Struts2的工作机制原理分析及实例
- 格式:docx
- 大小:648.88 KB
- 文档页数:79
Struts2工作原理及配置MyEclips运行第一个Struts2项目配置struts2在MyEclipse中的环境:启动MyEclips(本文使用的版本为8.0GA),在启动时设定工作目录名为D:\test,启动后新建一个Web Project,假如取名为struts2,并在J2EE Specification Level选项中选择Java EE 5.0,单击finish。
建好后把事先下载的struts2程序包(本文使用的版本为2.2.1.1)解压后打开可看到该struts2开发包中有4个文件夹:apps是一些实例文件;docs是帮助文档;lib是开发包;src是开源的源代码。
进入lib文件夹中,选择开发struts2须最小配置的几个包:commons-fileupload-1.2.1.jar(处理文件上传的)、commons-io-1.3.2.jar(是commons-fileupload-1.2.1.jar所依赖的)、commons-logging-1.0.4.jar(关于日志处理的)、ognl-3.0.jar(对象图的表达语言)、struts2-core-2.2.1.1.jar(struts2的核心包)、xwork-core-2.2.1.1.jar(基于xwork的内核)、freemarker-2.3.16.jar()把这个7个jar直接拷贝粘贴到刚才新建的web工程中的:struts2/WebRoot/WEB-INF/lib 中,此时MyEclipse会自动新建一个引用库夹Referenced Libraries,所拷贝的几个包自动进入其中。
修改WebRoot/WEB-INF/web.xml的内容为:<?xml version="1.0"encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepare AndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>该文件是在tomcat启动时就会自动解析的,而该配置是把所有请求都交给org.apache.struts2.dispatcher.ng.filter.StrusPrepareAndExecuteFilter类去处理,而此类是strtus2的类,所以也就把web应用纳入了struts2的范围之内了。
Java面试中常常问到的一个重要的理论
1。
struts2工作原理
(a)用户发送http(httpServletRequest)请求,请求web服务器(Tomcat),web服务器加载web部署描述文件(web.xml),执行过滤器
ActionContextCleanUp,Other filters,filterDispatcher等等ActionContextCleanUp:需要与装饰器(siteMesh)插件一起使用,作用:使用装饰器插件,struts2中Action不再管理Action中属性,使用ActionContextCleanUp来清理Action中属性other filters:其他过滤器(siteMesh)filterDispatcher:struts2核心控制器
注意:过滤器执行是有顺序(同图),值栈在filterDispatcher中创建
(b)filterDispatcher询问ActionMapper是否请求Action,如果不请求Action,就不再实行struts2容器,否则filterDispatcher会调用ActionProxy,ActionProxy通过配置文件管理器(Configuraction Manager)加载struts.xml 配置文件,找到相应Action
(c)ActionProxy会创建Action Invocation对象先执行struts2中相应的拦截器,在行所请求Action
(d)Action Invocation执行Result找到分发页面
(e)(反向)执行struts2中拦截器或拦截器栈
(f) 响应(HttpServletResponse)给客户端
struts2优势:
与Servlet API(Servlet容器)解耦。
Struts2的工作机制分析及实例一、概述本章讲述Struts2的工作原理。
读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。
实际上Struts1.x 与Struts2并无我们想象的血缘关系。
虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。
Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。
本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问/xwork/download.action即可自行下载。
下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。
(图14)二、主要的包和类Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。
从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。
但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。
Struts2(2) 工作原理一、Struts2框架结构Struts2框架按照模块来划分,可以分为Servlet Filters、Struts核心模块、拦截器和用户实现部分。
Struts2框架结构图如图4-1所示。
图4-1 Struts 2框架结构图一个请求在Struts2框架中的处理大概分为以下几个步骤。
①客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)请求。
②请求被提交到一系列(主要是3层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。
注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。
③FilterDispatcher是控制器的核心,就是MVC的Struts2实现中控制层(Controller)的核心。
④F ilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
⑤ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。
例如,用户注册示例将找到UserReg类。
⑥ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。
但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。
struts2原理suts2并不是一个生疏的web框架,它是以Webwork的设计思想为核心,汲取struts1的优点,可以说struts2是struts1和Webwork结合的产物。
struts2 的工作原理图:一个哀求在Struts2框架中的处理分为以下几个步骤:1.客户端发出一个指向servlet容器的哀求(toat);2.这个哀求会经过图中的几个过滤器,最后会到达FilterDiser过滤器。
3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户哀求时,它和哀求一起互相协作拜访struts2 的底层框架结构。
在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。
ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。
在哀求过程中全部的对象(Action,Relts, Interceptors,等)都是通过ObjectFactory来创建的。
过滤器会通过咨询ActionMapper类来查找哀求中需要用到的Action。
4.假如找到需要调用的Action,过滤器会把哀求的处理交给ActionProxy。
ActionProxy为Action的代理对象。
ActionProxy 通过ConfigurationManager咨询框架的配置文件,找到需要调用的Action类。
5.ActionProxy创建一个ActionInvoion的实例。
ActionInvocation在ActionProxy层之下,它表示了 Action的执行状态,或者说它控制的Action的执行步骤。
它持有Action实例和全部的Interceptor。
6.ActionInvocation实例用法命名模式来调用,1. ActionInvocation初始化时,按照配置,加载Action相关的全部Interceptor。
struts2 的工作原理Struts2是一个基于Java的Web应用框架,其核心原理是基于MVC(模型-视图-控制器)模式进行开发。
它的工作原理可以简要概括如下:1. 客户端通过浏览器发送请求至Web服务器,请求的URL映射到Struts2框架的前端控制器(Front Controller)。
2. 前端控制器负责接收请求并进行初步处理,它会根据Struts2配置文件中定义的拦截器(Interceptors)和映射表(Mapping)来确定如何处理请求。
3. 拦截器是Struts2框架中的一个重要组件,用于对请求进行预处理和后处理。
它可以用于验证用户身份、记录日志、数据验证等。
拦截器可以按照一定的顺序链式执行,每个拦截器可以对请求进行修改或决定是否继续执行下一个拦截器。
4. 映射表用于将请求映射到对应的Action(控制器)及其相关方法上。
Struts2框架会根据请求的URL、请求参数等信息进行匹配。
5. Action是Struts2框架中的控制器组件,负责接收请求、处理业务逻辑并生成响应。
在执行Action方法之前,Struts2框架会将请求参数绑定到Action对象的对应属性上。
6. Action执行后,会返回一个结果视图(View)路径或逻辑名。
Struts2框架会根据配置文件中的Result定义,将该结果视图转发或重定向给客户端。
7. 结果视图可以是一个JSP页面、一个HTML文件、一个JSON数据等。
客户端浏览器会接收到结果视图并进行展示。
总的来说,Struts2的工作原理是通过前端控制器接收请求,经过拦截器的预处理和后处理,根据映射表将请求转发给对应的Action进行处理,最后将处理结果返回给客户端浏览器展示。
这种基于MVC模式的设计能够有效地将业务逻辑与用户界面分离,提高了代码的可维护性和可重用性。
Struts2框架的原理和应用1. 什么是Struts2框架Struts2是一个基于Java EE的开源Web应用框架,是Struts框架的升级版。
它通过MVC设计模式实现了Web应用开发的分层,将业务逻辑、数据模型和用户界面分离,使得代码更加清晰、易于维护。
2. Struts2框架的原理Struts2框架的原理主要包括以下几个关键点:MVC设计模式Struts2采用了MVC(Model-View-Controller)设计模式,其中:•模型(Model):负责管理应用程序的数据和业务逻辑。
•视图(View):负责显示数据给用户。
•控制器(Controller):负责处理用户输入、调用模型和视图等。
核心组件Struts2框架包含以下核心组件:•拦截器(Interceptor):负责在请求前后进行统一处理,可以用来进行身份验证、日志记录等操作。
•动作(Action):负责处理用户请求,包括接收请求参数、调用业务逻辑方法等。
•结果(Result):负责生成并返回视图,可以是JSP、Freemarker、JSON等。
•值栈(ValueStack):用于存储Action处理过程中的数据,支持OGNL表达式读取和赋值操作。
•配置文件(struts.xml):用于配置拦截器、动作、结果等,实现URL与处理类之间的映射关系。
工作流程Struts2框架的工作流程如下:1.客户端发送请求到Struts2框架的前端控制器(例如:DispatcherFilter)。
2.前端控制器根据请求的URL找到对应的处理类(Action)。
3.前端控制器将请求参数、上下文信息等传递给Action,同时执行拦截器的前置处理逻辑。
4.Action处理用户请求,并根据业务逻辑生成相应的结果。
5.前端控制器将结果传递给结果组件,选择合适的视图进行渲染。
6.前端控制器将渲染后的视图返回给客户端。
3. Struts2框架的应用Struts2框架在Web应用开发中具有广泛的应用,以下是一些主要的应用场景:1. 构建Web应用程序Struts2框架提供了许多构建Web应用程序的工具和技术,包括表单验证、国际化、文件上传等功能。
struts2 s2-048原理一、概述Struts2 S2-048是Struts2框架中常见的一个错误码,主要涉及到Action 的执行过程。
该错误的出现通常意味着Struts2在处理请求时出现了问题,需要进行深入的分析和排查。
二、原理介绍1. Action执行流程:当一个请求到达Struts2框架时,首先会进行相应的验证和过滤,然后将其传递给相应的Action。
Action是Struts2的核心组件之一,负责处理业务逻辑并返回结果。
在默认情况下,Struts2会按照配置文件中定义的流程来执行Action,即遵循execute()方法的返回值来确定后续的处理。
2. S2-048出现原因:S2-048错误的出现通常是由于Action的execute()方法返回了一个未被定义的异常类型,或者返回了null,导致Struts2的执行流程出现了异常。
此外,配置文件中的错误配置也可能导致该错误的出现。
3. 排查方法:出现S2-048错误时,首先要查看具体的错误信息,了解错误的详细情况。
然后,可以通过检查Action的代码和配置文件,找出可能的问题所在。
常见的排查方法包括查看日志、跟踪请求流转、对比正常情况下的行为等。
三、示例分析以下是一个可能出现S2-048错误的示例代码:Action类:```javapublic class MyAction extends ActionSupport {private String myVariable;public String execute() {try {// some business logic herethrow new Exception("Some business exception");} catch (Exception e) {// handle exception and return null or other result typereturn null;}}}```在上述代码中,execute()方法中抛出了一个异常,但并没有定义该异常的类型,导致Struts2在处理请求时出现了S2-048错误。
Struts2总结1.struts2工作原理:1.服务器端提交请求,容器初始化HttpServletRequest对象2.请求的对象被FilterDispatcher过滤器过滤,FilterDispatcher调用ActionMapper,决定请求是否需要调用某个Action3.如果需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy(Action代理)ActionProxy通过Configuration Manager解析框架的配置文件,找到需要调用的Action 4.Action调用业务逻辑类完成业务逻辑。
在调用Action前后,将调用该Action涉及到的相关拦截器(Interceptor)5.Action执行完毕,ActionInvocation根据struts.xml中的配置找到对应的返回结果(被称为Result)。
返回结果通常是Jsp2.过滤器的配置:<filter><filter-name>FilterDispatcher</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>FilterDispatcher</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.action的写法:1.Action类不需要继承或实现任何父类或接口,2.如果该Action类是通过表单提交调用,且Action类中需要使用表单提交的请求参数,则必须在Action类中声明与表单域的名字对应的变量,并提供getters/setters方法例如:private String name;private int age;public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}3.Action类中必须有一个public String execute(){}方法,该方法将被自动调用,实现控制逻辑,但是可以通过配置修改方法名3.Action的配置:<struts><package name="primer"namespace="/primer"extends="struts-default"><action name="helloWorldAction"class="cn.itcast.primer.HelloWorldAction"><result name="success">/primer/success.jsp</result> </action></package></struts>各个位置的内容解释:<struts><!-- /primer/helloWorldAction.actionpackage:包* name:包名,唯一的,必选项* namespace:命名空间,唯一的,相当于房间号。
struts2的工作原理Struts2是一个基于Java的开源Web应用程序框架,用于快速构建企业级Web应用程序。
它采用了模型-视图-控制器(MVC)架构模式,通过统一的控制器来处理用户的请求,并将结果返回给视图进行展示。
本文将介绍Struts2的工作原理,包括请求的处理流程、组件的作用以及如何配置和使用Struts2。
一、Struts2的请求处理流程1. 客户端发送HTTP请求到服务器。
2. 服务器接收到请求后,将请求交给Struts2的过滤器(StrutsPrepareAndExecuteFilter)进行处理。
3. 过滤器根据请求的URL找到对应的Action,并将请求参数封装到Action的属性中。
4. 过滤器调用Action的execute()方法进行业务逻辑处理。
5. Action执行完毕后,返回一个结果视图。
6. 过滤器根据结果视图的配置,将结果返回给客户端。
二、Struts2的组件作用1. Action:Action是Struts2框架的核心组件,用于处理用户的请求。
每个Action类对应一个业务功能,其中的方法对应不同的请求处理逻辑。
2. Interceptor:Interceptor是Struts2框架的拦截器,用于在Action执行前后进行一些额外的处理。
例如,可以在Interceptor中进行身份验证、日志记录等操作。
3. Result:Result是Struts2框架的结果视图,用于将Action的处理结果展示给用户。
可以配置不同的Result类型,如跳转到指定页面、返回JSON数据等。
4. ValueStack:ValueStack是Struts2框架的数据栈,用于存储Action中的属性。
在页面中可以通过表达式语言访问ValueStack 中的数据。
三、Struts2的配置和使用1. 配置文件:Struts2的配置文件是struts.xml,用于配置Action、Interceptor、Result等组件的相关属性。
struts2核心工作流程与原理收藏这是Struts2官方站点提供的Struts 2 的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤:1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServlet Request)请求。
2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。
注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh 等)、最后到FilterDispatcher。
3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。
下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher 进行初始化并启用核心doFilter其代码如下:1.public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException ...{2. HttpServletRequest request = (HttpServletRequest) req;3. HttpServletResponse response = (HttpServletResponse) res;4. ServletContext servletContext = filterConfig.getServletContext();5. // 在这里处理了HttpServletRequest和HttpServletResponse。
Struts2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。
业务控制器Action 和业务逻辑组件是需要用户来自己实现的。
用户在开发Action 和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher 来使用。
Struts2的工作流程相对于Strutsl要简单,与WebWork框架基本相同,所以说Struts2 是WebWork 的升级版本。
基本扼要流程如下:1、客户端浏览器发出HTTP请求。
2、根据web.xml 配置,该请求被FilterDispatcher 接收。
3、根据struts.xml 配置,找到需要调用的Action 类和方法,并通过IoC 方式,将值注入给Aciton。
4、Action 调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action 执行完毕,根据struts.xml 中的配置找到对应的返回结果result,并跳转到相应页面。
6、返回HTTP响应到客户端浏览器。
Struts 工作机制?为什么要使用Struts?工作机制:Struts 的工作流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml 文件中读取配置信息,把它们存放到各种配置对象当ActionServlet 接收到一个客户请求时, 将执行如下流程.-(1)检索和用户请求匹配的ActionMapping 实例,如果不存在,就返回请求路径失效信息;-(2)如果ActionForm 实例不存在,就创建一个ActionForm 对象,把客户提交的表单数据保存到ActionForm 对象中;-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm 的validate()方法;-(4)如果ActionForm的validate。
struct 2(一) 之基本原理一、基本原理1. 问题如果是前端的静态HTML,处理网页设计的美术人员可以独立设计如果是后端的类,程序设计人员可以独立设计而结合HTML与Java代码的JSP,处理网页设计的美术人员与程序设计人员,必须被彼此加入至视图组件中的逻辑互相干扰,开发一个JSP页面,需要双方不断交流才能够完成,开发人员的学习负担重,他们必须一人了解多个角色的工作以及相关技术。
2. 解决Struts它试图在不同的角度上提供网页设计人员、应用程序设计人员、架构设计人员解决方案,让不同技术的人员可以彼此合作又不互相干扰。
从架构设计人员的角度来看,他只需要做出一些配置与定义,定义后端bean与前端页面的关系。
从网页设计人员的角度来看,St ruts提供了一套像是新版本的HTML标签,但它不是静态的,而是动态的,可以与后端的动态程序结合,但网页设计人员不需要理会后端的动态部份。
从应用程序设计人员的角度来看,他只需要按架构师设计人员的定义,完成后端bean的实现即可。
3. 总的来说,struct就是为了解决前台设计人员与应用程序设计人员的各自工作的解耦,尽量让另一方的工作不影响到另一方工作。
二、使用1. 添加jar包注:struct-spring-plugin.jar这个包是负责struct与spring进行交互,这个包是spring提供的,spring提供的这个jar包是有严谨的版本要求,spring决定是哪一个版本的struct2,配置web.xml:配置struts引擎<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.Struts PrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>3,添加struts.xml到src根目录<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN ""/dtds/struts-2.0.dtd"><struts><package name="demo_struts2" extends="struts-default"><action name="UserLogin" class="erAction"><!-- 定义处理结果和资源之间映射关系。
Struts2工作原理(实例)和Struts工作原理目录Struts2 官方工作流程 (1)Struts2运行原理(实例—详细说明其处理流程) (2)Struts工作原理 (6)Struts2 官方工作流程上图来源于Struts2官方站点,是Struts 2 的整体结构。
1.初始的请求通过一条标准的过滤器链,到达servlet 容器( 比如tomcat 容器,WebSphere 容器)。
2.过滤器链包括可选的ActionContextCleanUp 过滤器,用于系统整合技术,如SiteMesh 插件。
3.接着调用FilterDispatcher,FilterDispatcher 查找ActionMapper,以确定这个请求是否需要调用某个Action。
4.如果ActionMapper 确定需要调用某个Action,FilterDispatcher 将控制权交给ActionProxy。
5.ActionProxy 依照框架的配置文件(struts.xml),找到需要调用的Action 类。
6.ActionProxy 创建一个ActionInvocation 的实例。
ActionInvocation 先调用相关的拦截器(Action 调用之前的部分),最后调用Action。
7.一旦Action 调用返回结果,ActionInvocation 根据struts.xml 配置文件,查找对应的转发路径。
返回结果通常是(但不总是,也可能是另外的一个Action 链)JSP 技术或者FreeMarker 的模版技术的网页呈现。
Struts2 的标签和其他视图层组件,帮助呈现我们所需要的显示结果。
在此,我想说清楚一些,最终的显示结果一定是HTML 标签。
标签库技术和其他视图层技术只是为了动态生成HTML 标签。
8.接着按照相反次序执行拦截器链( 执行Action 调用之后的部分)。
最后,响应通过滤器链返回(过滤器技术执行流程与拦截器一样,都是先执行前面部分,后执行后面部)。
struts2 工作原理
Struts2是一个用于构建Java web应用程序的开源框架。
它的
工作原理可以简单概括为以下几个步骤:
1. 客户端发送请求:当用户在浏览器中访问一个Struts2应用
程序的URL时,客户端会发送一个HTTP请求到服务器。
2. DispatcherServlet接收请求:服务器上运行的Servlet容器
(如Tomcat)接收到HTTP请求后,会通过web.xml配置文
件将请求发送给Struts2的核心组件DispatcherServlet。
3. 动作(Action)处理:DispatcherServlet根据配置文件中的信息,确定请求对应的Action类,并创建该类的实例。
Action是一
个POJO(Plain Old Java Object)类,用于处理具体的业务逻辑。
4. 结果视图(View)解析:Action类中的方法执行完业务逻辑后,会返回一个结果视图。
Struts2的结果视图可以是JSP页面、HTML、JSON等格式。
DispatcherServlet根据配置文件中指定
的结果视图解析器,将结果视图转化为最终的响应内容。
5. 结果响应:DispatcherServlet将最终的响应内容发送给客户端,客户端浏览器会将响应内容渲染并呈现给用户。
在这个过程中,Struts2框架提供了一系列的核心组件来协助
处理请求和响应,包括拦截器(Interceptor)、值栈(ValueStack)、类型转换器(Type Converter)等。
这些组件
能够帮助开发者处理表单提交、数据验证、数据转换等常见的web开发任务,从而简化开发过程。
Struts的运行简单机制:Web.xml启动struts----->*.jsp提交表单(信息输入)--------->struts.xml(由表单的action找到配置信息中action)------>进入相应类的方法进行数据处理----->处理的结果与struts.xml 中result比较,然后跳转相应的页面一:在web.xml中添加过滤器的作用在web.xml中添加这些代码:<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>然后在jsp中添加:<%@taglib uri="/struts-tags" prefix="s" %>作用1:首先你在web.xml中配置过滤器,就相当于启动了struts2,那么就可以用struts的功能作用2:struts2过滤器的目的就是过滤符合要求的请求(如我们配置以action结尾的请求),过滤器接受这些请求后,并自动根据struts.xml配置的信息进行处理(过滤器对常用的操作进行了封装,减少了我们的工作量)二、struts的表单提交1、<s:form action="save.action" method="post" theme="simple">action的名字要与structs中的action名字要一模一样,不然提交的表单找不到相应的action处理Structs中的配置信息<package name="default" extends="struts-default"><action name="save"class="action.SaveAction"><result name="success">/success.jsp</result><result name="error">/index.jsp</result></action></package>在这里我们发现表单的action的名字是save.action而structs中的action名字是save,表面上看起来是不一样的,其实要看web.xml配置只拦截*.action的请求,还是拦截/*的请求,有的两个都行(但看你的html代码可以看出是action=”*.action”)2、struts中有三个主题:simple、ajax、xhtml三、在src下新建struts.xml<struts><package name="default" extends="struts-default"><action name="save" class="action.SaveAction"><result name="success">/success.jsp</result><result name="error">/index.jsp</result></action></package></struts>包名要唯一(一般可默认),后面extend是继承这个类,action的名字要与表单名一致,class是action的物理地址(这个方法在那个包那个类下),后面也可加method(具体执行该类下的那个方法,不写一般默认执行excute这个方法)执行完这个方法后,有返回值,根据返回值跳转到相应的页面注意:如如果在excute 中返回的是ruturn SUCCESS;也就相当于返回的是return "success"字符串就必须在struts.xml中写上对应的"success"<result name="success">/x.jsp</result>当然EORROR 对应的就是"error";字符串当然INPUT 对应的就是"input";字符串当然LOGIN 对应的就是"login";字符串当然NONE 对应的就是"none";字符串。
Struts2的工作机制分析及实例一、概述本章讲述Struts2的工作原理。
读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。
实际上Struts1.x 与Struts2并无我们想象的血缘关系。
虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。
Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。
本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问/xwork/download.action即可自行下载。
下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。
(图14)二、主要的包和类Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。
从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。
但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。
以下是对各包的简要说明:包名说明org.apache.struts2. components 该包封装视图组件,Struts2在视图组件上有了很大加强,不仅增加了组件的属性个数,更新增了几个非常有用的组件,如updownselect、doubleselect、datetimepicker、token、tree等。
另外,Struts2可视化视图组件开始支持主题(theme),缺省情况下,使用自带的缺省主题,如果要自定义页面效果,需要将组件的theme属性设置为simple。
org.apache.struts2. config 该包定义与配置相关的接口和类。
实际上,工程中的xml和properties文件的读取和解析都是由WebWork完成的,Struts只做了少量的工作。
org.apache.struts2.dispatcher Struts2的核心包,最重要的类都放在该包中。
org.apache.struts2.impl 该包只定义了3个类,他们是StrutsActionProxy、StrutsActionProxyFactory、StrutsObjectFactory,这三个类都是对xwork的扩展。
org.apache.struts2.interceptor 定义内置的截拦器。
org.apache.struts2.util 实用包。
org.apache.struts2.validators 只定义了一个类:DWRValidator。
org.apache.struts2.views 提供freemarker、jsp、velocity等不同类型的页面呈现。
下表是对一些重要类的说明:类名说明org.apache.struts2.dispatcher. Dispatcher 该类有两个作用:1、初始化2、调用指定的Action的execute()方法。
org.apache.struts2.dispatcher. FilterDispatcher 这是一个过滤器。
文档中已明确说明,如果没有经验,配置时请将url-pattern的值设成/*。
该类有四个作用:1、执行Action2、清理ActionContext,避免内存泄漏3、处理静态内容(Serving static content)4、为请求启动xwo rk’s的截拦器链。
com.opensymphony.xwork2. ActionProxy Action的代理接口。
com.opensymphony.xwork2. ctionProxyFactory 生产ActionProxy的工厂。
com.opensymphony.xwork2.ActionInvocation 负责调用Action和截拦器。
负责Struts2的配置文件的解析。
com.opensymphony.xwork2.config.providers.XmlConfigurationProvider三、 Struts2的工作机制3.1 Struts2体系结构图Strut2的体系结构如图15所示:(图15)3.2 Struts2的工作机制从图15可以看出,一个请求在Struts2框架中的处理大概分为以下几个步骤:1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
在表示的过程中可以使用Struts2 框架中继承的标签。
在这个过程中需要涉及到ActionMapper。
注:以上步骤参考至网上,具体网址已忘记。
在此表示感谢!3.3 Struts2源代码分析和Struts1.x不同,Struts2的启动是通过FilterDispatcher过滤器实现的。
下面是该过滤器在web.xml文件中的配置:代码清单6:web.xml(截取)<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建议,在对Struts2的配置尚不熟悉的情况下,将url-pattern配置为/*,这样该过滤器将截拦所有请求。
实际上,FilterDispatcher除了实现Filter接口以外,还实现了StrutsStatics接口,继承代码如下:代码清单7:FilterDispatcher结构publicclass FilterDispatcher implements StrutsStatics, Filter {}StrutsStatics并没有定义业务方法,只定义了若干个常量。
Struts2对常用的接口进行了重新封装,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。
以下是StrutsStatics的定义:代码清单8:StrutsStatics.javapublicinterface StrutsStatics {/*** Constant for the HTTP request object.*/publicstaticfinal String HTTP_REQUEST = "com.opensymphony.xwork2.dispatcher.HttpServletRequest";/*** Constant for the HTTP response object.*/publicstaticfinal String HTTP_RESPONSE = "com.opensymphony.xwork2.dispatcher.HttpServletResponse";/*** Constant for an HTTP request dispatcher}.*/publicstaticfinal String SERVLET_DISPATCHER = "com.opensymphony.xwork2.dispatcher.ServletDispatcher";/*** Constant for the servlet context} object.*/publicstaticfinal String SERVLET_CONTEXT = "com.opensymphony.xwork2.dispatcher.ServletContext";/*** Constant for the JSP page context}.*/publicstaticfinal String PAGE_CONTEXT = "com.opensymphony.xwork2.dispatcher.PageContext";/** Constant for the PortletContext object */publicstaticfinal String STRUTS_PORTLET_CONTEXT = "struts.portlet.context";}容器启动后,FilterDispatcher被实例化,调用init(FilterConfig filterConfig)方法。