1、annotation
servlet、filter、listener可以使用annotation来配置
- WebFilter
- WebInitParam
- WebListener
- WebServlet
例子:
配置一个servlet
2、模块化编程
servlet、filter、listener可以通过jar来打成jar包,然后放在WEB-INF\lib中;注意各自的模块都有各自的配置文件,这个配置文件的名称为 web-fragment.xml。
模块制作步骤:
1、编写servlet或者filter、listener
2、编译成class文件,打成jar包
3、把jar包中的META-INF中的mainifest删除,并添加web-fragment.xml
4、在把jar包放入WEB-INF中既可
web-fragment.xml文件的元素:
根元素为<web-fragment>;
<name></name>表示模块名称;
<ordering></ordering>是此模块的加载顺序;
<before><others/></before>表示第一个加载;
.<after><name>A</name></after>表示比A后面加载;
可以在里面部署listener、filter、servlet
3、servlet异步处理
servlet作为控制器,可以使用异步编程,把复杂响应时间交慢的业务交给另一个线程处理
注意:需要使用注解asyncSupported进行声明
package com.yaoxun.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns={"/MyAsyscnServlet"},asyncSupported=true) public class MyAsyscnServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); AsyncContext ac = request.startAsync(); /*设置超时时间*/ ac.setTimeout(15000); /*开启线程*/ ac.start(new MyThread(ac)); out.println("start....<br/>"); out.flush(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } class MyThread implements Runnable { private AsyncContext ac; public MyThread(AsyncContext ac) { this.ac = ac; } @Override public void run() { try { PrintWriter out = ac.getResponse().getWriter(); Thread.sleep(3000); out.println("复杂业务处理完了"); /*当异步处理完成,需要通知servlet*/ ac.complete(); out.close(); } catch (InterruptedException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
4、异步listener
异步listener用来监听异步处理事件
需要实现接口AsyncListener,覆盖四个四个方法
package com.yaoxun.listener; import java.io.IOException; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; public class MyListener implements AsyncListener{ @Override public void onComplete(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } @Override public void onError(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } @Override public void onStartAsync(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } @Override public void onTimeout(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } }
5、文件上传API简化
servlet3.0新特性不需要第三方包来实现上传
注意点:
1. html中 <input type="file">表示文件上传控件;
2. form的 enctype="multipart/form-data";
3.在Servlet类前加上 @MultipartConfig
4.request.getPart()获得;
package com.yaoxun.listener; import java.io.IOException; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/UploadServlet") @MultipartConfig public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*获取file中的文件*/ Part part = request.getPart("upload"); /*获取上传文件的存放文件夹*/ String path = request.getServletContext().getRealPath("/upload"); System.out.println(path); /* * 获取上传文件的请求头信息 * */ String name = part.getHeader("content-disposition"); /*获取文件的扩展名*/ String ext = name.substring(name.lastIndexOf("."),name.length()-1); String f = path+"/" + UUID.randomUUID().toString()+ext; System.out.println(f); /*写入文件*/ part.write(f); }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="UploadServlet" method="post" enctype="multipart/form-data"> file:<input type="file" name="upload"><br> <input type="submit" value="上传"> </form> </body> </html>