SSH框架之Struts2初識(shí)(一)

第一節(jié):Struts2概述

Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架,它本質(zhì)上相當(dāng)于一個(gè)servlet,在MVC設(shè)計(jì)模式中,Struts2作為控制器(Controller)來(lái)建立模型與視圖的數(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ī)制來(lái)處理用戶的請(qǐng)求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開(kāi),所以Struts 2可以理解為WebWork的更新產(chǎn)品。雖然從Struts 1到Struts 2有著太大的變化,但是相對(duì)于WebWork,Struts 2的變化很小。

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

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

1.1 前端控制器模式

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


image.png

在圖中傳統(tǒng)方式的開(kāi)發(fā),有一次請(qǐng)求就會(huì)對(duì)應(yīng)一個(gè)Servlet。這樣會(huì)導(dǎo)致出現(xiàn)很多Servlet。而Struts2將所有的請(qǐng)求都先經(jīng)過(guò)一個(gè)前端控制器,在前端控制器中實(shí)現(xiàn)框架的部分功能,剩下具體操作要提交到具體的Action中。那么所有的請(qǐng)求都會(huì)經(jīng)過(guò)前端控制器,那用什么來(lái)實(shí)現(xiàn)前端控制器呢?過(guò)濾器就是最好的一個(gè)實(shí)現(xiàn)方式,因?yàn)樾枰械恼?qǐng)求都可以被過(guò)濾器攔截,然后在過(guò)濾器中實(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文件,可以通過(guò)zip方法進(jìn)行解壓。
  • docs:該文件夾用于存放官方提供的Struts2文檔,包括Struts2的快速入門、Struts2的文檔以及API文檔等內(nèi)容。
  • lib:存放Struts2的核心類庫(kù),以及Struts2的第三方插件類庫(kù)。
  • src:用于存放該版本Struts2框架所對(duì)應(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é)碼的類庫(kù)
  • asm-commons:提供基于事件的表現(xiàn)形式
  • asm-tree:提供基于對(duì)象的表現(xiàn)形式
  • struts-core:Struts2框架的核心類庫(kù)
  • xwork-core:webWork核心庫(kù),Struts2的構(gòu)建集成
  • ognl:對(duì)象圖導(dǎo)航語(yǔ)言(Object Graph Navigation Lanaguage),Struts2框架通過(guò)其讀寫對(duì)象的屬性。
  • freemarker:Struts2標(biāo)簽?zāi)0迨褂玫念悗?kù)
  • javassist:javaScript字節(jié)碼解釋器
  • commons-fileupload:Struts2文件上傳組件依賴包
  • common-long:包含一些數(shù)據(jù)類型工具,是對(duì)java.lang包的增強(qiáng)
  • log4j-api:Struts2的日志管理組件依賴包的api
  • log4j-core:Struts2的日志管理組件依賴包

2.4 測(cè)試頁(yè)面Jsp的編寫

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

2.5 測(cè)試Action的編寫

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

public class Struts2Demo {

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

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

2.6 Action的配置:

在示例代碼WEB-INF的classes中,有一個(gè)名稱為struts.xml的文件,這個(gè)文件就是struts2的配置文件。
我們?cè)陂_(kāi)發(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"/>

    <!--配置一個(gè)包-->
    <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過(guò),WEB層框架都有一個(gè)特點(diǎn)就是基于前端控制器的模式,這個(gè)前端控制器是由過(guò)濾器實(shí)現(xiàn)的,所以我們需要配置Struts2的核心過(guò)濾器。這個(gè)過(guò)濾器的名稱是StrutsPrepareAndExecuteFilter

2.7 配置核心過(guò)濾器

Struts2框架要想執(zhí)行,所有的請(qǐng)求都需要經(jīng)過(guò)這個(gè)前端控制器(核心過(guò)濾器),所以需要配置這個(gè)核心過(guò)濾器。因?yàn)檫@個(gè)過(guò)濾器完成了框架的部分的功能。在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的過(guò)濾器(核心控制器)-->
    <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é)果頁(yè)面跳轉(zhuǎn),并訪問(wè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>
    <!--配置一個(gè)包-->
    <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>

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

image.png

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

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

2.9 總結(jié):

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

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

從客戶端發(fā)送請(qǐng)求過(guò)來(lái),先經(jīng)過(guò)前端控制器(核心過(guò)濾器StrutsPrepareAndExecuteFilter)過(guò)濾器中執(zhí)行一組攔截器(一組攔截器,就會(huì)玩部分功能代碼),在Struts2中定義很多攔截器,在其默認(rèn)棧中的攔截器會(huì)得到執(zhí)行。


image.png

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

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

3.1 Struts2配置文件的加載順序

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


image.png

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


image.png

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

這一系列代碼就是用來(lái)截止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():加載用戶配置的提供對(duì)象
  • this.init_FilterInitParameters():加載web.xml
  • this.init_AliasStandardObjects():加載標(biāo)準(zhǔn)對(duì)象。
    根據(jù)上面的代碼我們可以得出配置文件的加載順序如下:
/******
  * default.properties
  * struts-default.xml
  * struts-plugin.xml
  * struts.xml      配置Action以及常量
  * struts.properties     配置常量
  * web.xml        配置核心過(guò)濾器以及常量
******/

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

3.2 Action的配置

Struts2框架的核心配置文件是struts.xml文件,該文件主要用來(lái)配置Action的請(qǐng)求和對(duì)應(yīng)關(guān)系。
<package>標(biāo)簽的配置
Struts2框架的核心組件是Action和攔截器,它使用包來(lái)管理Action和攔截器。每個(gè)包就是多個(gè)Action,多個(gè)攔截器,多個(gè)攔截器引用的集合。在struts.xml文件中,package元素用于定義包配置,每個(gè)package元素定義一個(gè)包配置。package元素的常用屬性,如表所示:

image.png

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

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

<Action>的配置
Action映射是框架中的基本“工作單元”。Action映射就是講一個(gè)請(qǐng)求的URL映射到一個(gè)Action類,當(dāng)一個(gè)請(qǐng)求匹配某個(gè)Action名稱時(shí),框架就使用這個(gè)映射來(lái)確定如何處理請(qǐng)求。在sturts.xml文件中,通過(guò)<action>元素對(duì)請(qǐng)求的Action和Action類進(jìn)行配置。
<action>元素中共有4個(gè)屬性,這4個(gè)屬性的說(shuō)明如下:

image.png

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

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

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

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

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

在struts.xml文件中通過(guò)<constant>元素來(lái)配置常量,是最常用的方式。在struts.xml文件中通過(guò)<constant.../>元素來(lái)配置常量時(shí),需要指定兩個(gè)必填的屬性name和value。

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

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

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

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

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

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

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

在web.xml文件中配置核心過(guò)濾器StrutsPrepareAndExecuteFilter時(shí),通過(guò)初始化參數(shù)來(lái)配置常量。通過(guò)<filter>元素的<init-param>子元素指定,每個(gè)<init-param>元素配置了一個(gè)Struts2常量。在web.xml文件中通過(guò)初始化參數(shù)配置常量方式,具體如下:

   <!--配置Struts2的過(guò)濾器(核心控制器)-->
    <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路徑下有一個(gè)default.properties文件,該文件里為Struts2的所有常量都指定了默認(rèn)值,我們可以通過(guò)查看該文件來(lái)了解Struts2所支持的常量。
后加載的配置文件的常量的值會(huì)覆蓋先加載的配置文件中常量的值
在實(shí)際的開(kāi)發(fā)中我們更習(xí)慣使用struts.xml修改struts2的常量。

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

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

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

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

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

在Struts2的應(yīng)用開(kāi)發(fā)中,Action作為框架的核心類,實(shí)現(xiàn)對(duì)用戶請(qǐng)求的處理,Action類被稱為業(yè)務(wù)邏輯控制器。一個(gè)Action類代表一次請(qǐng)求或調(diào)用,每個(gè)請(qǐng)求的動(dòng)作都對(duì)應(yīng)于一個(gè)相應(yīng)的Action類,一個(gè)Action類是一個(gè)對(duì)立的工作單元。也就是說(shuō),用戶的每次請(qǐng)求,都會(huì)轉(zhuǎn)到一個(gè)相應(yīng)的Action類里面,由這個(gè)Action類來(lái)進(jìn)行處理。簡(jiǎn)而言之,Action就是用來(lái)處理一次用戶請(qǐng)求的對(duì)象。

5.1 Action的編寫方式:

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

public class struts2Demo {

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

execute()方法的要求如下:

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

Action類實(shí)現(xiàn)一個(gè)Action的接口
為了讓用戶開(kāi)發(fā)的Action類更規(guī)范,Struts2提供了一個(gè)Action接口,用戶在實(shí)現(xiàn)Action控制類時(shí),可以實(shí)現(xiàn)Struts2提供的這個(gè)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包中,這個(gè)接口中定義了一個(gè)execute()方法,該接口的規(guī)范規(guī)定了Action處理類應(yīng)該包含一個(gè)execute()方法,該方法返回一個(gè)字符串。除此之外,該接口還定義了5個(gè)字符串常量,它們的作用是統(tǒng)一execute()方法的返回值。
Action接口中提供了5個(gè)已經(jīng)定義的常量如下:

  • SUCCESS :success,代表成功。
  • NONE : none,代表頁(yè)面不跳轉(zhuǎn)。
  • ERROR: error,代表跳轉(zhuǎn)到錯(cuò)誤頁(yè)面。
  • INPUT: input,數(shù)據(jù)校驗(yàn)的時(shí)候跳轉(zhuǎn)的路徑。
  • LOGIN:login,用來(lái)跳轉(zhuǎn)到登錄頁(yè)面。

Action類繼承ActionSupport類 ,開(kāi)發(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等接口,來(lái)為開(kāi)發(fā)這提供更多的功能。
ActionSupport類中提供了許多默認(rèn)方法,這些方法包括獲取國(guó)際化信息的方法、數(shù)據(jù)校驗(yàn)的方法、默認(rèn)的處理用戶請(qǐng)求的方法等。實(shí)際上,ActionSupport類時(shí)Struts2默認(rèn)的Action處理類,讓開(kāi)發(fā)者的Action類繼承ActionSupport類,則會(huì)大大簡(jiǎn)化Action的開(kāi)發(fā)。

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

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

6.1 解決Action的訪問(wèn)方式一:通過(guò)配置method屬性完成。

  • 編寫jsp頁(yè)面
<%--通過(guò)配置method來(lái)實(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中,增加對(duì)應(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

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

6.2 解決Action的訪問(wèn)問(wèn)題方式二:通過(guò)配置符的配置完成

  • 編寫jsp訪問(wèn)界面
 <%--通過(guò)配置通配符的方式實(shí)現(xiàn)方法的切換--%>
  <h2>通過(guò)配置通配符的方式實(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)于通配符的配置:
 <!--配置一個(gè)包-->
    <package name="strutsDemo1" extends="struts-default" namespace="/" strict-method-invocation="false">
        <!--配置Action-->
       
        <!--使用通配符的方式配置action不同方法的訪問(wèn)-->
        <action name="CustomerAction_*" class="com.seapp.struts2.action.Struts2Action02" method="{1}">

        </action>
    </package>

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

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


    image.png
image.png

6.3 解決Action的訪問(wèn)問(wèn)題方式三:動(dòng)態(tài)方法訪問(wèn)

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

 <!--開(kāi)啟動(dòng)態(tài)訪問(wèn)-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  • jsp訪問(wèn)界面代碼編寫
  <%--通過(guò)配置動(dòng)態(tài)訪問(wèn)的方式實(shí)現(xiàn)方法的切換--%>
  <h2>通過(guò)配置動(dòng)態(tài)訪問(wèn)的方式實(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的配置
  <!--配置動(dòng)態(tài)訪問(wèn)action的方式-->
        <action name="CustomerAction" class="com.seapp.struts2.action.Struts2Action02">

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


    image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容