當前位置:首頁 » 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 。為了解決這個問題,我們建議您創建一個類,它包含的結果的結果。