filter使用动态代理解决字符乱码+Servlet使用注解+类加载器

仓库地址:https://gitee.com/DerekAndroid/ProxyServlet.git 

思维导图

2 装饰者模式

1 P接口定义跑步通用功能

package cn.itcast.demo2;

public interface Person 
{
	public void run();
	
}

2 (被装饰者)N是P接口的实现类

package cn.itcast.demo2;

public class NormalPerson implements Person
{

	@Override
	public void run() {
		System.out.println("走.....");
	}

}

3 (操作增强装饰)S引入N进行装饰

package cn.itcast.demo2;

public class SupPerson implements Person
{
	// 被装饰者的引用
	private NormalPerson p;

	public SupPerson(NormalPerson p) {
		this.p=p;
	}
	
	@Override
	public void run() {
		// 这个就是被装饰者以前的方法
		p.run();
		// 增强
		System.out.println("增强了:变成飞...");
	}

}

4使用装饰效果

package cn.itcast.demo2;

import org.junit.Test;

public class Demo 
{
	@Test
	public void test1()
	{
		NormalPerson p=new NormalPerson();
		
		// 假装不知道实现类 但是由需要对普通人的run方法进行增强
		// 装饰者解决这样的需要
					// 条件 : 1 装饰者和被装饰者实现同一个接口   Person
					//   	2 装饰者里面有被装饰者的引用    在我出生的时候,你把你给我 我要对你进行增强
		
		SupPerson sup=new SupPerson(p);
		sup.run();
		
	}
}

filter使用动态代理解决网站字符集码

package cn.itcast.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;


public class MyFilter implements Filter
{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 要增强的方法:request.getParameter
		// 被代理的对象: request
		
		final HttpServletRequest request=(HttpServletRequest)req;
		
		// 动态的生成代理对象
		HttpServletRequest hsr=(HttpServletRequest)Proxy.newProxyInstance(
				request.getClass().getClassLoader(), 
				request.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						
						// 1 判断是否是需要增强的方法 getParameter
						if("getParameter".equals(method.getName()))
						{
							// 知道getParameter使用的是哪个提交方式 
							String m = request.getMethod();
							// 判断是get还是post
							if("get".equalsIgnoreCase(m))
							{
								// 以前方法调用后的乱码
								String s =(String)method.invoke(request, args);
								// 增强--解决乱码
								s=new String(s.getBytes("iso8859-1"),"utf-8");
								return s;
							}
							
							if("post".equalsIgnoreCase(m))
							{
								request.setCharacterEncoding("utf-8");
								
							}
						}
						
						// 如果是别的方法
						return method.invoke(request, args);
					}
				});
		
		// 放行
		chain.doFilter(hsr, response);
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

Servlet使用注解

@WebServlet(name="SD2",urlPatterns={"/sd2"})
public class ServletDemo2 extends HttpServlet {
}

类加载器的组成

package cn.itcast.demo4;

import org.junit.Test;

public class Demo 
{
	@Test
	public void test1()
	{
		// 应用类加载器--java
		ClassLoader cl1 = Demo.class.getClassLoader();
		System.out.println(cl1);//sun.misc.Launcher$AppClassLoader@18b4aac2
		//扩展类加载器--java
		ClassLoader cl2 = sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader();
		System.out.println(cl2);//sun.misc.Launcher$ExtClassLoader@3f99bd52
		
		// 引导类加载器--C语言
		ClassLoader cl3 = String.class.getClassLoader();
		System.out.println(cl3);//null
		//返回的是语言的东西,所有返回的是null
	}

	@Test
    public void test2()
    {
        // 应用类加载器--java
        ClassLoader appClassLoader = Demo.class.getClassLoader();
        System.out.println(appClassLoader);
        //扩展类加载器--java
        ClassLoader extClassLoader = appClassLoader.getParent();
        System.out.println(extClassLoader);
        //引导类加载器--PlatformClassLoader 的父加载器是BootStrap.它是c++实现的,返回null
        ClassLoader parent = extClassLoader.getParent();
        System.out.println(parent);
    }
}

参考:https://juejin.im/post/5df0b9edf265da33b82beb61#heading-12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章