s
truts核心是StrutsPrepareAndExe
cuteFilter拦截器,这个拦截器的核心是jdkproxy。
一个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