struts2的动作类的创建和配置详解(核心)
一、创建动作类
1.使用普通方式javaBean作为Action动作类,不需要继承任何父类,也不需要实现接口。
(1)方法一定是public公用的
(2)返回值一定是字符串,用来决定跳转到哪个视图
(3)不需要参数。
(4)方法名自定义,如果不自定义的话,有默认的方法名叫execute
package action;
public class HelloWorld {
public String Hello() {
return "success";
}
/*
* 当请求没有绑定方法的时候自动找execute默认的方法
* */
public String execute() {
System.out.println("我TM要搞IT");
return "success";
}
}
2.创建动作类实现接口com.opensymphony.xwork2.Action
Action接口中提供一些常量
package action;
import com.opensymphony.xwork2.Action;
public class HelloWorld02 implements Action {
/*
* 实现Action中的默认方法
* */
@Override
public String execute() throws Exception {
System.out.println("IT分杯羹");
return "ok";
}
}
3.创建动作类继承父类com.opensymphony.xwork2.ActionSupport(推荐使用)
package action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld03 extends ActionSupport {
public String helloAs() {
return super.SUCCESS;
}
}
二、配置动作类:
<package name="hello" extends="struts-default" namespace="/person">
<!--
name:必须指定在一个包中唯一
class:当前action所在的动作类
method:当前action要访问的方法
-->
<action name="as" class="action.HelloWorld03" method="helloAs">
<result name="success">
/index.jsp
</result>
</action>
</package>
三、Action动作类的生命周期
创建:Action动作类每次请求的时候都会创建一个实例对象。
销毁:当前Action动作类的请求响应完之后,就消失了。
跟javaweb中的HttpServletRequest的生命周期是一样的,struts2是多例的,线程安全的。
四、action动作类的访问
1.通配符
原则:约定优于配置
在action中每一个方法有一定的规则,都已User结尾
<action name="*" class="action.HelloWorld04" method="{1}helloLife">
<result name="success">
/{1}index.jsp
</result>
</action>
注意:以下这种,在同一个package中,只能有一个这种通配符
<action name="*_*" class="action.HelloWorld04" method="{1}_{2}">
<result name="success">/{1}{2}.jsp</result>
</action>
五、动态方法调用struts2的动作类
首先开启动态方法调用的开关
package action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld04 extends ActionSupport {
/*
* 默认构造器
* */
public HelloWorld04() {
System.out.println("开始工作");
}
public String helloLife() {
System.out.println("我正在工作");
return super.SUCCESS;
}
}
<struts>
<!-- 启用动态方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="hello" extends="struts-default" namespace="/person">
<action name="hello5" class="action.HelloWorld04" >
<result name="success" >/index.jsp</result>
</action>
</package>
</struts>
这是我们的action的动作类不需要在指定方法的method属性了,而在url上指定语法: “!方法名[.后缀名]”
例: http://localhost:8080/struts2/person/hello5!HelloWorld04.do
六、结果视图的配置
<result name="ok" type="">/index.jsp</result>
result:要返回的视图
name:action动作类要返回的值,如果返回的值匹配上了当前的name的值,就跳转到相应的页面
type:跳转的方式:
dispatcher:请求转发,相当于javaweb中的forward,特点:地址栏不变,在我们不指定type的时候默认是这个
redirect:页面重定向,地址栏变化
chain:请求转发到action动作类,地址栏不发生变化
<package name="hello" extends="struts-default" namespace="/person">
<action name="hello5" class="action.HelloWorld04" >
<result name="success" type="chain">hello6.do</result>
</action>
<action name="hello6" class="action.HelloWorld04" >
<result name="success" >/index.jsp</result>
</action>
</package>
redirectAction:重定向到一个action的动作类,地址栏变化
同包内的重定向
<package name="hello" extends="struts-default" namespace="/person">
<action name="hello5" class="action.HelloWorld04" >
<result name="success" type="redirectAction">hello6.do</result>
</action>
<action name="hello6" class="action.HelloWorld04" >
<result name="success" >/index.jsp</result>
</action>
</package>
不同包内的重定向,result需要通过param来指定namespace和actionname
<package name="hello" extends="struts-default" namespace="/person">
<action name="hello5" class="action.HelloWorld04" >
<!-- <result name="success" type="chain">hello6.do</result>-->
<!-- 指定命名空间-->
<result name="success" type="chain">
<param name="namespace">/person2</param>
<!-- 重定向action的name-->
<param name="actionName">hello6</param>
</result>
</action>
</package>
<package name="hello2-2" extends="struts-default" namespace="/person2">
<action name="hello6" class="action.HelloWorld04" >
<result name="success" >/index.jsp</result>
</action>
</package>
stream:文件的上传下载
七、局部结果视图和全局的结果视图
在一个action中配置的result是局部的结果视图,外部的action是不能使用这个result
包内的全局结果视图配置对于每一个action动作类都有效
<package name="hello2-2" extends="struts-default" namespace="/person2">
<!--包级别的结果视图-->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="hello6" class="action.HelloWorld04" >
<result name="success" >/index.jsp</result>
</action>
</package>
在整个系统中的全局的结果视图(通过继承的方式实现)
<!-- 定义一个公用的包,继承struts-default-->
<package name="basePackage" extends="struts-default" abstract="true">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
</package>
<package name="hello2-2" extends="basePackage" namespace="/person2">
<action name="hello6" class="action.HelloWorld04" >
<result name="success" >/index.jsp</result>
</action>
</package>