Struts2框架的学习2(Struts-2.5.x)

2 动态Action的应用

Action对象是Struts2中重要的对象,主要用于HTTP请求进行处理。在Struts2API中,Action对象是一个接口,它位于com.opensymphony.xwork2包中。在Struts2项目开发中,创建Action对象都要直接或间接实现此对象。
Struts2框架的学习2(Struts-2.5.x)_第1张图片
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。

2.1 请求参数的注入原理

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

2.2 Action的基本流程

基本流程图如下:
Struts2框架的学习2(Struts-2.5.x)_第2张图片
在Struts2框架中,“*.action”请求的返回视图由Action对象决定,其实现手段是:通过查找返回字符串对应的配置项,确定返回的视图。例如,Action中的excute()方法返回的字符串为success,那么Struts2就会到配置文件中查找名称为success的配置项,返回这个配置项对应的视图。
动态Action的处理方式
Struts2框架的学习2(Struts-2.5.x)_第3张图片
在配置文件struts.xml中配置了userAction,当请求其中的add()方法时,其请求方式如下:

/userAction!add

2.3 动态Action

什么是动态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>

使用标签需要导入struts标签库

<%@ 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"/>

就会出现以下异常情况
Struts2框架的学习2(Struts-2.5.x)_第4张图片
这是由于struts安全版本的升级,版本从2.3.15.1变更为2.3.15.2,出现以下异常,解决办法就是打开动态方法调用,将value=“true” , 2.3.15.2以上将此属性默认设为false了,因此需要手动将属性值设置为true。
Struts2框架的学习2(Struts-2.5.x)_第5张图片
出现如上图所示异常,需要在package标签下添加如下所示代码:

<global-allowed-methods>regex:.*</global-allowed-methods>

同样也支持在你的action上添加注解@AllowedMethods
struts2.5 为了增加安全性,在 struts.xml 添加了如上属性.
/*******************************************************************/
项目运行成功截图如下:
Struts2框架的学习2(Struts-2.5.x)_第6张图片
Struts2框架的学习2(Struts-2.5.x)_第7张图片

你可能感兴趣的:(JavaEE)