Struts - 动作

  • 简述

    Actions是 Struts2 框架的核心,因为它们适用于任何 MVC(模型视图控制器)框架。每个 URL 都映射到一个特定的动作,它提供了为用户的请求提供服务所必需的处理逻辑。
    但该行动还具有其他两个重要功能。首先,动作在从请求到视图的数据传输中起着重要作用,无论是 JSP 还是其他类型的结果。其次,动作必须帮助框架确定哪个结果应该呈现将在对请求的响应中返回的视图。
  • 创建动作

    对行动的唯一要求 Struts2是必须有一个 noargument 方法返回 String 或 Result 对象,并且必须是 POJO。如果未指定无参数方法,则默认行为是使用 execute() 方法。
    您可以选择扩展 ActionSupport 实现六个接口的类,包括 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 示例中的 action 方法 -
    
    package com.jc2182.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;
       }
    }
    
    为了说明 action 方法控制视图的观点,让我们对 execute 方法并扩展类 ActionSupport 如下 -
    
    package com.jc2182.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", 我们返回 SUCCESS 结果否则我们返回 ERROR作为结果。因为我们扩展了ActionSupport,所以我们可以使用String常量SUCCESS和错误。现在,让我们修改我们的 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.jc2182.struts2.HelloWorldAction"
             method = "execute">
             <result name = "success">/HelloWorld.jsp</result>
             <result name = "error">/AccessDenied.jsp</result>
          </action>
       </package>
    </struts>
    
  • 创建视图

    让我们创建下面的jsp文件 HelloWorld.jsp在 eclipse 项目的 WebContent 文件夹中。为此,右键单击项目资源管理器中的 WebContent 文件夹并选择New >JSP File. 如果返回结果是 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>
    
    我们还需要创建 index.jsp在 WebContent 文件夹中。该文件将作为初始操作 URL,用户可以单击该 URL 告诉 Struts 2 框架调用executeHelloWorldAction 类的方法并呈现 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 Examples章节。现在,我们准备运行我们的Hello World 应用程序使用 Struts 2 框架。
  • 执行应用程序

    右键单击项目名称,然后单击 Export > WARFile 创建一个 War 文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动Tomcat服务器并尝试访问URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. 这将为您提供以下屏幕 -
    你好世界 Struts4
    让我们输入一个词作为“秘密”,你应该看到以下页面 -
    helloworldstruts51
    现在输入“秘密”以外的任何单词,您应该看到以下页面 -
    helloworldstruts6
  • 创建多个操作

    您将经常定义多个操作来处​​理不同的请求并向用户提供不同的 URL,因此您将定义如下定义的不同类 -
    
    package com.jc2182.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.jc2182.struts2.HelloWorld" 
             method = "execute">
             <result name = "success">/HelloWorld.jsp</result>
             <result name = "error">/AccessDenied.jsp</result>
          </action>
          
          <action name = "something" 
             class = "com.jc2182.struts2.SomeOtherClass" 
             method = "execute">
             <result name = "success">/Something.jsp</result>
             <result name = "error">/AccessDenied.jsp</result>
          </action>
       </package>
    </struts>
    
    正如您在上面的假设示例中看到的,操作结果 SUCCESSERROR’s 被复制。
    要解决此问题,建议您创建一个包含结果结果的类。