zoukankan      html  css  js  c++  java
  • (三)Web模块:【1】Web3.0 新特性之使用注解开发

    一、servlet3.0 新特性

      想要使用 servlet3.0 新特性必须使用 Tomcat7及以上版本。

      Servlet3.0 新增特性:

      (1)注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;

      (2)支持Web模块;

      (3)Servlet异步处理;

      (4)文件上传API简化;

      Servlet3.0 的注解:

      (1)@WebServlet :修饰Servlet类,用于部署该Servlet类;

      (2)@WebFilter:修饰Filter类,用于部署该Filter类;

      (3)@WebInitParam:与@WebServlet或@WebFilter注解连用,为它们配置参数;

      (4)@MultipartConfig:修饰Servlet类,指定该Servlet类负责处理multipart/form-data类型的请求(主要用于处理上传文件);

      (5)@ServletSecurity:修饰Servlet类,与JAAS(Java验证和授权API)有关的注解;

      (6)@HttpConstrait:与@ServletSecurity连用;

      (7)@HttpMethodConstrait:与@ServletSecurity连用;

      ServletContext提供了如下方法动态注册Servlet、Filter

    addServlet(); 动态注册Servlet
    addFilter(); 动态注册Filter
    addListener(); 动态注册Listener
    setInitParameter(String name ,String value); 为Web应用设置初始化参数。

    二、@WebServlet

      @WebServlet用于将一个类声明为Servlet,该标注将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。

    @WebServlet(name = "servlet3annotation", urlPatterns = {"/servlet3"},
            description = "servletinfo", displayName = "abc", asyncSupported = true, loadOnStartup = -1,
            initParams = {@WebInitParam(name = "username", value = "YangYuqin")})
    public class Servlet3Annotation extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取ServletConfig的实例
            ServletConfig config = this.getServletConfig();
            //获取指定参数名称的值
            String name = config.getInitParameter("username");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out = resp.getWriter();
            out.println("<html>");
            out.println("<head><title>Servlet3应用实例</title></head>");
            out.println("<body>");
            out.print("获取InitParamServlet的初始化参数\"username\"的字符串值:" + name);
            out.println("</body>");
            out.println("</html>");
        }
        @Override
        public void destroy() {
            //
        }
        @Override
        public void init() throws ServletException {
            //
        }
    }

    三、@WebFilter

      @WebFilter用于将一个类声明为过滤器,该标注将会在部署时被容器处理。以下属性均为可选属性,但是value、urlPatterns、servletNames三者必需至少包含一个,且value和urlPattern不能共存,如果同时指定,通常忽略value的取值。

    属性名 类型 描述
    filterName String 指定过滤器的name属性,等价于<filter-name>
    value String[] 该属性等价于urlPatterns属性,两个属性不能同时使用
    urlPatterns String[] 指定一组Servlet的URL匹配模式,等价于<url-pattern>标签
    servletNames String[] @WebServlet中的name属性的取值,或者是web.xml中<servlet-name>的取值
    initParams WebInitParam[] 指定一组Servlet初始化参数,等价于<init-param>标签
    dispatcherTypes DispatcherType 指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST
    asyncSupported boolean 声明过滤器是否支持异步操作模式,等价于<async-supported>标签
    description String 该Servlet的描述信息,等价于<description>标签
    displayName String 该Servlet的显示名,通常配合工具使用,等价于<display-name>标签

      示例:

    @WebFilter(servletNames = {"servlet3filterannotation"}, filterName = "characterFilter",
            initParams = {@WebInitParam(name = "encoding", value = "UTF-8")})
    public class Servlet3FilterAnnotation implements Filter {
        private FilterConfig filterConfig = null;
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
        }
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //获取此Filter的初始参数的值
            String encoding = filterConfig.getInitParameter("encoding");
            System.out.println(encoding);
            //设置请求数据的编码方式
            servletRequest.setCharacterEncoding(encoding);
            //把请求和响应对象传给过滤链中的下一个要调用的过滤器或Servlet
            filterChain.doFilter(servletRequest,servletResponse);
        }
        @Override
        public void destroy() {
            //
        }
    }

    四、@WebListener

      该标注用于将类声明为监听器。

    属性名 类型 是否可选 描述
    value String 该监听器的描述信息

      示例:

    //监听项目的启动和停止
    @WebListener
    public class MyListener implements ServletContextListener {
    
    
        //监听ServletContext启动初始化
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            ServletContext servletContext = sce.getServletContext();
            System.out.println("MyListener...contextInitialized...");
        }
    
        //监听ServletContext销毁
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("MyListener...contextDestroyed...");
        }
    }

    五、@WebInitParam

      @WebInitParam标注通常不单独使用,而是配合@WebServlet或者@WebFilter使用。它的作业是为Servlet或者过滤器指定初始化参数,这等价于web.xml中<servlet>和<filter>的<init-param>子标签。

    属性名 类型 是否可选 描述
    name String 指定参数的名字,等价于<param-name>
    value String 指定参数的值,等价于<param-value>
    description String 指定参数的描述,等价于<description>

     

    六、@MultipartConfig

      该标注主要是为了辅助Servlet3.0中HttpServletRequest提供的对上传文件的支持。该标注标注在Servlet上,表示该Servlet希望处理的请求的MIME类型是 multipart/form-data。

      相应servlet的HttpServletRequest对象必须通过 getParts 和 getPart 方法使 mime 附件可用来遍历各种mime附件,多用于表单上传。

    属性名 类型 是否可选 描述
    fileSizeThreshold int 当数据量大于该值时,内容将被写入文件
    location String 存放生成的文件地址
    maxFileSize long 允许上传的文件最大值。默认值为-1,表示没有限制
    maxRequestSize long 针对该multipart/form-data请求的最大数量,默认值为-1,表示没有限制

      1、改进内容
        (1)HttpServletRequest增加了对上传文件的支持
        (2)ServletContext允许通过编程的方式动态注册Servlet、Filter
      2、HttpServletRequest提供了如下两个方法处理文件的上传

    Part getPart(String name) 根据名称获取文件上传域
    Collection<Part> getParts() 获取所有文件上传域


      3、上传文件时一定要为表单域设置enctype属性,它表示表单数据的编码方式,有如下三个值:
        (1)application/x-www-form-urlencoded (默认),它只处理表单里的value属性值,它会将value值处理成URL编码方式。如果此时表单域里有上传文件的域(type=”file”),则只会获取该文件在上传者电脑里的绝对路径串,该串没什么实际意义;

        (2)multipart/form-data 此处编码方式会以二制流的方式来处理表单数据,此时会将文件内容也封装到请求参数里;

        (3)texst/plain 当表单的action属性为mailto:URL的形式时比较方便,主要适用于直接通过表单发送邮件的方式上传文件的Servlet需要加上@MultipartConfig注解通过request获取的Part对象就可以操作文件域了;

      4、上传文件的 Servlet 需要加上 @MultipartConfig 注解

      5、通过 request 获取的 Part 对象就可以操作文件域了

      示例:

    @WebServlet(name="uploadServlet",urlPatterns="/upload")
    @MultipartConfig
    public class UploaderServlet extends HttpServlet {
    
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
            //获得Par对象(每个Part对象对应一个文件域)
            Part part = request.getPart("file");
            long size = part.getSize(); //获取上传文件大小
            String info = part.getHeader("content-disposition");//获得包含原始文件名的字符串
            //获取原始文件名
            String fileName = info.substring(info.indexOf("filename=\"")+10,info.length()-1);
            //将文件上传到某个位置
            part.write(getServletContext().getRealPath("/uploadFiles")+"/"+fileName);
        }
    }

      

  • 相关阅读:
    10.23 JSTL
    10.22 EL执行表达式
    10.21 EL表达式(只能在jsp中使用)
    10.20 网站访问量统计(application)
    10.19 JSP内置对象作用域
    10.16 Session和Cookie的区别
    10.15 转发与重定向
    剑指Offer_26_二叉搜索树与双向链表
    剑指Offer_25_复杂链表的复制
    剑指Offer_24_二叉树中和为某一值的路径.md
  • 原文地址:https://www.cnblogs.com/niujifei/p/15592998.html
Copyright © 2011-2022 走看看