struts核心是StrutsPrepareAndExecuteFilter拦截器,这个拦截器的核心是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
分享到:
相关推荐
使用servlet模拟struts1的工作原理,解析xml,处理请求,自动封装数据
struts项目在jdk1.8环境下报错,提示升级到jdk1.5以上,最后修改了spring这个jar包才解决这个问题。
这是一个详细的Struts工作流程图,里面包含JSP、java(Action、ActionForm等)类
Struts工作流程
自己模拟实现struts的dispatcherAction 模拟struts DispatcherAction 反射 xml
1. 客户端发送一个请求,...2. ActionSevlet首先调用struts配置文件(struts-config.xml),如果有表单提交,需要自动填充ActionForm Bean(找struts配置文件的),根据请求分派给相应的Action(找struts配置文件的)。
虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...
模拟struts2框架的功能,用java模拟实现struts2的基础功能。
用sevrlet模拟Struts2的简单功能。从拦截请求、解析自定义xml数据文件以及动态生成action的代理去执行目标方法,并实现了简单的日志拦截【interceptor】
模拟Struts责任链工作流及简单AOP实现
jdk1.4下struts2应用实例,自己写的,整合spring,spring测试框架
NULL 博文链接:https://cjiany.iteye.com/blog/909971
jsp项目开发实录 jsp项目开发实录 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整...
利用java反射模拟struts2工作
模拟STRUTS的小项目模拟STRUTS的小项目
Struts2的工作流程及struts2配置文件中各属性的含义
struts2工作流程struts2工作流程struts2工作流程struts2工作流程struts2工作流程struts2工作流程struts2工作流程struts2工作流程struts2工作流程
模拟Struts2拦截器代码,模拟struts2拦截器的实现
使用servlet模拟struts1的工作原理,解析xml,处理请求,自动封装数据
Hibernate、Spring和Struts工作原理及使用理由