1.Struts2提供三种方式访问Servlet API
(1)ActionContext
(2)实现xxxAware接口
(3)ServletActionContext
2.Action搜索顺序
对于URL地址:http://localhost:8080/struts2/path1/path2/path3/student.action
① 判断对应路径(path1/path2/path3/)的namespace的package是否存在;
② 如果不存在此路径的package,则:迭代检查上一级路径对应namespace的package是否存在。如果存在,则到达第③步;否则继续向上寻找,直到根路径“/”。如果直到根路径仍然找不到action,则报错。
③ 如果存在此namespace的package,则:判断action是否存在,如果不存在则报错。
3. 动态方法调用
动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多。
(1)指定method属性
在struts.xml中的action标签中指定method属性,在运行过程中这个action会调用相应类中的对应method属性值的方法。
(2)感叹号方式(此方法不推荐使用)
使用此方式需要在struts.xml中配置常量(constant),常量名为:struts.enable.DynamicMethodInvocation,值为true。配置如下:
<constantname="struts.enable.DynamicMethodInvocation"value="true"></constant>
在一个action后面可添加多个result,访问路径为:action的name属性值 + “!” + result的name属性值。
比如:
<actionname="helloworld"class="study.struts2_study.HelloWorldAction">
<resultname="add">/add.jsp</result>
<resultname="update">/update.jsp</result>
访问路径分别为:…/helloworld!add.action和 …/helloworld!update.action
(3)通配符方式
通过action中的name属性的每个“*”的顺序,指定到{1},{2}…的值。访问相应的URL地址,则会将{1},{2}…中的内容替换为URL地址中 * 的位置的内容,填充到struts.xml的配置文件中,去调用不同的类或方法或返回值或页面。
比如:
<action name="*_*" class="study.struts2_study.{1}Action" method="{2}">
<result name={2}>/{2}.jsp</result>
<result name={2}>/{2}.jsp</result>
<result name={2}>/{2}.jsp</result>
</action>
当访问网址为:…/HelloWorld_add.action时,则会调用study.struts2_study.HelloWorldAction类中的 add 方法,若返回值为 “add”,则会调用 “/add.jsp”。简单说,就是将 {1} 替换为第一个*的值,即HelloWorld,将 {2} 替换为第二个*的值,即add。
4.指定多个配置文件
在 struts 节点内可用 include 标签包含其他的配置文件。
比如:
<struts>
<include file=”login.xml”></include>
</struts>
这里需要注意编码问题。如发生错误,可加上:
<constant name=”struts.i18n.encoding”value=”UTF-8”></constant>
5.默认action
当访问的URL地址不存在时会自动跳转到这个默认的action,进而调用这个action配置的页面。注意此配置需在一个package的所有action之前添加。
配置默认的action需要配置两个节点:(1)default-action-ref;(2)action
其中,default-action-ref中的name属性值需和配置的action中的name属性值相同。
示例配置如下:
<default-action-refname="index"></default-action-ref>
<action name="index">
<result>/error.jsp</result>
</action>
6.struts2后缀
配置struts2拦截的后缀名。
(1)默认struts2拦截“.action”后缀或无后缀名,配置此选项可使struts2拦截“.do”,“.html”等后缀名。
(2)若配置了此选项,且配置值为空,则struts2只会拦截无后缀名的访问,不会拦截“.action”后缀的访问。
(3)若同时配置:值为空和值不为空,则struts2会使值不为空的配置生效,值为空的配置不生效。若配置值中没有“.action”,则struts2也不会拦截“.action”后缀名。
比如,要拦截html和xhtml后缀,可进行如下配置:
<constantname="struts.action.extension" value="html ,jsp"></constant>
其中,struts.action.extension是指定要配置拦截的扩展名的选项,此项不可变。value的值可以添加多个。
7.接收参数
(1)使用Action的属性接收参数
在jsp页面中设置表单接收网页参数,表单的跳转页面参数需和struts.xml文件配置action的节点名相同(如图中的①),跳转后会将表单页面的同名参数赋值给action中的class类中的同名成员变量(如图中的③和④)。此外,还可通过param3[n]的方式指定数组的第n个元素进行赋值。
(2)使用Domain Model接收参数
在jsp页面中设置表单接收网页参数,表单的跳转页面参数需和struts.xml文件配置action的节点名相同(如图中的①),跳转后会将表单页面的同名参数(此处的参数使用Model.param1的方式赋值,(1)是直接赋值)赋值给action中的class类中的同名成员变量(如图中的③和④)。此外,还可通过Model.param3[n]的方式指定Model中数组成员变量的第n个元素进行赋值。
(3)使用Model Driven接收参数
使用 Model Driven方式与第二种方式类似,但是接收类class需实现ModelDriven<>接口并指定泛型为Model参数,且Model需要在接收类中进行实例化,但是网页表单的参数中无需再指定Model参数。此外,还可通过param3[n]的方式指定Model中数组成员变量的第n个元素进行赋值。
(4)返回结果名为input的情况
① 当网页输入的参数强制转换错误时,会自动跳转到name属性值为input的result页面。
② 在覆盖ActionSupport的方法validate() 中,通过addFieldError()方法实现跳转input页面。
8.处理结果类型
Struts2处理流程:
用户请求 --> Struts2框架 --> 控制器(action)--> Struts2框架 --> 视图资源
(1)由action返回到Struts2框架的处理结果是字符串,有利于框架分离,提高了代码的复用性。
(2)com.opensymphony.xwork2.Action内置返回结果的字符串的默认用法:
① SUCCESS:Action正确执行完成,返回相应的视图,success是name属性的默认值;
② NONE:表示Action正确执行完成,但并不返回任何视图;
③ ERROR:表示Action执行失败,返回到错误处理视图;
④ LOGIN:Action因为用户没有登录的原因没有正确执行,将返回该登录视图,要求用户进行登录验证;
⑤ INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证(validate),如果验证没有通过,将自动返回到该视图。
(3)处理结果是通过在struts.xml中使用<result>标签配置结果,根据位置的不同,分为两种结果:
① 局部结果:将<result>节点作为<action>的子节点进行配置;
② 全局结果:将<result>节点作为<global-result>的子节点进行配置。
(4)result节点的子节点
result节点的子节点<param>具有两个属性:
① location:该属性定义了该视图对应的实际视图资源。
② parse:该属性指定是否可以在实际视图名字中使用OGNL表达式,struts2框架默认该属性为true,即支持OGNL表达式(OGNL :Object-Graph Navigation Language)。
(5)result节点中的type属性
struts2支持多种视图技术,例如JSP、velocity、freemarker等(具体配置可在struts2-core.jar包中的struts-default.xml文件里面的“<package name=”struts-default”abstract=”true”>” --> “<result-types>” --> “<result-type>” 中的name属性查看)。当我们没有定义type的时候,默认值为dispatcher,这个类型支持JSP视图技术。又比如chain是将action和另外一个action链接起来。