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的工作流程,深入理解其核心机制。 首先,让我们探讨Struts1的基本架构。Struts1框架的核心组件包括ActionServlet、ActionForm、Action、Tiles以及配置文件(struts-config.xml...
struts项目在jdk1.8环境下报错,提示升级到jdk1.5以上,最后修改了spring这个jar包才解决这个问题。
**标题:“JDK1.4 运行Struts2”** 在Java开发领域,Struts2是一个非常流行的MVC框架,它为构建基于Java Web的应用程序提供了强大的支持。然而,随着时间的推移,JDK版本也在不断更新,从JDK1.4到更现代的版本。...
这是一个详细的Struts工作流程图,里面包含JSP、java(Action、ActionForm等)类
通过这种方式,我们可以理解Servlet的基本工作原理,同时也能体验到框架(如Struts2)带来的便利。不过,这种方法虽然可行,但相比成熟的框架,其复杂度较高,不易维护。在实际开发中,使用成熟的框架能提高开发效率...
在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...
虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...
以下是Struts工作流程的详细说明: 1. **模型(Model)**: 模型层主要负责应用程序的状态管理和业务逻辑处理。在Struts框架中,模型通常由JavaBean或Enterprise JavaBeans(EJB)来实现。JavaBean是简单的Java类...
在模拟实现中,我们可以逐步添加这些功能,以更全面地理解和掌握Struts2的工作流程。 总结来说,模拟Struts2框架的实现主要包括以下几个部分: 1. 创建Action类并定义业务逻辑方法。 2. 配置Action映射,指定...
Struts是Apache软件基金会下的一个开源框架,主要用于构建企业级的Java Web应用程序。DispatcherAction是Struts框架中的核心组件之一,它负责处理用户请求并调度到相应的Action进行业务逻辑处理。在这里,我们将深入...
Struts是Apache软件基金会 Jakarta项目下的一个开源框架,主要用于构建基于Java的企业级Web应用程序。它提供了MVC(Model-View-Controller)设计模式的实现,帮助开发者更好地组织和管理代码,提高开发效率和代码可...
但通过Servlet模拟Struts_MVC,我们可以了解其基本工作流程,这对于理解MVC架构和面试中的相关问题非常有帮助。 总结来说,Servlet模拟Struts_MVC是一个学习MVC模式的好方法,它让我们亲身体验到控制器如何调度模型...
jsp项目开发实录 jsp项目开发实录 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整...
通过以上步骤,我们成功地模拟了Struts责任链的工作流程,并实现了一个简单的AOP机制。这种设计不仅使得代码结构清晰,而且便于维护和扩展,因为每个拦截器都专注于自己的职责,而整个系统的流程则由Struts框架自动...
这个过程可以帮助开发者深入理解Struts1的工作流程,为实际开发打下坚实基础。同时,这也是一种学习和研究框架原理的好方法,能够提升对Web应用程序设计模式的认识。在实际项目中,结合其他现代框架如Spring MVC或...
总结来说,通过Java反射和XML解析,我们可以模拟Struts2的工作流程:解析配置文件,根据请求找到相应的Action,动态调用方法,处理结果。尽管这可能与Struts2的实际实现有所不同,但它可以帮助我们理解框架的核心...
在深入理解Struts2的工作流程之前,我们需要先了解一些基本概念。 1. **MVC模式**: MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑,视图负责显示...
Struts是Apache软件基金会下的一个开源框架,主要用于构建企业级的Java Web应用程序。这个小项目显然是为了帮助开发者理解和实践Struts框架的核心概念和技术。在本文中,我们将深入探讨Struts框架的基本原理、主要...
总结来说,这个实例提供了一个在旧版JDK环境下使用Struts2和Spring构建Web应用的例子,通过它你可以了解到如何在早期的Java环境中实现MVC架构,以及如何利用Spring进行依赖管理和测试。同时,这也是一个很好的历史...
通过实践简单的Struts2模拟代码,可以更好地理解和体验Struts2框架的工作原理和优势。在实际开发中,还需要不断学习和熟悉Struts2的高级特性,如自定义拦截器、类型转换、插件使用等,以提升开发能力。