对于只需在本Action内有效的Forward,应在Action元素内配置局部Forward.
能过ActionForm可使Action无须从HTTP请求中解析参数,因为所有的参数都被封装在ActionForm中。
ActionServlet拦截到用户的请求后,根据用户的请求,在配置文件中查找对应的Action,Action的name
属性指定了用于封装请求参数的ActionForm;然后ActionServlet将创建默认的ActionForm实例,并调用对应的setter方法完成ActionForm的初始化。
局部Forward作为Action的子元素配置,全局Forward配置在blobal-forwards元素里。
当每个Action在转发时,首先在局部Forward中查找与之对应的Forward对象,如果在局部Forward中找不到对应的Forward对象,才会在全局Forward中查找,局部Forward可以覆盖全局Forward.
表面上看起来,该Action的两个属性只提供了对应的setter和getter方法,很难理解请求参数在什么时候赋值给该Action的属性,事实上,因为Struts2的拦载器机制,它们负责解析用户的请求参数,并将请求参数赋值给Action对应的属性。
为了让Action能处理用户请求,还需要在struts.xml中配置一下,struts.xml文件应当放在classes路径下,该文件主要放置struts2的Action定义,定义struts2 Action时,除了需要指定该Action的实现类外,还需要定义Action处理结果和资源之间的映射关系。
如果struts2版本是2.1以前
web.xml配置过滤器的时候应该是这样:
<web-app>
<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>
</web-app>
如果struts2 版本是2.1.3以上
web.xml配置
<web-app>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
通常,当一个用户登录成功后,需要将用户的用户名添加为HTTPSession
而JSP页页则获取该Action的处理结果,并将全部结果迭代输出。
struts.xml放在src文件目录之下。
<constant name="struts.devMode" value="true" />
在开发模式下使用,这样可以打印出更详细的错误信息。
struts 2.1.6核心包:
commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.8.jar
xwork-2.0.3.jar
commons-fileupload-1.2.1.jar
commons-fileupload-1.2.1.jar这个jar包必须加载,不然会报错:报错内容为“ [Dispatcher] Dispatcher initialization failed Unable to load configuration. ”
再写Action类时, 一定要注意,继承ActionSupport类。
理论上讲,业务逻辑组件,实现业务逻辑方法时,必须实现底层业务持久组件。
Acton类中的成员属性,并不一定用于封装用户的请求参数,也可能是封装了Action需要传入下一个JSP页面的显示属性。
Action的所有属性,都被包装在ValueStack对象中,Action的属性,可以是ValueStack对像中的值。
ActionSupport类是一个工具类,它已经实现了Action接口,除此之外,它还实现了Validateable接口,
提供了数据校验功能,通过继承该ActionSupport类,可以简化Struts2的Action开发。
完成输入校验需要重写validate方法,该方法会在执行系统的execute方法之前执行,如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误,请求将被转发到input逻辑视图处。
Struts2的<s:form/>默认已经提供了输出校验错误的能力。
Struts2允许通过定义配置文件来完成数据校验,Struts2提供了大量的数据校验器,包括表单域校验器和非表单域校验器两种。
Struts2框架由三个部分组成,核心控制品FilterDispatcher,业务控制器和用户实现的业务逻辑组件。在这三个部分里,Struts2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。
Filter会过滤用户请求,如果用户请求以action结尾,该请求将被转入Struts2框架处理。
拦截器负责将HttpServletRequest里的请求数据解析出来,并传给业务逻辑组件Action实例。
MVC框架里的业务控制器会调用模型组件的方法来处理用户请求。也就是说,业务逻辑控制器不会
对用户求求进行任务实际处理,用户请求最终由模型组件负现处理,业务控制器,只是中间负责调度的
调度器。
通常,所有的MVC框架都需要WEB应用加载一个核心控制器,对于Struts2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts2框架。Struts2,将核心控制器设计成Filter而不是一个普通Servlet.
如果Web应用使用了Servlet2.3以前的规范,因为Web应用不会自动加载Struts2框架的标签文件,因此必须在Web.xml文件中配置加载Struts2标签库。
配置加载Struts2标签库的配置片段如下:
<taglib>
<taglib-uri>/s</taglib-uri> //过虑所有s开头的标签,并指定标签库文件位置。
<taglib-location>/WEB-INF/struts-tags.tld</taglib-locaton>
</taglib>
在上面配置片段中,指定了Struts2标签配置文件物理位置 /WEB-INF/struts-tags.tld,因此我们必须
手动复制Struts2的标签库方定义文件。将该文件放置在Web应用的WEB-INF路径下。如果Web应用使用Servlet2.4以上的规范,则无需在web.xml文件中配置标签库定义,因为Servlet2.4规范会自动加载标签库定义文件。
Struts2的标签库定义文件包含在struts2-core-2.1.6.jar文件里,在struts2-core-2.1.6.jar文件的META-INF路径下,包含了一个struts-tag.tld文件,这个文件就是Struts2的标签库定义文件的。
struts2框架将自动加载放在WEB-INF/classes路径下的struts.xml文件。为了避免struts.xml文件过大,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在
struts.xml
不仅如此,Struts2框架提供了一种类似Eclipse的扩展方式,它充许以一种“可挺拔”的方式来安装插件,例如Spring,JSF插件等。它们都提供了一个类似struts2-xxx-plugin.jar的文件,这个文件就是插件安装文件,只要将该文件放在Web应用的WEB-INF/lib路径下,Struts2框架将自动加载该框架。
Struts2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中心的Action映射,以及该Action包含 的Result定义等,除此之外,Struts2框架还包含一个struts.properties文件,该文件定义了Struts2框架的大量属性,可以通过改变属性,来满足应用的需求。
配置Struts2常量值有3个地方1、在struts.properties文件中配置常常2、在Web.xml文件中配置 FilterDispatcher
指定初始化参数来配置常量。3、在Struts.xml文件中使用<constrant../>元素来配置常量。
struts.devMode:设置是否使用开发模式,如果设置为true,可以使应用出错时显示更多的,更友好的
错误提示。
struts.i18n.reload:该常量设置是否每次HTTP请求到达时,系统都重新加载资源文件,默认false,开发阶段设成:ture.
struts.ui.theme:指定视图标签默认的视图主题,默认xhtml.
struts.ui.theme:所需模板文件的位置。
当某个包指定了命名空间后, 该包下所有的Action处理的URL应该是命名空间+Action名。
Struts2还可以显示指定根命名空间,通过设置某个包的namespace="/"来指定根命名空间。
默认命名空间里的Action可以处理任何模块下的Action请求。
拦截器其实就是面向切面编程的编程思想,拦截器充许在Action处理之前或者Action处理结束之后,放入开发者自己定义的代码。
使用拦截器,可以完成如下的操作:
1、进行权限控制。2、跟踪日志,记录每个浏览者所请求的每个Action。3、跟踪系统的性能瓶颈,记录每个Action开始处理和结束处理时间,从而取得耗时较长的Action.
Struts2,也充许将多个拦截器组合在一起,形成一个拦截器栈。
Struts2中,最好定义多个小粒度的拦截器,然后组合成拦截器栈来完成大的功能。进而实现复用性。
定义拦截器栈之前,必须先定义组成。
一旦定义了拦截器和拦截器栈之后,在Action中使用拦截器或拦截哭器栈的方式是相同的。
Action才是应用的核心,Action类里包含了对用户请求的处理逻辑,因此我们也称Action为业务控制器。
Struts2通常直接使用Action来封装HTTP请求超参数,因此Action类里还应该包含与请求参数对应的属性,并且为该属性提供对应的setter与getter方法。
系统不会严格区分Action里哪 个属性是用于封装请求参八的属性,哪个属性是封装处理结果的属性。
由于ActionSupport完全可作为Struts2应用的Action处理类,因此当用户配置Action类没有指定class属性时,系统自动使用ActionSupport类作为默认的Action处理类。
Struts2提供了一个ActionContent类,Struts2的Action可以通过该类来访问ServletAPI。
struts使用包来组织Action,因此,将Action定义是放在包定义下完成的。
class属性并不是必需的,如果我们不为Action指定class属性,系统则默认使用系统的ActionSupport
类。
Action只是一个控制器,它并不直接对用户生成任何响应,所以,Action处理完请求后,Action需要将指定的视图资源呈现给用户。
动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性。
action="action!methodName.action"
对于使用动态方法调用的方法, 该方法的方法明与系统默认的execute方法的方法声明只有方法名不同,其他的如方法参数返回值类型都应该绝对相同的。
在配置<action../>元素时,需要指定name,class和method属性,其中name可以支持通配符,然后可以在
class,method属笥中使用表达式。
<action name="*Action".../>元素不是定义了一个普通Action,而是定义了一系列的逻辑Action,只要用户请求的URL是*Action.action的模式,都可以通过该Actiono类处理,配置该Action元素时,还指定method属性,使用了表达式{1},该表达式的值就是name属性值中第一个*的值。
因为Struts2默认的校验文件命名遵守如下规则:ActionName-validation.xml,即如果有类名为MyAction的Action类,则应该提供名为MyAction-validation.xml文件。
实际上,Struts2不仅可以在class,name属性中使用表达式,还可以在<action.../>元素的<result.../>子元素中使用表达式。如下:
<action name="*">
<result>/{1}.jsp</result>
</action>
如果有URL为abcAction.action的请求,如果Struts.xml文件中有名为abcAction的Action,则一定由该Action来处理用户请求,如果struts.xml文件中没有名为abcAction的Action,则搜寻name属性值匹配abcAction的Action,除非请求的URL与Action的name属性绝对相同,否则将按先后顺序来决定由那个Action来处理用户请求。
因此,我们应该将名为星号的Action配置在最后,否则Struts2将使用该Action来处理所有
Struts2还充许在容器中定义一个默认的Action,当用户请求的URL在容器中找不到对应的Action时,系统将使用默认的Action.配置默认Action通过<default-action-ref.../>元素完成,每个<default-action-ref.../>元素配置一个默认Action.
相对于Strut1框架而言,Struts2的逻辑视图不再是ActionForward对象,而是一个普通字符串,这样的设计更有利于将Action类与Struts2框架分离,提供了更好的代码复用性。
Struts2通过d struts.xml文件中使用<result.../>元素来配置结果,
dispatcher结果类型与redirect结果类型的差别主要就是转发和重定向的差别,重定向会丢失所有的请求参数,请求属性----当然也丢失了Action的处理结果。
动态结果的意思是指配置结果时,指定实际视图资源时使用了表达式语法,通过这种语法可以允许Action处理完用户请求后,动态转入实际的视较长资源。
配置<result.../>元素时,不仅可以使用${1}表达式形式来指定视图资源,还可以使用${属性名}的方式来指定视图资源。${属性名}里的属性名就是对应Action实例里的属性。
如果一个Action里包含了与全局结果里同名的结果,则Action里的局部Action会覆盖全局Action。
采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动。所谓模型驱动,就是使用单独的javaBean实例。贯穿整个MVC流程。属性驱动模式,就是使用Action的属性贯穿整个MVC流程。
对于采用模型驱动的Action而言,该Action必须实现ModelDriven接口。
使用模型驱动时,必须实现ModelDriven接口,也必须实现ModelDriven的getModel方法,该方法用于把Action 与对应的模式实例关联起来。
配置模型驱动的Action与配置属性的Action没有区别。
Struts2的Action,可以对提交上来的String参数,进行自动转换。
大部分时候,我们只使用Struts2提供的类型转换器,以及基于OGNL的类型转换机制,就能满足大部分类型转换需求。
Struts2的类型转换器实际上是基于OGNL实现的,在OGNL项目中有一个TypeConverter接口,这个接口就是实现类型转换器必须实现的接口。实现类型转换器必须实现TypeConverter,不过上面接口是的方法太过复杂,所以用DefaultTypeConverter,通过继承该类来实现自己的类型转换器,重写其convertValue方法。
类型转换器必须重写convertvalue方法,该方法需要完成双向转换。
Struts2中每个Action都有一个校验文件,因此该文件的文件名应该遵守如下规则:
<Action名字>-validation.xml,且该文件应该被保存在与Action class文件相同的路径下。
来源:oschina
链接:https://my.oschina.net/u/208942/blog/68073