Struts2 Actions動(dòng)作

2022-07-08 11:32 更新

Actions是Struts2框架的核心,因?yàn)樗鼈冞m用于任何MVC(Model View Controller)框架。 每個(gè)URL映射到特定的action,其提供處理來(lái)自用戶的請(qǐng)求所需的處理邏輯。
但action還有另外兩個(gè)重要的功能。 首先,action在將數(shù)據(jù)從請(qǐng)求傳遞到視圖(無(wú)論是JSP還是其他類型的結(jié)果)方面起著重要作用。 第二,action必須協(xié)助框架確定哪個(gè)結(jié)果應(yīng)該呈現(xiàn)在響應(yīng)請(qǐng)求的視圖中。

創(chuàng)建Action

Struts2中actions的唯一要求是必須有一個(gè)無(wú)參數(shù)方法返回String或Result對(duì)象,并且必須是POJO。如果沒(méi)有指定no-argument方法,則默認(rèn)是使用execute()方法。
你還可以擴(kuò)展ActionSupport類,該類可實(shí)現(xiàn)六個(gè)接口,包括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;
}

讓我們來(lái)看看在Hello World示例中的action方法:

package cn.w3cschool.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;
   }
}

為了說(shuō)明action方法控制視圖的要點(diǎn),讓我們對(duì)execute方法進(jìn)行以下更改,并擴(kuò)展ActionSupport類如下:

package cn.w3cschool.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;
   }
}

在這個(gè)例子中,我們?cè)趀xecute方法中使用一些邏輯來(lái)查看name屬性。如果屬性等于字符串“SECRET”,我們返回SUCCESS作為結(jié)果,否則我們返回ERROR作為結(jié)果。因?yàn)槲覀円呀?jīng)擴(kuò)展了ActionSupport,所以我們可以使用String常量、SUCCESS和ERROR。 現(xiàn)在,讓我們修改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="cn.w3cschool.struts2.HelloWorldAction"
            method="execute">
            <result name="success">/HelloWorld.jsp</result>
            <result name="error">/AccessDenied.jsp</result>
         </action>
      </package>
</struts>

創(chuàng)建視圖

讓我們?cè)谀愕膃clipse項(xiàng)目的WebContent文件夾中創(chuàng)建下面的jsp文件HelloWorld.jsp。右鍵單擊項(xiàng)目資源管理器中的WebContent文件夾,然后選擇“New”> “JSP File”。如果返回結(jié)果是SUCCESS將調(diào)用此文件(這個(gè)字符串常量“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>

如果action的結(jié)果是ERROR,即字符串常量為“error”,下面的文件將被框架調(diào)用。 以下是AccessDenied.jsp的內(nèi)容:

<%@ 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文件夾中創(chuàng)建index.jsp文件。此文件將用作初始的action URL,用戶可以單擊它以命令Struts 2框架調(diào)用HelloWorldAction類的execute方法并呈現(xiàn)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>

這樣,沒(méi)有改變web.xml文件的需求,所以我們可以使用前面在Hello World示例章節(jié)中創(chuàng)建的的web.xml文件?,F(xiàn)在,我們準(zhǔn)備好使用Struts 2框架運(yùn)行我們的Hello World應(yīng)用程序了。

執(zhí)行應(yīng)用程序

右鍵單擊項(xiàng)目名稱,然后單擊“Export”>“WAR File”創(chuàng)建WAR文件。 然后在Tomcat的webapps目錄中部署這個(gè)WAR文件。最后,啟動(dòng)Tomcat服務(wù)器并嘗試訪問(wèn)URL http://localhost:8080/HelloWorldStruts2/index.jsp。顯示的圖示如下:

輸入

讓我們輸入一個(gè)單詞為“SECRET”,你會(huì)看到如下頁(yè)面:

secret成功

現(xiàn)在輸入除“SECRET”之外的任何詞,你會(huì)看到如下頁(yè)面:

錯(cuò)誤

創(chuàng)建多個(gè)Actions

你會(huì)需要頻繁定義多個(gè)action來(lái)處理不同的請(qǐng)求,并為用戶提供不同的URL,因此你將如下定義的不同類:

package cn.w3cschool.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文件中的配置這些action:

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

正如你在上面的例子中看到的,action的結(jié)果SUCCESS和ERROR是重復(fù)的。為了解決這個(gè)問(wèn)題,建議您創(chuàng)建一個(gè)包含結(jié)果的類。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)