摘 要: 針對(duì)目前Web項(xiàng)目開發(fā)面臨的諸多問題,結(jié)合當(dāng)今流行的SSH(Struts+Spring+Hibernate)開源框架,通過如何進(jìn)行環(huán)境搭建、配置文件設(shè)置、開發(fā)流程描述等,給出了進(jìn)行Web項(xiàng)目開發(fā)的全過程,以幫助項(xiàng)目初學(xué)者和開發(fā)人員快速搭建架構(gòu)清晰、可復(fù)用性好、維護(hù)方便的企業(yè)級(jí)Web項(xiàng)目。最后,通過具體案例實(shí)施說明方案的可行性。
關(guān)鍵詞: Web;Struts;Spring;Hibernate SSH
大、中型企業(yè)級(jí)Web項(xiàng)目開發(fā)通常需要有一個(gè)良好的軟件架構(gòu),便于協(xié)同工作和擴(kuò)展升級(jí),而傳統(tǒng)的開發(fā)模式在一定程度上滿足不了這些要求。本文結(jié)合當(dāng)今主流的框架技術(shù):基于MVC模式的Struts框架、基于IoC模式的Spring框架以及對(duì)象/關(guān)系映射框架Hibernate,通過如何將這3種規(guī)范進(jìn)行有機(jī)整合,形成SSH框架[1-2],使他們之間既相對(duì)獨(dú)立,又相互協(xié)作,是要思考的問題。
1 框架技術(shù)
Java框架如同建筑中的框架式結(jié)構(gòu)。使用了框架(鋼筋+混凝土)以后,所專注的只是業(yè)務(wù)(非承重墻構(gòu)建不同格局),當(dāng)然是在遵守框架的協(xié)議上開發(fā)業(yè)務(wù)。好的框架都是松耦合的、易配置的。正如著名的軟件大師RALPH JOHNSON對(duì)框架(Framework)進(jìn)行了如下的定義:框架是整個(gè)系統(tǒng)或系統(tǒng)的一部分可重用設(shè)計(jì),由一組抽象的類及其實(shí)例間的相互作用方式組成[3]。
通俗一點(diǎn)講:“為了完成一個(gè)整體功能,對(duì)實(shí)現(xiàn)這個(gè)功能的Java類的一種分工規(guī)范。”這種思想在多人合作開發(fā)一個(gè)大、中型項(xiàng)目時(shí)尤為必要。
2 軟件環(huán)境搭建及注意事項(xiàng)
2.1 JAVA安裝與配置JDK(Java Development Kit)
運(yùn)行下載的“jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe”軟件包,在安裝過程中可以設(shè)置安裝路徑及選擇組件,默認(rèn)的組件選擇是全部安裝,安裝成功后一定要注意環(huán)境變量JavaHome、path、classpath配置和編輯[4]。具體配置如下:
系統(tǒng)變量:JavaHome,值為“D:\Program Files\Java\ jdk1.6.0_10”(即jdk安裝的主目錄)。
系統(tǒng)變量:path,在“變量值”欄的命令后添加“;%JavaHome%\bin”。
系統(tǒng)變量:classpath,值為“.;%JavaHome%\lib”,其中“.”表示當(dāng)前目錄。
設(shè)置完上述3個(gè)變量后,單擊“開始”—“所有程序”—“附件”—“命令提示符”打開DOS窗口,在命令行提示符后輸入“java”或“javac”回車后,如果出現(xiàn)其用法參數(shù)提示信息,則安裝正確。
2.2 數(shù)據(jù)庫安裝(Mysql)
運(yùn)行下載的“mysql-essential-5.0.87-win32.msi”軟件包,在安裝過程中選擇“Custom”安裝類別,可方便熟悉安裝過程??梢宰远x安裝路徑,建議不要放在與操作系統(tǒng)同一分區(qū),這樣可以防止系統(tǒng)備份還原的時(shí)候,數(shù)據(jù)被清空。設(shè)置完后,按“Install”開始安裝,直到出現(xiàn)“finish”界面。在“finish”界面,選中“Configure the Mysql Server now”,點(diǎn)“Finish”結(jié)束軟件的安裝并啟動(dòng)mysql配置向?qū)?。選擇“Detailed Configuration” 配置方式,方便熟悉配置過程。在選擇服務(wù)器類型時(shí)選“Server Machine”。在數(shù)據(jù)庫的大致用途時(shí)選擇“Multifunctional Database”,按“Next”繼續(xù)。在選擇網(wǎng)站的一般mysql訪問量時(shí)選“Decision Support(DSS)/OLAP)”,按“Next”繼續(xù)。在對(duì)mysql默認(rèn)數(shù)據(jù)庫語言編碼進(jìn)行設(shè)置,選擇第3個(gè),然后在Character Set下選擇或填入“gbk”,當(dāng)然也可以用“gb2312”,就可以正常的使用漢字(或其他文字)了,否則不能正常顯示漢字。這里選“gb2312”,按“Next”繼續(xù),設(shè)置完畢,直到“Finish”界面。按“Finish”結(jié)束,mysql的安裝與配置就啟動(dòng)了。注意,這里有一個(gè)常見的錯(cuò)誤,最后一步不能“Start service”,出現(xiàn)這種現(xiàn)象是以前安裝過mysql在服務(wù)器上,解決的辦法是先保證以前安裝的mysql服務(wù)器徹底卸載掉或檢查是否按上一步所說,之前的密碼是否有修改,照上面的操作;如果依然出錯(cuò),將mysql安裝目錄下的data文件夾備份,然后刪除,在安裝完成后,將安裝生成的data文件夾刪除,備份的data文件夾移回來,再重啟mysql服務(wù)就可以了,這種情況下,需要將數(shù)據(jù)庫檢查一下,然后修復(fù)一次,防止數(shù)據(jù)出錯(cuò)。
2.3 安裝Apache Tomcat
直接將下載的“apache-tomcat-7.0.5”文件復(fù)制到指定路徑(可以不放置在jdk安裝的目錄中)。按照安裝向?qū)нM(jìn)行安裝,中間須注意選擇Tomcat運(yùn)行所需的jre,沒有jre將不能進(jìn)行后續(xù)安裝,直到出現(xiàn)“Finish”界面。
2.4 Myeclipse安裝與設(shè)置
運(yùn)行下載的“myeclipse-10.1-offline-installer-windows.exe”軟件包,在安裝過程中可以設(shè)置安裝路徑及選擇組件,完成后進(jìn)行preferences設(shè)置:進(jìn)入window—Preferences,在type filter text過濾器中輸入要配置的東西:首先設(shè)置默認(rèn)的全局JRE;其次設(shè)置工作空間全局編碼:選擇UTF-8;最后修改文件默認(rèn)編碼。否則對(duì)于漢字容易出現(xiàn)亂碼。
最后,若已經(jīng)安裝了Tomcat,在MyEclipse中配置Tomcat。從Preferences左側(cè)菜單下找到MyEclipse,打開其中的Servers項(xiàng),找到Tomcat,選擇安裝的版本,此處可選擇“Tomcat7.x”,將其設(shè)為Enable,在Browse...目錄下選擇Tomcat的安裝目錄即可。
到此,框架的運(yùn)行環(huán)境基本就搭建起來了,接下來開始進(jìn)行配置文件的設(shè)置。
3 SSH(Struts+Spring+Hibernate)框架配置文件設(shè)置
首先創(chuàng)建Java-Web Project工程(工程名為Demo1),為了以后不要再找包,把所有的包都復(fù)制到/WebRoot /WEB-INF/lib目錄下,在以后用到時(shí)直接導(dǎo)入。
3.1 配置Struts[5]
?。?)創(chuàng)建struts.xml文件(注意:一定要在src根目錄下)
struts.xml文件主要負(fù)責(zé)管理應(yīng)用中的Action映射,以及該Action包含的Result定義等。struts.xml內(nèi)容主要包括:Action、Interceptor、Packages和Namespace等。
代碼如下:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts
Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="front" extends="struts-default"
namespace="/">
<action name="init" class="com.snbcedu.
system.UserAction" method="init">
<result name="success">/WEB-INF/init.
jsp</result>
</action>
</package>
</struts>
(2)配置web.xml文件,添加Struts的核心控制器
代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
測(cè)試發(fā)布,Struts2開發(fā)環(huán)境配置完畢。每當(dāng)配置完成一個(gè)開發(fā)組件時(shí),在tomcat發(fā)布一下,以便容易查找錯(cuò)誤,否則全部環(huán)境配置完畢,不便于查錯(cuò)。
3.2 配置Spring
創(chuàng)建Spring配置文件applictionContext.xml,Spring如何知道Hibernate的存在,這就是Spring的魅力所在,它讓依賴性的綁定變得非常簡單。
applicationContext.xml代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
default-autowire="byName">
<context:annotation-config/>
<context:component-scan base-package="com.snbcedu.system"/>
<context:property-placeholder
location="WEB-INF/classes/jdbc.properties"/>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"value="
${driverName}"></property>
<property name="url" value="${url}"></property>
<property name="username"value="${username}"
></property>
<property name="password"value="${password}"><
/property>
<property name="maxActive"value="30">
</property>
<property name="maxIdle" value="10"></property>
<property name="minIdle" value="5"></property>
<property name="maxWait"value="5000">
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.
AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="packagesToScan">
<list>
<value>com.snbcedu.system</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org
.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
</beans>
3.3 配置Hibernate
在此之前先創(chuàng)建數(shù)據(jù)庫,接下來進(jìn)行jdbc.properties配置,代碼如下:
driverName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/security
username=root
password=870928
4 Web項(xiàng)目開發(fā)步驟
在具體開發(fā)前要做的預(yù)備工作:用mysql先創(chuàng)建一個(gè)security數(shù)據(jù)庫,然后創(chuàng)建user表和userinfo表,完成后按照下述步驟進(jìn)行項(xiàng)目開發(fā)。
?。?)創(chuàng)建項(xiàng)目(file-new-web project)Demo1。
?。?)復(fù)制java類庫(import或者直接從已有的項(xiàng)目中復(fù)制,放置在WebRoot-(WEB-INF)-Lib中。
?。?)在src下建立包。選中src,點(diǎn)右鍵:依次new-package,輸入包名,如:com.snbcedu.system(必須以com開始)。接下來依次創(chuàng)建applicationContext.xml,jdbc.properties(DB配置),struts.xml配置。
(4)創(chuàng)建文件夾src/entity,選中項(xiàng)目名,點(diǎn)右鍵依次選擇new-source folder。在此文件夾下首先創(chuàng)建包(包名為com.snbcedu.system),然后在包下再創(chuàng)建類(類名就是數(shù)據(jù)庫中的表名),先選中包名,點(diǎn)右鍵依次選擇new-class。完成后,開始創(chuàng)建類,在此注意兩點(diǎn)[7]:@Entity、@Id與@GeneratedValue(strategy=GenerationType.AUTO)的使用,最后在空白位置點(diǎn)右鍵,依次選source-generate setters and getters。
?。?)創(chuàng)建文件夾src/java,選中項(xiàng)目名,點(diǎn)右鍵依次選擇new-source folder。然后在包下再依次創(chuàng)建Dao、Service、Action。
①創(chuàng)建Dao[8]。在創(chuàng)建之前先創(chuàng)建包(包名為com.snbcedu.system.dao),依次創(chuàng)建UserDao與UserDaoImpl,UserInfoDao與UserInfoDaoImpl兩組,在創(chuàng)建之前先復(fù)制AGenericHibernateDao.java和IGenericDao.java兩個(gè)類。出錯(cuò)處理:先刪掉有問題的包,然后建立com.snbcedu.system.util包,復(fù)制PageBean.java類到該包下,最后再重新導(dǎo)入即可。
?、趧?chuàng)建Service[9]。在創(chuàng)建之前先創(chuàng)建包(包名為com.snbcedu.system.service),依次創(chuàng)建UserService、UserInfoService、UserLoginService 3個(gè)接口與UserServiceImp、UserInfoServiceImp、UserLoginServiceImp 3個(gè)類。
?、蹌?chuàng)建Action[10]。在創(chuàng)建之前先創(chuàng)建包(包名為com.snbcedu.system.action),創(chuàng)建UserLoginAction之前,先復(fù)制BaseAction.java、HomeAction.java、HTHomeAction.java這3個(gè)包。
?。?)在WebRoot-js下建立user_login.js文件。先建立js文件夾,復(fù)制common.js、init.js、jquery.js 3個(gè)文件后創(chuàng)建user_login.js。
?。?)在WebRoot-(WEB-INF)-jsp下建立user_login.jsp。先建立jsp文件夾,選中后點(diǎn)右鍵,依次new-jsp。
?。?)部署、發(fā)布項(xiàng)目。
通過上述配置,一個(gè)項(xiàng)目的基本框架就基本形成了,如圖1所示。
通過以上分析和應(yīng)用,人們可能有一個(gè)疑問,Spring如何以一個(gè)外部XML配置文件實(shí)現(xiàn)各種功能呢?這其實(shí)沒有任何神秘而言,每個(gè)框架都有許多類包,這些類包就是專門實(shí)現(xiàn)這些事情的。類包是如何介入寫的類代碼或其他框架的呢?當(dāng)然必須通過一定途徑才能調(diào)用其他類代碼,有時(shí)Spring把這個(gè)細(xì)節(jié)隱藏了起來,使人們感到不可思議,細(xì)究一下,不難發(fā)現(xiàn)不外乎通過這兩種方式調(diào)用其他類代碼:一是把類寫在它的配置文件里,二是類繼承它的接口。到此,對(duì)SSH框架有了一個(gè)初步了解,同時(shí)對(duì)于大、中型企業(yè)級(jí)Web項(xiàng)目開發(fā)流程也有了一個(gè)清楚的認(rèn)識(shí),相信對(duì)項(xiàng)目初學(xué)者和開發(fā)人員快速搭建架構(gòu)清晰、可復(fù)用性好、維護(hù)方便的企業(yè)級(jí)Web項(xiàng)目有直接的借鑒作用。
參考文獻(xiàn)
[1] 陳亞輝,繆勇.Structs+Spring+Hibernate框架技術(shù)與項(xiàng)目實(shí)戰(zhàn)[M].北京:清華大學(xué)出版社,2012.
[2] 李剛.輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn)(第3版)—Structs+Spring+Hibernate整合開發(fā)[M].北京:電子工業(yè)出版社,2013.
[3] GAMMA E, HELM R, JOHNSON R, et al. Design patterns: Elements of reusable object-oriented software[M]. Addison Wesley, 2000.
[4] 計(jì)磊,李里,周偉.精通J2EE—EclipseStruts Hibernate Spring整合應(yīng)用案例[M].北京:人民郵電出版社,2006.
[5] 李寧.Struts2教程3:struts.xml常用配置解析[OL].[2008-04-16](2013-4-12)http://www.blogjava.net/nokiaguy/archive/2008/04/16/193457.html.
[6] Wesley002.搭建簡單Web項(xiàng)目:spring3.0基礎(chǔ)配置(1) [OL].[2010-10-27](2013-4-12)http://blog.csdn.net/wzl002/article/details/5969469
[7] 邵雪航,王大鵬.基于SSH框架技術(shù)下的WEB項(xiàng)目的研究與實(shí)現(xiàn)[J].數(shù)字技術(shù)與應(yīng)用,2012(10):126-127.
[8] 鄧榮.Linux平臺(tái)下基于Open SSH的安全遠(yuǎn)程登錄服務(wù)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2010(11):8970-8971.
[9] 王愛松,姜楠,白鳳珍.以SSH協(xié)議為基礎(chǔ)加強(qiáng)高校校園網(wǎng)信息化安全[J].內(nèi)蒙古民族大學(xué)學(xué)報(bào)(自然科學(xué)版),2008(6):626-628.
[10] 簡思遠(yuǎn).基于SSH架構(gòu)的高校校園網(wǎng)站備案系統(tǒng)的構(gòu)建[J].福建電腦,2010(5):125-126.