一个url请求->拦截器->定位目标action->代理目标action->返回拦截器->目标action->拦截器->跳转页面
1,Action接口
public interface Action { public String execute(); }
2,UserAction
public class UserAction implements Action { private String name; private String password; public String execute() { System.out.println(name); System.out.println(password); return "index.jsp"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3,StrutsPrepareAndExecuteFilter:模拟拦截器类
public class StrutsPrepareAndExecuteFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)res; String url=request.getRequestURL().toString(); String actionName=url.substring(url.lastIndexOf("/")+1, url.lastIndexOf(".")); JDKProxyFactory factory=new JDKProxyFactory(); String result=""; //这里我单为UserAction配置过滤,其实也可以更深的利用配置文件来做过滤,就相当于struts里面配置action标签的配置 if("UserAction".equals(actionName)){ UserAction ua=new UserAction(); Action actionProxy=(Action)factory.createProxyInstance(ua,request,response); result=actionProxy.execute(); } request.getRequestDispatcher(result).forward(request, response); } public void init(FilterConfig arg0) throws ServletException { System.out.println("初始化配置文件"); } }
4,JDKProxyFactory:jdkproxy代理工厂
public class JDKProxyFactory implements InvocationHandler { private Object targetObject;//代理的目标对象 private HttpServletRequest request; private HttpServletResponse response; public Object createProxyInstance(Object targetObject,HttpServletRequest request,HttpServletResponse response){ this.targetObject = targetObject; this.request=request; this.response=response; /* * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器 * 第二个参数设置代理类实现的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法 */ return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Class clz=this.targetObject.getClass(); try { Field[] fields=clz.getDeclaredFields(); for(int i=0;i<fields.length;i++){ Field field=fields[i]; field.setAccessible(true); String name=field.getName(); Object value=request.getParameter(name); if(value!=null){ value=new String(value.toString().getBytes("iso8859-1"),"gb2312"); /** * 得到成员变量类型名,然后做相应的转型,因为value始终是字符型 * String typeName=field.getType().getName(); * if(typeName.equals("int")){ * value=Integer.parseInt(((String)value)); * } */ field.set(this.targetObject, value); } } } catch (Exception e) { e.printStackTrace(); } return method.invoke(this.targetObject, args);//把方法调用委派给目标对象 } }
5,web.xml配置模拟拦截器
<!-- 开始配置struts模拟拦截器 --> <filter> <filter-name>struts2</filter-name> <filter-class>com.fairy.struts.jdkproxy.strutsfilter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- 结束配置struts模拟拦截器 -->
6,测试url
http://ipAdress:port/projectName/UserAction.action?name=xxx&password=yyy