zoukankan      html  css  js  c++  java
  • 15.过滤器-基础.md


    目录

    基础

    过滤器相当于门的作用,用于在servlet获取之前,完成定义的过滤操作

    • 过滤器是一个特殊的servlet类
    • 过滤器实现接口javax.servlet.Filter

    实例

    package per.liyue.code.filter_demo;
    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;
    /*
     * 过滤器例子:
     * 1.普通的Java类实现javax.servlet.Filter接口
     * 2.这是一个特殊的servlet
     */
    public class HelloFilter implements Filter{
        /*
         * 过滤器在服务器启动的过程中就创建了,这个不同于普通的servlet,servlet在访问请求的时候创建,除非在配置中设置
         */
        public HelloFilter(){
            System.out.println("1.构造过滤器。。。");
        }
        
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("2.初始化过滤器,实现一些过滤器的初始化工作...");        
        }    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            System.out.println("3.进入过滤器,实现过滤...");
            //过滤完成后调用servlet
                    //如果有其他的过滤器,则进入其他的过滤器,最后才进入servlet        chain.doFilter(request, response);
            System.out.println("5.过滤器中完成了servlet的代码...");
        }
        @Override
        public void destroy() {
            System.out.println("6.销毁过滤器...");        
        }
    }
    
    package per.liyue.code.filter_demo;
    
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    public class HelloServlet extends HttpServlet {
    
    
    	/**
    		* The doGet method of the servlet. <br>
    		*
    		* This method is called when a form has its tag value method equals to get.
    		* 
    		* @param request the request send by the client to the server
    		* @param response the response send by the server to the client
    		* @throws ServletException if an error occurred
    		* @throws IOException if an error occurred
    		*/
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    		System.out.println("4.进入servlet,执行servlet本身内容...");
    	}
    
    
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
        <display-name>WebDemo1</display-name>
    
    
        <!-- 过滤器配置 -->
        <!-- 过滤器本身的设置 -->
        <filter>
            <!-- 过滤器内部名称 -->
            <filter-name>HelloFilter??</filter-name>
            <!-- 过滤器类名称 -->
            <filter-class>per.liyue.code.filter_demo.HelloFilter</filter-class>
        </filter>
        <!-- 过滤器路径配置 -->
        <filter-mapping>
            <!-- 过滤器内部名称 -->
            <filter-name>HelloFilter??</filter-name>
            <!-- 过滤器所有的servlet -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <!-- 过滤器对应的servlet -->
        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>per.liyue.code.filter_demo.HelloServlet</servlet-class>
        </servlet>
        <!-- 过滤器对应的servlet地址 -->
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <url-pattern>/HelloServlet</url-pattern>
        </servlet-mapping>
        
    </web-app>  
    
    

    图解

    核心API

    interface Filter过滤器接口

    • void init(filterConfig); 初始化方法,在服务器启动时候执行
    • void doFilter(request,response,filterChain); 过滤器拦截的业务处理方法
    • void destroy(); 销毁过滤器实例时候调用

    interface FilterConfig获取过滤器初始化信息

    现在xml中配置初始化参数

    <!-- 过滤器配置 -->
    	<filter>
    		<!-- 配置初始化参数 -->
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>UTF-8</param-value>
    		</init-param>
    		<init-param>
    			<param-name>path</param-name>
    			<param-value>c:/...</param-value>
    		</init-param>
    	
    		<!-- 内部名称 -->
    		<filter-name>hello_filter</filter-name>
    		<!-- 过滤器类的全名 -->
    		<filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<!-- filter内部名称 -->
    		<filter-name>hello_filter</filter-name>
    		<!-- 拦截所有资源 -->
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    

    再到过滤器中获取

    @Override
       public void init(FilterConfig filterConfig) throws ServletException {
       	System.out.println("2. 执行过滤器初始化方法");
       	
       	// 获取过滤器在web.xml中配置的初始化参数
       	String encoding = filterConfig.getInitParameter("encoding");
       	System.out.println(encoding);
       	
       	// 获取过滤器在web.xml中配置的初始化参数 的名称
       	Enumeration<String> enums =  filterConfig.getInitParameterNames();
       	while (enums.hasMoreElements()){
       		// 获取所有参数名称:encoding、path
       		String name = enums.nextElement();
       		// 获取名称对应的值
       		String value = filterConfig.getInitParameter(name);
       		System.out.println(name + "	" + value);
       	}
       }
    
    
    

    interface FilterChain 过滤器参数,一个个过滤器形成执行链

    指定过滤

    • 默认拦截的类型:(直接访问或者重定向)

    REQUEST

    • 拦截转发:

    FORWARD

    • 拦截包含的页面(RequestDispatcher.include(/page.jsp); 对page.jsp也执行拦截)

    INCLUDE

    • 拦截声明式异常信息:
      ERROR
      Demo:
    <!-- 配置第二个过滤器 -->
    	<!-- 演示: 拦截指定的请求 -->
    	<filter>
    		<filter-name>hello_filter2</filter-name>
    		<filter-class>cn.itcast.a_filter_hello.HelloFilter2</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>hello_filter2</filter-name>
    		<!-- 1. 拦截所有
    		<url-pattern>/*</url-pattern>
    		-->
    		 
    		<!-- 2. 拦截指定的jsp 
    		<url-pattern>/index.jsp</url-pattern>
    		<url-pattern>/list.jsp</url-pattern>
    		-->
    		<!-- 拦截所有的jsp
    		<url-pattern>*.jsp</url-pattern>
    		 -->
    		 <!-- 3. 根据servlet的内部名称拦截
    		 <servlet-name>IndexServlet</servlet-name>
    		  -->
    		 <!-- 拦截指定的servlet 
    		 <url-pattern>/index</url-pattern>
    		 -->
    		 
    		 <!-- 4. 指定拦截指定的类型 -->
    		 <url-pattern>/*</url-pattern>
    		 <dispatcher>REQUEST</dispatcher>
    		 <dispatcher>FORWARD</dispatcher>
    	</filter-mapping>
    

    常见问题:

    • 过滤器:

    方法参数没有自动命名,说明没有关联源码---->关联tomcat或servlet源代码

    • 连接池:

    多刷新几次,报错---->连接没关

                            QueryRunner qr = new QueryRunner();
                            qr.update(con,sql);
                            // 这里con一定要关闭
                     ---->注意:dataSource 确定一个项目创建一次
    
                            QueryRunner qr = new QueryRunner(dataSource);
                               ---->修改连接池参数配置
    
    • 编码
    
     // 设置POST提交的请求的编码
     request.setCharacterEncoding("UTF-8");
     // 设置相应体的编码
    response.setCharacterEncoding("UTF-8");
     // 设置页面打开时候时候的编码格式、设置相应体的编码
    response.setContentType("text/html;charset=UTF-8");
    
    

    ** 开发中:工作区间编码、项目编码、request/response、数据库编码一致!**

  • 相关阅读:
    cc2530 T3定时器控制引脚P1_1的亮灭
    ifconfig相关参数及用法说明
    linux系统的三种网络连接模式
    修改Linux主机名与IP之间的映射关系
    网络相关的配置文件
    windows网络相关的命令
    修改主机IP地址
    查看局域网中连接的主机名和对应的IP地址
    mysql数据库基于linux的安装步骤及数据库操作
    genPanel.py
  • 原文地址:https://www.cnblogs.com/bugstar/p/8512695.html
Copyright © 2011-2022 走看看