Servlet3.0要求:
- MyEclipse10.0以上版本
- Tomcat7.0版本以上
- 创建JavaEE6.0应用
新特性:
- 注解代替web.xml
- 异步处理
- 对上传的支持
注解替代配置文件
- 删除web.xml
- 在Servlet类上添加@WebServlet(urlPatterns={"/AServlet"})
/**
传统的servlet配置
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>xxxx.xxx.AServlet</serlvet-class>
<init-param> -----可以配置多个
<param-name>p1</param-name>
<param-value>v1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern> -----可以配置多个
</servlet-mapping>
*/
@WebServlet(urlPatterns={"/AServlet"})
public class AServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletReponse resp)throws ServletException,IOException{
resp.getWriter().print("hello servlet3.0");
}
}
WebFilter和WebListener注解
@WebFilter(urlPatterns="/*")
public class AFilter implements Filter{
public void doFilter(ServletRequest req,ServletReponse resp,FilterChain chain)throws ServletException,IOException{
chain.doFilter(request,reponse);
}
}
@WebListener //tomcat启动和关闭时分别执行以下两个方法
public class AListener implements ServletContextListener{
public void contextDestroyed(ServletContext arg0){}
public void contextInitialized(ServletContext arg0){}
}
异步处理
-在服务器没有结束响应之前,浏览器是看不到响应内容,只有响应结束时,浏览器才能显示结果。
- 在浏览器开始响应后,浏览器就可以看到响应内容,不用等待服务器响应结束!AsyncContext异步上下文对象,通过request.startAsync(request,response)获取
//非异步,响应必须全部结束后才能显示数据
@WebServlet(urlPatterns={"/AServlet"})
public class AServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletReponse resp)throws ServletException,IOException{
resp.getWriter().print("hello servlet3.0");
resp.getWriter().flush();
try{
Thread.sleep(3000);
}catch(InterruptedException e){
}
resp.getWriter().print("world!");
}
}
//异步
@WebServlet(urlPatterns="/AServlet",asyncSupported=true)
public class AServlet extends HttpServlet{
public void doGet(final HttpServletRequest req,final HttpServletReponse resp)throws ServletException,IOException{
resp.setContentType("text/html;charset=utf-8");
/**
对于IE浏览器,如果不能正常输出,说明响应体大小不足512B,需要多输出一些废话。实际场景中不会出现用异步的情况下还不足512B的情况
for(int i = 0;i<512;i++){
resp.getWriter().print("a");
}
*/
//得到异步上下文对象
final AsyncContext ac = req.startAsync(req,resp);
//给上下文对象一个Runnable对象,让它执行这个任务
ac.start(new Runnable(){
public void run(){
try{
resp.getWriter().print("立即开始");
resp.getWriter().flush();
Thread.sleep(2000);
for(char c = 'A';c<'Z';c++){
println("kkkkkk");
Thread.sleep(250);
}
//通知Tomcat子线程已经执行结束
ac.complete();
}catch(){}
}
});
}
上传支持:
- method=“post”
- entype=“multipart/form-data” 默认值application/x-www-form-rulencoded
- request.getParameter()不能再用
- request.getInputStream()使用它来获取表单数据 (1)
commons-fileupload 用来创建工厂 解析器 使用解析器解析request得到List,每个fileIntem对应表单项(2)
Servlet3.0对上传的支持:
表单不变
不使用commons-fileupload,而是使用提供的上传组件接口(3)
(1)—>(2)—>(3)逐渐替代的过程
上传步骤:
- 使用request.getPart(“字段名”) 得到Part实例
- Part接口的相关方法获取上传文件类型,获取表单项名称,获取指定头的值,获取上传文件的大小,获取上传文件内容,把上传文件保存到指定路径下
默认Servlet不支持上传,需要添加注解@MultipartConfig
//页面表单
<form action="<c:url value='/AServlet'/>" method="post" enctype="multipart/form-data">
<input type="file" name="resume"/>
提交....
</form>
@WebServlet(urlPatterns={"/AServlet"})
@MultipartConfig
public class AServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletReponse resp)throws ServletException,IOException{
Part part = req.getPart("resume"); //获取表单字段
//从part中获取数据
part.getContentType();
part.getSize();
part.getName();
part.getHeader("content-Disposition");//获取头,包含上传文件名称
part.write("C:/xx.jpg");//保存文件路径
//没有提供获取上传文件的名称,只能自行截取字符串,头中包含了上传文件的名称
}