一、走近 filter
我们先看看没有 filter 的时候,整个 web 客户端-服务端的一个流程。
接下来我们再看看引入了 filter 之后的 Uml 图。尝试分析这两者之间的差别。
filter 是在 servlet2.3 规范中加入的。同 servlet 的生命周期相同。
filter 执行过程如下:
看到这里有没有想起我们的数据库结构关于栈的描述,filter 和栈一样,也是按照先进后出的顺序。
filter 其实是对 http 的请求进行过滤,所以有时候完全可以实现页面拦截的功能。它是一种声明式的服务,具有可插拔的能力。
二、filter 应用
继承 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>
复制代码
然后在页面加载的时候,就可以看到 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.
评论