包装模式简介:
package com.itheima.test; import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader; public class MyBufferedReader extends BufferedReader {//似你 BufferedReader包装类
//针对父类已经是一个包装类的情况下,包装模式可以进一步简化 /*private BufferedReader br;//还有你
private int i=0;
public MyBufferedReader(Reader in) {
super(in);
this.br =(BufferedReader) in;//拜托你
}
@Override
public String readLine() throws IOException {
String str = br.readLine();
if(str==null)
return null;
i++;
return i+" "+str;
}*/ //改下后的
//private BufferedReader br;//还有你
private int i=0;
public MyBufferedReader(Reader in) {
super(in);
//this.br =(BufferedReader) in;//拜托你
}
@Override
public String readLine() throws IOException {
String str = super.readLine();
if(str==null)
return null;
i++;
return i+" "+str;
}
}
先继承同样的接口,然后将接口传进来,通过构造方法
测试
package com.itheima.test; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader; public class WrapperTest { public static void main(String[] args) {
try {
FileReader fr = new FileReader("src/com/itheima/test/MyBufferedReader.java");
BufferedReader br=new BufferedReader(fr);
MyBufferedReader mbr = new MyBufferedReader(br);
String line=null;
while((line=mbr.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
} }
tomcat 的高版本已经解决了get请求的乱码问题,如果要包装的类实现的接口已经有一个包装类了,可以直接继承那个包装类,进行简单的包装,简单包装后直接写需要包装的方法就可以了。
package com.itheima.web.filter; import java.io.IOException;
import java.io.UnsupportedEncodingException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse; /**
* Servlet Filter implementation class CharacterEncodingFilter
*/
public class CharacterEncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp; request.setCharacterEncoding("UTF-8");//post乱码
response.setCharacterEncoding("UTF-8");//添加,有经验
response.setContentType("text/html;charset=UTF-8");//响应时没有乱码 //对于get提交,也要解决??? (Tomcat高版本下对get提交已解决) //调包
MyHttpServletRequest myrequest = new MyHttpServletRequest(request);
chain.doFilter(myrequest, response);
} class MyHttpServletRequest extends HttpServletRequestWrapper{ public MyHttpServletRequest(HttpServletRequest request) {
super(request);
} @Override//改写你
public String getParameter(String name) {
String paramValue = super.getParameter(name);//取参数值
if(paramValue==null)
return null;
//要判断请求类型??? get 就要做乱码处理
String type = super.getMethod();//post get获取提交方式
if(type.equalsIgnoreCase("get")){
//说明要进行乱码处理
try {
paramValue = new String(paramValue.getBytes("iso-8859-1"),"UTF-8");//getBytes(“iso-8859-1”)是使用iso-8859-1编码表进行转换。
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} return paramValue;
}
} public void init(FilterConfig fConfig) throws ServletException { } }