倉庫地址: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