Struts 2 Hello World

描述

    當你在Struts2 Web應用中點擊一個超鏈接或者提交按鈕的時候,用戶的輸入不是發送到另一個服務器頁面,而是被髮送到了一個事先提供好的Java類。這個類就是Struts 2 中的Action 類。當Action被執行後,最終將選擇一個資源作爲響應返回給用戶。這個資源通常是一個服務器頁面(例如JSP),也可以是其他資源,例如PDF文件、Excel表格或者Java applet窗口。
   
    要想創建一個簡單的Struts 2“Hello World”程序顯示一個歡迎的信息,你最好藉助於上一個教程我們創建好的基礎Struts 2  Web應用(回顧上一篇教程如何創建一個Struts 2 Web應用),創建一個“Hello World”實例,你還需要做一下四點:
  1. 創建一個Java 類存儲歡迎信息(model)
  2. 創建一個服務器頁面(JSP)去呈現這個信息(view)
  3. 創建一個Action類來控制用戶和model、view之間的交互。
  4. 創建一個映射文件(struts.xml)來對Action類和view(視圖)進行關聯。

     通過這個組件,我們將工作流分爲三個衆所周知的三個關注點(三層):View(視圖)、Model(模型)和Controller(控制器)。當我們的應用變得很複雜時,分層開發能夠使項目管理更容易。

      下面,讓我們一起來看一個model類、Action類、視圖頁面以及之間的映射關係的示例。如果你願意,你可以打開你的Java IDE跟着教程敲代碼吧!

在閱讀這個教程之前你最好認真看過上一篇教程 如何創建一個Struts2 Web應用,並且已經創建了一個可以運行的基礎Struts項目。這個教程的示例代碼Hello World,你可以去Struts 2的Github倉庫 struts-examples 獲取.。這個示例項目使用Maven作爲依賴管理和構建工具。

編碼

     我們將在basic-struts項目中添加下面的內容:

  • 一個Model類,用於存儲我們的信息
  • 一個View視圖資源(JSP文件)來展示我們的信息
  • 一個Action類作爲控制器
  • 一個簡單配置將上面的內容聯繫在一起

步驟 1 - 創建一個Model類 MessageStore.java

      在src/main/java目錄下創建 MessageStore 類 . 注意下面的package語句,如果有必要記得修改。

注意這裏的java 文檔註釋被去掉了。在Struts Github倉庫中下載的代碼中有註釋。

MessageStore.java

package org.apache.struts.helloworld.model;

public class MessageStore {
    private String message;
    
    public MessageStore() {
        message = "Hello Struts User";
    }

    public String getMessage() {
        return message;
    }
}

     使用public getter方法使私有屬性message能夠被外部訪問。 Struts 2框架要求需要向視圖(HelloWorld.jsp)公開的對象必須遵守JavaBean風格約定 JavaBean-style conventions.

步驟 2 - 創建Action類 HelloWorldAction.java

     我們需要創建一個Action類作爲控制器。這個Action類響應用戶的操作(在這個示例中,用戶操作是點擊一個Html超鏈接,發送一個特定的URL到Servlet容器) 在這個Action類中一個或多個方法將被執行,最終返回一個字符串(String)。基於這個返回的結果值,Struts 2將會找到對應的視圖頁面然後顯示(這個示例中視圖頁面是HelloWorld.jsp)。

注意下面代碼中的package和import語句。

HelloWorldAction.java

package org.apache.struts.helloworld.action;

import org.apache.struts.helloworld.model.MessageStore;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
    private MessageStore messageStore;

    public String execute() {
        messageStore = new MessageStore() ;
        
        return SUCCESS;
    }

    public MessageStore getMessageStore() {
        return messageStore;
    }
}

     Struts 2框架負責創建 HelloWorldAction 類的對象,然後調用execute方法來響應用戶的操作。 (點擊一個超鏈接,發送一個特定的URL到Servlet容器)。

     在這個示例中,由execute方法創建 MessageStore 類的對象,然後返回字符串 SUCCESS 常量。

     注意:要想 MessageStore 對象在視圖 HelloWorld.jsp 頁面可用,我們必須提供私有(private) MessageStore 對象的公有(public)getter方法。我們需要遵循javaBean風格,在需要的地方提供getter和setter方法。

步驟 3 - 創建視圖頁面 HelloWorld.jsp

     我們需要一個服務器頁面來展示存儲在Model MessageStore 類中的信息。We need a server page to present the message that is stored in the model class . 在 src/main/webapp 文件夾下創建下面的JSP文件.

HelloWorld.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h2><s:property value="messageStore.message" /></h2>
  </body>
</html>

    <s:property> 標籤指令告訴Servlet容器這個頁面將使用Struts 2標籤。這些標籤都以 開頭。 

    這個 <s:property> 標籤將展示 HelloWorldAction 控制器類 getMessageStore 方法的返回值。這個方法將返回一個MessageStore對象。通過在messageStore的後面添加.message  Struts 2 框架將調用MessageStore對象的getMessage方法。MessageStore類的getMessage方法返回一個字符串。這個字符串通過 <s:property> 標籤展示出來。

     我們將在下一個教程學習更多的Struts 2標籤。

步驟 4 - 在struts.xml中添加配置

       我們通過需要添加配置將訪問時使用的URL、HelloWorldAction類(控制器)和 HelloWorld.jsp 視圖綁定在一起。這個映射配置告訴Struts 2 框架哪一個類將響應用戶的操作(URL請求),這個類哪一個方法將被執行,基於這個方法的返回值將確定哪一個視圖頁面將被展示。

       編輯struts.xml 文件(在Maven項目的src/main/resources 文件夾下)添加Action映射配置。如下所示:

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
		"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <constant name="struts.devMode" value="true" />

    <package name="basicstruts2" extends="struts-default">
        <action name="index">
            <result>/index.jsp</result>
        </action>
		
        <action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
            <result name="success">/HelloWorld.jsp</result>
        </action>
    </package>
</struts>

步驟 5 - 創建一個訪問HelloWorldAction 的超鏈接

     讓我們在HelloWorld.jsp (在src/main/webapp文件夾下)中創建一個訪問HelloWorldAction的超鏈接。用戶可以點擊這個鏈接,通知Struts 2框架去運行 HelloWorldAction類的execute方法最終將展示HelloWorld.jsp 視圖。

     首先在這個jsp文件中添加taglib指令 <%@ taglib prefix="s" uri="/struts-tags" %>。然後在 h1 標籤之後添加 p 標籤 <p><a href="<s:url action='hello'/>">Hello World</a></p> 。 最終的index.jsp,如下所示:

index.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Basic Struts 2 Application - Welcome</title>
    </head>
    <body>
        <h1>Welcome To Struts 2!</h1>
        <p><a href="<s:url action='hello'/>">Hello World</a></p>
    </body>
</html>

      Struts url標籤創建了一個URL。這個URL被映射到HelloWorldAction 類和它的 execute 方法。當用戶點擊這個超鏈接時,Struts 2 框架攔截這個請求找到 HelloWorldAction 類並運行execute方法返回success 常量字符串。最終HelloWorld.jsp將被展示在頁面中。

步驟 6 - 構建並運行這個應用

       執行 mvn jetty:run 來運行項目。

        在瀏覽器中訪問 http://localhost:8080/helloworld/index.action URL你將看到下面的頁面:

helloworld_index_action.png

        點擊Hello World 超鏈接你將看到HelloWorld.jsp 頁面:

helloworld_hello_action.png

代碼是如何工作的

      你在瀏覽器中訪問 http://localhost:8080/helloworld/hello.action,瀏覽器發送一個Http請求到Web服務器。

  1. 當項目在啓動的時候,Servlet容器將啓動Web項目,加載web.xml配置。當容器接收到來自對 hello.action 資源的請求時,Servlet容器發現對這個Web應用的所有以*.action結尾的請求都必須通過org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter過濾器。也就是說 StrutsPrepareAndExecuteFilter 過濾器是Struts 2 框架的入口。
  2. 接着Struts 2去struts.xml配置文件中查找以“hello”命名的Action映射配置,發現“hello”對應HelloWorldAction 類。Strut 2 框架就會去執行execute 方法。
  3.  execute 方法創建MessageStore對象,返回 SUCCESS (由Struts 定義的常量字符串值爲"success")。然後Struts 2框架去查看action配置,當返回SUCCESS時對應的頁面文件是什麼,並通知容器以資源HelloWorld.jsp作爲這個請求的響應。
  4. 頁面 HelloWorld.jsp 將被處理,  <s:property value="messageStore.message" /> 標籤會調用HelloWorld Action 的 getMessageStore方法返回MessageStore對象,然後調用MessageStore對象的 getMessage 方法。最終標籤將message屬性的值合併到這個響應中。
  5. 最終一個純粹的HTML文件作爲響應被髮送到瀏覽器。

回顧

      Struts 2框架Action來處理HTML表單和其他的請求。Action類返回諸如 SUCCESSERROR or INPUT的結果常量字符串(這些都是Struts定義好的)。然後從struts.xml文件中讀取映射配置,根據結果名獲取對應的頁面文件,也可能是其他的Action,或者其他的Web資源(例如圖片、PDF)。

      當一個服務器頁面被展示時,通常它會包含Action提供的動態數據。爲了能夠更方便的展示這些動態數據,Struts 2框架提供了一套標籤庫,能夠和HTML標記一起使用來創建一個動態頁面。 

上一篇 如何創建一個Struts 2 Web應用 or 下一篇  使用Struts2標籤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章