Struts 2 - Hello World 示例



正如您從 Struts 2 架構中已經瞭解到的,當您在 Struts 2 web 應用中點選超連結或提交 HTML 表單時,輸入資訊會被控制器收集,併發送到一個名為 Action 的 Java 類。Action 執行完成後,結果會選擇一個資源來呈現響應。該資源通常是 JSP,但也可以是 PDF 檔案、Excel 電子表格或 Java applet 視窗。

假設您已經構建了開發環境。現在,讓我們繼續構建我們的第一個 **Hello World Struts2** 專案。該專案的目的是構建一個 web 應用,收集使用者的姓名,並顯示“Hello World”以及使用者名稱。

對於任何 Struts 2 專案,我們都需要建立以下四個元件:

序號 元件及描述
1

Action

建立一個 Action 類,其中包含完整的業務邏輯並控制使用者、模型和檢視之間的互動。

2

攔截器

根據需要建立攔截器,或使用現有的攔截器。這是控制器的一部分。

3

檢視

建立 JSP 來與使用者互動,獲取輸入並呈現最終訊息。

4

配置檔案

建立配置檔案來關聯 Action、檢視和控制器。這些檔案包括 struts.xml、web.xml、struts.properties。

我將使用 Eclipse IDE,以便所有必需的元件都將在一個動態 Web 專案下建立。現在讓我們開始建立動態 Web 專案。

建立動態 Web 專案

啟動 Eclipse,然後選擇 **檔案 > 新建 > 動態 Web 專案**,並輸入專案名稱為 **HelloWorldStruts2**,並根據以下螢幕設定其餘選項:

Hello World Sturts1

在接下來的螢幕中選擇所有預設選項,最後選中 **生成 Web.xml 部署描述符** 選項。這將在 Eclipse 中為您建立一個動態 Web 專案。現在選擇 **視窗 > 顯示檢視 > 專案資源管理器**,您將看到您的專案視窗如下所示:

Hello World Sturts2

現在將 Struts 2 lib 資料夾 **C:\struts-2.2.3\lib** 中的以下檔案複製到我們專案的 **WEB-INF\lib** 資料夾中。為此,您可以簡單地將所有以下檔案拖放到 WEB-INF\lib 資料夾中。

  • commons-fileupload-x.y.z.jar
  • commons-io-x.y.z.jar
  • commons-lang-x.y.jar
  • commons-logging-x.y.z.jar
  • commons-logging-api-x.y.jar
  • freemarker-x.y.z.jar
  • javassist-.xy.z.GA
  • ognl-x.y.z.jar
  • struts2-core-x.y.z.jar
  • xwork-core.x.y.z.jar

建立 Action 類

Action 類是 Struts 2 應用的關鍵,我們在大多情況下在 Action 類中實現業務邏輯。因此,讓我們在 **Java 資源 > src** 下建立一個名為 HelloWorldAction.java 的 Java 檔案,包名為 **com.tutorialspoint.struts2**,內容如下所示。

當用戶點選 URL 時,Action 類會響應使用者的操作。Action 類的一個或多個方法會被執行,並返回一個字串結果。根據結果的值,將呈現特定的 JSP 頁面。

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

這是一個非常簡單的類,帶有一個名為“name”的屬性。我們為“name”屬性提供了標準的 getter 和 setter 方法,以及一個返回字串“success”的 execute 方法。

Struts 2 框架將建立 **HelloWorldAction** 類的物件,並響應使用者的操作呼叫 execute 方法。您將業務邏輯放在此方法中,該方法最終返回字串常量。換句話說,對於每個 URL,您都必須實現一個 Action 類,您可以直接使用該類名作為 Action 名,也可以使用 struts.xml 檔案將其對映到其他名稱,如下所示。

建立檢視

我們需要一個 JSP 來呈現最終訊息,當預定義的操作發生時,Struts 2 框架將呼叫此頁面,並在 struts.xml 檔案中定義此對映。因此,讓我們在 Eclipse 專案的 WebContent 資料夾中建立以下 jsp 檔案 **HelloWorld.jsp**。為此,右鍵單擊專案資源管理器中的 WebContent 資料夾,然後選擇 **新建 > JSP 檔案**。

<%@ 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>

taglib 指令告訴 Servlet 容器,此頁面將使用 **Struts 2** 標籤,並且這些標籤將以 **s** 為字首。

s:property 標籤顯示 Action 類屬性“name”的值,該值由 HelloWorldAction 類的 **getName()** 方法返回。

建立主頁

我們還需要在 WebContent 資料夾中建立 **index.jsp**。此檔案將作為初始操作 URL,使用者可以在其中點選,告訴 Struts 2 框架呼叫 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>

上面檢視檔案中定義的 **hello** 操作將使用 struts.xml 檔案對映到 HelloWorldAction 類及其 execute 方法。當用戶點選提交按鈕時,它將導致 Struts 2 框架執行 HelloWorldAction 類中定義的 execute 方法,並根據該方法返回的值,選擇並呈現適當的檢視作為響應。

配置檔案

我們需要一個對映來將 URL、HelloWorldAction 類(模型)和 HelloWorld.jsp(檢視)關聯起來。該對映告訴 Struts 2 框架哪個類將響應使用者的操作(URL),該類的哪個方法將被執行,以及根據該方法返回的字串結果呈現哪個檢視。

因此,讓我們建立一個名為 **struts.xml** 的檔案。由於 Struts 2 要求 struts.xml 位於 classes 資料夾中。因此,在 WebContent/WEB-INF/classes 資料夾下建立 struts.xml 檔案。Eclipse 預設情況下不會建立“classes”資料夾,因此您需要自己建立。為此,右鍵單擊專案資源管理器中的 WEB-INF 資料夾,然後選擇 **新建 > 資料夾**。您的 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>
      </action>
   </package>
</struts>

關於上述配置檔案,需要理解一些內容。在這裡,我們將常量 **struts.devMode** 設定為 **true**,因為我們處於開發環境中,需要檢視一些有用的日誌訊息。然後,我們定義一個名為 **helloworld** 的包。

當您希望將 Action 分組在一起時,建立包非常有用。在我們的示例中,我們將 Action 命名為“hello”,它對應於 URL ** /hello.action**,並由 **HelloWorldAction.class** 支援。**HelloWorldAction.class** 的 **execute** 方法是在呼叫 URL ** /hello.action** 時執行的方法。如果 execute 方法的結果返回“success”,那麼我們將使用者帶到 **HelloWorld.jsp**。

下一步是建立一個 **web.xml** 檔案,它是任何請求到 Struts 2 的入口點。Struts2 應用的入口點將在部署描述符 (web.xml) 中定義的過濾器。因此,我們將在 web.xml 中定義 org.apache.struts2.dispatcher.FilterDispatcher 類的條目。web.xml 檔案需要在 WebContent 下的 WEB-INF 資料夾中建立。當您建立專案時,Eclipse 已經為您建立了一個 web.xml 檔案的框架。因此,讓我們修改如下:

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

我們已將 index.jsp 指定為我們的歡迎檔案。然後,我們配置了 Struts2 過濾器以在所有 URL 上執行(即,任何與模式 /* 匹配的 URL)。

啟用詳細日誌

在使用 Struts 2 時,您可以透過在 **WEB-INF/classes** 資料夾下建立 **logging.properties** 檔案來啟用完整的日誌功能。在您的屬性檔案中保留以下兩行:

org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
   java.util.logging.ConsoleHandler

預設的 logging.properties 指定了一個 ConsoleHandler 用於將日誌路由到 stdout,以及一個 FileHandler。可以使用 SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL 設定處理程式的日誌級別閾值。

就是這樣。我們已準備好使用 Struts 2 框架執行我們的 Hello World 應用。

執行應用的步驟

右鍵單擊專案名稱,然後單擊 **匯出 > WAR 檔案** 以建立 WAR 檔案。

然後將此 WAR 部署到 Tomcat 的 webapps 目錄中。

最後,啟動 Tomcat 伺服器,並嘗試訪問 URL **https://:8080/HelloWorldStruts2/index.jsp**。這將顯示以下螢幕:

Hello World Struts4

輸入值“Struts2”並提交頁面。您應該看到下一頁

Hello World Struts5

請注意,您可以在 struts.xml 檔案中將 **index** 定義為一個 Action,在這種情況下,您可以將 index 頁面稱為 **https://:8080/HelloWorldStruts2/index.action**。請檢視以下如何在 struts.xml 中定義 index 為 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 = "index">
         <result >/index.jsp</result>
      </action>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>
廣告