servlet 3.0 새로운 기능 개관
14575 단어 servlet
Servlet 3.0 새로운 기능 개관
1. Servlet, Filter, Listener 는 웹. xml 에서 설정 할 필요 가 없고 Annotation 을 통 해 설정 할 수 있 습 니 다.
2. 모듈 화 프로 그래 밍, 각 Servlet 모듈 화 를 앞 두 고 설정 파일 도 따로 설정 합 니 다.
3. Servlet 비동기 처리, 복잡 한 업무 처리 에 대응;
4. 비동기 Listener 는 비동기 처리 의 생 성, 완성 등에 대해 감청 한다.
5. 파일 업로드 API 간소화;
tomcat 7.0. X 지원 Servlet 3.0
1. Annotation 지원
1.Servlet
원래 Servlet 개발 이 끝 난 후 웹. xml 에 다음 코드 를 설정 해 야 합 니 다.
<servlet>
<servlet-name></servlet-name>
<servler-class></servlet-class>
<load-on-startup></load-on-startup>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
현재 자바 원본 파일 의 Servlet 클래스 앞 에 만 추가 하면 됩 니 다:
@WebServlet(name="",urlPatterns={""},initParams={@WebInitParam(name="",value=""),loadOnStartup=1})
public class FirstServlet extends HttpServlet{}
코드 예제:
가장 간단 한 Servlet 을 실현 하 다.
package org.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
/*
name == <servlet-name>
urlPatterns == <url-pattern>,
loadOnStartup == <load-on-startup>
initParam == <init-param>
name == <param-name>
value == <param-value>
*/
@WebServlet(name="HelloServlet" ,urlPatterns={"/HelloServlet"},loadOnStartup=1,
initParams={
@WebInitParam(name="name",value="xiazdong"),
@WebInitParam(name="age",value="20")
})
public class HelloServlet extends HttpServlet{
public void init(ServletConfig config)throws ServletException{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
request.setCharacterEncoding("GBK");
ServletConfig config = getServletConfig();
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("Hello world"+"<br />");
out.println(config.getInitParameter("name"));
out.println("</body>");
out.println("</html>");
}
}
이렇게 되면 클 라 스 파일 을 WEB - INF \ classes 에 넣 고 웹. xml 에서 변경 하지 않 아 도 배 치 를 완료 할 수 있 습 니 다.
2.Filter
원래 Filter 의 설정 은 다음 과 같 습 니 다.
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
<filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern></url-pattern>
</filter-mapping>
지금 은 자바 원본 파일 의 Filter 클래스 앞 에 만 추가 하면 됩 니 다.
@WebFilter(filterName="",urlPattern={"/"});
3.Listener
웹. xml 에 다음 과 같이 설정 되 어 있 었 습 니 다.
<listener>
<listener-class></listener-class>
</listener>
현재 자바 원본 파일 의 Listener 클래스 앞 에 @ WebListener 만 추가 하면 됩 니 다.
2. 웹 모듈 화
원래 웹 애플 리 케 이 션 의 모든 설정 은 웹. xml 에서 이 루어 져 야 하기 때문에 웹. xml 을 혼 란 스 럽 고 유연성 이 떨 어 집 니 다. 따라서 Servlet 3.0 은 모든 Servlet, Filter, Listener 를 jar 패키지 로 만 든 다음 에 WEB - INF \ lib 에 넣 을 수 있 습 니 다.각 모듈 에 각각 프로필 이 있 음 을 주의 하 십시오. 이 프로필 의 이름 은 웹 - fragment. xml 입 니 다.
Servlet 모듈 을 만 드 는 절차:
1. Servlet 을 작성 하고 컴 파일 합 니 다.
2. 이 컴 파일 클 라 스 파일 과 소 재 된 가방 을 jar 패키지 명령 을 통 해 jar 패키지 로 만 듭 니 다.
3. 이 jar 가방 을 winrar 로 열 고 META - INF 의 manifest 를 삭제 하고 웹 - fragment. xml 를 추가 합 니 다.
4. 이 jar 가방 을 WEB - INF \ lib 에 넣 으 면 됩 니 다.
웹 - fragment. xml 주의 점:
1. 루트 요 소 는 < 웹 - fragment > 입 니 다.
2. < name > < / name > 은 모듈 이름 을 표시 합 니 다.
3. < ordering > < / ordering > 은 이 모듈 의 로드 순서 입 니 다.
4. < before > < others / > < / before > 는 첫 번 째 로 딩 을 표시 합 니 다.
5. < after > < name > A < / name > < / after > 는 A 보다 뒤에 불 러 오 는 것 을 나타 낸다.
6. 안에 listener, filter, servlet 를 배치 할 수 있 습 니 다.
물론 모듈 로드 순 서 를 설정 하지 않 아 도 됩 니 다.
코드 예제:
listener 모듈 두 개 설정 하기;
FirstListener.java
package org.listener;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;
import java.sql.*;
import javax.naming.*;
public class FirstListener implements ServletRequestListener{
public void requestInitialized(ServletRequestEvent event){
System.out.println("FirstListener created");
}
public void requestDestroyed(ServletRequestEvent event){
System.out.println("FirstListener destroyed");
}
}
First Listener 의 웹 - fragment. xml 내용:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
<A href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<name>FirstListener</name>
<listener>
<listener-class>org.listener.FirstListener</listener-class>
</listener>
<ordering>
<before>
<others/>
</before>
</ordering>
</web-fragment>
SecondListener.java
package org.listener;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;
import java.sql.*;
import javax.naming.*;
public class SecondListener implements ServletRequestListener{
public void requestInitialized(ServletRequestEvent event){
System.out.println("SecondListener created");
}
public void requestDestroyed(ServletRequestEvent event){
System.out.println("SecondListener destroyed");
}
}
SecondListener 의 웹 - fragment. xml 내용 은:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
<A href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<name>SecondListener</name>
<listener>
<listener-class>org.listener.SecondListener</listener-class>
</listener>
<ordering>
<after>
<name>FirstListener</name>
</after>
</ordering>
</web-fragment>
그리고 각각 jar 가방 으로 만들어 WEB - INF \ lib 에 넣 으 면 됩 니 다.
웹 애플 리 케 이 션 을 마음대로 방문 한 다음 tomcat 콘 솔 출력 을 발견 합 니 다:
먼저 First Listener 를 불 러 오고 SecondListener 를 불 러 오 는 것 을 알 수 있 습 니 다.
3. Servlet 비동기 처리
Servlet 는 MVC 에서 컨트롤 러 로 서 컨트롤 러 는 MODEL 에 게 임 무 를 나 누 어 주 고 결 과 를 JSP 에 보 여 줍 니 다.
만약 에 많은 MODEL 이 있 으 면 그 중에서 하나의 MODEL 처리 시간 이 길 면 전체 페이지 의 표시 가 느 릴 수 있다.
비동기 처리 관건: 복잡 한 업 무 를 다른 스 레 드 로 처리 하고 Servlet 은 실 행 된 업 무 를 jsp 출력 으로 보 내 고 시간 이 걸 리 는 업무 가 끝 난 후에 JSP 페이지 로 보 냅 니 다.
한 마디: 일부분 을 먼저 표시 하고 일부분 을 표시 합 니 다.
비동기 처리 Servlet 의 주의 점 은:
1. Annotation 에 asyncSupported = true 를 표시 해 야 합 니 다.
package org.sync;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;
@WebServlet(name="AsyncServlet",urlPatterns={"/AsyncServlet"},asyncSupported=true)
public class AsyncServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("==== ====<hr />");
AsyncContext actx = request.startAsync();
actx.setTimeout(30*3000);
actx.start(new MyThread(actx));
out.println("==== ====<hr />");
out.println("</body>");
out.println("</html>");
out.flush();
}
}
class MyThread implements Runnable{
private AsyncContext actx;
public MyThread(AsyncContext actx){
this.actx = actx;
}
public void run(){
try{
Thread.sleep(5*1000); // 5
actx.dispatch("/1.jsp");
}
catch(Exception e){}
}
}
1.jsp
<%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" session="false"%>
<html>
<body>
<%
out.println("====== ====");
%>
</body>
</html>
4. 비동기 모니터
비동기 감청 기 는 비동기 처리 사건 을 감청 하 는 데 사용 된다.즉, '3' 에서 말 한 지식 점 이다.
이 모니터 는 ServletContextListener 와 유사 한 메커니즘 입 니 다.
AsyncListener 인터페이스 만 실현 하면 됩 니 다.
이 인 터 페 이 스 는 4 가지 방법 이 있 습 니 다. Public void onStartAsync (AsyncEvent event) throws IOException;
public void onComplete(AsyncEvent event);
public void onTimeout(AsyncEvent event);
public void onError(AsyncEvent event);
다음은 모니터 가 구현 한 코드 입 니 다.
package org.listener;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;
import java.sql.*;
import javax.naming.*;
import java.io.*;
public class MyListener implements AsyncListener{
public void onStartAsync(AsyncEvent event)throws IOException{}
public void onComplete(AsyncEvent event){
System.out.println("-----------------------Complete");
}
public void onTimeout(AsyncEvent event){
}
public void onError(AsyncEvent event){}
}
Servlet 비동기 처리 에 추가:
actx.addListener(new MyListener());모니터 를 추가 할 수 있 습 니 다. 비동기 처리 가 끝 날 때마다 onComplete () 이벤트 가 발생 하여 Complete 를 출력 합 니 다.
5. 파일 업로드 개선 API
원래 파일 을 업로드 할 때 common - fileupload 나 SmartUpload 를 통 해 업로드 하 는 것 이 귀 찮 습 니 다. Servlet 3.0 에 서 는 제3자 jar 패 키 지 를 가 져 올 필요 가 없 으 며 파일 업로드 에 편리 한 기능 을 제공 합 니 다.
주의 점:
1. html 에서 < input type = "file" > 은 파일 업로드 컨트롤 을 표시 합 니 다.
2. form 의 enctype = "multipart / form - data";
3. Servlet 클래스 앞 에 @ MultipartConfig 추가
4. request. getPart () 획득;
다음은 파일 업로드 의 예 입 니 다.
upload.html
<html>
<body>
<form method="post" enctype="multipart/form-data" action="upload">
<input type="file" id="file" name="file"/>
<input type="text" id="name" name="name"/>
<input type="submit" value=" "/>
</form>
</body>
</html>
UploadServlet.java
package org.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name="UploadServlet" ,urlPatterns={"/upload"})
@MultipartConfig
public class UploadServlet extends HttpServlet{
public void init(ServletConfig config)throws ServletException{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
Part part = request.getPart("file");
PrintWriter out = response.getWriter();
out.println(" :"+part.getSize()+"<br />");
out.println(" :"+part.getContentType()+"<br />");
out.println(" :"+request.getParameter("name")+"<br />");
out.println(UploadUtil.getFileName(part)+"<br />");
part.write("F:\\1."+UploadUtil.getFileType(part));
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
5분 안에 JSP 배우기Java 생태계는 지난 20년 동안 많이 발전했으며 이는 시장에서 변함없이 인기를 얻고 있음으로 알 수 있습니다. 글쎄, 이것은 다른 프로그래밍 언어 중 하나에 대한 탄탄한 배경이 있거나 새로운 개발자이지만 시간이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.