struts2 实现原理解析 (2010-07-27 14:49:36)转载▼标签: filterdispatcherthreadlocalactionproxy杂谈 分类: java和数据库
struts2 操作 action servlet,是通过在web.xml中配置一个filter实现的 <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:现在新版本的struts2已经改成StrutsPrepareAndExecuteFilter,但原理大同小异,我们还按FilterDispatcher讲解
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
而这个Filter FilterDispatcher 实际做了下列工作
public class FilterDispatcher implements StrutsStatics, Filter
1.filter的init()方法建立一个Dispatcher对象
以后struts2 都是围绕这个Dispatcher对象进行操作
init()方法将参数FilterConfig对象传给Dispatcher对象,实际就是将ServletContext对象传递给Dispatcher对象
而ServletContext包含了各种基本Servlet的运行环境,比如ServletContext提供了getAttribute(), setAttribute() 等方法
所以,实际是Dispatcher对象接管了基本Servlet的一切功能
public void init(FilterConfig filterConfig) throws ServletException {
dispatcher = createDispatcher(filterConfig);
...
}
protected Dispatcher createDispatcher(FilterConfig filterConfig) {
...
return new Dispatcher(filterConfig.getServletContext(), params);
}
2.filter的doFilter()方法继续操作前面init()方法建立的作Dispatcher对象,将HttpServletRequest对象和HttpServletResponse对象传入Dispatcher中
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
ServletContext servletContext = getServletContext();
....
dispatcher.serviceAction(request, response, servletContext, mapping);
}
Dispatcher对象是Struts2的核心操作对象,它主要实现实现了下面的工作
1.它是线程安全的,即Dispatcher对象支持多线程,且每线程一副本
public class Dispatcher {
private static ThreadLocal<Dispatcher> instance = new ThreadLocal<Dispatcher>();
//Store the dispatcher instance for this thread.
public static void setInstance(Dispatcher instance) {
Dispatcher.instance.set(instance);
// Tie the ObjectFactory threadlocal instance to this Dispatcher instance
if (instance != null) {
Container cont = instance.getContainer();
if (cont != null) {
ObjectFactory.setObjectFactory(cont.getInstance(ObjectFactory.class));
} else {
LOG.warn("This dispatcher instance doesn't have a container, so the object factory won't be set.");
}
} else {
ObjectFactory.setObjectFactory(null);
}
}
//Provide the dispatcher instance for the current thread.
public static Dispatcher getInstance() {
return instance.get();
}
2.上边说了,Dispatcher对象的建立/构造,是接受了参数FilterDispatcher过滤器的FilterConfig传来的ServletContext,这样才接管了基本Servlet的一切功能
private ServletContext servletContext;
private Map<String, String> initParams;
public Dispatcher(ServletContext servletContext, Map<String, String> initParams) {
this.servletContext = servletContext;
this.initParams = initParams;
}
3. 上边说了,FilterDispatcher过滤器的doFilter()方法,调用了Dispatcher对象的serviceAction()方法,并把HttpServletRequest对象和HttpServletResponse对象传入
这个serviceAction()方法,就是整个Strtus2的主引擎.
serviceAction内部完成了多项功能:
配置文件加载,配置初始化
调用ActionProxy对象实现对Action类的执行
ActionProxy对象又会按照Struts2的Stack结构依次执行Inteceptor,action,method
public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context,ActionMapping mapping) throws ServletException {
Map<String, Object> extraContext = createContextMap(request, response, mapping, context);
// If there was a previous value stack, then create a new copy and pass it in to be used by the new Action
ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
if (stack != null) {
extraContext.put(ActionContext.VALUE_STACK, ValueStackFactory.getFactory().createValueStack(stack));
}
try {
String namespace = mapping.getNamespace();
String name = mapping.getName();
String method = mapping.getMethod();
Configuration config = configurationManager.getConfiguration();
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, extraContext, true, false);
proxy.setMethod(method);
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
// if the ActionMapping says to go straight to a result, do it!
if (mapping.getResult() != null) {
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
// If there was a previous value stack then set it back onto the request
if (stack != null) {
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
}
} catch (ConfigurationException e) {
}
}
- 大小: 17.1 KB
分享到:
相关推荐
【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....
总结来说,学习“Struts内部实现简单实例”有助于开发者深入理解Struts框架的工作原理,提升Web应用开发的效率和质量。通过实践,你可以掌握如何配置struts-config.xml,编写Action和ActionForm,以及如何利用Tiles...
Struts2的工作原理深入探讨了其内部机制和核心组件,对于理解框架如何处理请求、路由到相应的Action以及渲染响应至关重要。 首先,Struts2并非Struts1的简单升级,而是融合了WebWork的核心,因此在设计和工作流程上...
本书《Struts2技术内幕——深入解析Struts2架构设计与实现原理》结合提供的《struts2基础.chm》资料,为我们提供了深入理解Struts2内部机制的机会。 首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器...
Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、模块化和高度结构化的Web应用程序。...通过阅读本书,读者可以深入了解Struts2的内部工作原理,更好地利用这一框架构建高效、稳定的Web应用程序。
总的来说,Struts2的工作原理是通过一系列的过滤器、ActionMapper、ActionProxy、ActionInvocation和拦截器协同工作,实现了对请求的处理、业务逻辑的执行以及视图的渲染。这一系列的流程使得开发者能够专注于业务...
总的来说,Struts2的工作原理是通过一系列的组件协作,实现了从用户请求到业务逻辑处理再到视图展示的完整流程。它通过拦截器机制提供了强大的扩展性,使得开发者可以轻松地插入自定义的行为,增强了应用程序的灵活...
了解Struts的配置和工作原理,有助于开发者更有效地构建和维护Java Web应用,提高开发效率。在实际开发中,还需要掌握如何编写Action类、ActionForm、JSP页面以及配置文件,以实现特定的功能需求。
### Struts2的工作机制原理分析 #### 一、概述 Struts2是Java Web开发领域内的一款重要框架,它在很大程度上改变了Web应用的开发方式。相比于其前辈Struts1.x,Struts2不仅仅是简单的升级,而是进行了全面的革新。...
在“Struts内部测试电影管理系统”中,我们可以推测这是一个使用Struts框架实现的用于管理电影信息的系统。这个系统可能包含了对电影的添加、删除、修改和查询等基本操作。下面我们将深入探讨Struts框架的关键特性...
- **开源性**:作为开源项目,开发者可以深入了解其内部实现机制,进行定制化开发。 - **高效的标记库**:Struts提供的标记库大大提高了开发效率,减少了代码编写量。 - **清晰的系统脉络**:通过配置文件,可以清晰...
实践是学习的最佳途径,通过分析和运行代码,你将更深入地了解Struts2拦截器的内部工作原理。 总的来说,Struts2拦截器是实现业务逻辑复用和控制流管理的强大工具。它们提高了代码的可维护性和可扩展性,使得开发者...
### Struts、Spring、Hibernate工作原理详解 #### Struts 工作原理与应用场景 **Struts** 是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于简化Web应用的开发过程。它利用了JSP和Servlet技术...
这个“Struts2接口文档”是开发者的重要参考资料,提供了关于Struts2框架内各个组件、类库以及接口的详细说明,帮助开发者深入理解框架的内部工作原理并有效地使用其功能。 Struts2的核心组件包括Action、Result、...
Struts 的 MVC 实现是通过 ActionServlet(Controller)、ActionForm(Form State)和 Action(Model Wrapper)组件来工作的。 **Struts 体系结构** 1. **模型(Model)** - **内部状态**:通常由一组 ActionForm ...
为了更好地理解Struts框架的实现原理,你需要对以下几个关键点有深入的理解: 1. MVC模式及其在Struts中的实现。 2. Action和ActionContext的角色及交互。 3. 拦截器的工作原理与自定义拦截器的编写。 4. 结果...
总的来说,通过Struts框架实现文件上传和下载,需要理解其内部的工作原理,合理配置拦截器,注意版本兼容性,并时刻关注安全性与性能。这个源代码项目提供了一个学习和实践的平台,有助于深入理解Struts在处理文件...
**工作原理** 当一个HTTP请求到达服务器,ActionServlet首先捕获这个请求,然后通过struts-config.xml配置文件中的ActionMapping找到对应的Action类实例。Action类执行相应的业务逻辑,并可能修改ActionForm Bean的...
**标题解析:** "重构mvc实现struts框架" 这个标题表明了我们要探讨的主题是关于软件开发中的重构过程,特别关注的是如何从一个简单的MVC(Model-View-Controller)模型出发,逐步演进到实现Struts框架的初步形态。...
Struts2是一个流行的Java Web开发框架,它遵循MVC(Model-View-Controller)设计模式,旨在简化Web应用的开发过程。...通过深入理解Struts2的工作原理和实践,开发者可以构建出高效、稳定和可扩展的Web应用。