一、走近 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,所以为true
System.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);// true
Integer _i5 = 128;
Integer _i6 = 128;
System.out.println(_i5 == _i6);//false
Integer ii5 = new Integer(127);
System.out.println(i5 == ii5); // false
Integer 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.
评论