• java—过虑器基础(47)


    在web项目中就只有三大组件:

                  Filter过虑器

                  监听器.

                  Servlet   

    在web中过虑器就是一个类javax.servlet.Filter。

    过虑器是用于在执行时,过虑用户的请求(request),或是过虑从请求的资源中返回的响应(response).

    实现一个最基本的过虑器

           1:过虑器只对url(路径)进行过虑。

           2:过虑器开发人员来实现。

           3:过虑器由于是web的核心组,所以这个filter的实现者也必须要配置到web.xml中。

           4:三个生命周期方法:init,destory,doFilter(执行过虑任务)。用户的每次请求,都会执行doFIlter方法,而

                  Init,destory只会执行一次。

                  Init方法执行的时间:在项目启动时,直接初始化Filter的对象,所以会在tomcat启动时执行init方法。


    第一步:书写一个类实现Filter接口

    package cn.hongxin.filter;
    
    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;
    public class OneFilter implements Filter {
        //此方法只会在tomcat在启动时执行一次
        public void init(FilterConfig filterConfig) throws ServletException {
            System.err.println("过虑器初始化了:"+this);
        }
        //此方法执行过虑任务
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.err.println("1:正在执行过虑:"+this);
            //执行下一个过虑器,如果没有下一个过虑器则执行目标的servlet
            chain.doFilter(request, response); //2:
            
            System.err.println("3:目标组件,执行完成了...");
    }
        public void destroy() {
            System.err.println("过虑器dead.."+this);
        }
    }

    第二步:在web.xml中配置这个过虑器

     <filter>
          <filter-name>one</filter-name>
          <filter-class>cn.itcast.filter.OneFilter</filter-class>
      </filter>
      <!-- 配置这个过虑器对哪一个url进行过虑 -->
      <filter-mapping>
          <filter-name>one</filter-name>
          <url-pattern>/one </url-pattern>
      </filter-mapping>

    第三步:测试执行

    ilter的filter-mapping中的url-pattern的设置

           url-pattern的设置:

           /* = 对所有url都请求这个servlet。| 都被这个filter过虑.

           /  = 只可以给servlet。 - 所有其他的servlet不处理的url都由这个url所指定的servlet处理。默认servlet。

           *.jspx = 所有以jspx结束都请求到这个Servlet或是被某个Filter拦截。如http://local:8080/proj/abc.jspx

       /jsps/*  = 所有路径中以/jsps/开头的都请求到这个servlet或是被某个filter拦截到。

       /jsps/*.jspx  错误的:SUN规定*两边不可以同时出现字符。

    <filter-mapping>
          <filter-name>one</filter-name>
          <!-- 对所有url都拦截过虑任务 -->
          <url-pattern>/index.jsp</url-pattern>
          <url-pattern>/jsps/*</url-pattern>
          <!-- 拦截这个servlet上的所有url设置 -->
         <servlet-name>OneSerlvet</servlet-name>
      </filter-mapping>

    过虑器中的其他配置

    如果有jsps/abc.jsp这个页面,则显示这个页面有两种方式:

           1:在地址栏请求:http://local:8080/project/jsps/abc.jsp   -- 可以被拦截到的,因为:路径符合/jsp/abc.jsp

           2:req.getRequestDispathcer(“/jsps/abc.jsp”).forward(req,resp); -

        Dipatcher属性:

           Request – 默认值,只拦截用户的新的请求。

           Forward – 对转发进行拦截。

           Include – 对include拦截。

           Error  - 对错误进行拦截。

    <!-- 设置对转发拦截 -->

        <dispatcher>REQUEST[W1] </dispatcher>

        <dispatcher>FORWARD</dispatcher>

    7、配置过虑器的初始化参数

    在filter类中有一个方法:init(FilterConfig config); 而filtetrConfig中包含了从web.xml中读取初始化参数值。

    <filter>

        <filter-name>one</filter-name>

        <filter-class>cn.itcast.filter.OneFilter</filter-class>

        <init-param>

            <param-name>name</param-name>

            <param-value>张三Jack</param-value>

        </init-param>

        <init-param>

            <param-name>age</param-name>

            <param-value>88</param-value>

        </init-param>

      </filter>

    在filter类中获取值:

    private FilterConfig conf;

        //此方法只会在tomcat在启动时执行一次

        public void init(FilterConfig conf) throws ServletException {

           this.conf=conf;

           System.err.println("过虑器初始化了:"+this);

           //获取name的值:

           String name = conf.getInitParameter("name");

           System.err.println("name is:"+name);

           System.err.println("----------------------------");

            Enumeration<String> en= conf.getInitParameterNames();

           while(en.hasMoreElements()){

               String paramName = en.nextElement();

               String val = conf.getInitParameter(paramName);

               System.err.println(paramName+"="+val);

           }

        }


  • 相关阅读:
    大小端表示法
    构建二叉树并求其深度
    输入一行字符反向输出
    C++读取一行字符串输入
    关于递归调用的深度
    2016-9-22题目:extern char* 与char[]
    Ubuntu安装搜狗输入法
    判断字符串相等
    [Warning] deprecated conversion from string constant to 'char*' 原因
    ArcGIS API for JavaScript 4.2学习笔记[31] (补充学习)Task类
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/4454908.html
Copyright © 2020-2023  润新知