深入讲解Struts2的用法

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链接起来。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值