1. 程式人生 > >使用IDEA進行struts2+Spring+mybatis+maven框架整合(二)struts框架搭建

使用IDEA進行struts2+Spring+mybatis+maven框架整合(二)struts框架搭建

1、在pom.xml檔案中加入struts2 core 的maven路徑,然後自動引入jar包到External Libriries中:

<dependency>
      <groupId>org.apache.struts</groupId>
      <artifactId>struts2-core</artifactId>
      <version>2.5.14.1</version>
</dependency>
2、配置web.xml檔案中struts2的過濾器:
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
        2.4版本的servlet規範在部屬描述符中新增加了一個<dispatcher>元素,這個元素有四個可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一個<filter-mapping>元素中加入任意數目的<dispatcher>,使得filter將會作用於直接從客戶端過來的request,通過forward過來的request,通過include過來的request和通過<error-page>過來的request。如果沒有指定任何< dispatcher >元素,預設值是REQUEST。

3、在resources資料夾中建立struts.xml檔案:
<struts>
    <!--指定web應用的預設編碼集,相當於呼叫HttpServletRequest的setCharacterEncoding的方法 -->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!--設定檔案上傳大小,最大不超過4800M,很對-->
    <constant name="struts.multipart.maxSize" value="5000000000"/>
    <!--設定spring是否總是以自動裝配策略建立物件,只有引入spring外掛後才有效。-->
    <constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true"/>
    <!-- 自動動態方法的呼叫,使用這個設定後可以這樣呼叫:action!method -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!-- 把它設定為開發模式,釋出時要設定為false -->
    <constant name="struts.devMode" value="true" />
</struts>
4、在main資料夾下建立java資料夾,並在java資料夾下建立包名(包名需要按照功能模組進行劃分),我建立的是com.cxx.maven.cxx.action.base,並在該包下建立LoginAction類,該類繼承ActionSupport類,並重寫execute()方法,程式碼如下(這裡先寫簡要程式碼,後期會根據功能的完善逐步完善程式碼):
package com.cxx.mavenssm.action.base;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    public String execute(){
        return "login";
    }
}

5、在struts.xml檔案中加入如下程式碼:

<package name="defult" extends="struts-default">
        <action name="loginAction" class="com.cxx.mavenssm.action.base.LoginAction">
            <result name="login">/WEB-INF/frame/login.jsp</result>
        </action>
</package>
        注意:

package節點是整個配置的核心部分。每個package,從語義上講,其實代表了每一個獨立的模組。

在這個模組中,你可以定義隸屬於這個模組的行為方式,而與其他的模組沒有關係。所以,每個package都有獨立

interceptorresult-typeaction的定義,絕大多數的Runtime配置定義都是通過package節點實現的。

接下來我們就來詳細討論一下package中的屬性和子節點。

1. name

name屬性為每個package設定一個唯一的標識,這個標識在所有的package定義中不能重複。

2. abstract

標識這個package的定義是一個抽象定義,也就是允許他僅包含宣告式的定義,而不需要在package定義中包含action的定義。

3. extends

通過使用extends,你可以指定本package繼承另外一個package的所有的配置。當某個package繼承了另外一個package

所有配置,那麼你就無需對父package中已經宣告過的配置定義做再次的定義。

同時,如果重複定義父package中已宣告過的配置定義,那麼這些重複定義宣告將覆蓋父package中的相關定義。

4. namespace

namespace的作用:對於action配置進行邏輯劃分。

如果我們不為package節點指定namespaceStruts2預設使用一個空字串作為預設的namespace。當然,

也可以使用"/"等字串來表示namespace

定義package名稱空間 該名稱空間影響到url的地址,例如此名稱空間為/test,那麼在xxx.jsp中訪問的地址

http://localhost:8080/struts2/test/XX.action

Struts2在根據URL進行定址的時候,使用以下的步驟:

1) 根據URL進行NamespaceActionName的計算

2) 根據計算的得到的NamespaceActionName查詢package節點中相應配置

3) 如果查詢失敗,則查詢Namespace為空,ActionName為整個URL的配置


上面注意這段出自:http://blog.csdn.net/educast/article/details/52043338。

6、修改webapp資料夾下的index.jsp檔案,轉發到login.jsp頁面:

<jsp:forward page="loginAction.action"/>
     

轉發過程:客戶瀏覽器傳送http請求——》web伺服器接受此請求——》呼叫內部的一個方法在容器內部完成請求處理和轉發動作——》將目標資源傳送給客戶;在這裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器傳送http請求——》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——》伺服器根據此請求尋找資源併發送給客戶。在這裡location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

        怎麼選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的物件,所以他是第一選擇。但是由於在轉發之後,瀏覽器中URL仍然指向開始頁面,此時如果過載當前頁面,開始頁面將會被重新呼叫。如果你不想看到這樣的情況,則選擇轉發。 

轉發和重定向的區別
不要僅僅為了把變數傳到下一個頁面而使用session作用域,那會無故增大變數的作用域,轉發也許可以幫助你解決這個問題。
重定向:以前的request中存放的變數全部失效,並進入一個新的request作用域。
轉發:以前的request中存放的變數不會失效,就像把兩個頁面拼到了一起。
7、在WEB-INF資料夾下建立frame資料夾並建立login.jsp檔案,該檔案內的內容可隨意,主要是為了測試struts2是否起作用了。
8、啟動專案,輸入url地址:http://localhost:8088/MavenSSM/,這時你會發現瀏覽器顯示的是/WEB-INF/frame/login.jsp
頁面的內容。這是因為請求地址到預設的index.jsp頁面時,在該頁面進行轉發到struts2的loginAction中,對映到
LoginAction.java的execute()方法,根據"login"返回值返回到/WEB-INF/frame/login.jsp頁面。
注:因為struts2對其WEB-INF下的jsp檔案進行保護,通過url地址直接訪問是訪問不到的,需要外部的jsp檔案進行轉發到其內部的jsp檔案,然後通過struts2框架進行資原始檔的訪問。