1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- /primer/helloWorldAction.action 7 package:包 8 * name:包名,唯一的,必选项 9 * namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是"/"。页面中请求连接的前半部分 10 * extends:继承 11 * extends="struts-default":struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件 12 * 为什么要继承这个struts-default.xml文件? 13 * 因为struts2框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈, 14 知道在struts2框架运行时执行struts-default.xml文件中的拦截器栈。 15 * 如果不继承struts-default.xml文件,就没有办法使用struts2框架提供的所有拦截器 16 --> 17 <package name="primer" namespace="/primer" extends="struts-default"> 18 19 <!-- 20 如果找不到对应的action名的时候,配置默认要执行的action 21 * name:指定action的名称 22 --> 23 <default-action-ref name="helloWorldAction" /> 24 25 <!-- 26 action: 27 * name:对应页面中请求连接的后面半部分 28 * class:对应要执行的类的完整路径 29 --> 30 <action name="helloWorldAction" class="cn.yht.primer.HelloWorldAction"> 31 <!-- 32 result:结果类型 33 * name:对应的是执行的类的方法的返回值 34 public String execute() throws Exception { 35 System.out.println("HelloWorldAction ************* execute()"); 36 return "success"; 37 } 38 * 后半部分的文本内容:要转向到的页面 39 --> 40 <result name="success">/primer/success.jsp</result> 41 </action> 42 <!-- 43 没有为action指定class 44 * 在struts2框架底层的struts-default.xml文件中,配置了默认执行的类 45 com.opensymphony.xwork2.ActionSupport 46 public String execute() throws Exception { 47 return SUCCESS; 48 } 49 * 实际上,默认执行的是底层提供的ActionSupport类的execute()方法 50 * result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()方法返回值,进行跳转 51 --> 52 <action name="actionNoClass"> 53 <result name="success">/primer/success.jsp</result> 54 </action> 55 </package> 56 </struts>
为Action配置method属性:
将Action类中的每一个处理方法都定义成一个逻辑Action方法。
1 <!DOCTYPE struts PUBLIC 2 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 5 "http://struts.apache.org/dtds/struts-2.0.dtd"> 6 7 <struts> 8 9 <package name="my" extends="struts-default" namespace="/manage"> 10 11 <action name="userLogin" class="org.qiujy.web.struts2.action.LoginAction" method="login"> 12 13 <result name="success">/success.jsp</result> 14 15 <result name="error">/error.jsp</result> 16 17 </action> 18 19 20 21 <action name="userRegist" class="org.qiujy.web.struts2.action.LoginAction" method="regist"> 22 23 <result name="success">/success.jsp</result> 24 25 <result name="error">/error.jsp</result> 26 27 </action> 28 29 </package> 30 31 </struts>
如上,把LoginAction中的login和regist方法都配置成逻辑Action。要调用login方法,则相应的把index.jsp中表单元素的action设置为"manage/userLogin.action";要调用regist方法,把regist.jsp中表单元素的action设置为"manage/userRegist.action"。
3.3. 使用通配符映射(wildcard mappings)方式:
在struts.xml文件中配置<action…>元素时,它的name、class、method属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。
当我们使用通配符定义Action的name属性时,相当于用一个元素action定义了多个逻辑Action:
<action name="user_*" class="org.qiujy.web.struts2.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> {1}为配置参数,意思为如: user_*时,则执行时,使用的是方法*, user_a时,则执行时,使用的是方法a。
如上,<action name=”user_*”>定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式{1},表示它的值是name属性值中第一个*的值。例如:用户请求URL为user_login.action时,将调用到UserAction类的login方法;用户请求URL为user_regist.action时,将调用到UserAction类的regist方法。
4. 处理结果
Struts2的Action处理完用户请求后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图资源之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图资源呈现给浏览者。
4.1. 配置处理结果:
Struts2的Action处理用户请求结束后,返回一个普通字符串-逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可让系统转到实际的视图资源。
Struts2通过在struts.xml文件中使用<result …/>元素来配置结果。Struts2提供了两种结果。
l 局部结果:将<result …/>作为<action …>元素的子元素配置。
l 全局结果:将<result …/>作为<global-results …>元素的子元素配置。
在package元素中配置<global-results>子元素:
<global-results> <result name="error">/Error.jsp</result> <result name="invalid.token">/Error.jsp</result> <result name="login" type="redirect-action">Logon!input</result> </global-results>
全局result(global-results)有很多时候一个<result>可供很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>l。执行顺序:当一个Action返回的String没有相应的<result>与之对应,Struts2就会查找全局的<result>。