struts2的使用

調皮的玩程式碼發表於2018-06-10

一、Struts2的簡介

Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與檢視的資料互動,Struts2=struts1+webwork的發展其起來的。

二、Struts2的原理

Struts2的原理圖

struts2的執行流程:

當通過瀏覽器傳送一個請求

會被StrutsPrepareAndExecuteFilter攔截

會呼叫strtus2框架預設的攔截器(interceptor)完成部分功能

在執行Action中操作

根據Action中方法的執行結果來選擇來跳轉頁面Resutl檢視

一般管StrutsPrepareAndExecuteFilter 叫做前端控制器(核心控制器),只有配置了這個filter我們的strtus2框架才能使用。Strtus2的預設攔截器(interceptor)它們是在struts-default.xml檔案中配置,注意:這上xml檔案是在strtus-core.jar包中。預設的攔截器是在defaultStack中定義的。

        struts2使用的是filter來進行攔截的,其中將請求轉接到struts2框架中,而springmvc是使用servlet來進行攔截的,其中在web.xml檔案的配置中體現了。

struts2的預設配置檔案struts.xml是在class檔案下的struts.xml檔案的,但是為了自己定義位置可以如下進行設計

<filter>  
    <filter-name>struts2</filter-name>  
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    <init-param>
        <param-name>filterConfig</param-name>  
        <param-value>classpath:struts2/struts.xml</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>struts2</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

攔截的方式的配置:/*

二、Struts2的主要配置檔案

1)Struts2的主要配置檔案

web.xml中的前段控制器的配置StrutsPrepareAndExecuteFilter

Struts2的主要配置檔案,其中struts2有很多主要的配置檔案,其中的作用都是一樣,但是其中載入的順序不同,按照下面的順序來進行執行。

載入順序:default.properties——>Strtus-default.xml/Strtus-plugin.xml/Strtus.xml——>strtus.properties——>自定義配置提供——>web.xml配置檔案——>bean相關配置

1

default.properties:

位置:strtus2-core.jar包   org.apache.struts2包下

作用:主要是宣告瞭struts2框架的常量

2

Strtus-default.xml

位置:struts2-corl.jar

作用:宣告瞭interceptor  result  bean

Strtus-plugin.xml

位置:在strtus2的外掛包中

作用:主要用於外掛的配置宣告

Strtus.xml

位置:在我們自己的工程中

作用:用於我們自己工程使用strtus2框架的配置

3

strtus.properties

位置:都是在自己工程的src下

作用:定製常量

4 自定義配置提供
5

web.xml配置檔案

主要是載入strtus2框架在web.xml檔案中的相關配置.

6

bean相關配置

2)Struts2的配置檔案struts.xml

<?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>

    <!-- 宣告常量 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant> 
    <!-- 可以幫助我們解決post請求亂碼問題 -->
	<!-- <constant name="struts.action.extension" value="action"></constant> -->
    <!-- 指定訪問strtsu2框架路徑的副檔名 -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 配置這項後,它會提供更加詳細報錯資訊,以及在struts.xml檔案修改後不在需要重啟伺服器 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <!-- 開啟動態方法呼叫 -->
    <package name="default" namespace="/" extends="struts-default">
        <global-results>
            <result name="" type=""></result>
        </global-results>

        <action name="struts2" class="cn.itheima.web.action.Struts2Action"></action>
        <action name="login" class="cn.itheima.web.action.LoginAction" method="login">
            <result name="success" type="redirect">/success.jsp</result>
            <result name="failer">/failer.jsp</result>
        </action>
        <action name="login1" class="cn.itheima.web.action.LoginAction1" method="login">
            <result name="success" type="redirect">/success.jsp</result>
            <result name="failer">/failer.jsp</result>
        </action>
        <action name="login2" class="cn.itheima.web.action.LoginAction2" method="login">
            <result name="success" type="redirect">/success.jsp</result>
            <result name="failer">/failer.jsp</result>
        </action>
        <action name="test">
            <result>/success.jsp</result>
        </action>

        <action name="bookadd" class="cn.itheima.web.action.BookAction" method="addBook"></action> 
        <action name="bookupdate" class="cn.itheima.web.action.BookAction" method="updateBook"></action> 
        <action name="bookdel" class="cn.itheima.web.action.BookAction" method="delBook"></action> 
        <action name="bookfind" class="cn.itheima.web.action.BookAction" method="findBook"></action>
		<!-- 以上操作可以簡化,使用*通配置來操作 -->
		<action name="*_*" class="cn.itheima.web.action.{1}Action" method="{2}"></action>
	</package>

</struts>

package配置

name屬性  作用:定義一個包的名稱,它必須唯一。

namespace屬性 作用:主要是與action標籤的name屬性聯合使用來確定一個action的訪問路徑

extends屬性 作用:指定繼承自哪個包。一般值是strtus-default,strtus-default包是在strtus-default.xml檔案中宣告的。

abstruct屬性 它代表當前包是一個抽象的,主要是用於被繼承

action配置

name屬性 作用:主要是與package的namespace聯合使用來確定一個action的訪問路徑

class屬性  作用:用於指示當前的action類

method屬性  作用:用於指示當前的action類中的哪個方法執行

 

關於action配置中的class與method的預設值以及result中的name與type 預設值問題

原因:strtus-default.xml檔案中配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

它的作用就是當一個請求來時,如果查詢不到指定的class及對應的method就會執行ActionSupport類中的execute方法。在這個類的execute方法中預設返回的是”success”,也就是說,result的name屬性預設值是success,預設的跳轉方式是請求轉發dispatcher

result配置:它主要是用於指示結果檢視

name屬性 作用是與action類的method方法的返回值進行匹配,來確定跳轉路徑

type屬性 作用是用於指定跳轉方式

3)常量配置

default.properties檔案中定義了struts2框架常用常量 .我們需要自己定義常量的方法:

可以在src下建立一個strtus.properties配置檔案

可以在web.xml檔案中配置

可以直接在strtus.xml檔案中定義常量 (推薦)

注意:後載入的配置檔案中的常量會將先載入的常量覆蓋

三、Action的幾種寫法

        1)POJO類

 

        2)繼承ActionSupport類(推薦使用)

        3)實現Action介面

四、Struts2的請求路徑攔截原理

        1)配置檔案中配置

        2)註解的方式

五、Struts2的請求引數的獲取

1)獲取javaweb中的引數request  response  session

ServletActionContext獲取的方法

通過攔截器的方式來獲取

Struts2框架在執行時,請求會被StrutsPrepareAndExecuteFilter攔截,會根據請求去strtus.xml檔案中查詢到匹配的action,在action執行前,會走一些interceptor,預設執行的攔截器是struts-default.xml檔案中定義的。在預設執行的攔截器中有一個servletConfig攔截器。

檢視一下ServletConfigInterceptor原始碼,以下是部分原始碼

ServletRequestAware, 實現這個介面可以獲取HttpServletRequest

ServletResponseAware ,實現這個介面可以獲取HttpServletResponse

ServletContextAware 實現這個介面可以獲取ServletContext

Struts2的攔截器

四、Struts2的安全漏洞問題

相關文章