描述
- 創建一個Java 類存儲歡迎信息(model)
- 創建一個服務器頁面(JSP)去呈現這個信息(view)
- 創建一個Action類來控制用戶和model、view之間的交互。
- 創建一個映射文件(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 開頭。
這個 <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你將看到下面的頁面:
點擊Hello World 超鏈接你將看到HelloWorld.jsp 頁面:
代碼是如何工作的
你在瀏覽器中訪問 http://localhost:8080/helloworld/hello.action,瀏覽器發送一個Http請求到Web服務器。
- 當項目在啓動的時候,Servlet容器將啓動Web項目,加載web.xml配置。當容器接收到來自對 hello.action 資源的請求時,Servlet容器發現對這個Web應用的所有以*.action結尾的請求都必須通過
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
過濾器。也就是說StrutsPrepareAndExecuteFilter
過濾器是Struts 2 框架的入口。 - 接着Struts 2去struts.xml配置文件中查找以“hello”命名的Action映射配置,發現“hello”對應HelloWorldAction 類。Strut 2 框架就會去執行
execute
方法。 -
execute
方法創建MessageStore對象,返回SUCCESS
(由Struts 定義的常量字符串值爲"success"
)。然後Struts 2框架去查看action配置,當返回SUCCESS時對應的頁面文件是什麼,並通知容器以資源HelloWorld.jsp作爲這個請求的響應。 - 頁面
HelloWorld.jsp
將被處理,<s:property value="messageStore.message" />
標籤會調用HelloWorld
Action 的getMessageStore
方法返回MessageStore對象,然後調用MessageStore對象的getMessage
方法。最終標籤將message屬性的值合併到這個響應中。 - 最終一個純粹的HTML文件作爲響應被髮送到瀏覽器。
回顧
Struts 2框架Action來處理HTML表單和其他的請求。Action類返回諸如 SUCCESS
, ERROR
or INPUT
的結果常量字符串(這些都是Struts定義好的)。然後從struts.xml文件中讀取映射配置,根據結果名獲取對應的頁面文件,也可能是其他的Action,或者其他的Web資源(例如圖片、PDF)。
當一個服務器頁面被展示時,通常它會包含Action提供的動態數據。爲了能夠更方便的展示這些動態數據,Struts 2框架提供了一套標籤庫,能夠和HTML標記一起使用來創建一個動態頁面。
上一篇 如何創建一個Struts 2 Web應用 | or | 下一篇 使用Struts2標籤 |