【Struts2筆記整理一】HelloWorld

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106676866







本篇博客還是以一個衆所周知的 HelloWorld 小栗子開始講起,幫助大家快速瞭解 Struts2 這個主流框架。

本篇博客中 Struts2 版本選用的是 2.3.24


一、Struts2 概述

在講 HelloWorld 這個小栗子之前,我先簡單說一下什麼是 Struts2

1、什麼是 Struts2

如果說的專業點,Struts2 是一款基於 MVC 設計模式的 Web 應用框架,它本質上相當於 Servlet,它是作爲控制器(Controller)來建立模型與視圖的數據交互。說白了它就是用來 進行 WEB 開發的框架 而已。

那麼有些小夥伴可能會有疑問,它的名字格式爲什麼和其他框架不一樣,我們爲什麼不能把它稱爲 Struts 框架,而要在後面加一個 2 呢?其實 Struts 框架分爲兩個大版本(Struts1 和 Struts2),這兩個版本的用法完全不同,相當於是兩個不同的框架了。

Struts1 最先出來的時候號稱是標籤最豐富的框架,因爲它裏面有各種各樣的標籤,直接用標籤就能展示相應的信息了,使用起來非常方便。但是隨着時代的變遷,後來又出來了一款叫 WebWork 的框架,它號稱是開發最便捷的框架,開發的速度要比 Struts1 更快,導致 Struts1 的用戶大量流失。後來 Struts1 也發現了自己的問題,但是在原框架的基礎上修改起來比較費勁了,於是它又重新設計了一款 Web 框架,就是我們現在使用的 Struts2 框架。

這也是 Struts 的一個發展歷史,目前的 Web 主流框架也有很多,比如我們常見的 Spring MVC 這樣的框架也同樣好用,有興趣的小夥伴們可以參考我之前寫的博客:Spring MVC 筆記整理


2、前端控制器模型設計

Struts2 這款框架 和 Spring MVC 一樣也是基於 前端控制器 的模型設計。

前端控制器Struts2 中相當於是一個過濾器,它是用來集中處理請求的,它負責過濾所有的請求,再將對應的請求分發到其他程序(Action)進行處理,它其實就是一箇中央處理器,每次請求都需要經過它。

我們通過一張圖簡單瞭解下傳統方式和 前端控制器模型 的區別:

01前端控制器模型



二、HelloWorld

1、準備工作

先創建一個 Web 工程,如果你使用的是 Maven,可以先創建一個 Maven 的 Web 工程(可以參考: 在 Eclipse 中構建 Web 工程),並引入 Maven 依賴;如果你創建的是普通的 Web 工程,則直接引入 Jar 包即可。

建議大家從 Struts2 官網 上將 Struts2 的開發環境包下載下來,因爲這個開發環境包裏提供了 Struts2 的 Jar 包、開發文檔以及測試應用等,可以很方便的幫助我們進行 Struts2 開發。

這裏使用的是 struts-2.3.24 版本,解壓 Strus2 開發環境包的目錄:

  • apps:Struts2 提供的應用,war 文件,可以將 web 項目打成 war 包,直接放入到 tomcat 裏就可以運行;
  • docs:Struts2 的開發文檔和 API;
  • lib:Struts2 框架的開發 jar 包;
  • src:Struts2 的源碼。

1)Maven 依賴

<dependencies>
	<!-- Struts2 依賴 -->
	<dependency>
		<groupId>org.apache.struts</groupId>
		<artifactId>struts2-core</artifactId>
		<version>2.3.24</version>
	</dependency>
    
	<!-- Servlet 依賴 -->
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>servlet-api</artifactId>
		<version>2.5</version>
	</dependency>
    
	<!-- log4j 依賴 -->
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.16</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.6.1</version>
	</dependency>
</dependencies>

2)Jar 包

apps 目錄下找到 struts-blank 項目(基本項目)並解壓,將此項目的 jar 包全部引入。

01Jar包


2、目錄結構

1)Maven 目錄結構

01Maven目錄結構

2)使用 Jar 包的目錄結構

01普通Java工程目錄結構


3、配置前端控制器(核心過濾器)

這個前端控制器我們也把它稱爲是 Struts2 的核心過濾器。自 2.1.3 版本開始,ActionContextCleanUpFilterDispatcher 都由 StrutsPrepareAndExecuteFilter 代替了。

我們需要配置 Struts2 的核心過濾器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class

<!-- 配置 struts2 的核心過濾器 -->
<filter>
	<filter-name>struts2</filter-name>
	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

4、創建 Struts2 的配置文件

src 下創建一個名字叫做 struts.xml 的配置文件。在這裏先不將 log4j 的配置文件進行引入,若引入時需要注意,Struts2 引入的 Jar 包是 log4j 2.X 的版本,所以只能使用 log4j2.xml 作爲配置文件,當然你也可以將 2.X 版本的 jar 包換成 1.X,這樣就能使用 log4j.properties 作爲配置文件了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 配置 package -->
	<package name="demo1" extends="struts-default" namespace="/">
		<!-- 配置 Action -->
		<action name="hello" class="com.demo.HelloAction">
			<!-- 配置頁面的跳轉 -->
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

Struts2 爲了管理對 Action 的配置,通過包(package)進行管理,一個配置文件中可以有多個包,但是包的 name 屬性必須在當前配置文件中是唯一的。extends 屬性是指繼承了 struts2-core.jar 中的 struts-default.xml,因爲只有繼承了這個 xml,才擁有了 Struts2Action 的基本功能,namespace 屬性需要和 action 標籤中的 name 屬性結合使用,它表示訪問路徑。

關於此配置文件的標籤及屬性在後續博客中會進行專門講解,這裏大家瞭解即可。

在這裏大家只需要知道,當瀏覽器的訪問路徑爲:/hello.action 就能夠訪問到該 Action 並執行對應的方法,最終跳轉到 success.jsp 頁面。這裏和大家擴展一下,Struts2 的擴展名是 .action,所以在 Action 的訪問路徑後面要加 .action;而 Struts1 的擴展名是 .do,所以需要加 .do 擴展名。


5、編寫 Action

Action 其實是一個類,這個類是用來處理用戶請求,給用戶作響應的。

在這個類中需要提供一個 execute() 方法,這個方法的簽名是固定的,當訪問該 Action 時,會默認執行該方法,若想更改其他方法,需要在 Struts2 的配置文件中進行配置,這個後續博客會有專門講解,這裏瞭解一下即可。

/**
 * HelloAction類
 */
public class HelloAction {
	/**
	 * 提供一個方法:
	 * 		方法簽名是固定的,共有的,返回值是 String 類型,方法名是 execute
	 * 		在這個方法中不能傳遞參數
	 * @return
	 */
	public String execute() {
		System.out.println("HelloAction 執行了...");
		return "success";   // 返回 success 字符串,與配置文件中的 result 的 name 屬性對應
	}
}

6、準備 JSP 頁面

我們這裏準備兩個 JSP 頁面,一個是入口的 JSP(demo.jsp),還有一個是跳轉後的 JSP(success.jsp)

1)demo.jsp

<body>
	<h1>Struts2 的 HelloWorld</h1>
	<h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2 的 HelloWorld</a></h3>
</body>

2)success.jsp

<body>
	<h1>跳轉成功頁面!</h1>
</body>

7、瀏覽器測試

用瀏覽器訪問 /hello.action 這個 URL,如果能轉發到 success.jsp 頁面,表示測試成功!

01瀏覽器測試



三、可能會出現的問題

在做 HelloWorld 這個小栗子時可能會出現一些意想不到的問題,我在做 HelloWorld 這個小栗子的時候,出現了下列問題,大家可以進行參考:

1、Maven 構建 Struts2 時報 ClassNotFoundException 異常

請參考:https://blog.csdn.net/sun8112133/article/details/104521255


2、項目報 Java 版本不匹配

請參考:https://blog.csdn.net/sun8112133/article/details/104521088



博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章