笔记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
- 笔记action的配置
- struts2笔记(二)action的配置
- struts2系列学习笔记(4)---------------Action的多样化配置之一
- struts2系列学习笔记(5)---------------Action的package配置
- struts2学习笔记----action配置的各项默认值
- Struts2基于注解的Action配置(项目笔记)
- 配置Action---struts2学习笔记
- struts2学习笔记 配置action
- Struts2学习笔记02------Action名称的搜索顺序和Action配置的各项默认值
- Action的配置
- STRUTS2的Action配置
- Action的配置
- struts2的Action配置
- action的配置
- action的配置详解
- action的配置详解
- struts2的action配置
- struts2的Action配置
- JOptionPane应用备忘,基于弹出式密码框
- 迷宫问题中的链式堆栈类的实现
- DNF让假钱变真钱
- 开源数据库连接池 SQL Relay 的安装配置和应用
- Atom (标准)
- 笔记action的配置
- 谈我对攻读计算机研究生的看法
- C#播放背景音乐
- web services入门示例
- WPF 的图表控件的制作
- pku 2533 最长上升子序列
- 电白的ASP.NET网站故障排查手记
- Yacc---Unix/Linux上一个用来生成编译器的编译器
- marquee控制文字或者图片等产生移动效果