`

Struts2基本原理

阅读更多
框架可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。

基本流程:
1. 客户端浏览器发出HTTP请求
2. 根据web.xml配置,该请求被FilterDispatcher接收
3. 根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Action。
4. Action调用业务逻辑组件处理业务逻辑,包含表单验证。
5. Action执行完毕,根据structs.xml中的配置找到对应的返回结果result,并跳转到相应页面
6. 返回HTTP响应到客户端浏览器

工作原理:
1. 客户端发起一个指向servlet容器的请求(如:Tomcat)
2. 这个请求会经过几个过滤器,到达FilterDispatcher过滤器
3. FilterDispatcher是struts2的核心,在处理用户请求时,它和请求一起相互配合访问struts2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里面的相关层数,并转换成相应的类,如:ConfigurationManager, ActionMapper 和 ObjectFactory。 ConfigurationManager存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中得所有对象(如:Action,result,interceptors等)都是通过ObjectFactory来创建的。过滤器会通过ActionMapper类来查找请求中需要用到的Action。
4.如果找到需要调用Action,过滤器会把请求交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManger询问框架的配置文件,找到需要调用的Action类。
5. ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,表示了Action的执行状态,或者说控制Action的执行步骤。它持有Action实例和所有的Interceptor。
6. ActionInvocation实例使用命名模式来调用。在ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。通过ActionInvocation.invoke()方法按序调用所有的Interceptor后,调用Action的实现。并在返回时,再次调用Interceptor。
7. Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(不总是,也可能是另一个Action链)一个需要被表示的JSP或者FreeMarker的模板。在表示中的过程中可以使用struts2框架中的标签。



完整步骤与类的调用过程

1.客户端发送一个HTTP请求,tomcat接收后,查看web.xml,找到配置文件中的FilterDispatcher

2.FilterDispatcher中包含了ConfigurationManager和ActionMapper对象,ConfigurationManger中含有struts.xml, default-struts.xml等配置文件中得信息,ActionMapper中含有Action的信息。ActionMapper会查找本次请求需要调用的Action。如果没有找到就执行静态的资源请求。如果找到了action,就会调用dispatcher中得serviceAction方法。

在serviceAction方法中,会通过容器的反射机制获得ActionProxyFactory对象,通过工厂模式的方式创建一个ActionProxy实例。然后调用ActionProxy的execute方法。

3.struts调用的ActionProxy类为StructActionProxy,其中包含一个ActionInvocation对象,ActionProxy就调用ActionInvocation的invoke()方法。

4.默认调用的是DefaultActionInvocation类。ActionInvocation中持有从ActionMapper中获得的与本次请求相关的action类的信息,如namespace,name,需要调用的方法名method等。还持有与这个Action相关的所有Interceptor(protected Iterator<InterceptorMapping> interceptors;一个迭代器)。

在invoke方法中,会依次调用每一个Interceptor,实现方式是:
首先,判断迭代器是否还有下一个Interceptor(hasNext()方法),如果有就获得这个Interceptor调用它的intercept()方法,该方法的参数就是ActionInvocation本身。在Interceptor中又会再一次调用ActionInvocation的invoke方法,使得ActionInvocation能够调用下一个Interceptor。这样就完成了在调用Action之前的全部拦截工作。在调用完成全部的Interceptor之后,ActionInvocation开始调用Action。

在invokeAction()方法中,通过反射机制来获得需要调用的method方法
method = getAction().getClass().getMethod(methodName, EMPTY_CLASS_ARRAY);

其中:methodName是方法名,EMPTY_CLASS_ARRAY是常量Object[],说明该方法没有参数。
然后调用这个method方法:  methodResult = method.invoke(action, EMPTY_OBJECT_ARRAY); 并返回结果集


ActionInvocation根据结果集从配置文件中找到对应的返回结果。


由于invokeAction()方法是在最后一个Interceptor中调用ActionInvocation的invoke方法中被调用的,因此程序返回到最后一个Interceptor中,此时Interceptor就可以在请求返回时进行拦截操作。最后一个Interceptor返回的是倒数第二个Interceptor中调用invoke方法处,以此类推,就实现了与请求进入时顺序相反的拦截操作。例如ExceptionInterceptor拦截器的实现:在请求进入前给请求加上try/catch异常捕获块,在请求返回时,处理异常。


try{
    result =  invocation.invoke();
}catch(Exception e){
      … //异常处理操作。
}
  • 大小: 109.4 KB
分享到:
评论

相关推荐

    struts1 mvc基本原理

    NULL 博文链接:https://diaochenlong2.iteye.com/blog/1830592

    struts2工作原理

    从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是...

    struts2的基本实现原理

    个人实现的struts2的execute的基本步骤。希望大家参考指教

    struts2 学习重点笔记

    这是学习struts2时记得重点笔记,包括了一些原理,ognl语句的编写,以及如何设置拦截器等等一些基本知识,起到复习和巩固的作用

    struts2完整版

    完整指南struts2 从struts2的基本配置 到深入学习运行原理

    Struts1工作原理浅析.doc

    Struts1工作原理浅析 1.引入struts1 2.struts1工作原理 3.struts1工作机制 4.struts1的安装于基本配置 5.ActionServlet

    struts运行基本原理(详细)

    struts实现简单登录

    struts实现简单登录实例,体会struts的基本原理。

    Struts2入门教程(全新完整版)

    十二、总结 本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例。 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图...

    struts2+cas单点登陆例子

    myEclipse下含源码,在struts2下集成cas实现单点登陆的例子,例子虽然简单,基本上反映出cas的工作原理!

    struts 基本原理和添加数据库

    今天在搞ssh中的一个,strut,感觉这个框架还是不错的!以后可以好好的利用,用来找工作!

    Struts框架的原理的实现

    对struts的原理实现。做到了和struts的功能基本一样,但肯定没有struts那么完善,毕竟是个人完成的。

    struts2-core-2.3.31.jar

    该漏洞与Apache Struts2 (S2-045)远程代码执行漏洞原理基本相同,均是由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过发送恶意的数据包,利用该漏洞在受影响服务器上执行任意...

    Struts2练习Demo以及随笔

    Struts的开发步骤、OGNL、ValueStack、Action核心、Result基本原理、Struts2核心标记库、Struts2拦截器、自定义拦截器、UI标记、非UI标记、资源文件国际化等等实例全面使用。

    仿写 struts2 实现

    根据Struts2的基本原理,实现了struts2的的基本功能,资源包括了具体的实现代码

    struts2讲义_吴峻申

    5.1 Struts2标签使用原理解疑 73 5.2 OGNL表达式语言介绍 75 5.3 Struts2控制标签简介 79 5.3.1 append标签使用介绍 79 5.3.2 generator标签使用介绍 80 5.3.3 if、else、elseif标签使用介绍 81 5.3.4 iterator标签...

    struts2学习ppt

    掌握Struts2原理、基本配置及使用 掌握Struts2核心解析、国际化、类型转换、输入校验、OGNL、Struts2标签库 了解AJAX技术支持 掌握文件的上传与下载。 深入理解MVC与Struts之间的关系,并使用基本MVC和Struts进行项目...

    struts运行基本实现

    对struts的运行原理进行了简单的实现希望对大家有所帮助,不足之处还请大家指正

    struts的教程.doc

    Struts framework的工作原理和组件 7 Struts ActionServlet控制器对象 8 Struts Action Classes 8 Struts Action Mapping 9 使用ActionForward导航 10 Struts ActionForm Bean捕获表单数据 11 Struts的其他...

Global site tag (gtag.js) - Google Analytics