1. pom.xml에서 JDK, Java 버전을 11, Servlet 버전을 3.1로 변경 후 저장한 다음 "프로젝트 우클릭 -> Maven -> Update Project"
<!-- Java --> <properties> <java-version>11</java-version> <org.springframework-version>3.1.1.RELEASE</org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> </properties> <!-- JDK --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>11</source> <target>11</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>2. web.xml 에서 DTD를 3.1로 변경
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="//java.sun.com/xml/ns/javaee" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//java.sun.com/xml/ns/javaee //java.sun.com/xml/ns/javaee/web-app_3_1.xsd">3. 프로젝트 우클릭 -> Project Facets -> Dynamic Web Module="3.1", Java Version="11"로 변경
4. 프로젝트 우클릭 -> Project Facets -> Java Compiler -> Compiler Compilance level="11"로 변경
5. 이클립스 restart!!
Servlet의 버전은 아래와 같다.
Servlet 컨테이너 잘 설정해도 문제가 없다보니 일하면서 기능이나 스펙문서를 살펴본 적이 없었다.
1. Servlet 2.5 new feature (링크)
- J2SE 5.0(제네릭, 오토박싱, enum, static importing, varargs, annotation) 이상에서 사용가능
- Annotation 지원
- web.xml 편의기능
2. Servlet 3.0 new feature (링크)
- Asynchronous 지원
- web.xml 파일 없이 annotation으로 설정 가능
- API 개선
- ServletRequest를 반환하는 getServeltContext 메소드 추가
- 클라이언트 스크립트에서 접근할 수 없는 HTTPOnly 쿠키를 지원하는 Cookie 클래스 추가
3. Servlet 3.1 new feature (링크)
- non-blocking I/O (동기/비동기와 블록킹/논블록킹은 별도의 글에 정리해봐야겠다.)
- HTTP 프로토콜 업그레이드
- Security 보강
Servlet 컨테이너
SpringBoot는 3가지의 embedded 컨테이너를 지원한다.
1. Tomcat은 7.0부터 Servlet 3.0을, 8.0부터 3.1을 지원한다.
Undertow는 servlet 없이도 non-blocking을 구현할 수 있다고 하는데, undertow는 잘 몰라서 좀 더 알아보고 업데이트 해야겠다.
Spring framework와 Servlet
Sping은 3.1부터 Servlet 3.0을 사용할 수 있다.
//docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/WebApplicationInitializer.html
사용방법은 좋은 글이 있어서 링크를 기록한다.
//whiteship.me/?p=13397
위 글을 보다보니 SPI(Service Provider Interface)라는 단어가 나와서 찾아봤다.
//t.motd.kr/ko/archives/1618
버전 확인
서버정보:<%=application.getServerInfo() %>
서블릿정보:<%=application.getMajorVersion()%>.<%= application.getMinorVersion() %>
JSP정보:<%= JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %>
톰캣 버전 | JSP 스펙 | 웹소켓 스펙 | 최소 Java 버전 | 서블릿 API 버전 | 발표 | 중요한 변화 |
9 | 2.4(예정) | 1.2(예정) | 8 | 서블릿 4.0 | 개발 중 | HTTP/2 |
8 | 2.3 | 1.1 | 7 | 서블릿 3.1 | 2013년 5월 | 비차단 방식의 I/O, HTTP 프로토콜 업그레이드 구조 |
7 | 2.2 | 1.1 | 6 | 서블릿 3.0 | 2009년 1월 | JSR 315, Ajax 대응비동기지원, 어노테이션에의한개발편의성, web.xml 없는 개발및배포 |
6 | 2.1 | - | 5 | 서블릿 2.5 | 2005년 9월 | JSR 154, Requires J2SE 5.0, supports annotations |
5.5 | 2 | - | 1.4 | 서블릿 2.4 | 2003년 11월 | JSR 154, web.xml uses XML Schema |
4.1 | 1.2 | - | 1.3 | 서블릿 2.3 | 2001년 8월 | Addition of Filters |
3.3 | 1.1 | - | 1.1 | 서블릿 2.2 | 1999년 8월 | Becomes part of J2EE, introduced independent web applications in .war files |
서블릿 2.1 | 1998년 11월 | First official specification, added RequestDispatcher, ServletContext | ||||
서블릿 2.0 | Part of Java Servlet Development Kit 2.0 | |||||
서블릿 1.0 | 1997년 6월 |
서블릿 별 web.xml 선언 문은 아래와 같다.
------2.4----
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="servlet-2_4" version="2.4" xmlns="//java.sun.com/xml/ns/j2ee"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//java.sun.com/xml/ns/j2ee //java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
출처: //antop.tistory.com/145 [Brain → Blog]
------2.5----
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xmlns="//java.sun.com/xml/ns/javaee" xmlns:web="//java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="//java.sun.com/xml/ns/javaee //java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="servlet-2_5" version="2.5">
</web-app>
출처: //antop.tistory.com/145 [Brain → Blog]
------3.0--------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="//java.sun.com/xml/ns/javaee" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//java.sun.com/xml/ns/javaee //java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
출처: //antop.tistory.com/145 [Brain → Blog]
------3.1------
<web-app xmlns="//xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
출처: //antop.tistory.com/145 [Brain → Blog]
해당 톰캣 버전에서 servlet.jar 가 있으면 굳이 어플리케이션 단에서 servlet 을 선언 안해도 되는것으로 확인 되었다.
maven을 사용하면 스프링에서 한번에 끌고 오기 때문에 exclusion 으로 빼고 scop을 provier로 선언 해야 될것이다.
maven 환경에선 정확하게 테스트를 안해봐서 구글링을 해봐야 할것 같다.