一.命名空间:namespace
为了解决同一package中的不同action不能出现相同name属性值的问题,即不同package的namespace属性值不同时,就可以实现当前package中action的name属性值与其他package中的action的name属性值相同的情况。例如:JSP代码:struts.xml配置:<a href=”users/addMethod.action?name=zhangsanAdd”>添加</a> <a href=”users/showMethod.action?name=lisiShow”>展示</a>
MethodAction类如下:<package name="default" namespace="/users" extends="struts-default"> <action name="addMethod" class="com.study.test.MethodAction" method="add"> <result name="add">add.jsp</result> </action> <action name="showMethod" class="com. study.test.MethodAction" method="show"> <result name="show">show.jsp</result> </action> </package>
public class MethodAction extends ActionSupport{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String add(){ //其他逻辑代码 return "add"; } public String show(){ return "show"; } }
注:如果处理某个action请求的方法返回值为SUCCESS,那么可以再配置文件的result中省略那么属性,如下:
<result>show.jsp</result><!-- 表示的就是返回值为SUCCESS时进行的操作 -->
二.配置默认action:为了提高用户对访问出错时的体验度,如:404错误
action配置代码如下:一般写在package中的最上方位置:
<default-action-ref name="defaultAction" /> <action name="defaultAction"> <result>error.jsp</result> </action>
三.配置result:根据在struts.xml文件中的不同位置分为全局result和局部result
1.局部result:定义在action中,如下:<action name="showMethod" class="com.study.test.MethodAction" method="show"> <result name="show">show.jsp</result> </action>
2.全局result: 定义在<global-results>中,<global-results>在package中与action同级,对所有的action都起作用。代码如下:上面result的name属性值默认为SUCCESS,所以只会处理返回值为SUCCESS的请求。<global-results> <result> syserror.jsp</result> </global-results>
(1)发起action请求后,需要在struts.xml中查找result时先查找局部result,如果没有查找到,就再去查找全局result,最后没查找到就好报错了。<result name="" type=""></result>
(2)name属性:表示返回的逻辑视图名,默认为SUCCESS。(3)type属性:表示结果处理的方式,默认为dispatcher(请求跳转)常用属性值:type="redirect":表示重定向处理,一般到JSP页面,但是也可以到另一个Action。
type="redirectAction":表示重定向到另一个Action,使用该类型时,需要指定参数param(actionName,namespace)。如下:type="chain":表示将请求下发,下面的代码能够将参数值从addMethod这个action传到showMethod这个action,在showMethod这个action中使用参数后,最终将参数传到delMethod这个action:<action name="addMethod" class="com.study.test.MethodAction"> <result name="add" type="redirectAction"> <param name="actionName">showMethod</param> <param name="namespace">/</param> </result> </action>
(4)配置动态result:*代表一个或者多个任意字符串<action name="addMethod"class="com.study.test.MethodAction"method="add"> <result name="add" type="redirectAction"> <param name="actionName">showMethod</param> <param name="namespace">/</param> <!—使用<param name="参数名">参数值</param>可以将值传递给下一个action,一般建议这样使用,不建议使用<param name="参数名">action名称?参数=值 </param>的方式--> <param name="name">zhangsan</param> </result> </action> <action name="showMethod"class="com.study.test.MethodActio"method="show"> <!— 使用chain可以在当前请求处理完后将请求下发,参数也将传递过去--> <result name="show" type="chain" >delMethod</result> </action>
<action name="*Method"class="com.study.test.MethodActio"method="{1}"> <result name="show">{1}.jsp</result> </action>
四.Struts异常处理:在action配置(struts.xml)中可以捕获在action处理方法中throw抛出的异常。
MethodAction类中show方法可以如下抛出异常:public String show(){ if(name.length() >= 6){ return "showrs"; }else{ throw new RuntimeException("用户名不能少于6位"); } }
1.全局异常处理:作用于当前package的全部action在struts.xml中的package中的 <global-exception-mappings>中配置全局异常处理:
在struts.xml中的package中的<global-results>中配置全局result:<global-exception-mappings> <exception-mapping result="error"exception="java.lang.Exception"/> </global-exception-mappings>
注意:上面result的那么熟悉值与exception-mapping 的result属性值对应。<global-results> <result name="error">error.jsp</result> </global-results>
2.局部异常处理:只作用于当前action
在struts.xml中的package中的action中配置局部异常处理并且配置局部result:<action name="showMethod" class="com.study.test.MethodAction" method="show"> <result name="showrs">show.jsp</result> <result name="error">error.jsp</result> <exception-mapping result="error" exception="java.lang.Exception"/> </action>