Struts2 动作类
一、创建动作类
1、使用普通方式 javaBean 作为 Action 动作类,不需要继承任何父类,也不需要实现接口。
- 方法一定是 public 公用的。
- 返回值是字符串用来决定跳转到哪个视图。
- 不需要参数。
- 方法名自定义,如果不自定义的话,有个默认的方法名 execute。
package com.wyx.action;
/**
* action动作类
*/
public class HelloAction
{
public String hello()
{
System.out.println("魏宇轩");
return "success";
}
/**
* 当请求没有绑定方法的时候,默认找execute默认方法
* @return
*/
public String execute()
{
System.out.println("魏宇轩是个好人!");
return "success";
}
}
2、创建动作类实现接口 com.opensymphony.xwork2.Action。
Action 接口中提供了一些常量:
package com.wyx.action;
import com.opensymphony.xwork2.Action;
/**
* action动作类
*/
public class HelloAction1 implements Action
{
/**
* 实现 Action 中的默认方法
*/
@Override
public String execute() throws Exception
{
System.out.println("魏宇轩是个好人!");
//return "success";
return NONE;
}
}
3、创建动作类继承父类 com.opensymphony.xwork2.Action(推荐使用)。
package com.wyx.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* action动作类
*/
public class HelloAction2 extends ActionSupport
{
public String helloAS()
{
return super.SUCCESS;
}
}
二、配置动作类
<!--
name:必须指定在一个包中唯一
class:当前action所在的动作类
method:当前action要访问的方法
-->
<action name="as" class="com.wyx.action.HelloAction2" method="helloAS">
<result name="success">/success.jsp</result>
</action>
三、action 动作类的生命周期
创建与销毁
- 创建:Action 动作类每次请求的时候都会创建一个实例对象。
- 销毁:当前 action 动作类的请求响应完后就消失了。
跟 javaweb 中的 HttpServletRequest 的生命周期是一样的,struts2 是多例的,每次请求都会创建实例对象,是线程安全的。
package com.wyx.action;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
/**
* action动作类
*/
public class HelloAction3 extends ActionSupport
{
/**
* 默认构造器
*/
public HelloAction3()
{
System.out.println("我来了!");
}
public String helloLife()
{
System.out.println("我还活着!");
return super.SUCCESS;
}
}
四、action 动作类的访问
1、通配符
原则:约定优于配置。比如在 action 中每一个方法有一定的规则:都以 User 结尾。
方式一
方式二
注意:同一个包中不能有多个通配符的 action。
2、动态方法调用
首先要开启动态方法调用的开关。
<!--
启用动态方法调用
-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
这是我们的 action 的动作类不需要再指定方法 method 属性了,而是在 url 上指定。
语法:
!方法名[.后缀名]
package com.wyx.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* action动作类
*/
public class HelloAction extends ActionSupport
{
public String hello1()
{
System.out.println("魏宇轩1");
return super.SUCCESS;
}
public String hello2()
{
System.out.println("魏宇轩2");
return super.SUCCESS;
}
public String hello3()
{
System.out.println("魏宇轩3");
return super.SUCCESS;
}
}
五、结果视图的配置
Result:要返回的视图。
属性:
- Name: action 动作类要返回的值,如果返回的值匹配上了当前的 name 的值就跳转到相应的页面。
- Type:跳转方式
① dispatcher:请求转发,相当于 javaweb 中的 forward,地址栏不变,在我们不知道 type 的时候默认是 dispatcher。
② redirect:页面重定向,地址栏变化。
③ chain:请求转发到一个 action 动作类,地址栏不发生变化。
④ redirectAction:重定向到一个 action 的动作类,地址栏变化。与 ③ 不同的就是地址栏变化。 - 以上③是同包内的重定向。
- 不同包的重定向。
访问后会发现地址栏的命名空间也发生了改变。
⑤ stream:文件的上传和下载。
六、局部结果视图和全局的结果视图
1、在一个 action 中配置的 result 是局部结果视图,外部的 action 是不能使用这个 result的。
2、包内的全局的结果视图配置对于包内的每一个 action 动作类都有效。
3、在整个系统中的全局的结果视图,通过继承的方式来实现。
如有错误,欢迎指正!