在java 企業(yè)應(yīng)用領(lǐng)域,ejb的功能強(qiáng)大同ejb的配置復(fù)雜,難于學(xué)習(xí)一樣出名。但在以前我們又有什么辦法呢?只有硬著頭皮來(lái)學(xué)ejb。真有點(diǎn)“明知山有虎,偏向 虎山行”的精神。現(xiàn)在形式有了樂(lè)觀的變化,java開源的持續(xù)走紅,使得開發(fā)java企業(yè)級(jí)應(yīng)用不再局限于ejb領(lǐng)域。這里我主要介紹一下怎樣采用開源的 Spring,Hibernate以及Struts構(gòu)建一個(gè)輕量級(jí)的架構(gòu)。
一、整體架構(gòu)介紹
在軟件工程領(lǐng)域,為了降低模塊耦合度,提高模塊的可重用性,分層一直是廣為采納的一個(gè)方法。其實(shí)分層還可以使開發(fā)人員專注于某一層進(jìn)行開發(fā),使得軟件開發(fā)的分工變細(xì),提高生產(chǎn)效率(這一點(diǎn)上堪比福特發(fā)明的流水線生產(chǎn)汽車的做法,各個(gè)工人負(fù)責(zé)特定部件的生產(chǎn),最后組裝)。
一個(gè)企業(yè)級(jí)的java應(yīng)用,通常分為以下幾層:UI層,業(yè)務(wù)邏輯層,數(shù)據(jù)持久層,域?qū)ο髮印O旅鎸?duì)這幾層分別作簡(jiǎn)要介紹:
1. ? ? UI層:負(fù)責(zé)與用戶交互,包括:接受用戶的請(qǐng)求,把處理結(jié)果返回給用戶。這里我們采用struts來(lái)UI層,雖然比起Tapestry以及JSF這些事件 驅(qū)動(dòng)的表現(xiàn)層技術(shù)而言,Struts的設(shè)計(jì)顯得有些老土,但它目前仍是表現(xiàn)層事實(shí)上的標(biāo)準(zhǔn),所以我們還是選用它。
2. ? ? 業(yè)務(wù)邏輯層:主要負(fù)責(zé)具體的業(yè)務(wù)處理。通過(guò)Spring的IOC以及AOP實(shí)現(xiàn)各個(gè)功能的耦合相連
3. ? ? 數(shù)據(jù)持久層:主要負(fù)責(zé)與底層的數(shù)據(jù)庫(kù)打交道。這里我們采用Spring封裝的Hibernate操作來(lái)簡(jiǎn)化實(shí)際的編碼。主要的操作為CRUD(create ,read,update,delete)
4. ? ? 域?qū)ο髮樱壕唧w的實(shí)體類,如老師,學(xué)生等等這些具體的類(注意:需要與數(shù)據(jù)庫(kù)中的某一標(biāo)對(duì)應(yīng))。
以上只是簡(jiǎn)單介紹了各個(gè)層的劃分以及各層所對(duì)應(yīng)的開源框架,要詳細(xì)了解各層的具層信息,需要訪問(wèn) struts,hibernate,spring的官方網(wǎng)站。
二、實(shí)例分析
實(shí)例說(shuō)明:一個(gè)網(wǎng)站登錄的例子,比較簡(jiǎn)單,但能說(shuō)明各層是如何協(xié)調(diào)工作的。
工具:jdk1.5,eclipse3.2,myeclipse5.0GA,mysql5.0,tomcat5.5,至于這幾個(gè)工具到底該怎么裝這里我就不多說(shuō)了,大家不清楚的可以到網(wǎng)上搜搜。下面是具體操作步驟:
預(yù)備工作:用mysql創(chuàng)建一個(gè)test數(shù)據(jù)庫(kù),再創(chuàng)建一個(gè)user表,再創(chuàng)建兩個(gè)字段username和password。腳本如下
DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test`
USE `test`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(30) NOT NULL default '',
`password` varchar(30) default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
打開myeclipse的database explore透視圖
右鍵單擊左側(cè)的空白區(qū)域 ,點(diǎn)擊 new 按鈕
單擊“configure database driver”來(lái)配置數(shù)據(jù)庫(kù)的驅(qū)動(dòng),你必須有mysql的jdbc驅(qū)動(dòng) ,沒(méi)有的到mysql的官方網(wǎng)站上下載。
測(cè)試數(shù)據(jù)庫(kù)配置是否成功。
1. ? ? 新建一個(gè)myeclipse的web工程
2. ? ? 引入Spring包
右鍵工程名
注意:這里為了省得以后再添加spring的相關(guān)包,所以一次性的選中了所有的包。選中
Copy選項(xiàng),它會(huì)把這些包拷貝到/WebRoot/WEB-INF/lib目錄下,方便以后的實(shí)際部署。
3. ? ? 添加hibernate包
系統(tǒng)會(huì)檢測(cè)到該工程已經(jīng)添加了Spring包,選擇使用Spring的配置文件
點(diǎn)擊 next
點(diǎn)擊 next
點(diǎn)擊 next
最后點(diǎn)擊Finish按鈕即可。
4切換到database explore視圖,右鍵 點(diǎn)擊 user 表的“Hibrnate Reverse Engineering”
彈出如下窗口
點(diǎn)擊 “next”
再單擊finish
? ? 在包視圖中 可以看到 src下多了一個(gè)名為vo的package以及該包下的四個(gè)文件
為了更加直觀地顯示分層,我另建了一個(gè)名為dao的package,并把UserDAO.java移到dao中
同時(shí)注意在applicationContext.xml中把對(duì)UserDAO的引用部分也作相應(yīng)修改。
5. ? ? 建立業(yè)務(wù)邏輯層代碼
新建一個(gè)名為service的包,再在里面建立一個(gè)Service類,代碼如下
package service;
import java.util.List;
import vo.User;
import dao.UserDAO;
public class Service {
? ? private UserDAO userDao;
? ? public UserDAO getUserDao() {
? ? ? ? return userDao;
? ? }
? ? public void setUserDao(UserDAO userDao) {
? ? ? ? this.userDao = userDao;
? ? }
? ? public boolean isValid(User user) {//判斷用戶是否合法
? ? ? ? List result = userDao.findByExample(user);
? ? ? ? if (result.size() > 0)
? ? ? ? ? ? ? return true;
? ? ? ? else
? ? ? ? ? ? ? return false;
? ? }
}
同時(shí)在applicationContext.xml中添加如下配置
<bean id="service" class="service.Service" singleton="false">
? ? ? ? <property name="userDao">
? ? ? ? ? ? ? <ref bean="userDao" />
? ? ? ? </property>
? ? </bean>
6.配置UI層
添加struts包,方法同添加spring一樣
配置struts-config.xml文件,在空白區(qū)域右鍵單擊 new 一個(gè) action ,actionForm ,jsp
下一步
對(duì)forward作設(shè)置,增加succeed轉(zhuǎn)到welcome.jsp,fail轉(zhuǎn)到login.jsp
在WebRoot目錄下建立一個(gè)welcome.jsp文件,顯示用戶登錄成功后的歡迎信息。
6. ? ? 把struts和spring連接起來(lái)
6.1修改struts-config.xml注意紅色字體部分
<action
? ? attribute="loginForm"
? ? input="/login.jsp"
? ? name="loginForm"
? ? path="/login"
? ? scope="request"
? ? type="org.springframework.web.struts.DelegatingActionProxy">
? ? <forward name="fail" path="/login.jsp" />
? ? <forward name="succeed" path="/welcome.jsp" />
</action>
再在strut-config.xml中添加如下代碼
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
</plug-in>>
6.2修改applicationContext,增加以下內(nèi)容
<bean name="/login" class="web.action.LoginAction"
? ? ? ? singleton="false">
? ? ? ? <property name="service">
? ? ? ? ? ? ? <ref bean="service" />
? ? ? ? </property>
</bean>
6.3修改LoginAction.java部分代碼,增加一個(gè)service變量,以及其 get/set方法(主要用于Spring IOC)。代碼如下:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import web.form.LoginForm;
import service.Service;
import vo.User;
/**
* MyEclipse Struts Creation date: 09-27-2006
*
* XDoclet definition:
*
* @struts.action path="/login" name="loginForm" input="/login.jsp"
* ? ? ? ? ? scope="request" validate="true"
* @struts.action-forward name="fail" path="/login.jsp"
* @struts.action-forward name="succeed" path="/welcome.jsp"
*/
public class LoginAction extends Action {
? ? /*
? ? * Generated Methods
? ? */
? ? /**
? ? * Method execute
? ? *
? ? * @param mapping
? ? * @param form
? ? * @param request
? ? * @param response
? ? * @return ActionForward
? ? */
? ? private Service service;
? ? public void setService(Service service) {
? ? ? ? this.service = service;
? ? }
? ? public Service getService() {
? ? ? ? return service;
? ? }
? ? public ActionForward execute(ActionMapping mapping, ActionForm form,
? ? ? ? ? ? ? HttpServletRequest request, HttpServletResponse response) {
? ? ? ? LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // stub
? ? ? ? User user = new User();
? ? ? ? user.setPassword(loginForm.getPassword());
? ? ? ? user.setUsername(loginForm.getUserName());
? ? ? ? if (service.isValid(user))
? ? ? ? ? ? ? return mapping.findForward("succeed");
? ? ? ? else
? ? ? ? ? ? ? return mapping.findForward("fail");
? ? }
}
至此一個(gè)簡(jiǎn)單的登錄已經(jīng)做成。剩下的工作就是打包并發(fā)布你的應(yīng)用了。 ?
一、整體架構(gòu)介紹
在軟件工程領(lǐng)域,為了降低模塊耦合度,提高模塊的可重用性,分層一直是廣為采納的一個(gè)方法。其實(shí)分層還可以使開發(fā)人員專注于某一層進(jìn)行開發(fā),使得軟件開發(fā)的分工變細(xì),提高生產(chǎn)效率(這一點(diǎn)上堪比福特發(fā)明的流水線生產(chǎn)汽車的做法,各個(gè)工人負(fù)責(zé)特定部件的生產(chǎn),最后組裝)。
一個(gè)企業(yè)級(jí)的java應(yīng)用,通常分為以下幾層:UI層,業(yè)務(wù)邏輯層,數(shù)據(jù)持久層,域?qū)ο髮印O旅鎸?duì)這幾層分別作簡(jiǎn)要介紹:
1. ? ? UI層:負(fù)責(zé)與用戶交互,包括:接受用戶的請(qǐng)求,把處理結(jié)果返回給用戶。這里我們采用struts來(lái)UI層,雖然比起Tapestry以及JSF這些事件 驅(qū)動(dòng)的表現(xiàn)層技術(shù)而言,Struts的設(shè)計(jì)顯得有些老土,但它目前仍是表現(xiàn)層事實(shí)上的標(biāo)準(zhǔn),所以我們還是選用它。
2. ? ? 業(yè)務(wù)邏輯層:主要負(fù)責(zé)具體的業(yè)務(wù)處理。通過(guò)Spring的IOC以及AOP實(shí)現(xiàn)各個(gè)功能的耦合相連
3. ? ? 數(shù)據(jù)持久層:主要負(fù)責(zé)與底層的數(shù)據(jù)庫(kù)打交道。這里我們采用Spring封裝的Hibernate操作來(lái)簡(jiǎn)化實(shí)際的編碼。主要的操作為CRUD(create ,read,update,delete)
4. ? ? 域?qū)ο髮樱壕唧w的實(shí)體類,如老師,學(xué)生等等這些具體的類(注意:需要與數(shù)據(jù)庫(kù)中的某一標(biāo)對(duì)應(yīng))。
以上只是簡(jiǎn)單介紹了各個(gè)層的劃分以及各層所對(duì)應(yīng)的開源框架,要詳細(xì)了解各層的具層信息,需要訪問(wèn) struts,hibernate,spring的官方網(wǎng)站。
二、實(shí)例分析
實(shí)例說(shuō)明:一個(gè)網(wǎng)站登錄的例子,比較簡(jiǎn)單,但能說(shuō)明各層是如何協(xié)調(diào)工作的。
工具:jdk1.5,eclipse3.2,myeclipse5.0GA,mysql5.0,tomcat5.5,至于這幾個(gè)工具到底該怎么裝這里我就不多說(shuō)了,大家不清楚的可以到網(wǎng)上搜搜。下面是具體操作步驟:
預(yù)備工作:用mysql創(chuàng)建一個(gè)test數(shù)據(jù)庫(kù),再創(chuàng)建一個(gè)user表,再創(chuàng)建兩個(gè)字段username和password。腳本如下
DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test`
USE `test`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(30) NOT NULL default '',
`password` varchar(30) default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
打開myeclipse的database explore透視圖
右鍵單擊左側(cè)的空白區(qū)域 ,點(diǎn)擊 new 按鈕
單擊“configure database driver”來(lái)配置數(shù)據(jù)庫(kù)的驅(qū)動(dòng),你必須有mysql的jdbc驅(qū)動(dòng) ,沒(méi)有的到mysql的官方網(wǎng)站上下載。
測(cè)試數(shù)據(jù)庫(kù)配置是否成功。
1. ? ? 新建一個(gè)myeclipse的web工程
2. ? ? 引入Spring包
右鍵工程名
注意:這里為了省得以后再添加spring的相關(guān)包,所以一次性的選中了所有的包。選中
Copy選項(xiàng),它會(huì)把這些包拷貝到/WebRoot/WEB-INF/lib目錄下,方便以后的實(shí)際部署。
3. ? ? 添加hibernate包
系統(tǒng)會(huì)檢測(cè)到該工程已經(jīng)添加了Spring包,選擇使用Spring的配置文件
點(diǎn)擊 next
點(diǎn)擊 next
點(diǎn)擊 next
最后點(diǎn)擊Finish按鈕即可。
4切換到database explore視圖,右鍵 點(diǎn)擊 user 表的“Hibrnate Reverse Engineering”
彈出如下窗口
點(diǎn)擊 “next”
再單擊finish
? ? 在包視圖中 可以看到 src下多了一個(gè)名為vo的package以及該包下的四個(gè)文件
為了更加直觀地顯示分層,我另建了一個(gè)名為dao的package,并把UserDAO.java移到dao中
同時(shí)注意在applicationContext.xml中把對(duì)UserDAO的引用部分也作相應(yīng)修改。
5. ? ? 建立業(yè)務(wù)邏輯層代碼
新建一個(gè)名為service的包,再在里面建立一個(gè)Service類,代碼如下
package service;
import java.util.List;
import vo.User;
import dao.UserDAO;
public class Service {
? ? private UserDAO userDao;
? ? public UserDAO getUserDao() {
? ? ? ? return userDao;
? ? }
? ? public void setUserDao(UserDAO userDao) {
? ? ? ? this.userDao = userDao;
? ? }
? ? public boolean isValid(User user) {//判斷用戶是否合法
? ? ? ? List result = userDao.findByExample(user);
? ? ? ? if (result.size() > 0)
? ? ? ? ? ? ? return true;
? ? ? ? else
? ? ? ? ? ? ? return false;
? ? }
}
同時(shí)在applicationContext.xml中添加如下配置
<bean id="service" class="service.Service" singleton="false">
? ? ? ? <property name="userDao">
? ? ? ? ? ? ? <ref bean="userDao" />
? ? ? ? </property>
? ? </bean>
6.配置UI層
添加struts包,方法同添加spring一樣
配置struts-config.xml文件,在空白區(qū)域右鍵單擊 new 一個(gè) action ,actionForm ,jsp
下一步
對(duì)forward作設(shè)置,增加succeed轉(zhuǎn)到welcome.jsp,fail轉(zhuǎn)到login.jsp
在WebRoot目錄下建立一個(gè)welcome.jsp文件,顯示用戶登錄成功后的歡迎信息。
6. ? ? 把struts和spring連接起來(lái)
6.1修改struts-config.xml注意紅色字體部分
<action
? ? attribute="loginForm"
? ? input="/login.jsp"
? ? name="loginForm"
? ? path="/login"
? ? scope="request"
? ? type="org.springframework.web.struts.DelegatingActionProxy">
? ? <forward name="fail" path="/login.jsp" />
? ? <forward name="succeed" path="/welcome.jsp" />
</action>
再在strut-config.xml中添加如下代碼
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
</plug-in>>
6.2修改applicationContext,增加以下內(nèi)容
<bean name="/login" class="web.action.LoginAction"
? ? ? ? singleton="false">
? ? ? ? <property name="service">
? ? ? ? ? ? ? <ref bean="service" />
? ? ? ? </property>
</bean>
6.3修改LoginAction.java部分代碼,增加一個(gè)service變量,以及其 get/set方法(主要用于Spring IOC)。代碼如下:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import web.form.LoginForm;
import service.Service;
import vo.User;
/**
* MyEclipse Struts Creation date: 09-27-2006
*
* XDoclet definition:
*
* @struts.action path="/login" name="loginForm" input="/login.jsp"
* ? ? ? ? ? scope="request" validate="true"
* @struts.action-forward name="fail" path="/login.jsp"
* @struts.action-forward name="succeed" path="/welcome.jsp"
*/
public class LoginAction extends Action {
? ? /*
? ? * Generated Methods
? ? */
? ? /**
? ? * Method execute
? ? *
? ? * @param mapping
? ? * @param form
? ? * @param request
? ? * @param response
? ? * @return ActionForward
? ? */
? ? private Service service;
? ? public void setService(Service service) {
? ? ? ? this.service = service;
? ? }
? ? public Service getService() {
? ? ? ? return service;
? ? }
? ? public ActionForward execute(ActionMapping mapping, ActionForm form,
? ? ? ? ? ? ? HttpServletRequest request, HttpServletResponse response) {
? ? ? ? LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // stub
? ? ? ? User user = new User();
? ? ? ? user.setPassword(loginForm.getPassword());
? ? ? ? user.setUsername(loginForm.getUserName());
? ? ? ? if (service.isValid(user))
? ? ? ? ? ? ? return mapping.findForward("succeed");
? ? ? ? else
? ? ? ? ? ? ? return mapping.findForward("fail");
? ? }
}
至此一個(gè)簡(jiǎn)單的登錄已經(jīng)做成。剩下的工作就是打包并發(fā)布你的應(yīng)用了。 ?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

