版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址: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)進行處理,它其實就是一箇中央處理器,每次請求都需要經過它。
我們通過一張圖簡單瞭解下傳統方式和 前端控制器模型 的區別:
二、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 包全部引入。
2、目錄結構
1)Maven 目錄結構
2)使用 Jar 包的目錄結構
3、配置前端控制器(核心過濾器)
這個前端控制器我們也把它稱爲是 Struts2 的核心過濾器。自
2.1.3
版本開始,ActionContextCleanUp
和FilterDispatcher
都由 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,才擁有了 Struts2 中 Action 的基本功能,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
頁面,表示測試成功!
三、可能會出現的問題
在做 HelloWorld 這個小栗子時可能會出現一些意想不到的問題,我在做 HelloWorld 這個小栗子的時候,出現了下列問題,大家可以進行參考:
1、Maven 構建 Struts2 時報 ClassNotFoundException 異常
請參考:https://blog.csdn.net/sun8112133/article/details/104521255
2、項目報 Java 版本不匹配
請參考:https://blog.csdn.net/sun8112133/article/details/104521088