Struts 2 动作 Action
动作(Action)是 Struts2 框架的核心,因为它们适用于任何 MVC(模型(Model) 视图(View) 控制器(Controller))框架。 每个 URL 都映射到一个特定的操作,该操作提供了处理用户请求所必需的处理逻辑。
但动作还具有其他两个重要功能。 首先,动作在从请求到视图的数据传输中起着重要作用,无论是 JSP 还是其他类型的结果。 其次,动作必须帮助框架确定哪个结果应该呈现将在响应请求中返回的视图。
创建 Action
Struts2 中对动作的唯一要求是必须有一个没有参数的方法返回 String 或 Result 对象,并且必须是 POJO
。 如果未指定无参数方法,则默认行为是使用 execute()
方法。
我们可以选择继承实现六个接口的 ActionSupport
类,包括 Action
接口。 Action 接口如下
public interface Action {
String SUCCESS = "success";
String NONE = "none";
String ERROR = "error";
String INPUT = "input";
String LOGIN = "login";
String execute() throws Exception;
}
让我们看一下 Struts 2 第一个示例 中的操作方法
package com.jiyik.struts2.action;
public class HelloWorldAction {
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
为了说明 action 方法控制视图这一点,让我们对 execute()
方法进行以下更改并继承类 ActionSupport
如下
package com.jiyik.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
@Override
public String execute() throws Exception {
if ("SECRET".equals(name)) {
return SUCCESS;
} else {
return ERROR;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在这个例子中,我们在 execute()
方法中有一些逻辑来查看 name 属性。 如果属性等于字符串“SECRET”,则返回 SUCCESS 作为结果,否则返回 ERROR 作为结果。 因为我们继承了 ActionSupport
,所以我们可以使用字符串常量 SUCCESS 和 ERROR。 现在,让我们修改我们的 struts.xml 文件如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.jiyik.struts2.action.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
创建视图
让我们在 IDEA 项目的 Web 文件夹中创建以下 jsp 文件 HelloWorld.jsp
。 为此,右键单击项目资源管理器中的 Web 文件夹并选择 New >JSP File。 如果返回结果为 SUCCESS
,则将调用此文件,SUCCESS
是 Action 接口中定义的字符串常量“success”。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, ${name}
</body>
</html>
以下是框架将调用的文件,以防操作结果为等于字符串常量“error”的 ERROR
。 以下是 AccessDenied.jsp
的内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Access Denied</title>
</head>
<body>
You are not authorized to view this page.
</body>
</html>
我们还需要在 Web 文件夹中创建 index.jsp。 该文件将用作初始操作 URL,用户可以单击该 URL 以告知 Struts 2 框架调用 HelloWorldAction
类的执行方法并呈现 HelloWorld.jsp 视图。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">请输入您的姓名</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
就是这样,web.xml 文件不需要更改,所以让我们使用我们在示例章节中创建的相同 web.xml。 现在,我们已准备好使用 Struts 2 框架运行我们的 Hello World 应用程序。
执行应用程序
我们直接使用 IDEA 运行应用程序。在浏览器中输入地址 http://localhost:8080
。在 input 输入框中输入 “SECRET”。我们会看到跳转到的界面显示 “Hello World, SECRET”。如果我们输入其他的字符串,则跳转到的页面显示 “You are not authorized to view this page.”。
创建多个 Action
我们将经常定义多个操作来处理不同的请求并为用户提供不同的 URL,因此我们将定义如下定义的不同类
package com.jiyik.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
class MyAction extends ActionSupport {
public static String GOOD = SUCCESS;
public static String BAD = ERROR;
}
public class HelloWorld extends ActionSupport {
...
public String execute() {
if ("SECRET".equals(name)) return MyAction.GOOD;
return MyAction.BAD;
}
...
}
public class SomeOtherClass extends ActionSupport {
...
public String execute() {
return MyAction.GOOD;
}
...
}
我们将在 struts.xml 文件中配置这些操作,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.jiyik.struts2.action.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
<action name = "something"
class = "com.jiyik.struts2.action.SomeOtherClass"
method = "execute">
<result name = "success">/Something.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
正如我们在上面的假设示例中所见,操作结果 SUCCESS
和 ERROR
是重复的。
为了解决这个问题,建议大家创建一个包含结果的类。