Java自学手记——servlet3.0新特性

时间:2024-01-05 08:40:08

  servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持。

  支持servlet3.0的要求:MyEclipse10.0或以上版本,发布到Tomcat7.0或以上版本,并且需要创建JavaEE6.0应用。

一、使用注解代替配置文件

  可以使用 @WebServlet, @WebFilter, @WebListener 三个注解来代替web.xml中的 Servlet, Filter, Listener 的配置,注解的好处是配置信息少,但是定死在代码中,不方便修改。

 @WebServlet(
urlPatterns={"/AServlet"},
    initParams{@WebInitParam(name="paramName",value="paramValue")},
loadOnStartup=1
)
public class AServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println(config.getInitParameter("paramName"));
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("Hello World!");
}
}

二、异步处理

  异步处理:Servlet异步处理就是让Servlet在处理费时的请求时不要阻塞,而是一部分一部分的显示。

  原来,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果,使用异步处理,在服务器开始响应后,浏览器可以看到响应内容,不用等待服务器响应结束。

  实现异步处理的步骤:

  1.   需要在@WebServlet注解中给出 asyncSupported=true, 不然Servlet默认是不支持异步处理的,如果存在过滤器,也需要在WebFilter设置该值。
  2.   得到AsynoContext,它是异步上下文对象,AsynoContext ac = request.startAsync(request, response);
  3.   给上下文一个 Runable 对象,启动它!
 ac.start(new Runnable(){
public void run(){
...
}
});

  注意:

  1.   响应类型必须是 text/html, 所以需要设置 response.setContentType("text/html;charset=utf-8");
  2.   IE如果不能正常输出,这说明响应体大小不足512B,那你需要更多的输出!
  3.   AsyncContext#complete();:通知Tomcat服务器我们的异步线程已经执行完毕,让Tomcat及时断开与浏览器的连接,否则Tomcat无法知道异步线程是否已经结束,导致响应结束过一会才断开连接。

三、上传支持

  上传文件对表单的要求:

  1.   method=post,提交方式必须为post
  2.   enctype="multipart/form-data",它的默认值是它的默认值是:application/x-www-form-urlencoded
  3.   <input type="file" name="必须给出">

  使用文件上传是,Servlet中需要使用request.getInputStream()来获取整个表单的数据,不能够使用request.getParameter()。使用commons-fileupload类库中的方法可以三部得到上传文件的数据:创建工厂,利用工厂创建解析器,使用解析器来解析request对象,得到List<FileItem>。servlet3.0中对上传提供了支持,不再需要使用commons-fileupload,而是使用servlet3.0提供的上传接口。

  上传步骤:使用request.getPart("字段名"),得到Part实例,通过Part中的方法得到文件的数据,不过还没有提供获取文件原名称的方法, 需要自己截取,servlet默认是不支持使用上传组件的,需要在servlet中添加注解,@MultipartConfig