SSH框架之Struts2初識(一)

第一節(jié):Struts2概述

Struts2是一個基于MVC設(shè)計(jì)模式的Web應(yīng)用框架叙谨,它本質(zhì)上相當(dāng)于一個servlet,在MVC設(shè)計(jì)模式中保屯,Struts2作為控制器(Controller)來建立模型與視圖的數(shù)據(jù)交互手负。Struts 2是Struts的下一代產(chǎn)品,是在 struts 1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的Struts 2框架姑尺。其全新的Struts 2的體系結(jié)構(gòu)與Struts 1的體系結(jié)構(gòu)差別巨大竟终。Struts 2以WebWork為核心,采用攔截器的機(jī)制來處理用戶的請求切蟋,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開统捶,所以Struts 2可以理解為WebWork的更新產(chǎn)品。雖然從Struts 1到Struts 2有著太大的變化柄粹,但是相對于WebWork喘鸟,Struts 2的變化很小。

Struts擁有優(yōu)良的設(shè)計(jì)和功能镰惦,其優(yōu)勢具體如下:

  • 項(xiàng)目開源迷守,使用及拓展方便,天生優(yōu)勢旺入。
  • 提供Exception處理機(jī)制兑凿。
  • Result方式的頁面導(dǎo)航凯力,通過Result標(biāo)簽很方便的實(shí)現(xiàn)重定向和頁面跳轉(zhuǎn)。
  • 通過簡單礼华、集中的配置來調(diào)度業(yè)務(wù)類咐鹤,使得配置和修改都非常容易。
  • 提供簡單圣絮、統(tǒng)一的表達(dá)式語音來訪問所有可供訪問的數(shù)據(jù)祈惶。
  • 提供標(biāo)準(zhǔn)、強(qiáng)大的驗(yàn)證框架和國際框架扮匠。
  • 提供強(qiáng)大的捧请、可以有效減少頁面代碼的標(biāo)簽。
  • 提供良好的Ajax支持棒搜。
  • 擁有簡單的插件疹蛉,只需要放入相應(yīng)的JAR包,任何人都可以擴(kuò)展Struts2框架力麸,比如自定義攔截器可款、自定義結(jié)果類型、自定義標(biāo)簽等克蚂,為Struts定制需要的功能闺鲸,不需要什么特殊配置,并且可以發(fā)布給其他人使用埃叭。
  • 擁有智能的默認(rèn)設(shè)置摸恍,不需要另外進(jìn)行繁瑣的設(shè)置。使用默認(rèn)設(shè)置就可以完成大多數(shù)項(xiàng)目程序開發(fā)所需要的功能游盲。

1.1 前端控制器模式

什么是前端控制器模式呢误墓?如下圖


image.png

在圖中傳統(tǒng)方式的開發(fā),有一次請求就會對應(yīng)一個Servlet益缎。這樣會導(dǎo)致出現(xiàn)很多Servlet谜慌。而Struts2將所有的請求都先經(jīng)過一個前端控制器,在前端控制器中實(shí)現(xiàn)框架的部分功能莺奔,剩下具體操作要提交到具體的Action中欣范。那么所有的請求都會經(jīng)過前端控制器,那用什么來實(shí)現(xiàn)前端控制器呢令哟?過濾器就是最好的一個實(shí)現(xiàn)方式恼琼,因?yàn)樾枰械恼埱蠖伎梢员贿^濾器攔截,然后在過濾器中實(shí)現(xiàn)部分功能屏富。

第二節(jié):Struts2的入門(下載晴竞、集成、配置狠半、運(yùn)行)

2.1下載

下載地址:https://struts.apache.org/

image.png

2.2 jar包結(jié)構(gòu)分析

解壓后的目錄詳情:


image.png
  • apps:該文件夾用于存放官方提供的Struts2示例程序噩死,這些程序可以作為學(xué)習(xí)者的學(xué)習(xí)資料颤难,可為學(xué)習(xí)者提供很好的參照。各示例均為war文件已维,可以通過zip方法進(jìn)行解壓六孵。
  • docs:該文件夾用于存放官方提供的Struts2文檔励幼,包括Struts2的快速入門、Struts2的文檔以及API文檔等內(nèi)容蚤吹。
  • lib:存放Struts2的核心類庫逛艰,以及Struts2的第三方插件類庫染坯。
  • src:用于存放該版本Struts2框架所對應(yīng)的源代碼筒扒。

2.3 創(chuàng)建web項(xiàng)目忘苛,引入Struts2jar包

將示例工程struts-2.5.20\apps\struts2-rest-showcase\WEB-INF\lib下的jar包引入項(xiàng)目中。


image.png

部分jar包的作用

  • asm :操作java字節(jié)碼的類庫
  • asm-commons:提供基于事件的表現(xiàn)形式
  • asm-tree:提供基于對象的表現(xiàn)形式
  • struts-core:Struts2框架的核心類庫
  • xwork-core:webWork核心庫缔莲,Struts2的構(gòu)建集成
  • ognl:對象圖導(dǎo)航語言(Object Graph Navigation Lanaguage),Struts2框架通過其讀寫對象的屬性甫恩。
  • freemarker:Struts2標(biāo)簽?zāi)0迨褂玫念悗?/li>
  • javassist:javaScript字節(jié)碼解釋器
  • commons-fileupload:Struts2文件上傳組件依賴包
  • common-long:包含一些數(shù)據(jù)類型工具,是對java.lang包的增強(qiáng)
  • log4j-api:Struts2的日志管理組件依賴包的api
  • log4j-core:Struts2的日志管理組件依賴包

2.4 測試頁面Jsp的編寫

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Struts2初識</title>
  </head>
  <body>
  <a href="${pageContext.request.contextPath}/Struts2Demo.action">點(diǎn)擊訪問第一個action</a>
  </body>
</html>

2.5 測試Action的編寫

在src下建立Struts2Demo的文件酌予,并且創(chuàng)建一個public的execute的方法。返回一個"success"的字符串與struts.xml中的result標(biāo)簽配合奖慌,實(shí)現(xiàn)頁面的跳轉(zhuǎn)抛虫。

public class Struts2Demo {

    /**
     * 不提供任何參數(shù),供反射使用
     * @return
     */
    public String execute(){
        System.out.println("我的第一個action訪問成功了简僧。");
        return "success";
    }
}

Action類編寫好了以后建椰,Struts2框架如何識別它就是一個Action呢,則需要我們隊(duì)Action類進(jìn)行配置岛马。

2.6 Action的配置:

在示例代碼WEB-INF的classes中棉姐,有一個名稱為struts.xml的文件,這個文件就是struts2的配置文件啦逆。
我們在開發(fā)中需要將struts.xml文件引入到工程的src下伞矩,配置的內(nèi)容如下:

<?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>
    <!--  Overwrite Convention -->
    <constant name="struts.convention.action.suffix" value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches" value="true"/>

    <!--配置一個包-->
    <package name="strutsDemo1" extends="struts-default" namespace="/">
        <!--配置Action-->
        <action name="Struts2Demo" class="com.seapp.struts2.action.Struts2Demo">

        </action>
    </package>
</struts>

Action類已經(jīng)配置好了,但現(xiàn)在還不可以執(zhí)行夏志。因?yàn)橹拔覀兘榻B過乃坤,WEB層框架都有一個特點(diǎn)就是基于前端控制器的模式,這個前端控制器是由過濾器實(shí)現(xiàn)的沟蔑,所以我們需要配置Struts2的核心過濾器湿诊。這個過濾器的名稱是StrutsPrepareAndExecuteFilter

2.7 配置核心過濾器

Struts2框架要想執(zhí)行瘦材,所有的請求都需要經(jīng)過這個前端控制器(核心過濾器)厅须,所以需要配置這個核心過濾器。因?yàn)檫@個過濾器完成了框架的部分的功能食棕。在web.xml中具體的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--配置Struts2的過濾器(核心控制器)-->
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

2.8 配置結(jié)果頁面跳轉(zhuǎn)朗和,并訪問action

<?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>
    <!--配置一個包-->
    <package name="strutsDemo1" extends="struts-default" namespace="/">
        <!--配置Action-->
        <action name="struts2Demo" class="com.seapp.struts2.action.struts2Demo">
            <result name="success">/demo01.jsp</result>
        </action>
    </package>
</struts>

訪問http://localhost:8080/struts2/index.jsp后跳轉(zhuǎn)到如下界面:

image.png

點(diǎn)擊跳轉(zhuǎn)后错沽,進(jìn)入如下界面:
image.png

至此,入門測試項(xiàng)目完成例隆。

2.9 總結(jié):

在測試階段碰到如下問題:在通過配置文件struts.xml來訪問struts2Demo的action時報錯:“Wrong method was defined as an action method: index”甥捺,參考https://blog.csdn.net/github_38616039/article/details/79045432該文檔解決問題。根據(jù)文檔描述是因?yàn)椤皊truts2-rest-plugin-2.5.20.jar”包導(dǎo)致镀层,將其移除后可正常訪問镰禾。暫不明白具體原因,望各位前輩指點(diǎn).....

第二節(jié):Struts2的開發(fā)流程分析

從客戶端發(fā)送請求過來唱逢,先經(jīng)過前端控制器(核心過濾器StrutsPrepareAndExecuteFilter)過濾器中執(zhí)行一組攔截器(一組攔截器吴侦,就會玩部分功能代碼),在Struts2中定義很多攔截器坞古,在其默認(rèn)棧中的攔截器會得到執(zhí)行备韧。


image.png

第三節(jié):Struts2的常見配置

在針對Struts2中的struts.xml文件的配置等內(nèi)容進(jìn)行詳細(xì)的學(xué)習(xí)前,先對Struts2的配置文件的加載順序有一定的了解痪枫,這樣對后面學(xué)習(xí)Struts2的配置都是有幫助的织堂。

3.1 Struts2配置文件的加載順序

每次從客戶端發(fā)送請求到服務(wù)器都要先經(jīng)過Struts2的核心過濾器StrutsPrepareAndExecuteFilter,這個過濾器有兩個功能:預(yù)處理和執(zhí)行奶陈。在預(yù)處理中主要就是來加載配置文件的易阳。對應(yīng)的是過濾器中的init方法,而執(zhí)行是用來執(zhí)行一組攔截器完成部分功能的吃粒,對應(yīng)的是過濾器的doFilter方法潦俺。所以要了解Struts2的配置文件的加載順序,需要從過濾器的init方法開始:


image.png

在init方法中徐勃,調(diào)用了init的initDispacher的方法來加載配置文件事示,進(jìn)入該方法:


image.png

在該方法中又調(diào)用了dispatcher的init方法,繼續(xù)往下跟蹤:
image.png

這一系列代碼就是用來截止Struts2的配置文件的:

  • this.init_DefaultProperties():加載org.apache.struts.default.properties配置僻肖,是Struts2的所有常量肖爵。
  • this.init_TraditionalXmlConfigurations():加載struts-default.xml,struts-plugin.xml,struts.xml的配置項(xiàng)。
  • this.init_LegacyStrutsProperties():加載用戶自定義的struts.properties.
  • this.init_CustomConfigurationProviders():加載用戶配置的提供對象
  • this.init_FilterInitParameters():加載web.xml
  • this.init_AliasStandardObjects():加載標(biāo)準(zhǔn)對象臀脏。
    根據(jù)上面的代碼我們可以得出配置文件的加載順序如下:
/******
  * default.properties
  * struts-default.xml
  * struts-plugin.xml
  * struts.xml      配置Action以及常量
  * struts.properties     配置常量
  * web.xml        配置核心過濾器以及常量
******/

前三個配置文件我們不關(guān)心遏匆,是Struts2內(nèi)部的配置文件,我們無法修改谁榜,能修改的文件就是struts.xml,struts.properties,web.xml配置文件幅聘。這三個配置文件的加載是有順序的,這三個配置文件都可以修改Struts2常量的值窃植,要記住的是帝蒿,后加載配置文件中常量的值會將先加載的配置文件中的常量的值給覆蓋。

3.2 Action的配置

Struts2框架的核心配置文件是struts.xml文件巷怜,該文件主要用來配置Action的請求和對應(yīng)關(guān)系葛超。
<package>標(biāo)簽的配置
Struts2框架的核心組件是Action和攔截器暴氏,它使用包來管理Action和攔截器。每個包就是多個Action,多個攔截器绣张,多個攔截器引用的集合答渔。在struts.xml文件中,package元素用于定義包配置侥涵,每個package元素定義一個包配置沼撕。package元素的常用屬性,如表所示:

image.png

其中在配置包時芜飘,必須制定name屬性务豺,就是包的標(biāo)識。除此之外嗦明,還可以指定一個可選的extends屬性笼沥,extends屬性值必須是另一個包的name屬性值,但該屬性值通常都設(shè)置為struts-default,這個該包中的action就具有了Struts2框架默認(rèn)的攔截器等功能了娶牌。Struts2還提供了一種所謂的抽象包奔浅,抽象包不能包含Action定義。為了顯示指定一個包是抽象包诗良,可以為該package元素增加abstract = "true"屬性乘凸。
在package中還有namespace的配置,namespace屬性與action標(biāo)簽的name屬性共同決定了訪問路徑累榜。namespace有如下三種配置:

  • 默認(rèn)名稱空間:默認(rèn)名稱空間就是namespace=""。
  • 根名稱空間:根名稱空間就是namespace = "/"
  • 帶名稱的名稱空間:帶名稱的名稱空間就是namespace = "/demo1"

<Action>的配置
Action映射是框架中的基本“工作單元”灵嫌。Action映射就是講一個請求的URL映射到一個Action類壹罚,當(dāng)一個請求匹配某個Action名稱時,框架就使用這個映射來確定如何處理請求寿羞。在sturts.xml文件中猖凛,通過<action>元素對請求的Action和Action類進(jìn)行配置。
<action>元素中共有4個屬性绪穆,這4個屬性的說明如下:

image.png

其中name屬性和namespace屬性共同決定了訪問路徑辨泳,class對應(yīng)的是Action類的全路徑。Method指定了執(zhí)行Action的那個方法玖院,默認(rèn)是execute方法菠红。

第四節(jié):Struts2常量的配置:

Sturts2中的常量大多在默認(rèn)配置文件中已經(jīng)配置好了,但根據(jù)用戶需求的不同难菌,開發(fā)的要求也不同试溯,可能需要修改這些常量值,修改的方法就是在配置文件中對常量進(jìn)行重新配置郊酒。
Struts2常量配置共有3種方式遇绞,分別如下:

  • 在struts.xml文件中使用<constant>元素配置常量键袱。
  • 在struts.properties文件中配置常量。
  • 在web.xml文件中通過<init-param>元素配置常量摹闽。
    具體如下:

4.1 在Struts.xml文件中通過<constant>元素配置常量

在struts.xml文件中通過<constant>元素來配置常量蹄咖,是最常用的方式。在struts.xml文件中通過<constant.../>元素來配置常量時付鹿,需要指定兩個必填的屬性name和value澜汤。

  • name:該屬性指定了常量的常量名。
  • value:該屬性指定了常量的常量值倘屹。
    在struts.xml文件中配置的示例代碼如下:
 <!--設(shè)置默認(rèn)編碼集為UTF-8-->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!--設(shè)置開發(fā)模式-->
    <constant name="struts.devMode" value="true"/>

值的一提的是银亲,struts.properties文件能配置的常量都可以在struts.xml文件中用<constant>元素來配置。

4.2 在struts.properties文件中配置常量

struts.properties文件是一個標(biāo)準(zhǔn)的properties文件纽匙,其格式是key-value對务蝠,即每個key對應(yīng)一個value,key表示的是Struts2框架中的常量烛缔,而value則是其常量值馏段。在struts.properties文件中配置常量的方式

# 設(shè)置默認(rèn)編碼集為UTF-8
struts.il8n.encoding=UTF-8
# 設(shè)置action請求拓展名為action或者沒有拓展名
struts.action.extension=action
# 設(shè)置不使用開發(fā)模式
struts.devMode = false
# 設(shè)置不開啟動態(tài)方法調(diào)用
struts.enable.DynamicMethodInvocation = false

需要注意的是,和struts.xml文件一樣践瓷,struts.properties文件也應(yīng)存放于WEB-INF/classes路徑下院喜。

4.3 在web.xml文件中通過初始化參數(shù)配置常量

在web.xml文件中配置核心過濾器StrutsPrepareAndExecuteFilter時,通過初始化參數(shù)來配置常量晕翠。通過<filter>元素的<init-param>子元素指定喷舀,每個<init-param>元素配置了一個Struts2常量。在web.xml文件中通過初始化參數(shù)配置常量方式淋肾,具體如下:

   <!--配置Struts2的過濾器(核心控制器)-->
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        
        <!--配置編碼集為UTF-8-->
        <init-param>
            <param-name>struts.i18n.encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        
    </filter>

注意:<init-param>標(biāo)簽必須放在<filter>標(biāo)簽下硫麻。
Struts2所支持的常量數(shù)量眾多,在struts2-core-***.jar壓縮文件的org/apche/struts2路徑下有一個default.properties文件樊卓,該文件里為Struts2的所有常量都指定了默認(rèn)值拿愧,我們可以通過查看該文件來了解Struts2所支持的常量。
后加載的配置文件的常量的值會覆蓋先加載的配置文件中常量的值
在實(shí)際的開發(fā)中我們更習(xí)慣使用struts.xml修改struts2的常量碌尔。

4.4 分模塊開發(fā)的配置

在實(shí)際開發(fā)中浇辜,我們通常很多人都需要修改同一個配置文件就是struts.xml。因?yàn)檫@個文件是struts2的核心配置文件唾戚,而且這個文件一旦改錯了一點(diǎn)柳洋,那么會導(dǎo)致整個項(xiàng)目都會出現(xiàn)問題,所以struts2提供了<include>標(biāo)簽解決這個問題叹坦。
<include>元素用來在一個struts.xml配置文件中包含其他的配置文件膳灶,包含配置體現(xiàn)的是軟件工程中的“分而治之”原則。Struts2允許將一個配置文件分解成多個配置文件,從而提供配置文件的可讀性轧钓。Struts2默認(rèn)只加載WEB-INF/classes下的strts.xml文件序厉,但一旦通過多個xml文件來配置Action,就必須通過struts.xml文件來包含其他配置文件毕箍。
具體示例如下:

<struts>
<!--不指定默認(rèn)路徑在src下時的方式 -->
<include file="struts-shop.xml"/>
<!-- 配置文件在具體包中時的方式 -->
<include file = "com/seapp/struts2/action/strurs-product.xml"/>
</struts>

需要注意的是:每一個被包含的配置文件都是標(biāo)準(zhǔn)的Struts2配置文件弛房,一樣包含DTD信息、Struts2配置文件的根元素信息等而柑。通常將Struts2的所有配置文件都放在Web項(xiàng)目的WEB-INF/classes路徑下文捶,struts.xml文件包含了其他配置文件,在Struts2框架自動加載struts.xml文件時媒咳,完成加載所有的配置信息粹排。

第五節(jié):Struts2中Action類的創(chuàng)建

在Struts2的應(yīng)用開發(fā)中,Action作為框架的核心類涩澡,實(shí)現(xiàn)對用戶請求的處理顽耳,Action類被稱為業(yè)務(wù)邏輯控制器。一個Action類代表一次請求或調(diào)用妙同,每個請求的動作都對應(yīng)于一個相應(yīng)的Action類射富,一個Action類是一個對立的工作單元。也就是說粥帚,用戶的每次請求胰耗,都會轉(zhuǎn)到一個相應(yīng)的Action類里面,由這個Action類來進(jìn)行處理芒涡。簡而言之柴灯,Action就是用來處理一次用戶請求的對象。

5.1 Action的編寫方式:

Action是一個POJO的類
在Struts2中费尽,Action可以不繼承特殊的類或不實(shí)現(xiàn)任何特殊的接口赠群,僅僅是一個POJO。POJO全稱Plain Ordinary Java Object(簡單的Java對象)依啰,只是具有一部分getter/setter方法的類,就可以稱作POJO,一般在POJO類中店枣,要有一個公共的無參的構(gòu)造方法(采用默認(rèn)的構(gòu)造方法就可以)和一個execute()方法速警。定義格式如下:

public class struts2Demo {

    /**
     * 不提供任何參數(shù),供反射使用
     * @return
     */
    public String execute(){
        System.out.println("我的第一個action訪問成功了鸯两。");
        return "success";
    }
}

execute()方法的要求如下:

  • 方法的權(quán)限修飾符為public
  • 返回一個字符串闷旧,就是指示的下一個頁面的Result
  • 方法沒有參數(shù)
    也就是說,滿足上述要求的POJO都可算作是Struts2的Action實(shí)現(xiàn)钧唐。

Action類實(shí)現(xiàn)一個Action的接口
為了讓用戶開發(fā)的Action類更規(guī)范忙灼,Struts2提供了一個Action接口,用戶在實(shí)現(xiàn)Action控制類時,可以實(shí)現(xiàn)Struts2提供的這個Action接口该园。
Action接口定義了Struts的Action處理類應(yīng)該實(shí)現(xiàn)的規(guī)范酸舍,具體如下:

import com.opensymphony.xwork2.Action;

public class Struts2Action01 implements Action {
    @Override
    public String execute() throws Exception {
        return null;
    }
}

Action接口位于com.opensymphony.xwork2.Action包中,這個接口中定義了一個execute()方法里初,該接口的規(guī)范規(guī)定了Action處理類應(yīng)該包含一個execute()方法啃勉,該方法返回一個字符串。除此之外双妨,該接口還定義了5個字符串常量淮阐,它們的作用是統(tǒng)一execute()方法的返回值。
Action接口中提供了5個已經(jīng)定義的常量如下:

  • SUCCESS :success,代表成功刁品。
  • NONE : none,代表頁面不跳轉(zhuǎn)泣特。
  • ERROR: error,代表跳轉(zhuǎn)到錯誤頁面。
  • INPUT: input,數(shù)據(jù)校驗(yàn)的時候跳轉(zhuǎn)的路徑挑随。
  • LOGIN:login,用來跳轉(zhuǎn)到登錄頁面状您。

Action類繼承ActionSupport類 ,開發(fā)中通常使用這種方式,示例如下:

import com.opensymphony.xwork2.ActionSupport;

public class Struts2Action02 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        return NONE;
    }
}

ActionSupport類本身實(shí)現(xiàn)了Action接口镀裤,是Struts2中默認(rèn)的Action接口的實(shí)現(xiàn)類竞阐,所以繼承ActionSupport就相當(dāng)于實(shí)現(xiàn)了Action接口。ActionSupport類還實(shí)現(xiàn)了Validateable,ValidationAware,TextProvider,LocaleProvider和Serializable等接口暑劝,來為開發(fā)這提供更多的功能骆莹。
ActionSupport類中提供了許多默認(rèn)方法,這些方法包括獲取國際化信息的方法担猛、數(shù)據(jù)校驗(yàn)的方法幕垦、默認(rèn)的處理用戶請求的方法等。實(shí)際上傅联,ActionSupport類時Struts2默認(rèn)的Action處理類先改,讓開發(fā)者的Action類繼承ActionSupport類,則會大大簡化Action的開發(fā)蒸走。

第六節(jié):Action的訪問

Action類的執(zhí)行訪問可以通過前面的配置來完成仇奶,但是之前的方式有一個缺點(diǎn),就是多次請求不能對應(yīng)同一個Action比驻。因?yàn)閷?shí)際的開發(fā)中该溯,一個模塊的請求通常由一個Action類處理就好,否則就會造成Action類過多别惦。
那么如何讓一個模塊的操作提交到一個Action中呢狈茉?在<action>的標(biāo)簽中有一個屬性method,通過method的配置就可以指定Action中的某個方法執(zhí)行。

6.1 解決Action的訪問方式一:通過配置method屬性完成掸掸。

  • 編寫jsp頁面
<%--通過配置method來實(shí)現(xiàn)調(diào)用方法的切換--%>
  <a href="${pageContext.request.contextPath}/addCustomerAction.action">增加用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/updateCustomerAction.action">更新用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/delCustomerAction.action">刪除用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/queryCustomerAction.action">查詢用戶</a>
  <br/>
  • 在struts.xml配置文件中氯庆,增加method的配置
       <action name="addCustomerAction" class="com.seapp.struts2.action.Struts2Action02" method="add">
            
        </action>
        <action name="updateCustomerAction" class="com.seapp.struts2.action.Struts2Action02" method="update">
            
        </action>
        <action name="delCustomerAction" class="com.seapp.struts2.action.Struts2Action02" method="del">
            
        </action>
        <action name="queryCustomerAction" class="com.seapp.struts2.action.Struts2Action02" method="query">
            
        </action>
  • 在Struts2Action02中蹭秋,增加對應(yīng)的方法
import com.opensymphony.xwork2.ActionSupport;

public class Struts2Action02 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        return NONE;
    }

    /**
     * 執(zhí)行保存用戶的方法
     * @return
     * @throws Exception
     */
    public String add() throws Exception{
        System.out.println("用戶保存的方法被調(diào)用了");
        return NONE;
    }
    /**
     * 執(zhí)行更新用戶的方法
     * @return
     * @throws Exception
     */
    public String update() throws Exception{
        System.out.println("用戶更新的方法被調(diào)用了");
        return NONE;
    }  /**
     * 執(zhí)行刪除用戶的方法
     * @return
     * @throws Exception
     */
    public String del() throws Exception{
        System.out.println("用戶刪除的方法被調(diào)用了");
        return NONE;
    }  /**
     * 執(zhí)行查詢用戶的方法
     * @return
     * @throws Exception
     */
    public String query() throws Exception{
        System.out.println("用戶查詢的方法被調(diào)用了");
        return NONE;
    }
}
  • 調(diào)用執(zhí)行結(jié)果
    執(zhí)行界面如下:


    image.png

    返回結(jié)果:


    image.png

    但是這種方式我們會發(fā)現(xiàn),同一個Action類被配置了很多次堤撵,只是修改了后面的method的值仁讨。那么能不能配置簡單化呢?也就是一個Action類粒督,只配置一次就好陪竿。這就需要我們使用通配符的配置方式了。

6.2 解決Action的訪問問題方式二:通過配置符的配置完成

  • 編寫jsp訪問界面
 <%--通過配置通配符的方式實(shí)現(xiàn)方法的切換--%>
  <h2>通過配置通配符的方式實(shí)現(xiàn)方法的切換</h2>
  <a href="${pageContext.request.contextPath}/CustomerAction_add.action">增加用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/CustomerAction_update.action">更新用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/CustomerAction_del.action">刪除用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/CustomerAction_query.action">查詢用戶</a>
  <br/>
  • 在struts.xml配置文件中屠橄,關(guān)于通配符的配置:
 <!--配置一個包-->
    <package name="strutsDemo1" extends="struts-default" namespace="/" strict-method-invocation="false">
        <!--配置Action-->
       
        <!--使用通配符的方式配置action不同方法的訪問-->
        <action name="CustomerAction_*" class="com.seapp.struts2.action.Struts2Action02" method="{1}">

        </action>
    </package>

注意:struts2從2.5版本開始族跛,為了提升安全性,默認(rèn)開啟了嚴(yán)格的方法調(diào)用锐墙。如果要使用通配符*礁哄,必須在package中設(shè)置 strict-method-invocation="false"。在沒有配置的情況下報錯信息會提示

There is no Action mapped for namespace [/] and action name [Action!Metho
  • Struts2Action02中的方法沒變溪北,則訪問測試結(jié)果如下:


    image.png
image.png

6.3 解決Action的訪問問題方式三:動態(tài)方法訪問

動態(tài)方法訪問在Struts2中默認(rèn)是不開啟的桐绒,如果需要使用則需要卡其一個常量

 <!--開啟動態(tài)訪問-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  • jsp訪問界面代碼編寫
  <%--通過配置動態(tài)訪問的方式實(shí)現(xiàn)方法的切換--%>
  <h2>通過配置動態(tài)訪問的方式實(shí)現(xiàn)方法的切換</h2>
  <a href="${pageContext.request.contextPath}/CustomerAction!add.action">增加用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/CustomerAction!update.action">更新用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/CustomerAction!del.action">刪除用戶</a>
  <br/>
  <a href="${pageContext.request.contextPath}/CustomerAction!query.action">查詢用戶</a>
  <br/>
  • struts.xml中action的配置
  <!--配置動態(tài)訪問action的方式-->
        <action name="CustomerAction" class="com.seapp.struts2.action.Struts2Action02">

        </action>
  • Struts2Action02中方法不變,則對應(yīng)的測試結(jié)果如下:


    image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末之拨,一起剝皮案震驚了整個濱河市茉继,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚀乔,老刑警劉巖烁竭,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吉挣,居然都是意外死亡派撕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門睬魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來终吼,“玉大人,你說我怎么就攤上這事氯哮〖使颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵喉钢,是天一觀的道長姆打。 經(jīng)常有香客問我,道長出牧,這世上最難降的妖魔是什么穴肘? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任歇盼,我火速辦了婚禮舔痕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己伯复,他們只是感情好慨代,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啸如,像睡著了一般侍匙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叮雳,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天想暗,我揣著相機(jī)與錄音,去河邊找鬼帘不。 笑死说莫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寞焙。 我是一名探鬼主播储狭,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捣郊!你這毒婦竟也來了辽狈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤呛牲,失蹤者是張志新(化名)和其女友劉穎刮萌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侈净,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尊勿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畜侦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片元扔。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旋膳,靈堂內(nèi)的尸體忽然破棺而出澎语,到底是詐尸還是另有隱情,我是刑警寧澤验懊,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布擅羞,位于F島的核電站,受9級特大地震影響义图,放射性物質(zhì)發(fā)生泄漏减俏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一碱工、第九天 我趴在偏房一處隱蔽的房頂上張望娃承。 院中可真熱鬧奏夫,春花似錦、人聲如沸历筝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梳猪。三九已至麻削,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間春弥,已是汗流浹背呛哟。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匿沛,地道東北人竖共。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像俺祠,于是被迫代替她去往敵國和親公给。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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