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

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