三膏斤、第一個Struts程序

有了開發(fā)環(huán)境盅惜,有了運(yùn)行環(huán)境中剩,就可以開始正式進(jìn)入Struts世界了。

  • 獲取Struts框架(jar包)
  • 寫第一個HelloStruts程序
  • 分析Struts程序的執(zhí)行流程

1.獲取Struts框架

使用框架抒寂,其實(shí)就是別人已經(jīng)寫好的封裝好的JAVA程序结啼,我們通過調(diào)用別人寫好的類,來實(shí)現(xiàn)更優(yōu)雅的設(shè)計模式屈芜,從而提高程序開發(fā)效率以及程序編寫的便捷性郊愧。因此,我們首先需要去下載好Struts框架的jar文件井佑。
我們可以通過到Struts2官網(wǎng)進(jìn)行下載属铁,地址如下:http://struts.apache.org

Struts官網(wǎng)提供多個版本可供下載,具體如下表格所示:

Struts版本 說明
Full Distribution Struts2完整版:包含示例程序躬翁、空應(yīng)用焦蘑、核心庫、源代碼以及文檔
Example Applications Struts2的示例程序
Essential Dependencies Only Struts2核心庫
Documentation struts2核心文檔
Sources Struts2源代碼

但鑒于國內(nèi)經(jīng)常無法打開該網(wǎng)站盒发,我這里為大家學(xué)習(xí)方便例嘱,提供了常用的Struts2基礎(chǔ)框架包。下載:Struts2傳送門...

2.第一個HelloStruts程序

一個基本的Struts2程序大概的執(zhí)行流程應(yīng)該如下:
Client --> index.jsp --> web.xml --> struts.xml --> HelloStrutsAction.java --> success.jsp

用戶->index.jsp:用戶通過瀏覽器訪問JSP頁面
index.jsp->web.xml:通過JSP頁面中的按鈕發(fā)送action請求
web.xml->struts.xml:請求被攔截器獲取宁舰,并通過struts配置文件實(shí)現(xiàn)路由
struts.xml->HelloStrutsAction:調(diào)用對應(yīng)的Action類
HelloStrutsAction->success.jsp:Action類中實(shí)現(xiàn)業(yè)務(wù)處理拼卵,并組織生成JSP頁面
success.jsp->用戶:返回結(jié)果

如下圖所示:


struts時序圖說明

所以,我們需要編寫5個文件:

0.前置工作

首先我們需要在Eclipse中新建一個Dynamic Web Project蛮艰,并讓工具自動給我們生成web.xml配置文件腋腮。


生成web.xml

并在項(xiàng)目的WebContent——WEB-INF——lib文件夾下,引入Struts2框架文件(復(fù)制或拖拽進(jìn)來)印荔,如下圖所示:


引入Struts框架jar包

1.index.jsp

在WebContent下低葫,創(chuàng)建一個index.jsp的頁面。
主要用于為用戶提供訪問入口仍律,并向web.xml發(fā)送action請求嘿悬。
頁面中包含一個[HelloWorld]的超鏈接鲤孵,用于觸發(fā)action請求演怎。

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<html>
    <head>
        <title>首頁</title>
</head>
    <body>
        <h1>Welcome To Struts 2!</h1>
        <a href="${pageContext.request.contextPath }/helloStruts.action">
        Hello World
        </a>
    </body>
</html>

2.web.xml

為本項(xiàng)目web配置文件秧均,里面配置了一個Struts2的核心過濾器。

<?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" 
         version="3.0">
  <!-- 配置一個Struts2核心過濾器 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <!-- 配置該Struts2過濾器的映射 -->
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- 頁面列表 -->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

3.struts.xml

在項(xiàng)目的Java Resources——src文件夾下新建一個Struts.xml配置文件葡缰,其定義了action的請求路徑,實(shí)現(xiàn)Action類的路由映射拯爽。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- Struts2配置文件的根元素 -->
<struts>
  <!-- Struts2的Action必須放在指定的包空間下定義 -->
  <package name="hello" extends="struts-default" namespace="/*">
    <!-- 定義 action最蕾,該action對應(yīng)的類為cn.itcast.action.HelloStrutsAction類 
    -->
    <action name="helloStruts" class="cn.itcast.action.HelloStrutsAction">
      <!-- 定義處理結(jié)果和視圖資源之間的映射關(guān)系 -->
      <result name="success">/success.jsp</result>
    </action>
  </package>
</struts>

<action>標(biāo)簽:定義請求路徑;
<result>標(biāo)簽:定義處理結(jié)果與視圖資源之間的映射關(guān)系源内;(即:什么情況返回什么頁面)

4.HelloStrutsAction.java

其為具體執(zhí)行業(yè)務(wù)操作的Action類葡粒,java代碼就寫在這里。
在項(xiàng)目的Java Resources——src文件夾下新建一個名為:cn.itcast.action的包膜钓,并在該包下創(chuàng)建一個HelloStrutsAction的Java類嗽交,該類繼承Struts2框架的ActionSupport類,因此需要先引入命名空間com.opensymphony.xwork2.ActionSupport颂斜;


HelleStrutsAction類
package cn.itcast.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloStrutsAction extends ActionSupport {
    public String execute() throws Exception {
        return SUCCESS;
    }
}

5.success.jsp

在WebContent下夫壁,創(chuàng)建一個success.jsp的頁面,用于把結(jié)果組織成界面沃疮,響應(yīng)返回給用戶盒让。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>成功頁面</title>
    </head>
    <body>
        歡迎學(xué)習(xí)第一個Struts2程序!
    </body>
</html>

運(yùn)行項(xiàng)目

選擇項(xiàng)目右鍵——Run As——Run on Server司蔬,若成功跑起來邑茄,則可在瀏覽器中輸入http://localhost:8080/HelloStruts 訪問index.jsp。

補(bǔ)充一點(diǎn):
如果引入原有項(xiàng)目到本地時葱她,有些庫的引入可能與本地的不一致撩扒,例如:原有JRE是7.0,但本機(jī)環(huán)境是JRE8.0吨些。
此時搓谆,需要刪掉原來的JRE7.0,并添加本地的JRE8.0豪墅。

  • 1.刪掉原來的JRE7.0的引用:
    右擊該項(xiàng)目 - Build Path - Configure Build Path 泉手, Java Build Path - Libraries 選項(xiàng)下,會發(fā)現(xiàn)有個出錯的JRE System Libraries偶器,將其Remove掉斩萌。


    刪除原有JRE7.0引用庫
  • 2.添加本地的JRE8.0的引用:
    右擊該項(xiàng)目 - Build Path - Add Library, 選擇JRE System Library屏轰,選擇Workspace defaulr JRE(jdk1.6)(此前JDK已成功安裝并配置好)颊郎, 然后 Finish 。


    添加JRE8.0 引用庫

3.總結(jié)出:Struts2的執(zhí)行流程

Struts2的基本執(zhí)行流程

1.首先客戶端瀏覽器發(fā)送一個請求(HttpServletRequest)霎苗。
2.接著程序會調(diào)用StrutsPrepareAndExecuteFilter姆吭,然后詢問ActionMapper這個請求是否需要調(diào)用某個Action。
3.如果ActionMapper決定需要調(diào)用某個Action唁盏,StrutsPrepareAndExecuteFilter會把請求的處理交給ActionProxy内狸。
4.ActionProxy通過配置管理器(Configuration Manager)從配置文件(struts.xml)中讀取框架的配置信息检眯,從而找到需要調(diào)用的Action類。
5.然后ActionProxy會創(chuàng)建一個ActionInvocation的實(shí)例昆淡。
6.ActionInvocation使用命名模式來調(diào)用Action锰瘸,在調(diào)用Action前,會依次調(diào)用所有配置的攔截器(Intercepter1昂灵、Intercepter2……)避凝。
7.一旦Action執(zhí)行完,返回結(jié)果字符串眨补,ActionInvocation就會負(fù)責(zé)查找結(jié)果字符串對應(yīng)的Result恕曲,然后執(zhí)行這個Result。通常情況下Result會調(diào)用一些模板(JSP等)來呈現(xiàn)頁面渤涌。
8.產(chǎn)生的Result信息返回給ActionInvocation, 此過程中攔截器會被再次執(zhí)行(順序與Action執(zhí)行之前相反)把还。
9.最后產(chǎn)生一個HttpServletResponse的響應(yīng)行為实蓬,通過StrutsPrepareAndExecuteFilter反饋給客戶端。


作者: 肖sir@ZHBIT
2018 年 09月 17日


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吊履,一起剝皮案震驚了整個濱河市安皱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艇炎,老刑警劉巖酌伊,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缀踪,居然都是意外死亡居砖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門驴娃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏候,“玉大人,你說我怎么就攤上這事唇敞≌岵荩” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵疆柔,是天一觀的道長咒精。 經(jīng)常有香客問我,道長旷档,這世上最難降的妖魔是什么模叙? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮彬犯,結(jié)果婚禮上向楼,老公的妹妹穿的比我還像新娘查吊。我一直安慰自己,他們只是感情好湖蜕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布逻卖。 她就那樣靜靜地躺著,像睡著了一般昭抒。 火紅的嫁衣襯著肌膚如雪评也。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天灭返,我揣著相機(jī)與錄音盗迟,去河邊找鬼。 笑死熙含,一個胖子當(dāng)著我的面吹牛罚缕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怎静,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邮弹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚓聘?” 一聲冷哼從身側(cè)響起腌乡,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夜牡,沒想到半個月后与纽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塘装,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年急迂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氢哮。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡袋毙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冗尤,到底是詐尸還是另有隱情听盖,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布裂七,位于F島的核電站皆看,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏背零。R本人自食惡果不足惜腰吟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毛雇,春花似錦嫉称、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至震捣,卻和暖如春荔棉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒿赢。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工润樱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羡棵。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓壹若,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皂冰。 傳聞我的和親對象是個殘疾皇子舌稀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容