仓库地址: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