Struts2系列笔记(2)---struts.XML
Struts2.xml
本篇博客主要讲struts.xml中package下的标签和标签属性,主要分以下四个部分说明:
(1)action的配置基本属性
(2)同一个Action类中不同方法满足不同的action逻辑
(3)通配符解决多业务问题
(4)配置处理结果:
(1)action的配置基本属性
1 <!--首先声明本片文章基本还是参考http://www.cnblogs.com/Nouno/p/5683447.html的博客,特此说明--> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <!DOCTYPE struts PUBLIC 4 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 5 "http://struts.apache.org/dtds/struts-2.3.dtd"> 6 <struts> 7 <!-- /primer/helloWorldAction.action 8 package:包 9 * name:包名,唯一的,必选项 10 * namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是"/"。页面中请求连接的前半部分 11 * extends:继承 12 * extends="struts-default":struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件 13 * 为什么要继承这个struts-default.xml文件? 14 * 因为struts2框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈, 15 知道在struts2框架运行时执行struts-default.xml文件中的拦截器栈。 16 * 如果不继承struts-default.xml文件,就没有办法使用struts2框架提供的所有拦截器 17 --> 18 <package name="primer" namespace="/" extends="struts-default"> 19 20 <!-- 21 如果找不到对应的action名的时候,配置默认要执行的action 22 * name:指定action的名称 23 --> 24 <default-action-ref name="error"></default-action-ref>
25 27 <action name="error" class="com.yyc.struts.action.ErrorAction"> 28 <result name="error">/error.jsp</result> 29 </action> 30 <!-- 31 action: 32 * name:对应页面中请求连接的后面半部分,这里表示jsp请求链接为hello.action才会和它匹配 33 * class:对应要执行的类的完整路径 ,表示Action类的完整路径,相当于之前的servlet类 34 *method:对应的class类中要执行的方法,默认执行method="execute()" 35 --> 36 <action name="hello" class="cn.yht.primer.HelloWorldAction" method="execute()"> 37 <!-- 38 result:结果类型 ,可以用来把Action类处理好的数据跳转到某界面 39 * name:对应的是执行的类的方法的返回值 40 public String execute() throws Exception { 41 System.out.println("HelloWorldAction ************* execute()"); 42 return "success"; 43 } 44 * 默认判断name="success",后半部分的文本内容:要转向到的页面 45 --> 46 <result name="success">/primer/success.jsp</result> 47 </action> 48 <!-- 49 没有为action指定class 50 * 在struts2框架底层的struts-default.xml文件中,配置了默认执行的类 51 com.opensymphony.xwork2.ActionSupport 52 public String execute() throws Exception { 53 return SUCCESS; 54 } 55 * 实际上,默认执行的是底层提供的ActionSupport类的execute()方法 56 * result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()方法返回值,进行跳转 57 --> 58 <action name="actionNoClass"> 59 <result name="success">/primer/success.jsp</result> 60 </action> 61 </package> 62 </struts>
(2)同一个Action类中不同方法满足不同的action逻辑
1 <!--这个Action中有两个方法 2 public class ProductAction extends ActionSupport { 3 public String add(){ 4 System.out.println("添加商品"); 5 return NONE; 6 } 7 public String del(){ 8 System.out.println("删除商品"); 9 return NONE; 10 } 11 }--> 12 13 <!-- 多个业务需求 --> 14 <action name="addBook" class="com.guigu.struts.action.BookAction" method="add"></action> 15 <action name="delBook" class="com.guigu.struts.action.BookAction" method="del"></action> 16 <!--这样确实能够实现一个Action类中的不同方法,都能被调用 17 但是你也许会注意到,每调用一个方法都需要配置action-->
(3)通配符解决多业务问题
1 <!--这里是jsp文件 2 <h1>客户管理</h1> 3 <a href="${pageContext.request.contextPath }/customer_add">添加客户</a><br/> 4 <a href="${pageContext.request.contextPath }/customer_del">删除客户</a><br/> 5 <a href="${pageContext.request.contextPath }/customer_edit">修改客户</a><br/> 6 <a href="${pageContext.request.contextPath }/customer_find">查询客户</a><br/> 7 --> 8 <!-- 使用通配符解决多业务问题 --> 9 <!-- method 属性{1}是取第一个* ,这样就只需要写一个action就可以了,我们只要在Action类中写好相对应的方法即可--> 10 <action name="customer_*" class="com.guigu.struts.action.CustomerAction" method="{1}"> 11 <result >/demo1/{1}.jsp</result> 12 </action>
(4)配置处理结果:
Struts2的Action处理用户请求结束后,返回一个普通字符串-逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可让系统转到实际的视图资源。
Struts2通过在struts.xml文件中使用<result …/>元素来配置结果。Struts2提供了两种结果。
a.局部结果:将<result …/>作为<action …>元素的子元素配置。
b.全局结果:将<result …/>作为<global-results …>元素的子元素配置。
在package元素中配置<global-results>子元素:
<!--全局result(global-results) 有很多时候一个<result>可供很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>l。执行顺序:当一个Action返回的String没有相应的<result>与之对应,Struts2就会查找全局的<result>。--> <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>
欢迎大家留言指点!