(三)struts2之ActionSupport

(三)struts2之ActionSupport之前在第一个示例中,使用到的Acrtion是没有继承任何方法的,仅仅提供一个execute的方法和返回字符串值,那么就目前的主流开发来说,用到的关于Struts2的Action还是必须要继承ActionSupport的,从而能够更方便的操作CURD的操作,这一点跟struts中使用DispactherAction有些相似。具体示例index.jspJava代码

之前在第一个示例中,使用到的Acrtion是没有继承任何方法的,仅仅提供一个execute的方法和返回字符串值,那么就目前的主流开发来说,用到的关于Struts2的Action还是必须要继承ActionSupport的,从而能够更方便的操作CURD的操作,这一点跟struts中使用DispactherAction有些相似。


具体示例

index.jsp


Java代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”><%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>  
  2. <html>  
  3.   <head>  
  4.     <title>index page</title>  
  5.   </head>  
  6.   <body>  
  7.     <a href=“msg/delete.action”>删除</a>  
  8.     <a href=“msg/findbyid.action”>查找</a>  
  9.     <a href=“msg/update.action”>更新</a>  
  10.     <a href=“msg/add.action”>新增</a>  
  11.   </body>  
  12. </html></span></span>  

 注意看下这里的href中连接都是多加了msg


success.jsp


Java代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”><%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>  
  2. <html>  
  3.   <head>  
  4.     <title>Success Page</title>  
  5.   </head>  
  6.   <body>  
  7.   <font color=“blue” size=“7”>${msg}</font>   
  8.   </body>  
  9. </html></span></span>  

 

继承自ActionSupport的MsgAction.java


Java代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”>package com.javacrazyer.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class MsgAction extends ActionSupport {  
  6.     private static final long serialVersionUID = -805771504597006480L;  
  7.     private String msg;  
  8.   
  9.     public String getMsg() {  
  10.         return msg;  
  11.     }  
  12.   
  13.     public void setMsg(String msg) {  
  14.         this.msg = msg;  
  15.     }  
  16.     public String add(){  
  17.         msg=“新增成功”;  
  18.         return SUCCESS;  
  19.     }  
  20.     public String delete(){  
  21.         msg=“删除成功”;  
  22.         return SUCCESS;  
  23.     }  
  24.     public String update(){  
  25.         msg=“更新成功”;  
  26.         return SUCCESS;  
  27.     }  
  28.     public String findbyid(){  
  29.         msg=“查找成功”;  
  30.         return SUCCESS;  
  31.     }  
  32.       
  33. }</span></span>  

 src/struts.xml


Java代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”><?xml version=“1.0” encoding=“UTF-8” ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     “-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN”  
  4.     “http://struts.apache.org/dtds/struts-2.1.7.dtd”>  
  5.   
  6. <struts>  
  7.     <!– 请求参数的编码方式 –>  
  8.     <constant  name=“struts.i18n.encoding” value=“UTF-8”/>  
  9.     <!– 指定被struts2处理的请求后缀类型。多个用逗号隔开 –>  
  10.     <constant name=“struts.action.extension” value=“action,do,go,xkk”/>  
  11.     <!– 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  –>  
  12.     <constant name=“struts.configuration.xml.reload” value=“true”/>  
  13.     <!– 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  –>  
  14.     <constant name=“struts.devMode” value=“false”/>  
  15.     <!– 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  –>  
  16.     <constant name=“struts.serve.static.browserCache” value=“false” />  
  17.     <!– 指定由spring负责action对象的创建   
  18.     <constant name=“struts.objectFactory” value=“spring” />  
  19.     –>  
  20.     <!– 是否开启动态方法调用 –>  
  21.     <constant name=“struts.enable.DynamicMethodInvocation” value=“false”/>  
  22.       
  23.       
  24.     <!– Struts2中使用包来管理一组Action –>  
  25.     <!– package的属性  
  26.        name:  指定包名。要唯一。方便于其它包的继承。  
  27.        extends: 指定要继承的包名。一般是struts-default  
  28.        namespace: 指定命名空间。不指定时,使用默认命名空间,默认命名空间为“”  
  29.        abstract: 指定是否为抽象包。抽象包中不能有Action的配置。  
  30.      –>  
  31.     <package name=“mystruts” extends=“struts-default” namespace=“/msg”>  
  32.   
  33.         <!– action标签用来注册一个Action.常用属性   
  34.           name: action的名字,用于匹配请求URI。必须的。不能出现“/”  
  35.           class: 指定Action处理类的全限定名。未指定时,默认是ActionSupport。而ActionSupport的execute() 方法默认处理就是返回一个success字符串。  
  36.           method: 指定要调用的处理方法.不指定时,默认调用execute方法  
  37.           converter: 指定本Action类要使用到的转换器的全限定名  
  38.         –>  
  39.         <action name=“*” class=“com.javacrazyer.action.MsgAction” method=“{1}”>  
  40.             <!– result配置结果映射  
  41.                name:指定结果的逻辑名。  
  42.                type: 指定跳转的方式。默认是值dispatcher,表示请求分派。常用还有:redirect(重定向), freemarker(使用模板技术解析目标资源)  
  43.              –>  
  44.             <result name=“success” >/success.jsp</result>  
  45.         </action>  
  46.     </package>  
  47.   
  48. </struts></span></span>  

  上面说到result的配置跳转方式可以为两种,那么如果我配置成这种

<result name=”success” type=”redirect”>/msg1.jsp?id=${id}</result>

 这个id呢,就是MsgAction的属性,那么在msg1.jsp中,我们可想而知,id的值肯定是取不到的,关于为什么取不到值可以看看我之前写过的文章,有介绍重定向和请求分派的区别


相对于一般只需要pakage和action配置的struts.xml来说,这里我们在上面配置了更多信息,具体可根据喜好来选择,不过上面提到建议打开的实际项目中还是要配置上的

  关于package中的namespace一直都是很多人非常头疼的配置,关键是不知道为什么要配置这个,并且配置有什么作用。

  Action的请求URL由两部分组成:包的命名空间+Action的名称

         如:<package … namespace=”/msg”> <action name=”add”..></action></package>

    最匹配的路径:http://server:port/appName/msg/add.action

   下一步搜索的是:http://server:port/appName/add.action

那么为了验证这一句话,我们将index.jsp中的href中的msg都去掉


Html代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”>  <a href=“delete.action”>删除</a>  
  2.     <a href=“findbyid.action”>查找</a>  
  3.     <a href=“update.action”>更新</a>  
  4.     <a href=“add.action”>新增</a></span></span>  

结果发现执行就报错There is no Action mapped for namespace / and action name update. 

对于这个错误只要将namespace去掉就不会报错


也就是说验证了红色字体部分的是对的,得出的结论就是:凡是在package中配置了namespace的[假如值是’/msg’]那么WEB页面对应的链接必须包含这个msg即:http://server:port/appName/msg/xx.action


接下来我们还有一个问题,如果struts.xml中配置了两个package呢,URL将匹配哪个?

在上面的struts.xml中最下方新增下面这段代码


Xml代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”><package name=“yourstruts” extends=“struts-default” namespace=“/msg”>  
  2.       <action name=“*” class=“com.javacrazyer.action.MsgAction2” method=“{1}”>  
  3.             <result name=“success” >/success.jsp</result>  
  4.         </action>  
  5. </package></span></span>  

 

发现这段代码与第一个pakage的唯一区别就是名字不同,里面的action配置形式也完全一样,这样的话到底执行哪个Action呢?

MsgAction2.java


Java代码  
收藏代码

  1. <span style=“font-size: large;”><span style=“font-size: large;”>package com.javacrazyer.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class MsgAction2 extends ActionSupport {  
  6.     private static final long serialVersionUID = -805771504597006480L;  
  7.     private String msg;  
  8.   
  9.     public String getMsg() {  
  10.         return msg;  
  11.     }  
  12.   
  13.     public void setMsg(String msg) {  
  14.         this.msg = msg;  
  15.     }  
  16.     public String add(){  
  17.         msg=“新增成功2”;  
  18.         return SUCCESS;  
  19.     }  
  20.     public String delete(){  
  21.         msg=“删除成功2”;  
  22.         return SUCCESS;  
  23.     }  
  24.     public String update(){  
  25.         msg=“更新成功2”;  
  26.         return SUCCESS;  
  27.     }  
  28.     public String findbyid(){  
  29.         msg=“查找成功2”;  
  30.         return SUCCESS;  
  31.     }  
  32.       
  33. }</span></span>  

 执行后发现结果执行的是MsgAction2.java这个类,如果交换两个package的配置顺序,那么执行结果是会执行原来的MsgAction.java.

由上面的结果我们得出又一个结论,那就是:在struts.xml中,对于多个package配置,如果其配置的namespace相同,extends相同,唯独name不同,并且里面配置的类形式都为

<action name=”*” class=”xxAction” method=”{1}”>

唯独class值不同,那么实际上匹配到的Action会是按从上到下顺序中,最下面的那个package中的action


至于成功页面中为什么${msg}能直接取出来Action中配置的属性[Action的属性知道吧,就是匹配表单元素信息的,所以Struts2的Action还是具有优势的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34301.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注