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";
}
}

Struts2(6)_Struts2 动作类(Action)_地址栏

Struts2(6)_Struts2 动作类(Action)_重定向_02

2、创建动作类实现接口 com.opensymphony.xwork2.Action。

Action 接口中提供了一些常量:

Struts2(6)_Struts2 动作类(Action)_Struts2_03

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;
}
}

Struts2(6)_Struts2 动作类(Action)_Struts2_04

Struts2(6)_Struts2 动作类(Action)_重定向_05

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;
}
}

Struts2(6)_Struts2 动作类(Action)_方法调用_06

Struts2(6)_Struts2 动作类(Action)_Struts2_07

二、配置动作类

<!-- 
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;
}
}

Struts2(6)_Struts2 动作类(Action)_地址栏_08

Struts2(6)_Struts2 动作类(Action)_方法调用_09

Struts2(6)_Struts2 动作类(Action)_Struts2_10

四、action 动作类的访问

1、通配符

原则:约定优于配置。比如在 action 中每一个方法有一定的规则:都以 User 结尾。

方式一

Struts2(6)_Struts2 动作类(Action)_地址栏_11

Struts2(6)_Struts2 动作类(Action)_Struts2_12

Struts2(6)_Struts2 动作类(Action)_Struts2_13

Struts2(6)_Struts2 动作类(Action)_Struts2_14

方式二

Struts2(6)_Struts2 动作类(Action)_重定向_15

Struts2(6)_Struts2 动作类(Action)_地址栏_16

注意:同一个包中不能有多个通配符的 action。

Struts2(6)_Struts2 动作类(Action)_方法调用_17

Struts2(6)_Struts2 动作类(Action)_Struts2_18

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;
}
}

Struts2(6)_Struts2 动作类(Action)_Struts2_19

Struts2(6)_Struts2 动作类(Action)_方法调用_20

五、结果视图的配置

Result:要返回的视图。

Struts2(6)_Struts2 动作类(Action)_Struts2_21

属性:


  • Name: action 动作类要返回的值,如果返回的值匹配上了当前的 name 的值就跳转到相应的页面。
  • Type:跳转方式
    ① dispatcher:请求转发,相当于 javaweb 中的 forward,地址栏不变,在我们不知道 type 的时候默认是 dispatcher。
    Struts2(6)_Struts2 动作类(Action)_方法调用_22
    ② redirect:页面重定向,地址栏变化。
    Struts2(6)_Struts2 动作类(Action)_重定向_23
    Struts2(6)_Struts2 动作类(Action)_重定向_24
    ③ chain:请求转发到一个 action 动作类,地址栏不发生变化。
    Struts2(6)_Struts2 动作类(Action)_重定向_25
    Struts2(6)_Struts2 动作类(Action)_地址栏_26
    Struts2(6)_Struts2 动作类(Action)_地址栏_27
    ④ redirectAction:重定向到一个 action 的动作类,地址栏变化。与 ③ 不同的就是地址栏变化。


    • 以上③是同包内的重定向。
    • 不同包的重定向。
      Struts2(6)_Struts2 动作类(Action)_地址栏_28
      访问后会发现地址栏的命名空间也发生了改变。
      Struts2(6)_Struts2 动作类(Action)_重定向_29
      ⑤ stream:文件的上传和下载。



六、局部结果视图和全局的结果视图

1、在一个 action 中配置的 result 是局部结果视图,外部的 action 是不能使用这个 result的。

2、包内的全局的结果视图配置对于包内的每一个 action 动作类都有效。

Struts2(6)_Struts2 动作类(Action)_地址栏_30

3、在整个系统中的全局的结果视图,通过继承的方式来实现。

Struts2(6)_Struts2 动作类(Action)_重定向_31

如有错误,欢迎指正!