struts2 action几乎完全吸收了xwork 的精华,近日学习struts 2,总结一下action的配制方法。首先看一下com.opensymphony.xwork2.Action的接口声明,Action提供execute() 方法,子类必须实现execute() 方法。
public interface Action { |
com.opensymphony.xwork2.ActionSupport是com.opensymphony.xwork2.Action的缺省实现,实现了execute()方法。我们开发的Action通常继承com.opensymphony.xwork2.ActionSupport
1.简单的action配置
<action name="logon" class="tutorial.Logon"> |
前台发送调用logon.action的请求,截听器调用默认的execute()方法
2.在开发中通常将多个方法写在一个action中,对于这样action可以采用集中配置方式
2.1.一个方法一个action配制
<action name="delete" class="example.CrudAction" method="delete"> |
2.2通配符方式
2.2.1 *
<action name="*Crud" class="example.Crud" method="{1}"> |
action调用的例子:addCrud.action, deleteCrud.action, updateCrud.action, viewCrud.action
2.2.2 分割符加上*,分割符如:下划线_, 惊叹号!
<action name="crud_*" class="example.Crud" method="{1}"> |
调用方式:crud_add.action, crud_delete.action
<action name="crud!*" class="example.Crud" method="{1}"> |
调用方式:crud!add.action, crud!delete.action
2.3 url pattern: /{model}/{method}.action
“/User/add.action” 调用User的add方法
<action name=”*/*” method=”{2}” |
=========================================================
struts2的配置文件
struts2相关的配置文件有web.xml(必须的),struts.xml(必须的),struts.properties,struts-default.xml,velocity.properties,struts-default.vm。
web.xml: 包含所有必须的框架组件的web部署描述符;
struts.xml:配置包含result/view类型、action映射、拦截器等的struts2的主要配置文件。
struts.properties: 配置struts2的框架属性;
struts.properties 配置文件(此文件放在/WEB-INF/classes/)
此文件包含了一系列的key-value对象,每个key就是一个struts2的属性,value就是一个struts2的属性值。
此配置文件提供了一种改变框架默认行为的机制。其所包含的所有属性都可以在web.xml配置文件中使用"ini-param"标签进行配置,或者在struts.xml文件中使用"constant"标签进行配置。
****************************
struts.xml常用配置使用方法**
****************************
1、<include>标签重用配置文件
如果package,action,interceptor等配置较多时,都放到一个struts.xml中比较不容易维护。
所以需要将struts.xml文件分成多个配置文件,然后在struts.xml文件中使用<include>标签引用这些配置文件。结构清晰,配置文件复用。
例子:
<struts>
<include file="struts1.xml"/>
<package name="" extends="/sturts-default">...</package>
<action name=>..</action>
</struts>
2、action配置
默认情况下,struts2会调用动作类的execute方法,但有时,好几个请求动作对应一个action类中不同的方法。
这种情况下,可以在<action>标签中通过method方法指定要执行的动作类的方法名,并且需要为不同的动作起不同的名字(也叫别名,即name值)。
<action name="my1" class="action2.method.Myaction">
......
</action>
<action name="my2" class="action2.method.Myaction" method="print">
......
</action>
上面2个动作的class属性都指向同一个类,name为他起了2个动作别名,my1和my2.
在每个动作里又指定了要运行的方法名。
下来在action类里一定要有这1个方法print。
package ction2.method
public class Myaction extends ActionSupport{
public String execute() throws Exception{
........这是一般的方法,配合第一个action
}
public String print() throws Exception{
....... 这是第2个action的方法
}
}
除了 在struts.xml中配置别名外,还可以不用修改struts.xml而直接用请求参数来描述指定动作,格式如下:
http://localhost:8080/contextPath/actionName!method.action
通过请求指定动作的详细内容: actionName!method.action
如这个,后面可以这样写:/my2!print.action 即可访问之。
3、请求参数设置
<action name="" class="">
<param name="name">zhengsha</param>
<param name="age">26</param>
<result name="save">/result.jsp</result>
</action>
4、action类中定义相应的setter方法读取此参数,一般不用设置getter方法
public class Myaction extends ActionSupport
{
private String name;
private String age;
public void setName(String name)
{
this.name= name;
}
public void setAge(String age)
{
this.age= age;
}
public String execute() throws Exception
{System.out.println("name is"+name+";age is"+age);}
}
5、result 配置
默认状态下,<result>标签的type属性是"dispatcher",即转发。
如果result的type属性没有定义,struts2会自动将其定义为success。
用户也可以自己设置
<result name="save" type="redirect">/result.jsp</result>
如有一个result被多个<action>使用,这时可以使用<global-results>标签来定义全局的<result>,代码如下:
<struts>
<package name="demo" extends="struts-default">
<global-results>
<result name="print">/result.jsp</result>
</global-results>
<action name="submit" class="...">
如果action里没有相应的result,那struts2就会使用全局的<result>
</action>
</package>
</struts>
6、拦截器配置
struts2拦截器如同servlet里的过滤器,struts2执行action的execute()方法前先执行在struts.xml中配置的拦截器,执行完所有的intercepor方法后,会执行execute方法。
注意:在action里面最后必须一定要引用struts2自带的拦截器缺省堆栈defaltStack,否则出错。
如:
<interceptor-ref name="defaultStack"/>(必须加,否则出错!)
7、package配置
package 可以将逻辑上相关的一组action,result,interceptor等组件分为一组。
package 属性有:
name(必须的) package的表示,为了让其他的package引用
extends(可选的) 从哪个package继承的
namespace(可选的) 下面讲
abstract(可选的) 定义这个package为抽象的,这个package中不需要定义action
namespace 讲解
"/" 表示根namespace,所有直接在应用程序上下文环境下的请求(Context)都在这个package下查找。
""表示默认的namespace。当所有的namespace中都找不到的时候,就在这里找。
例如:
<package name="default">
<action name="bar" class="">...</action>
</package>
<package name="mypack1" namespace="/barspace">
<action name="bar" class="">...</action>
</package>
<package name="mypack2" namespace="/">
<action name="no" class="">...</action>
</package>
a、 如果请求为 /barspace/bar.action ,则查找 “/barspace”,如果找到"bar",则执行相应的 action;如果没找到,就执行默认的namespace。
b、 如果请求为“/no.action”则namespace(“/”)被查找,找到了则执行对应的action,否则执行默认的namespace。
8、action配置
result默认的name为success.
action中的方法通配符
例子:
<action name="*curd" class="" method="{1}"></action>
editcurd action 将调用edit方法,
deletecurd action将调用delete方法。
默认的action
当没有指定action的class属性的时候,默认使用com.opensymphiony.xwork.ActionSupport。
ActionSupport下有2个方法,input 和 execute,每个方法都是简单的返回success。
当请求的action不存在的时候,struts2会返回404错误页面,但我们也可以定义自己的默认页面,使用如下方法:
<package name="hello" extends="action-default">
<default-action-ref name="Under">
<action name="Under">
<result>/error.jsp</result>
</action>
<action name="*">
<result>/{1}.jsp</result>
</action>//每个action将会被映射到以自己名字 命名的 jsp上。
</package>