Servlet3.0(WEB3.0)算是比较新的Servlet技术了,对应的JavaEE版本是6,虽然目前最新的版本是3.1,对应版本JavaEE7。我们目前使用的做多的还是Servlet2.5的东西,所以3.0仅做一个了解
要求
- MyEclipse10.0或以上版本
- 发布到Tomcat7.0或以上版本
概述
注解代替web.xml配置文件,可以不使用web.xml文件,所以在创建JavaEE6.0版本时,会发现默认不创建web.xml
对上传的支持,在Servlet2.5中,我们更多的使用第三方的jar来完成上传文件(如commons-fileupload),在3.0中可以不添加其他jar来完成上传文件
注解代替配置文件
我们可以先干掉web.xml,注解主要围绕JavaWeb的三大组件(Servlet,Filter,Linstener)
Servlet类
我只需要在Servlet类上面添加@WebServlet(urlPatterns="servlet路径") 即可
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet(urlPatterns="/AServlet", initParams={ @WebInitParam(name="p1", value="v1"), @WebInitParam(name="p2", value="v2") }, loadOnStartup=1 ) public class AServlet extends HttpServlet { private static final long serialVersionUID = 1L; public AServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = (String) request.getParameter("userName"); if(userName==null||userName.equals("")){ request.setAttribute("msg", "请先登录"); request.getRequestDispatcher("/session1/login.jsp").forward(request, response); }else{ if(userName.equalsIgnoreCase("lz")){ //登录成功 HttpSession session = request.getSession(); session.setAttribute("userName", userName); //写入Cookie Cookie cookie=new Cookie("uname", userName); cookie.setMaxAge(60*60); response.addCookie(cookie); response.sendRedirect("/day11/session1/succ1.jsp"); }else{ //登录失败 request.setAttribute("msg", "请先登录"); request.getRequestDispatcher("/session1/login.jsp").forward(request, response); } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
这个initParams属性的配置在注解中使用并不是很好,既然在注解中使用,为何不直接点在代码中定义变量参数。但只有urlParrents时,可以忽略这个属性名,直接给个值 :@WebServlet("/AServlet") ,其实一个Servlet可以配置多个url,不然这个属性单词最后也不会带s,虽然一般我们不这样使用
Filter
Filter使用@WebFilter注解,其中也有一个urlParrents属性用来表示需要过滤的资源,这个urlParrents也可以省略
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter(urlPatterns="/*") public class AFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse repsonse, FilterChain chain) throws IOException, ServletException { System.out.println("哈哈~,你看到我没有!"); chain.doFilter(request, repsonse); //放行 } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
Listener
监听器使用@WebListener,监听器的注解不需要属性值
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class AListener implements ServletContextListener { public AListener() { // TODO Auto-generated constructor stub } public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub } }
上传的支持
上传对表单的要求(所有的上传对前端页面都是这些要求):
- method="post"
- enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded
- <input type="file" name="必须给"/>
我们只需要在Servlet上添加@MultipartConfig注解即可
当然也可以为@MultipartConfig注解指定属性值,它有四个属性:
- int filesizeThreshold:指定缓存的大小,当超出这个大小后,文件会保存到磁盘上;
- String location:指定临时文件的目录;
- long maxFilesize:指定上传单个文件的大小限制,如果上传的谁的超出了这个大小,那么就会抛出异常;
- long maxRequestSize:指定整个表单的大小限制。
当在Servlet上使用了@MultipartConfig注解后,那么就可以使用request.getPart(“fieldName”)来获取<input:file>的内容,其中Part表示一个文件表单项,接着就可以使用Part对象的API
import java.io.IOException; 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("/CServlet") @MultipartConfig public class CServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //Servlet3.0对文件上传的支持 String userName = request.getParameter("userName"); Part part = request.getPart("file"); //获得文件的MIME类型 System.out.println(part.getContentType()); //获得文件的字节数 System.out.println(part.getSize()); //获得文件字段名 System.out.println(part.getName()); //获取文件名 System.out.println(part.getSubmittedFileName()); //保存图片到硬盘 part.write("d:/xxx.jpg"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }