歡迎光臨
每天分享高質量文章

通向架構師的道路 ( 第二十二天 ) 萬能框架 spring ( 四 ) 使用 struts2

(點選上方公眾號,可快速關註)


來源:袁鳴凱 ,

blog.csdn.net/lifetragedy/article/details/8192736

一、前言

SSH有了,現在我們要把我們的struts層從原來的1.3替換成struts2.x,引入了struts2.0後我們會發覺我們的程式碼和框架的變化還是不小的

二、Struts2的好處

1)在struts2的方法裡,一切變數是執行緒安全的,而原有的struts1不是的;

2)在struts2中如果你宣告瞭如下這樣的程式碼:

privater String studentName=””;

 

public void setStudentName(String studentName){

 

    this.studentName = studentName;

 

}

 

public String getStudentName(){

 

    return this.studentName;

 

}

那麼當你對這個studentName進行符值後,不需要再把它用request.setAttribute這樣的形式把值帶到頁面中去了,相當於你可以省去在request中來回的setAttribute{…}getAttribute{…}的操作(有時由於忘記把一個listset 到request中去,經常導致一個頁面就是不顯示串列,對吧?這樣的事可以被極大程度上避免掉)。

3)更豐富且描述簡單的頁面標簽,可以直接支援將一個Object和頁面的進行系結,如:

我在後臺如果有一個StudentVO,這個StudentVO如下描述:

private String studentNo = “”;

private String studentName = “”;

 

public String getStudentNo() {

 

        return studentNo;

}

 

public void setStudentNo(String studentNo) {

 

        this.studentNo = studentNo;

 

}

 

public String getStudentName() {

 

        return studentName;

 

}

 

public void setStudentName(String studentName) {

 

        this.studentName = studentName;

}

於是我在前臺jsp裡可以直接這樣使用我的標簽和我這個VO中的某個欄位進行系結:

4)原有在struts1中的formbean徹底消失,去而代之的是使用VO物件,一個strutsaction就是一個普通的類,只是它extendsActionSupport而己。

5)良好的註入機制,連session,request, response都可以註入了,因此你的一個action方法就是一個普通類方法,這樣做的好處是極大化將servlet與我們的action進行解耦合。試想如果是原有的struts1的action方法,我現在要改成swing的actionPerform,你是不是要把原有的action方法包括傳參都要進行重構啊?而現在有了struts2,由於連session,request, response都是被註入的,因此這個struts2的action方法可以直接重用。

Strtus2還有很多好處,這邊不一一列舉了,在struts2的官方檔案和stepby step等書中詳細有說,我們這邊主要以實戰為主,講述struts2怎麼和spring進行整合併且能夠開發我們的應用。

三、整合spring和struts2

我們還是用我們的Maven2。

Struts2變化很大,它是一個幾乎被重寫的框架,而不是一個“增強”的框架,它是繼承自xwrok的框架並且在整個框架中全面使用了filter機制。

對於我們的maven的pom.xml檔案來說,這個lib庫的改動還是很大的。

甚至還會出現一些莫名奇妙的錯誤而其原因是因為lib庫的版本不對或者是有衝突,為此筆者整理了一份ssh2的所有需要的jar的mavenpom.xml檔案。

雖然,我會在後面把這個xml檔案完整列出來但還是希望大家在一開始跟著我能夠一步步走,對pom.xml檔案和工程進行排錯,這樣你將對一些常用的框架的lib庫有個比較熟悉的過程。

3.1 延用原有的myssh工程中的pom.xml檔案

我們新建一個maven的web工程-myssh2,並將原有的myssh工程中的pom.xml檔案拷入工程中。

請確保你使用的jdk版本為version1.6.x。

 

3.2 去除所有的struts1.3的依賴關係

開啟這個pom.xml檔案,把下麵這段所有的關於struts1.3的依賴包全部去除。

 

        org.apache.struts

 

        struts-core

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-el

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-extras

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-faces

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-mailreader-dao

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-scripting

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-taglib

 

        1.3.10

 

 

 

        org.apache.struts

 

        struts-tiles

 

        1.3.10

 

3.3 增加struts2的依賴包

我們把原有的struts1.3的依賴包去除後加入struts2的依賴包

 

        org.apache.struts

 

        struts2-spring-plugin

 

        2.3.1.2

 

 

 

        org.apache.struts

 

        struts2-core

 

        2.3.1.2

 

存檔後,此時maveneclipse外掛會自動開始編譯和下載相關的jar到你的本地maven的repository中,然後我們會發覺這個pom.xml檔案出錯了:

拋一個sun.tool.jar沒有找到的錯誤。

道理很簡單,因為該tool.jar其實已經存在在我們本地安裝的jdk的lib目錄下了,因此我們不需要這個包,但是maven是自動依賴的,你沒有看到它在pom.xml檔案中出現不代表這層依賴關係不存在。

因此我們需要做的是exclude這個包。

讓我們在maveneclipse外掛中開啟這個pom.xml檔案,切換到“DependencyHierarchy”檢視,然後找到這個tool.jar檔案,點左邊這個list中的tools:1.5.0然後右鍵選“ExcludeMaven Artifact”。

選[ok]按鈕然後存檔。

我們可以看到這個pom.xml檔案一切正常了,沒有紅色的“叉叉”了,我們切換到pom.xml檢視,可以看到它其實做了這麼一件事(註意紅色標粗的陳述句):

 

        org.apache.struts

 

        struts2-spring-plugin

 

        2.3.1.2

 

 

 

        org.apache.struts

 

        struts2-core

 

        2.3.1.2

 

       

 

               

 

                        tools

 

                        com.sun

 

               

 

       

 

然後:

1)我們把原先ssh工程中的resources目錄下所有的東西拷到myssh2工程的resources目錄下

2)我們把原先的ssh工程的java檔案拷過來;

3)我們把原先的ssh工程的src/main/webapp目錄下的檔案也複製過來;

4)不要忘了把WEB-INF/web.xml檔案和index.jsp檔案也拷過來啊!

1)我們把原有的org.sky.ssh.student.form和org.sky.ssh.login.form刪了;

2)我們把原有的service類中的一些需要傳入StudentForm的方法的中的StudentForm改成

org.sky.ssh.vo.StudentVO,其內容如下:

package org.sky.ssh.vo;

 

import java.io.Serializable;

 

public class StudentVO implements Serializable {

 

        private String studentNo = “”;

        private String studentName = “”;

 

 

        public String getStudentNo() {

 

                return studentNo;

 

        }

 

 

        public void setStudentNo(String studentNo) {

 

                this.studentNo = studentNo;

 

        }

 

 

        public String getStudentName() {

 

                return studentName;

 

        }

 

 

        public void setStudentName(String studentName) {

 

                this.studentName = studentName;

 

        }

 

}package org.sky.ssh.vo;

 

import java.io.Serializable;

 

public class StudentVO implements Serializable {

 

        private String studentNo = “”;

        private String studentName = “”;

 

 

        public String getStudentNo() {

 

                return studentNo;

 

        }

 

 

        public void setStudentNo(String studentNo) {

 

                this.studentNo = studentNo;

 

        }

 

 

        public String getStudentName() {

 

                return studentName;

 

        }

 

 

        public void setStudentName(String studentName) {

 

                this.studentName = studentName;

 

        }

 

}package org.sky.ssh.vo;

 

import java.io.Serializable;

 

public class StudentVO implements Serializable {

 

        private String studentNo = “”;

        private String studentName = “”;

 

 

        public String getStudentNo() {

 

                return studentNo;

 

        }

 

 

        public void setStudentNo(String studentNo) {

 

                this.studentNo = studentNo;

 

        }

 

 

        public String getStudentName() {

 

                return studentName;

 

        }

 

 

        public void setStudentName(String studentName) {

 

                this.studentName = studentName;

        }

}

3)把原有的兩個action檔案也刪了吧(刪了就刪了,反正我們要用struts2來重寫)

4)開啟web.xml檔案,把下麵這些內容去掉

 

       

 

                /WEB-INF/struts-bean.tld

 

                /WEB-INF/struts-bean.tld

 

       

 

       

 

                /WEB-INF/struts-html.tld

 

                /WEB-INF/struts-html.tld

 

       

 

       

 

                /WEB-INF/struts-logic.tld

 

                /WEB-INF/struts-logic.tld

 

       

5)開啟web.xml檔案,把.do都改成.action

6)開啟web.xml檔案,把這些去掉

 

        action

 

        org.apache.struts.action.ActionServlet

 

       

 

                config

 

                /WEB-INF/struts-config.xml,

 

                     /WEB-INF/struts-config/login.xml,

 

                     /WEB-INF/struts-config/index.xml

 

               

 

       

 

       

 

                debug

 

                3

 

       

 

       

 

                detail

 

                3

 

       

 

        2

 

7)開啟web.xml檔案,加入struts2的配置

 

        struts2

 

        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

 

 

 

        struts2

 

        *.action

 

可以看到struts2框架是一個基於filter的框架,確保這個filter在所有工程中你自己定義的filter的最後面,要不然你自己定義的filter會被struts2給filter掉(這點一定要註意)。

最後別忘了把:

                exclude

                /jsp/login/login.jsp,

                                                            /login.action

               

這邊的原有的/login.do改成/login.action哦。 

確保工程編譯沒有任何問題,然後我們按照番外篇《第十九天》中的“四、如何讓Maven構建的工程在eclipse裡跑起來”對工程進行設定,使得工程可以在eclipse的tomcat中跑起來。

跑起來後直接丟擲一堆的錯,然後我們來看為什麼

就是下麵這個狗屁錯。

其原因在於由於使用的struts2。原有的這個cglib:2.1.3,這個包對於spring3和hibernate3還有struts1.3來說沒有任何問題,在遇到struts2時就衝突了,因此我們需要把這個包也給exclude掉

Exclude掉了後沒有cglib包了,AOP類反射沒法玩了,怎麼辦?

簡單:

手工在pom.xml檔案中新增一個cglib較新版本的包,如下:

 

        org.hibernate

 

        hibernate-entitymanager

 

        3.3.1.ga

 

       

 

               

 

                        cglib

 

                        cglib

 

               

 

       

 

 

 

        cglib

 

        cglib-nodep

 

        2.2

再執行工程,一切無誤,tomcat啟動時正常,說明我們的框架已經搭好了,接下來我們就要開始改我們的struts的action層了。

四、使用struts2重寫action層

4.1 struts的配置檔案

Struts2只有一個核心的struts.xml檔案,它應該放在執行工程的classpath路徑下即WEB-INF/classes目錄下,所以我們把它放在工程的resources目錄下,使得它在工程被編譯時會被自動編譯到工程的WEB-INF/classes目錄下.

其內容如下:

 

 


        “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”

        “http://struts.apache.org/dtds/struts-2.0.dtd”>

 

               

 

  

 

               

 

                               

 

                                                /jsp/error/syserror.jsp

 

                                               

 

                               

 

                               

 

                                               

 

                               

 

                               

 

                                               

 

                                                                /

 

                                                                indexInit

 

                                               

                                

 

                               

 

               

 

               

 

                               

 

                                                method=”indexInit”>

 

                                                /index.jsp

 

                               

 

               

 

               

 

                               

 

                                                method=”popAddStudent”>

 

                                                /jsp/student/studentAdd.jsp

 

                               

 

                               

 

                                                method=”addStudent”>

 

                                                /jsp/student/studentAdd.jsp

 

                               

 

                               

 

                                                method=”addStudent”>

 

                                                /jsp/student/studentAdd.jsp

 

                               

 

                               

 

                                                method=”delStudent”>

 

                                               

 

                                                                /

 

                                                                indexInit

 

                                               

 

                               

 

               

 

4.2 struts2中的類的書寫

struts2中的action就是一個普通的class,它的public方法名就是一個具體的action,這相當於原有struts1中的DispatchAction,只不過它做的更加靈活。

如:我有一個按鈕叫addStudent,如果你在你的action的類中有一個publicString addStudent()方法,那麼你的這個按鈕對應的action名就叫/addStudent.action(神奇吧)。

我們對應著“”來看我們的login.action吧,前面的這個

贊(0)

分享創造快樂