Action对象是Struts2中重要的对象,主要用于HTTP请求进行处理。在Struts2API中,Action对象是一个接口,它位于com.opensymphony.xwork2包中。在Struts2项目开发中,创建Action对象都要直接或间接实现此对象。
Action接口源代码如下:
package com.opensymphony.xwork2;
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
在Action接口中,包含了5个静态的成员变量,它们是Struts2 API 为处理结果定义的静态变量。各变量含义如下:
(1)SUCCESS
静态变量SUCCESS是Action执行成功时的返回值。在Action执行成功的情况下,需要将返回值设置为SUCCESS。
(2)NONE
静态变量NONE也是Action执行时的返回值,但是它不需要返回到成功的页面。其只要用于处理不需要返回结果的页面的业务逻辑。
(3)ERROR
静态变量ERROR,从词中,我们可以看出,它是当Action执行失败时的返回值。在信息验证失败时,可以使Action返回此值。
(4)INPUT
静态变量INPUT代码需要返回到某个输入信息的页面的返回值。例如,在修改某些信息时,加载数据后返回到修改页面,此时就可以将Action对象处理的返回值设置为INPUT。
(5)LOGIN
静态变量LOGIN代码需要用户登录的返回值。例如,在验证用户是否登录时,Action验证失败需要用户重新登录,此时就可以将Action对象处理的返回值设置为LOGIN。
在Struts2框架中,表单提交的数据会自动注入给与Action对象相应的属性。其原理与Spring框架中IoC注入原理相同,通过Action对象为属性提供setter方法进行注入。
① 创建一个UserAction类,该类继承ActionSupport类,ActionSupport类又是实现了Action接口,故此,UserAction类相当于间接的实现了Action接口。在UserAction类中添加username属性,并提供getter与setter方法。代码如下:
package com.muke.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
return "SUCCESS";
}
}
基本流程图如下:
在Struts2框架中,“*.action”请求的返回视图由Action对象决定,其实现手段是:通过查找返回字符串对应的配置项,确定返回的视图。例如,Action中的excute()方法返回的字符串为success,那么Struts2就会到配置文件中查找名称为success的配置项,返回这个配置项对应的视图。
动态Action的处理方式
在配置文件struts.xml中配置了userAction,当请求其中的add()方法时,其请求方式如下:
/userAction!add
什么是动态action呢?上一篇中跳转页面都是对excute()进行重写实现对浏览器请求进行处理,这种方式只适合比较单一的业务逻辑请求。而在实际的开发中,业务请求时多种多样的,对数据库的增删改查操作。如果建立多个Action对象,编写多个excute()方法来处理请求,但是这种方式较为复杂,需要编写很多代码。
在Struts2框架中提供了Dynamic Action 这样一个概念,称之为动态Action,通过动态请求Action对象中的方法,可以实现对某一业务逻辑的处理。动态Action的处理的方式,如上图所示。
① 创建一个JavaWeb项目,添加Struts2所需jar包,放到lib文件夹下,然后在web.xml文件中注册Struts2提供的StrutsPrepareAndExcuteFilter过滤器。
② 创建一个UserAction 的Action对象,并在Action中添加add()方法和update(),分别用于处理用户添加信息,用户更新信息的请求,并且将请求返回到相应的页面。
代码如下:
package com.muke.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* 用户Action
* @author kenewstar
*
*/
public class UserAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//提示信息
private String info;
//添加用户信息
public String add() throws Exception{
info = "添加用户信息";
return "add";
}
//更新用户信息
public String update() throws Exception{
info = "修改用户信息";
return "update";
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
add()方法用于处理用户添加信息的请求。
update()方法用于处理用户更新信息的请求。
代码中并没有真正去实现用户对信息的操作,只对类中info变量赋值,返回一个响应结果。
在项目源码文件夹下添加struts.xml配置文件,在文件中配置UserAction类。代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 打开动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 声明包 -->
<package name="myPackage" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="first">
<!-- 定义处理成功后的映射页面 -->
<result>/first.jsp</result>
</action>
<!-- 定义Action -->
<action name="userAction" class="com.muke.action.UserAction">
<!-- 添加成功的映射页面 -->
<result name="add">useradd.jsp</result>
<!-- 更新成功的映射页面 -->
<result name="update">userupdate.jsp</result>
</action>
</package>
</struts>
第一个result用于对应返回用户添加信息成功的映射页面,根据UserAction类的add()方法与name=“add”,跳转到useradd.jsp.
第二个result用于对应返回用户更新信息成功的映射页面,根据UserAction类的update()方法与name=“update”,跳转到userupdate.jsp页面
创建useradd.jsp页面,代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>添加用户信息成功页面</title>
</head>
<body>
<font color="red">
<s:property value="info"/>
</font>
</body>
</html>
使用
<%@ taglib prefix="s" uri="/struts-tags" %>
创建userupdate.jsp,关键代码如下:
<title>修改用户信息成功页面</title>
</head>
<body>
<font color="red">
<s:property value="info"/>
</font>
</body>
创建index.jsp页面,作为首页,添加关键代码如下:
<a href="userAction!add">添加用户信息</a>
<br />
<a href="userAction!update">修改用户信息</a>
使用Struts2的动态Action,其Action的请求的URL地址中使用“!”分隔Action请求与请求字符串,而请求字符串的名称需要与Action类中的方法名称相对应,否则将出现java.lang.NoSuchMethodException异常。
如果struts.xml中没有如下代码:
<!-- 打开动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
就会出现以下异常情况
这是由于struts安全版本的升级,版本从2.3.15.1变更为2.3.15.2,出现以下异常,解决办法就是打开动态方法调用,将value=“true” , 2.3.15.2以上将此属性默认设为false了,因此需要手动将属性值设置为true。
出现如上图所示异常,需要在package标签下添加如下所示代码:
<global-allowed-methods>regex:.*</global-allowed-methods>
同样也支持在你的action上添加注解@AllowedMethods
struts2.5 为了增加安全性,在 struts.xml 添加了如上属性.
/*******************************************************************/
项目运行成功截图如下: