当前位置:首页 » struts2在线教程 » Struts2动作(Action)

Struts2动作(Action)

Struts2动作(Action)-动作是Struts2框架的核心,因为它们是任何MVC(模型 - 视图 - 控制器)框架。每一个URL映射到一个特定的操作,它提供了处理用户的请求提供服务所需的逻辑。

动作是Struts2框架的核心,因为它们是任何MVC(模型 - 视图 - 控制器)框架。每一个URL映射到一个特定的操作,它提供了处理用户的请求提供服务所需的逻辑。

但动作也用来在另外两个重要的能力。首先,动作从请求中的数据的传输,通过到视图中起着重要的作用,无论是其一个JSP的或其它类型的结果。二,行动要协助的框架中确定的结果应该渲染视图将返回响应到请求。

创建动作-Action:

Struts2的行动,唯一的要求是,必须有一个无参数的方法,该方法返回一个字符串或结果的对象,必须是一个POJO。如果不带参数的方法不指定,则默认行为是使用execute()方法。

您也可以选择扩展ActionSupport类实现接口,包括动作(Action)接口。动作(Action)接口如下:

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

让我们一起来看看在动作方法中的Hello World示例:

package com.tutorialspoint.struts2;

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

为了说明这一点的操作方法控制视图,让我们作出以下更改execute 方法和扩展的类ActionSupport的如下:

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   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”的字符串,返回成功的结果,否则返回错误的结果。因为我们已经扩展了ActionSupport的,所以我们可以使用字符串常量的成功和错误。现在,让我们修改我们的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.tutorialspoint.struts2.HelloWorldAction"
            method="execute">
            <result name="success">/HelloWorld.jsp</result>
            <result name="error">/AccessDenied.jsp</result>
         </action>
      </package>
</struts>

创建视图 View

让我们在你的eclipse项目在WebContent文件夹创建下面的JSP文件helloWorld.jsp,要做到这一点,右键单击WebContent文件夹中的项目资源管理器,然后选择“新建”>“JSP文件"。该文件将被要求的情况下,返回的结果是成功,这是一个字符串常量“success”,定义在Action接口中:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
   Hello World, <s:property value="name"/>
</body>
</html>

以下是文件,该文件将被调用的框架的情况下作用的结果是等于字符串常量“ERROR ”的错误,以下内容的AccessDenied.jsp的

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Access Denied</title>
</head>
<body>
   You are not authorized to view this page.
</body>
</html>

我们还需要在WebContent文件夹中创建index.jsp。该文件将作为初始动作URL,用户可以通过点击告诉Struts 2框架,来调用theexecute的HelloWorldAction类的方法和渲染HelloWorld.jsp视图。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
   <h1>Hello World From Struts2</h1>
   <form action="hello">
      <label for="name">Please enter your name</label><br/>
      <input type="text" name="name"/>
      <input type="submit" value="Say Hello"/>
   </form>
</body>
</html>

就是这样,有没有需要改变的web.xml文件,让我们使用同一个web.xml举例章节,我们已经创建了。现在,我们已经准备好来运行我们的Hello World应用程序使用Struts 2框架。

执行应用程序

右键点击项目名称,并单击“导出”>WAR文件创建一个WAR文件。然后,这WAR部署在Tomcat的webapps目录下。最后,启动Tomcat服务器,并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给你以下画面:

让我们一起进入一个“SECRET”的话,你应该看到下面的页面:

现在输入任何文字以外的“SECRET”,你应该看到下面的页面:

创建多个动作-Action:

我们通常会定义一个以上的动作,以处理不同的请求,向用户提供不同的URL,因此可以定义不同的类定义如下:

package com.tutorialspoint.struts2;
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.tutorialspoint.struts2.HelloWorld" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
         <result name="error">/AccessDenied.jsp</result>
      </action>
      <action name="something" 
         class="com.tutorialspoint.struts2.SomeOtherClass" 
         method="execute">
         <result name="success">/Something.jsp</result>
         <result name="error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

在上述假设的例子中,你可以看到操作的结果被复制的SUCCESS和ERROR 。为了解决这个问题,我们建议您创建一个类,它包含的结果的结果。