(點選上方公眾號,可快速關註)
來源:袁鳴凱 ,
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
3.3 增加struts2的依賴包
我們把原有的struts1.3的依賴包去除後加入struts2的依賴包
org.apache.struts
struts2-spring-plugin
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
然後:
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
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
7)開啟web.xml檔案,加入struts2的配置
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
可以看到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
再執行工程,一切無誤,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”>
method=”popAddStudent”>
method=”addStudent”>
method=”addStudent”>
method=”delStudent”>
/
indexInit
4.2 struts2中的類的書寫
struts2中的action就是一個普通的class,它的public方法名就是一個具體的action,這相當於原有struts1中的DispatchAction,只不過它做的更加靈活。
如:我有一個按鈕叫addStudent,如果你在你的action的類中有一個publicString addStudent()方法,那麼你的這個按鈕對應的action名就叫/addStudent.action(神奇吧)。
我們對應著“