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)publicclassAServletextendsHttpServlet{privatestaticfinallong serialVersionUID =1L;publicAServlet(){super();}protectedvoid doGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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);//写入CookieCookie cookie=newCookie("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);}}}protectedvoid doPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{         doGet(request, response);}}


Servlet3.0的简单使用_java

这个initParams属性的配置在注解中使用并不是很好,既然在注解中使用,为何不直接点在代码中定义变量参数。但只有urlParrents时,可以忽略这个属性名,直接给个值 :@WebServlet("/AServlet") ,其实一个Servlet可以配置多个url,不然这个属性单词最后也不会带s,虽然一般我们不这样使用

Filter

Filter使用@WebFilter注解,其中也有一个urlParrents属性用来表示需要过滤的资源,这个urlParrents也可以省略

Servlet3.0的简单使用_表单_02

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="/*")publicclassAFilterimplementsFilter{@Overridepublicvoid destroy(){// TODO Auto-generated method stub}@Overridepublicvoid doFilter(ServletRequest request,ServletResponse repsonse,FilterChain chain)throwsIOException,ServletException{System.out.println("哈哈~,你看到我没有!");         chain.doFilter(request, repsonse);//放行}@Overridepublicvoid init(FilterConfig arg0)throwsServletException{// TODO Auto-generated method stub}}

Servlet3.0的简单使用_表单_03

Listener

监听器使用@WebListener,监听器的注解不需要属性值


import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublicclassAListenerimplementsServletContextListener{publicAListener(){// TODO Auto-generated constructor stub}publicvoid contextDestroyed(ServletContextEvent arg0){// TODO Auto-generated method stub}publicvoid contextInitialized(ServletContextEvent arg0){// TODO Auto-generated method stub}}


上传的支持​​#​​

上传对表单的要求(所有的上传对前端页面都是这些要求):


  1. method="post"
  2. enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded
  3. <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")@MultipartConfigpublicclassCServletextendsHttpServlet{privatestaticfinallong serialVersionUID =1L;protectedvoid doGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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");}protectedvoid doPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{         doGet(request, response);}}






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)publicclassAServletextendsHttpServlet{privatestaticfinallong serialVersionUID =1L;publicAServlet(){super();}protectedvoid doGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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);//写入CookieCookie cookie=newCookie("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);}}}protectedvoid doPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{         doGet(request, response);}}


Servlet3.0的简单使用_java

这个initParams属性的配置在注解中使用并不是很好,既然在注解中使用,为何不直接点在代码中定义变量参数。但只有urlParrents时,可以忽略这个属性名,直接给个值 :@WebServlet("/AServlet") ,其实一个Servlet可以配置多个url,不然这个属性单词最后也不会带s,虽然一般我们不这样使用

Filter

Filter使用@WebFilter注解,其中也有一个urlParrents属性用来表示需要过滤的资源,这个urlParrents也可以省略

Servlet3.0的简单使用_表单_05

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="/*")publicclassAFilterimplementsFilter{@Overridepublicvoid destroy(){// TODO Auto-generated method stub}@Overridepublicvoid doFilter(ServletRequest request,ServletResponse repsonse,FilterChain chain)throwsIOException,ServletException{System.out.println("哈哈~,你看到我没有!");         chain.doFilter(request, repsonse);//放行}@Overridepublicvoid init(FilterConfig arg0)throwsServletException{// TODO Auto-generated method stub}}

Servlet3.0的简单使用_java_06

Listener

监听器使用@WebListener,监听器的注解不需要属性值


import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublicclassAListenerimplementsServletContextListener{publicAListener(){// TODO Auto-generated constructor stub}publicvoid contextDestroyed(ServletContextEvent arg0){// TODO Auto-generated method stub}publicvoid contextInitialized(ServletContextEvent arg0){// TODO Auto-generated method stub}}


上传的支持​​#​​

上传对表单的要求(所有的上传对前端页面都是这些要求):


  1. method="post"
  2. enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded
  3. <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")@MultipartConfigpublicclassCServletextendsHttpServlet{privatestaticfinallong serialVersionUID =1L;protectedvoid doGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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");}protectedvoid doPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{         doGet(request, response);}}