`
Action-人生
  • 浏览: 104795 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

struts内部实现工作原理

阅读更多

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、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....

    struts内部实现简单实例

    总结来说,学习“Struts内部实现简单实例”有助于开发者深入理解Struts框架的工作原理,提升Web应用开发的效率和质量。通过实践,你可以掌握如何配置struts-config.xml,编写Action和ActionForm,以及如何利用Tiles...

    struts2工作原理

    Struts2的工作原理深入探讨了其内部机制和核心组件,对于理解框架如何处理请求、路由到相应的Action以及渲染响应至关重要。 首先,Struts2并非Struts1的简单升级,而是融合了WebWork的核心,因此在设计和工作流程上...

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    本书《Struts2技术内幕——深入解析Struts2架构设计与实现原理》结合提供的《struts2基础.chm》资料,为我们提供了深入理解Struts2内部机制的机会。 首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器...

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、模块化和高度结构化的Web应用程序。...通过阅读本书,读者可以深入了解Struts2的内部工作原理,更好地利用这一框架构建高效、稳定的Web应用程序。

    Struts2工作原理图

    总的来说,Struts2的工作原理是通过一系列的过滤器、ActionMapper、ActionProxy、ActionInvocation和拦截器协同工作,实现了对请求的处理、业务逻辑的执行以及视图的渲染。这一系列的流程使得开发者能够专注于业务...

    struts2工作原理.

    总的来说,Struts2的工作原理是通过一系列的组件协作,实现了从用户请求到业务逻辑处理再到视图展示的完整流程。它通过拦截器机制提供了强大的扩展性,使得开发者可以轻松地插入自定义的行为,增强了应用程序的灵活...

    struts与tomcat的配置与工作原理

    了解Struts的配置和工作原理,有助于开发者更有效地构建和维护Java Web应用,提高开发效率。在实际开发中,还需要掌握如何编写Action类、ActionForm、JSP页面以及配置文件,以实现特定的功能需求。

    Struts2的工作机制原理分析及实例.docx

    ### Struts2的工作机制原理分析 #### 一、概述 Struts2是Java Web开发领域内的一款重要框架,它在很大程度上改变了Web应用的开发方式。相比于其前辈Struts1.x,Struts2不仅仅是简单的升级,而是进行了全面的革新。...

    Struts内部测试电影管理系统

    在“Struts内部测试电影管理系统”中,我们可以推测这是一个使用Struts框架实现的用于管理电影信息的系统。这个系统可能包含了对电影的添加、删除、修改和查询等基本操作。下面我们将深入探讨Struts框架的关键特性...

    Struts、Spring、Hibernate三大框架的原理和优点

    - **开源性**:作为开源项目,开发者可以深入了解其内部实现机制,进行定制化开发。 - **高效的标记库**:Struts提供的标记库大大提高了开发效率,减少了代码编写量。 - **清晰的系统脉络**:通过配置文件,可以清晰...

    struts2拦截器实现原理模拟 2013-8-8

    实践是学习的最佳途径,通过分析和运行代码,你将更深入地了解Struts2拦截器的内部工作原理。 总的来说,Struts2拦截器是实现业务逻辑复用和控制流管理的强大工具。它们提高了代码的可维护性和可扩展性,使得开发者...

    struts、spring、hibernate工作原理.

    ### Struts、Spring、Hibernate工作原理详解 #### Struts 工作原理与应用场景 **Struts** 是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于简化Web应用的开发过程。它利用了JSP和Servlet技术...

    Struts2接口文档

    这个“Struts2接口文档”是开发者的重要参考资料,提供了关于Struts2框架内各个组件、类库以及接口的详细说明,帮助开发者深入理解框架的内部工作原理并有效地使用其功能。 Struts2的核心组件包括Action、Result、...

    struts结构及原理

    Struts 的 MVC 实现是通过 ActionServlet(Controller)、ActionForm(Form State)和 Action(Model Wrapper)组件来工作的。 **Struts 体系结构** 1. **模型(Model)** - **内部状态**:通常由一组 ActionForm ...

    struts源码,更好的理解框架实现原理

    为了更好地理解Struts框架的实现原理,你需要对以下几个关键点有深入的理解: 1. MVC模式及其在Struts中的实现。 2. Action和ActionContext的角色及交互。 3. 拦截器的工作原理与自定义拦截器的编写。 4. 结果...

    struts实现文件上传和下载源代码

    总的来说,通过Struts框架实现文件上传和下载,需要理解其内部的工作原理,合理配置拦截器,注意版本兼容性,并时刻关注安全性与性能。这个源代码项目提供了一个学习和实践的平台,有助于深入理解Struts在处理文件...

    Struts工作原理

    **工作原理** 当一个HTTP请求到达服务器,ActionServlet首先捕获这个请求,然后通过struts-config.xml配置文件中的ActionMapping找到对应的Action类实例。Action类执行相应的业务逻辑,并可能修改ActionForm Bean的...

    重构mvc实现struts框架

    **标题解析:** "重构mvc实现struts框架" 这个标题表明了我们要探讨的主题是关于软件开发中的重构过程,特别关注的是如何从一个简单的MVC(Model-View-Controller)模型出发,逐步演进到实现Struts框架的初步形态。...

    struts2多年工作总结

    Struts2是一个流行的Java Web开发框架,它遵循MVC(Model-View-Controller)设计模式,旨在简化Web应用的开发过程。...通过深入理解Struts2的工作原理和实践,开发者可以构建出高效、稳定和可扩展的Web应用。

Global site tag (gtag.js) - Google Analytics