02-Struts2的工作流程及配置文件
2struts2中常用的配置文件及result返回类型

1.web.xml文件主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过滤器,它负责初始化整个Struts框架并且处理所有的请求。
这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml 配置文件,还有的会影响struts框架的行为。
除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。
2.struts.xml文件框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。
在通常的应用开发中,我们可能想为每个不同的模块单独配置一个struts.xml文件,这样也利于管理和维护。
这也是我们要配置的主要文件3.struts.properties(参default.properties)在Struts框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。
要改变这些属性,只需在struts.properties文件中指定属性的key和value即可。
属性文件可以放在任何一个包含在classpath中的路径上,但是通常我们都把它放在/WEB-INF/classes目录下面。
我们可以在struts-default.properties文件中找到一个属性的列表。
4.struts-default.xml此文件是struts2框架默认加载的配置文件,它定义了struts2一些核心bean和拦截器,它会自动包含(included)到struts.xml文件中(实质是通过<package extends="struts-default">),并为我们提供了一些标准的配置。
struts2工作流程详解

工作流程一个请求在Struts2框架中的处理大概分为以下几个步骤:1客户端初始化一个指向Servlet容器(例如Tomcat)的请求;2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类6ActionProxy创建一个ActionInvocation的实例。
和"struts2工作流程"有关的java编程小帖士:strong>Locale.setNegativeNumberMode方法的参数。
字段7ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个Action 链)一个需要被表示的JSP或者FreeMarker的模版。
在表示的过程中可以使用Struts2框架中继承的标签。
在这个过程中需要涉及到ActionMapper在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
Struts2的目标很简单--使Web开发变得更加容易。
02_Struts2

struts-test2.xml 被包含的strtus-test2.xml必须是 标准的Struts2配置文件,一样 包含了DTD信息、struts根元素 等信息。
2.5 struts.xml之interceptors
Interceptor允许在Action处理之前或者之后插入自定义的代码。 使用interceptor可以完成如下操作:进行权限控制、跟踪日志、事务管理等。 可以将多个interceptor组合在一起形成一个interceptor stack。 Interceptor配置示例: struts-default.xml片段 片段
struts.xml
显示效果
2.14 动态结果 、全局结果
动态结果
全局结果的作用范围是 当前package下所有的 Action有效。
2.15 模型驱动
在Action中把用户请求数据封装成模型对象,Action需要实现 ModelDriven接口,并实现Object getModel()方法
UserAction.java
2.12 默认Action
用户请求非常简单,不需要系统过多的处理或者只是一个简单的转发,可以通过定义 name为*的Action(该Action应该放在最后定义)实现。
无class属性时默认 class为ActionSupport
Struts2还允许在容器中定义一个默认的Action,当用户请求的URL在容器中找不到 时,系统将使用此Action处理用户请求。
User.java
2.16 异常机制
任何成熟的MVC框架都提供成熟的异常处理机制,当然也可在方法中手动捕获,但这种处理方 式比较繁琐,需要书写当量的catch块,最大的缺点还在于异常处理与代码耦合,一旦需要改变异 常处理方式必须得修改代码。Struts2提供了一种声明式异常处理方式
Struts2工作原理及配置MyEclips运行第一个Struts2项目

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的范围之内了。
Struts2配置文件加载顺序及运行流程

Struts2配置文件加载顺序一、Struts2配置文件加载顺序通过查看StrutsPrepareAndExecuteFilter源码可以得到答案!此处,我们以及清晰了看到了该类加载配置文件的顺序,我们依次围绕标号查看对应方法产生的文件即可。
对应产生文件依次如下:. init_DefaultProperties(); // [1]---- org/apache/struts2/default.properties.. init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml.. init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties.. init_CustomConfigurationProviders(); // [5] ----- 自定义配置提供.. init_FilterInitParameters() ; // [6] ----- web.xml.. init_AliasStandardObjects() ; // [7] ---- Bean加载结论:【前三个是默认的,不用关注,后面三个需要注意】①default.properties该文件保存在struts2-core-2.3.7.jar 中org.apache.struts2包里面(常量的默认值)②struts-default.xml 该文件保存在struts2-core-2.3.7.jar (Bean、拦截器、结果类型)③struts-plugin.xml该文件保存在struts-Xxx-2.3.7.jar (在插件包中存在,配置插件信息)struts-config-browser-plugin-2.3.7.jar里面有④struts.xml该文件是web应用默认的struts配置文件(实际开发中,通常写struts.xml )⑤struts.properties该文件是Struts的默认配置文件(配置常量)⑥web.xml该文件是Web应用的配置文件(配置常量)后加载配置文件中修改的常量的值会覆盖前面配置文件修改的常量的值!二、Struts2运行流程详解1.Struts2的架构图请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。
02Struts2配置详解

Struts 2 Action 2-2
/user!register.action /user!login.action
动态方法调用
作用:减少Action数量 public class UserAction implements Action { 调用UserAction的register()方法 调用UserAction的login()方法 … 使用:actionName!methodName.action public String login() { … 禁用:将属性strutsenableDynamicMethodInvocation设臵为 } false public String register() { … } <action name="user" class="erAction"> } <result name="login">/page/manage.jsp</result> <result name="register">/page/success.jsp</result> <result name="login_input">/page/login.jsp</result> <result name="register_input">/page/register.jsp</result> <result name="error">/page/error.jsp</result> </action> 演示示例:动态方法调用
第二章
Struts2框架的执行流程

Struts2框架的执⾏流程Struts2是⼀个基于MVC设计模式的Web应⽤框架,它本质上相当于⼀个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建⽴模型与视图的数据交互。
⼀.Struts2执⾏流程介绍1.通过浏览器发送⼀个请求2.会被StrutsPrepareAndExecuteFilter拦截(struts2的拦截器作⽤)3.会调⽤strust2框架默认的拦截器(interceptor)完成部分功能4.在执⾏Action中操作5.根据Action中⽅法的执⾏结果来选择来跳转页⾯Result视图⼀般我们将StrutsPrepareAndExecuteFilter 叫做前端控制器(核⼼控制器),只有在web.xml⽂件中配置了这个filter我们的strtus2框架才能使⽤。
<!-- 声明StrutsPrepareAndExecuteFilter --><filter> <filter-name>struts2Filter</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><!-- 拦截访问路径 --><filter-mapping><filter-name>struts2Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>Strtus2的默认拦截器(interceptor),它们是在struts-default.xml⽂件中配置。
struts2核心工作流程与原理

struts2核心工作流程与原理做为一名技术人员,听到太多关于.net和java的比较的话题。
我想对那些技术人员说,请先了解一下什么是java(或者.net)吧,其实你根本不了解。
这是Struts2官方站点提供的Struts 2 的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。
2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。
注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到 FilterDispatcher。
3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。
下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter其代码如下:public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;ServletContext servletContext = filterConfig.getServletContext();// 在这里处理了HttpServletRequest和HttpServletResponse。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2的工作流程及配置文件--- ---Struts2.0的流程图从图中看到Struts2的工作流程如下:1.服务器接收到的请求首先经过一组过滤器链(实际中的其他过滤器可能还包括诸如Spring 的字符过滤器CharactorEncodingFilter、V elocity的过滤器等,一般FilterDispatcher位于过滤器的最后一个执行),过滤器链按照你在web.xml中的配置顺序在接收客户请求时顺序执行,在向客户发送响应时反序执行,Struts2的核心FilterDispatcher在web.xml中的配置如下:<filter><filter-name>setCharactor</filter-name><!-- 配置字符过滤--><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter><filter-name>struts2</filter-name><!-- 配置Struts2过滤器--><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>setCharactor</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>注意:如果你使用的是W ebLogic6.1作为应用服务器,需要使用FilterDispatcherCompatW eblogic61替代FilterDispatcher。
2.请求被送到FilterDispatcher之后,FilterDispatcher会通过其私有静态的属性ActionMapper 询问这个请求是否需要调用Action处理,如果需要调用Action,FilterDispatcher会把请求委托给ActionProxy,ActionProxy调用ActionInvocation查找配置文件中该Action的所有信息,并以这个Action为目标创建代理对象(因为Struts2中的Action由于XWork的设计理念,并没有与Servlet的API被调用,所以如果直接调用Action的实例,那么显然基于HTTP 的请求都将无法传入Action。
Struts2通过创建Action的代理对象,并使用拦截器将HTTP 的请求信息传入代理对象,这是典型的AOP处理方式,这也实现了控制器与Servlet的API 的分离,这是Struts1.x所欠缺的优秀的设计方式),然后执行该Action之前的所配置的所有拦截器,与过滤器相同,在接受请求时,会顺序执行你在配置文件中为该Action配置的拦截器顺序;3.在穿越拦截器之后,就会执行Action,当Action执行完毕,ActionInvocation就要使用result加载结果(可以是JSP、PDF、XML、V elocity、EXCEL、Action等,Struts2为我们提供了丰富的视图模板可以调用),加载完结果之后会再次反向穿越拦截器和过滤器链,将响应结果发送给客户;从上面不难看出,拦截器(Interceptor)是Struts2中非常重要的组成部分,在Struts2中绝大多数功能都是通过配置拦截器实现的,例如防止表单的重复提交、文件上传等等。
在上图中的action与Struts1有很大的不同,Struts1在接收到第一个请求时,会创建Action 实例,将其放到HashMap中,以后的请求会直接返回这个实例,也就是说一个Action的实例是多线程共享的,这样虽然节省了资源,但在Action中应谨慎使用全局变量,因为全局变量是多线程共享的,所以Struts1+Hibernate3+Spring2整合的时候,其中一种方式是把Struts1的Action交给Spring容器管理,我们在Spring的XML文件中用<bean>元素配置Action的时候,Spring建议我们设置singleton=”false”(Spring2.0之后改为scope=”prototype”),也就是一个请求产生一个Action实例!在Struts2中的Action是线程安全的,因为Struts2会为每个请求创建一个Action实例,所以我们可以大胆的使用全局变量。
另外,Struts2的POJO并不要求继承任何类或实现任何接口,Action也不要求继承任何类或实现任何接口,不像Struts1那样要求POJO继承ActionForm或其子类,Action要求继承Action 或其子类。
Struts2都是通过配置文件和拦截器与POJO、Action建立关联,实现了非侵入性,这是优越于Struts1的重要优势!另外要注意的是,最好对Action中的POJO进行初始化,防止空指针异常。
但实际上Struts2建议取消类似于FormBean这样的累赘对象,主张使用POJO代替Action和FormBean,这点和JSF是一致的,在JSF中也是用一个普通的POJO 完成接受表单数据并处理请求的目的。
_______________________________________________________________________________ Struts2的API为两个部分:Struts2 core和Xwork,两个部分分工协作。
Struts2在接受到用户请求时会遍历HttpSession等对象,将所有值装入Action Context Map对象(请求参数会装入值栈ValueStack中的根对象),在Xwork中(也就是Action)操作经过包装的对象,而不是直接操作Servlet的API,这实现了Xwork与Servlet API的分离,大大降低了系统的耦合度,使得逻辑层不依赖于表现层(Web层),因为XWork并不是专为Servlet容器设计的。
注意:关于OGNL的具体部分请参看本教程第四篇的内容。
XWork的API提供了两种访问Servlet的API的方式供我们选择:1.IOC方式,也就是通过setXXX()方法进行依赖注入,这要求我们的Action实现ServletRequestAware、SerlvetResponseAware、SessionAware接口,通过实现接口中的setXXX()方法传递Servlet的API,这是由struts-default.xml的默认拦截器栈中的”servlet-config”拦截器提供的,如下图所示:Struts2默认地会为每个Action配置defaultSatck(因为我们自己定义的package一般都会使用extends=”struts-default”继承struts-default.xml中的name属性为”struts-default”的<package>,这个文件在struts-core-2.0.6,jar的根目录中,大家可以参看API很好的了解这个文件里的东东都是做什么的。
),这是Struts2的默认拦截器栈,里面包含了一组拦截器,通常我们不需要再为Action配置拦截器,因为这些默认的已经足够了!2.非IOC方式,因为每个请求都有一个Action的上下文,所以我们可以使用com.opensymphony.xwork2.ActionContext访问session对象,方法:ActionContext.getContext.getSession().put(“”,””),或者使用ActionContext的子类org.apache.struts2.ServletActionContext的静态方法访问请求、响应等对象,方法:ServletActionContext.getRequest()、ServletActionContext.getResponse()、ServletActionContext.getPageContext(),但一般建议能使用ActionContext完成的功能,尽量不要使用ServlvetActionContext,从包名上就能看出来,ActionContext是XWork是的API,使用装饰过后的Map对象,而ServletActionContext是Struts2的API,使用ServletActionContext无疑是把Servlet的API引入了XWork中。
有人可能会问,那ActionContext使用请求和响应对象不是很方便哦,这很简单,因为你在实际开发中很少在Action中使用request和response对象,使用response无非是利用它的重定向功能,但这个功能使用<result name=”success” type=”redirect”>JSP文件</result>就可以解决了;使用request无非是在请求中设置参数,利用request.setAttribute(“”,””),这个功能完全可以交给POJO哦!你可以在POJO中定义一个变量,向里面传递值,JSP页面上直接取POJO的值就可以了。
3.Struts2的Action是控制器,并不是标准的Servlet,如果我们想在Action结束的时候向客户端输出,我们可以获取HttpServletResponse对象,调用其输出字符流或者字节流的方法,最后加上return null;即可完成。
你也可以使用result的type=stream向客户端写入流,这个会在文件上传和下载中看到!4.当然,我们也可以完全不接触Servlet的API进行操作,而是直接利用ActionContext对象,例如:在JSP中我们可以利用EL表达式进行输出这些值,如下图所示:从上面的图我们可以看出EL表达式可以独立使用,也可以配合JSTL的c:out标签进行输出。