struts2

struts2的配置
一般不用定义bean.

常量的配置可以在struts.xml、struts.properties、web.xml文件中定义。
搜索顺序为从左至右,如果几个文件出现相同的常量配置,则后面的配置覆盖前面的配置。

包的配置:struts2中的核心组件以包为单位进行组织。父包必须定义在子包前。

命名空间配置:在同一个命名空间里不能有同名的Action,必须以包为单位来指定nameSpace,
若未指定则表示默认的命名空间"",指定命名空间后,Action的处理url为nameSpace/***.action,如果在指定的命名空间中找不到Action,则由默认的命名空间中的Action处理,如果也找不到则报错。

包含配置:struts2允许将一个配置文件分割为多个,通过<include.../>来指定。

拦截器配置:拦截器其实就是AOP的思想,允许在Action处理之前或之后插入自定义的代码。
可以由多个拦截器组成一个拦截器栈,拦截器栈对外表现为一个拦截器。拦截器或拦截器栈用<interceptor.../>来定义。

Struts2的Action
采有低侵入式的设计,不要求继承任何基类或接口。Action直接封装请求中的数据,要求具有与请求参数对应的属性及setter、getter。
struts2为了统一规范提供了Action接口以及ActionSupport实现类用于简化Action的开发。
Struts2提供ActionContext来让Action与容器保持联系。


完成类似于Struts1的DispatchAction的要求
可以采用以下两种方法
1、Struts2中出现了动态方法调用
步骤:
1)设置struts.enable.DynamicMethodInvocation常量为true开启动态方法调用
2)请求格式为Action名!方法名.action

或者用下面这种方式
2、将一个Action类配置为多个逻辑Action,用method指定方法名,这样请求时不会再去调用execute方法,而是用指定的方法名去处理请求。
<action name="action逻辑名" class="Action类名" method="方法名"/>

在配置<action.../>元素时,需要指定name,class和method属性,这3个属性支持通配符。
例如:
<action name="*.Action" class="lee.LoginRegistAction" method="{1}">
如果用户请求loginAction.action,则调用lee.LoginRegistAction类的login方法

<action name="*Action" class="lee.{1}Action">
如果用户请求LoginAction.action,则调用lee.LoginAction的execute方法

<action name="*_*" method="{2}" class="actions.{1}">
如果用户请求Book_save.action,则表示要调用actions.Book类的save方法


实现类似于struts1中的ForwardAction的功能。
<action name="*">
<result>/{1}.jsp</result>
</action>
表示所有的请求都由ActionSupport类的execute方法处理,该方法返回success资源名。该配置表示如果请求a.action则进入a.jsp页面

当用户请求的URL同时匹配多个<action.../>时,由<action.../>的声明次序来顺序匹配,所以应该将<action name="*".../>的配置放在最后。

当用户请求的URL找不到对应的<action.../>时,则使用默认的Action来处理。
<default-action-ref name="simpleViewAction">
...
<action name="simpleViewAction" class="lee.simpleViewAction">
<result.../>
...
</action>


返回处理结果
Action处理完用户请求后,将返回一个普通字符串它代表着一个逻辑视图名。
局部结果:<result.../>放在<action.../>中
全局结果:<result.../>放在<blobal-results.../>中


一个完整的配置
<result name="success" type="dispatcher">
<param name="location">/thank_you.jsp</param>
</result>

可以省略为<result>/thank_you.jsp</result>
如果配置<result.../>元素时没有指定location参数,系统将会把<result>...</result>之间的字符串当成实际视图资源,如果没有指定name属性,则name属性采用默认值:success,如果没有指定type属性,则采用struts2的默认结果类型。

Action处理完请求之后会返回一个字符串用于表示逻辑视图名,该名未与任何视图相关联,直到在<result.../>中配置,struts2支持的视图类型要求实现com.opensymphony.xwork.Result接口,struts2默认提供了一系列的结果类型,在struts-default.xml配置文件中有说明。


几个常用的结果类型
1、redirect结果类型
这种结果类型表示重定向,而默认的dispatcher结果类型表示转发。
用于重定向到一个具体资源。
<result type="redirect">/welcome.jsp</result>

2、redirect-action结果类型
将请求重定向到另一个Action时使用这种结果类型。
指定两个参数:
actionName:指定重定向的Action名。
namespace:指定重定向的Action所在的命名空间。

3.动态结果
<action name="crud_*" class="lee.CrudAction" method="{1}">
<result name="input">/input.jsp</result>
<result>/{1}.jsp</result>
</action>
当请求crud_create.actioin请求时,将调用lee.CrudActionr的create方法来处理请求,处理之后有两种结果:结果字符串为input时转到/input.jsp页面,处理结果为success字符串时,转入create.jsp页面。

配置<result.../>元素时,不仅可以使用${n}表达式形式来指定视图资源,还可以使用${属性名}方式来指定视图资源。其中${属性名}里的属性名就是对应Action实例里的属性。同时可以使用如下的形式${属性名.属性名.属性名}


全局结果
struts2的<result.../>元素配置,也可放在<blobal-results.../>元素中配置。该元素配置了一个全局结果对所有Action都有效。
如果同名,局部结果优先。


struts2的异常处理
可以和struts1一样在execute方法用try..catch...的方式处理,也可以使用声明的方式。
struts2的Action接口中execute方法声明允许抛出一切异常。
为了使用struts2的声明异常处理,要打开struts2的异常映射功能,需要开启一个拦截器。在struts-default.xml中有<interceptor name="exception"..../>
<inerceptor-stack name="defaultStack">
....
<interceptor-ref name="exception"/>
....
</interceptor-stack>

异常处理是通过struts.xml文件中配置<exception-mapping.../>元素完成,配置该元素时,需要指定两个属性:
exception:指定异常类型。
result:转入的结果。

根据<exception-mapping.../>出现的位置又可分为局部异常和全局异常。

输出异常信息
用<s:property value="exception"/>:输出异常对象本身。
用<s:property value="exceptionStack">:输出异常堆栈信息。
为了简化类型转换器的实现,struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是OGNL中的DefaultTypeConverter类的子类。
它提供了两个方法:
convertFromString用于将请求中的字符串转为复合类型。
convertToString用于将复合类型转为字符串输出。


struts2的类型转换
是基于OGNL项目实现的,OGNL提供了一个TypeConverter接口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值