笔记action的配置

来源:互联网 发布:淘宝卖食品需要哪三证 编辑:程序博客网 时间:2024/06/11 04:57

struts2框架中每一个Action是一个工作单元。Action负责将一个请求对应到一个Action处理上去,每当一个Action类匹配一个请求的时候,这个Action类就会被Struts2框架调用。



一个Action配置示例:

 


每一个Action可以配置多个result,多个ExceptionHandler,多个Intercepter,但是只能有一个name,这个name和package的namespace来唯一区别一个Action。

每当struts2框架接受到一个请求的时候,他会去掉Host,Application和后缀等信息,得到Action的名字,例如如下的请求将得到Welcome这个Action。
http://www.planetstruts.org/struts2-mailreader/Welcome.action

在一个Struts2应用程序中,一个指向Action的链接通常有Struts Tag产生,这个Tag只需要指定Action的名字,Struts框架会自动添加诸如后缀等的扩展,例如:

  



将产生一个如下的链接的请求:

http://Hostname:post/appname/Hello.action

在定义Action的名字的时候不要使用.和/来明明,最好使用英文字母和下划线。

Action中的方法

Action的默认入口方法由xwork2的Action接口来定义,代码清单为:

 

在配置action元素中如果不指定class属性,struts2框架将使用com.opensymphony.xwork.ActionSupport类完成请求,自动返回success。eg

<action name="hello">

 <result>/hello.jsp</result>

</action>

 

默认得action配置:

 
通常情况下,请求的Action不存在的情况下,Struts2框架会返回一个Error画面:“404 - Page not found”,有些时候或许我们不想出现一个控制之外的错误画面,我们可以指定一个默认的Action,在请求的Action不存在的情况下,调用默认的Action,通过如下配置可以达到要求:

如果用户提交的action请求不存在,struts2会返回一个异常界面,“404-page not found”,如果不想让用户看到这个界面,而是返回一个比较好的提示界面,可以再struts.xml中作如下的配置默认:

<default-action-ref name="NofindAction"></default-action-ref name>

  <action name=NofindAction">

  <result>/NofindAction.jsp</result>

</action>

NofindAction.jsp

<%@ page contentType="text/html;charset=UTF-8"%>

<html>

<head>

<title>hello world</title>

</head>

<body>

Action无法找到!

</body>

</html>

 

除了上面的还可以使用通配符来实现默认配置:

 

<action name="*">

<result>/NofindAction.jsp</result>

</action>

使用“*”来处理所有的*.action的用户请求,在没有指定class属性的情况下,会自动调用ActionSupport类来处理,并自动返回success。

struts2在匹配action的请求的时候,最先匹配与用户action请求完全一致的匹配Action,当没有与用户完全一致的配置时,则按照配置文件顺序来匹配Action,最先找到的Action会被框架多匹配。所以定义配置文件不要把

<action name="*">放在前面,应该近两方在最后。

 

默认的Action
当我们没有指定Action的class属性的时候,例如:
<action name="Hello">
我们默认使用com.opensymphony.xwork.ActionSupport
ActionSupport有两个方法input和execute,每个方法都是简单的返回SUCCESS。

Post-Back Action
可以使用如下画面达到字画面刷新的效果

Action的动态方法调用

 

使用DMI(DynammicMethod Invocation,动态方法)调用同一个Action中的不同业务逻辑方法,一般需要再JSP的表单属性中指定具体的调用方法,一般格式如下:

<form method="post" action="Action名称!方法名称.action">

 

如银行存款和转账

 

 <!--定义BankDMIAction,使用execute处理请求-->
  <action name="BankDMIAction" class="bank.BankDMIAction">
   <result name="success">/bank/Bank_success.jsp</result>
   <result name="input">/bank/Bank_login.jsp</result>
  </action>

Action配置中并没有定义method属性,使用该Action中的execute()方法来处理用户请求.

业务控制器BankDMIAction

package bank;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class BankDMIAction extends ActionSupport {
 // 定义银行账号
 private String account;
 // 定义返回信息
 private String msg;
 // 模拟操作金额
 private double money;

 public String getAccount() {
  return account;
 }

 public void setAccount(String account) {
  this.account = account;
 }

 public String getMsg() {
  return msg;
 }

 public void setMsg(String msg) {
  this.msg = msg;
 }

 public double getMoney() {
  return money;
 }

 public void setMoney(double money) {
  this.money = money;
 }

 // 模拟存款方法
 public String saving() throws Exception {
  // 判断账号、金额是否为空
  if (account != null && !account.trim().equals("") && money > 0) {
   // 返回操作信息
   setMsg("账号" + getAccount() + "存款" + String.valueOf(money));
   return SUCCESS;
  } else {
   return INPUT;
  }
 }

 // 模拟转账方法
 public String transfer() throws Exception {
  // 判断账号、金额是否为空
  if (account != null && !account.trim().equals("") && money > 0) {
   // 返回操作信息
   setMsg("账号" + getAccount() + "转账" + String.valueOf(money));
   return SUCCESS;
  } else {
   return INPUT;
  }
 }

}

Bank_login.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录界面</title>
<s:head />
</head>
<body>
<table>
<form  name="form1" method="post" action="BankDMIAction!saving.action">
  <p>操作账号:
    <label>
    <input name="account" type="text"  />
    </label>
  </p>
  <p>金额:
    <label>
    <input name="money" type="text"  />
    </label>
  </p>
    <input type="submit" name="Submit" value="存款" />
    <input  type="button" value="转账" onClick="transfer();"/>
 </form>
<!-- 定义转账函数 -->
 <script language="javascript">
 function transfer()
 {
 //获得Form表单
 tf=document.forms[0];
 //定义Action
 tf.action="BankDMIAction!transfer.action";
 //提交
 tf.submit();
 }
 </script>
</table>
</body>
</html>

 

前面介绍的动态调用Action中方法的方式是修改用户的请求,采用Action名城!方法名称.action"来实现

还可以用另外一种方法来实现这个功能,就是修改配置文件,定义多个Action名称,不同方法对应不同的Action配置。要配置不同的Action名对应一个Action类的不同方法,必须配置mothod属性。

如上“存款“和“转帐" 两个业务逻辑配置成两个Action,在配置中指定method值,指定method的配置文件

<!--定义BankDMIAction,使用execute处理请求-->
    <!--配置名为Bank_saving的Action,使用saving方法处理请求-->
  <action name="Bank_saving" class="bank.BankDMIAction"
   method="saving">
   <result name="success">/bank/Bank_success.jsp</result>
   <result name="input">/bank/Bank_login.jsp</result>
  </action>
  <!--配置名为Bank_transfer的Action,使用transfer方法处理请求-->
  <action name="Bank_transfer" class="bnak.BankDMIAction"
   method="transfer">
   <result name="success">/bank/Bank_success.jsp</result>
   <result name="input">/bank/Bank_login.jsp</result>
  </action>


Bank_saving Bank_transfer两个Action配置指定了method属性,分别对应Action的saving()和transfer()方法

jsp也得改

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录界面</title>
<s:head />
</head>
<body>
<table>
<!-- 修改action,指向Bank_saving -->
<form  name="form1" method="post" action="Bank_saving.action">
  <p>操作账号:
    <label>
    <input name="account" type="text"  />
    </label>
  </p>
  <p>金额:
    <label>
    <input name="money" type="text"  />
    </label>
  </p>
    <input type="submit" name="Submit" value="存款" />
    <input  type="button" value="转账" onClick="transfer();"/>
 </form>
<!-- 定义转账函数 -->
 <script language="javascript">
 function transfer()
 {
 //获得Form表单
 tf=document.forms[0];
//修改action,Bank_transfer
 tf.action="Bank_transfer.action";
 //提交
 tf.submit();
 }
 </script>
</table>
</body>
</html>

 

 

通配符配置

 

Bank_saving 和Bank_transf配置中如果,使用通配符Bank_*来配置更加方便,再Action配置中,一般需要指定name,class和method属性,这三个属性可以使用通配符。

 

<!--使用通配符配置-->
  <action name="MyBank_*" class="bank.BankDMIAction"
   method="{1}">
   <result name="success">/bank/Bank_success.jsp</result>
   <result name="input">/bank/Bank_login.jsp</result>
  </action>

该配置定义了一系列Action,只要用户请求位MyBank_*.action就可以找到相应的Action.这一系列都指向了bank.BankDMIAction该类种对应的不同方法。method="{1}"表示用户请求MyBank_*.action中的第一个参数。如果用户请求位MyBank_saving.action,那么method=saving;配置文件中可以指定多个通配符,<action name="MyBank_*_*" class="bank.Bank{1}Action"
   method="{2}">那么如果用户请求位MyBank_transfer_cbb.action时,struts2会将action配置翻译为,<action name="MyBank_transfer_cbb" class="bank.BankransferAction"
   method="cbb">

该示例action配置

package bank;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class BankDMIAction extends ActionSupport {
 // 定义银行账号
 private String account;
 // 定义返回信息
 private String msg;
 // 模拟操作金额
 private double money;

 public String getAccount() {
  return account;
 }

 public void setAccount(String account) {
  this.account = account;
 }

 public String getMsg() {
  return msg;
 }

 public void setMsg(String msg) {
  this.msg = msg;
 }

 public double getMoney() {
  return money;
 }

 public void setMoney(double money) {
  this.money = money;
 }

 public String execute() throws Exception {
  return SUCCESS;

 }

 // 模拟存款方法
 public String saving() throws Exception {
  // 判断账号、金额是否为空
  if (account != null && !account.trim().equals("") && money > 0) {
   // 返回操作信息
   setMsg("账号" + getAccount() + "存款" + String.valueOf(money));
   return SUCCESS;
  } else {
   return INPUT;
  }
 }

 // 模拟转账方法
 public String transfer() throws Exception {
  // 判断账号、金额是否为空
  if (account != null && !account.trim().equals("") && money > 0) {
   // 返回操作信息
   setMsg("账号" + getAccount() + "转账" + String.valueOf(money));
   return SUCCESS;
  } else {
   return INPUT;
  }
 }

}

jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录界面</title>
<s:head />
</head>
<body>
<table>
<form  name="form1" method="post" action="MyBank_saving.action">
  <p>操作账号:
    <label>
    <input name="account" type="text"  />
    </label>
  </p>
  <p>金额:
    <label>
    <input name="money" type="text"  />
    </label>
  </p>
    <input type="submit" name="Submit" value="存款" />
    <input  type="button" value="转账" onClick="transfer();"/>
 </form>
<!-- 定义转账函数 -->
 <script language="javascript">
 function transfer()
 {
 //获得Form表单
 tf=document.forms[0];
 //定义Action
 tf.action="MyBank_transfer.action";
 //提交
 tf.submit();
 }
 </script>
</table>
</body>
</html>

 

当然,Action配置中也可以再result元素中使用通配符,

在使用通配符的情况下如何确定校验文件?使用通配符来配置Action,一般可以分为两种情况:

1。配置中,Action对应的class不是固定的,如

<action name="MyBank_*" class="bank.Bank{1}Action" >

这是校验文件可以采用"Action类名-validation.xml“的形式,如用户URL请求为MyBank_ICBC.action,那么对应的action就是Bank ICBC Action- 则相应的校验文件BankICBC Action-validation.xml

2:配置文件中对应一个固定的class

<action name="MyBank_*" class="bank.BankAction" method={1}>

校验文件应该是"Action名称_方法名称-validation.xml"形势。如用户请求位MyBank_ICBC.action,对应的class时BankAction,校验文件位BankAction_ICBC-validation.xml

 

 

 

 

的数据校验文件位MyBank_ICBC.action,

 

 

 


有些时候我们想指定一个Action的多个方法,我们可以做如下两步:

1    建立一些execute签名相同的方法,例如:

Public String forward() throws Exception

2    在Action配置的时候使用method属性,例如:

    <action name="delete" class="example.CrudAction" method="delete">

Action中的方法通配符

有些时候对Action中方法的调用满足一定的规律,例如edit Action对应edit方法,delete Action对应 delete方法,这个时候我们可以使用方法通配符,例如:

<action name="*Crud" class="example.Crud" method="{1}">

这时,editCrud Action的引用将调用edit方法,同理,deleteCrud Action的引用将调用delete 方法。



另外一种比较常用的方式是使用下划线分割,例如:

<action name="Crud_*" class="example.Crud" method="{1}">

这样当遇到如下调用的时候可以找到对应的方法。

"action=Crud_input"  =>  input方法

"action=Crud_delete" =>  delete方法
通配符和普通的配置具有相同的地位,可以结合使用框架的所有其他功能。




默认通配符

<action name="*" >   

<result>/{1}.jsp</result>   

</action>  

 

 

处理结果

Action的处理结果是通过在配置文件中设定result属性来实现的。Action处理执行完毕后,将会返回一个标准的字符串,该字符串在配置文件中对应体格视图资源名称。struts2中的result对应的不仅仅是jsp视图可以是一个Action形成一个Action链。也可以使FreeMarker资源甚至可以通过插件的方式来支持新的视图技术。

 

配置result

配置result的目的就是高速struts2在执行完一个Action后需要系统做什么,

局部result:包含在Action定义中,result属性是一个Action的子元素,其作用范围只能在本Action中

全局result:使用<global-results.../>来定义,其作用范围是所有Action都可以。

 

 <ACTION NAME="Reg" class="user.UserRegAction">

   <result name="success">/user/success.jsp</result>

<result name="input">/user/Reg.jsp</result>

<result name="result_test" type="dispatcher">

     //指定参数location

  <param name="location" >hello.jsp</param>

</result>

对应子元素<param../>可以指定下面两个属性:

.location:该属性指定了视图对应的实际视图资源。

.parse:该属性指定是否在实际视图名字中使用OGNL表达式,struts2默认为true,既支持OGNL.

一般配置可简化为

<ACTION NAME="Reg" class="user.UserRegAction">

   <result name="success">/user/success.jsp</result>

配置省略了type="dispatcher"即默认支持jsp视图。

如果进一步简化

<ACTION NAME="Reg" class="user.UserRegAction">

   <result >/user/success.jsp</result>

上面没有指定result的name,默认success