struts2框架是SSH框架集中的框架之一,是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器層(Controller)來建立模型與視圖的數據交互。
在使用struts2框架的過程中,需要兩個配置文件,分別為web.xml和struts.xml,服務器一啟動就加載web.xml的配置,web.xml啟動時,在StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作;struts2讀取到struts.xml后,以javabean形式存放在內存中,以后struts2對用戶的每次請求處理將使用內存中的數據,而不是每次都讀取struts.xml文件。
一、訪問流程:
(1)客戶端提交請求
(2)請求被提交到一系列過濾器(先ActionContentCleanUp,然后其他過濾器,最后FilterDispatcher)
(3)FilterDispatcher咨詢ActionMapper是否需要調用某個Action來處理這個請求,如果ActionMapper決定調用某個Action,FilterDispatcher則把請求的處理交給ActionProxy。
(4)ActionProxy通過Configuration Manager(struts.xml)詢問框架的配置文件,找到需要調用的Action類。
(5)ActionProxy創建一個ActionInvocation實例,同時ActionInvocation通過代理模式調用Action,但在調用之前,ActionInvocation會根據配置加載Action相關的所有Interceptor(攔截器)
(6)一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果result
二、struts.xml的文件組成
1、XML 頭部聲明為<?xml version="1.0" encoding="UTF-8"?>
2、DTD約束文件<!DOCTYPE struts PUBLIC
"-//Apache Software undation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
DTD文件是一種保證xml文檔格式正確的有效方法,通過比較xml文檔和DTD文件來看文檔是否符合規范,元素和標簽使用是否正確。
3、struts 根標簽
4、devMode 開發模式 <constant name="struts.devMode" value="true" />當value的值為false的時候,就不是開發模式,修改struts.xml文件之后運行項目需要重啟服務器;當value的值為true時,為開發模式,修改struts.xml文件之后運行項目不需要重啟服務器就能運行,並且可進行調試信息輸出。
5、package 包配置
struts2框架使用包來管理Action和攔截器等。每個包就是多個Action、多個攔截器、多個攔截器引用的集合。每個package元素定義了一個包配置。常用屬性有:
name:必填屬性,指定包名;extends可選屬性,指定該包繼承其他包;namespace:可選屬性,用來制定該包的命名空間。考慮到同一個Web應用中需要同名的Action,struts2以命名空間的方式來管理Action,同一個命名空間不能有同名的Action。
一般來說,package的使用按照項目的功能模塊來划分,從而使得項目更有邏輯性。
6、實現action類:struts2中Action是核心內容。struts2中通常直接使用Action來封裝HTTP請求參數,因此,Action類里應該包含與請求參數對應的屬性,並提供setter,getter方法。action有以下屬性:
name:action的名稱;class:對應的類的路徑;method:調用action中的方法名
action中:——>result 結果,有一下屬性:
name:返回值,返回值可以是框架提供的常量(SUCCESS,FINAL,LOGIN,INPUT等),也可以自定義
type:默認不寫為請求轉發,type=redirect表示“重定向”
result之間的路徑表示要跳轉的路徑。
struts2的優點:
1、結構更加清晰,地址和類之間的映射都配置在struts.xml中,struts2內部按照MVC設計模式設計,並且作為web開發中MVC設計模式中的Controller層。
2、在操作Action時,可以直接使用參數,不需要考慮request和response,struts2也提供了ServletActionContext對象,通過方法ServletActionContext.getRequest()獲得當前請求的對象request(response對象)。
3、Action獲得頁面bean.屬性拼裝的實體Bean;頁面直接獲得Action中的屬性。