写点什么

Java 进阶 (三十三)java 基础 -filter

  • 2022 年 9 月 21 日
    上海
  • 本文字数:2652 字

    阅读完需:约 9 分钟

Java进阶(三十三)java基础-filter

一、走近 filter

我们先看看没有 filter 的时候,整个 web 客户端-服务端的一个流程。



      接下来我们再看看引入了 filter 之后的 Uml 图。尝试分析这两者之间的差别。



      filter 是在 servlet2.3 规范中加入的。同 servlet 的生命周期相同。

      filter 执行过程如下:


看到这里有没有想起我们的数据库结构关于栈的描述,filter 和栈一样,也是按照先进后出的顺序。

      filter 其实是对 http 的请求进行过滤,所以有时候完全可以实现页面拦截的功能。它是一种声明式的服务,具有可插拔的能力。

二、filter 应用

  1. 继承 filter


package com.bjpowernode.drp.util.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;  /**   * 采用Filter统一处理字符集   * @author Administrator   *   */  public class CharsetEncodingFilter implements Filter {      private String encoding;       public void destroy() {      }      public void doFilter(ServletRequest request, ServletResponse response,              FilterChain chain) throws IOException, ServletException {          System.out.print("刚刚进来");             //设置字符集          request.setCharacterEncoding("GB18030");          //继续执行          chain.doFilter(request, response);          System.out.print("好了,结束了");      }      /**       * @param filterConfig可以用来读取filter里头的参数       */      public void init(FilterConfig filterConfig) throws ServletException {          this.encoding = filterConfig.getInitParameter("encoding");          System.out.print("encoding"+encoding);      }  }  
复制代码

2. 在 web.xml 文件中配置

<?xml version="1.0" encoding="UTF-8"?>  <web-app version="2.4"       xmlns="http://java.sun.com/xml/ns/j2ee"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    <display-name></display-name>    <!--   告诉tomcat去找那个filter -->    <filter>      <filter-name>CharsetEncodingFilter</filter-name>  <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>      <!-- 在filter里头传入参数 -->      <init-param>          <param-name>encoding</param-name>          <param-value>GBK</param-value>      </init-param>    </filter>  <!--  告诉哪个filter对哪些个servlet起作用  -->    <filter-mapping>      <filter-name>CharsetEncodingFilter</filter-name>      <url-pattern>*.jsp</url-pattern>    </filter-mapping>  </web-app>      
复制代码


  1. 然后在页面加载的时候,就可以看到 filter 的效果了。

​三、Integer 与 int 的种种比较你知道多少?

     如果面试官问 Integer 与 int 的区别:估计大多数人只会说到两点:Ingeter 是 int 的包装类,注意是一个类;int 的初值为 0,Ingeter 的初值为 null。但是如果面试官再问一下 Integer i = 1;int ii = 1; i==ii 为 true 还是为 false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱。所以我对它们进行了总结,希望对大家有帮助。

     首先看代码:


 package cn.edu.ujn.test;public class integereTest {/** * @param args */public static void main(String[] args) {int i = 128;Integer i2 = 128;Integer i3 = new Integer(128);// Integer会自动拆箱为int,所以为trueSystem.out.println(i == i2);System.out.println(i == i3);System.out.println("**************");Integer i5 = 127;// java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);Integer i6 = 127;System.out.println(i5 == i6);// trueInteger _i5 = 128;Integer _i6 = 128;System.out.println(_i5 == _i6);//falseInteger ii5 = new Integer(127);System.out.println(i5 == ii5); // falseInteger i7 = new Integer(128);Integer i8 = new Integer(128);System.out.println(i7 == i8); // false}}
复制代码

首先,11 行和 12 行输出结果都为 true,因为 Integer 和 int 比都会自动拆箱(jdk1.5 以上)。

     16 行的结果为 true,而 19 行则为 false,很多人都不动为什么。其实 java 在编译 Integer i5 = 127 的时候,被翻译成-> Integer i5 = Integer.valueOf(127);所以关键就是看 valueOf()函数了。只要看看 valueOf()函数的源码就会明白了。JDK 源码的 valueOf 函数式这样的:


public static Integer valueOf(int i) {        assert IntegerCache.high >= 127;       if (i >= IntegerCache.low && i <= IntegerCache.high)           return IntegerCache.cache[i + (-IntegerCache.low)];       return new Integer(i);   }
复制代码


     看一下源码大家都会明白,对于-128 到 127 之间的数,会进行缓存,Integer i5 = 127 时,会将 127 进行缓存,下次再写 Integer i6 = 127 时,就会直接从缓存中取,就不会 new 了。所以 16 行的结果为 true,而 19 行为 false。

     对于 21 行和 24 行,因为对象不一样,所以为 false。

     实际运行情况如下:

 

我对于以上的情况总结如下:

       ①无论如何,Integer 与 new Integer 不会相等。不会经历拆箱过程,i7 的引用指向堆,而 new Integer()指向专门存放他的内存(常量池),他们的内存地址不一样,所以为 false(如 L24)。

       ②两个都是非 new 出来的 Integer,如果数在-128 到 127 之间,则是 true(如 L18),否则为 false(如 L18)。java 在编译 Integer i2 = 128 的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而 valueOf()函数会对-128 到 127 之间的数进行缓存。

       ③两个都是 new 出来的,都为 false(如 L27)。

      ④int 和 integer(无论 new 否)比,都为 true,因为会把 Integer 自动拆箱为 int 再去比(如 L13、L14)。

     1.Java 里面“==”与 equals()的区别:前者比较的是地址,后者比较的是内容。

     2.int 是在栈里创建的,Integer 是在堆里创建的。栈里创建的变量要比在堆创建的速度快得多。

     3.


发布于: 刚刚阅读数: 6
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
Java进阶(三十三)java基础-filter_Java_No Silver Bullet_InfoQ写作社区