學(xué)習(xí)SSH框架

1.SSH框架的認(rèn)知

在做相關(guān)的java的網(wǎng)頁(yè)的開發(fā)制作時(shí),良好的層次分解是十分有比要的,所以我們?cè)谠朴康谌降目蚣苤聛?lái)簡(jiǎn)化還有名了我們相關(guān)的網(wǎng)站的開發(fā)。

SSH框架實(shí)則為Struct + spring + hibernate 的三個(gè)組成的,其中struct,專注與前臺(tái)的相關(guān)的請(qǐng)求的所對(duì)應(yīng)的ActionForm還有其相關(guān)跳轉(zhuǎn)的Action來(lái)處理得到相關(guān)的JSP頁(yè)面,從而來(lái)更新或是條狀到相關(guān)用戶的請(qǐng)求的服務(wù)頁(yè)面,或是信息頁(yè)面。而Hibernate的作用是體現(xiàn)在數(shù)據(jù)的持久化的層次中,我們對(duì)于頁(yè)面,通過(guò)其特定的方式來(lái)對(duì)相關(guān)程序的數(shù)據(jù)驚醒I/O的持久化操作。在其次是相關(guān)spring的應(yīng)用,是對(duì)與中間層次的相關(guān)的控制,處理相關(guān)業(yè)務(wù)的數(shù)據(jù)的依賴注入問題,還有就是融合其他的聯(lián)大框架來(lái)實(shí)現(xiàn)相關(guān)程序的層次化的結(jié)構(gòu)。

2.struct框架的使用

在web.xml中進(jìn)行配置,相關(guān)配置如下:

SSH

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

SSH

/*

Struct.xml的相關(guān)配置如下


"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

/Register.jsp

/Success.jsp

/Fail.jsp

其上兩處的配置的做用時(shí)。當(dāng)在browser中發(fā)出相關(guān)的請(qǐng)求時(shí)候,Struct會(huì)把相關(guān)的請(qǐng)求轉(zhuǎn)到Struct的特定的filter中去,然后把數(shù)據(jù)映射到在struct.xml中所示的ActionForm中去,然后在更具配置吧,數(shù)據(jù)還有其他的相關(guān)的參數(shù)轉(zhuǎn)交給相關(guān)的Action來(lái)做業(yè)務(wù)的處理,軟后在更具結(jié)果進(jìn)行跳轉(zhuǎn)的。所以我們?cè)赟truct.xml中的相關(guān)的配置,實(shí)際上就是相關(guān)的請(qǐng)求所對(duì)應(yīng)要使用到的ActionForm還有就是Action和相關(guān)跳轉(zhuǎn)頁(yè)面的配置。

程序的書寫代碼如下:

packagecom.ynwi.ssh.beans;

publicclassUserForm {

privateString username;

privateString password;

privateintgender;

publicString getUsername() {

returnusername;

}

publicvoidsetUsername(String username) {

this.username = username;

}

publicString getPassword() {

returnpassword;

}

publicvoidsetPassword(String password) {

this.password = password;

}

publicintgetGender() {

returngender;

}

publicvoidsetGender(intgender) {

this.gender = gender;

}

} //相關(guān)的ActionForm類的書寫范例。

處理業(yè)務(wù)的書寫如下:

packagecom.ynwi.ssh.action;

importcom.opensymphony.xwork2.ActionSupport;

importcom.ynwi.ssh.beans.UserForm;

importcom.ynwi.ssh.service.UserManager;

importcom.ynwi.ssh.serviceImpl.UserManagerImpl;

publicclassRegisterActionextendsActionSupport {

privatestaticfinallongserialVersionUID = 1L;

privateUserForm user;

privateUserManager userManager;

publicUserForm getUser() {

returnuser;

}

publicvoidsetUser(UserForm user) {

this.user = user;

}

publicUserManager getUserManager() {

returnuserManager;

}

publicvoidsetUserManager(UserManager userManager) {

this.userManager = userManager;

}

publicString execute() {

try{

this.setUserManager(newUserManagerImpl());

userManager.regUser(user);

returnSUCCESS;

}catch(Exception e) {

e.printStackTrace();

returnERROR;

}

}

} //相關(guān)的Action的書寫范例。

以上便是struct的書寫的范例。Struct的其原理可查詢struct的官網(wǎng)站,或者是相關(guān)的文檔。

3.Hibernate的使用

hibernate的相關(guān)的配置如下:


"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">


com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/project

root

root




org.hibernate.dialect.MySQLDialect






true



//hibernate-configuration的相關(guān)的配置實(shí)際上就是配置縣官的Hibernate的相關(guān)數(shù)據(jù)庫(kù)ide鏈接用戶名還有密碼。同時(shí)還有一些相關(guān)的設(shè)置的問題。還有就是Mapping的配置(對(duì)象性的數(shù)據(jù)到關(guān)系型數(shù)據(jù)映射,例子見2)

mapping的配置:


"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

not-null="true"length="16">

not-null="true"length="16"/>

//其中ID是變種對(duì)應(yīng)的主鍵,而其他的為元素的應(yīng)用。

//代碼說(shuō)明將根據(jù)本地?cái)?shù)據(jù)庫(kù)的設(shè)置來(lái)創(chuàng)建userId,如MySQL中將表user的userId設(shè)置為自動(dòng)增長(zhǎng),則在保存記錄是,userId將自動(dòng)增長(zhǎng)。對(duì)于需要在程序中指定主鍵的值,則將generator的class屬性設(shè)置為assigned。

相關(guān)的代碼書寫如下:

packagecom.ynwi.ssh.dao;

importorg.hibernate.HibernateException;

importorg.hibernate.Session;

publicinterfaceBaseDao {

publicvoidsaveObject(Object obj)throwsHibernateException;

publicSession getSession();

publicvoidsetSession(Session session);

}

//數(shù)據(jù)持久化曾的相關(guān)的接口。

packagecom.ynwi.ssh.daoImpl;

importorg.hibernate.HibernateException;

importorg.hibernate.Session;

importcom.ynwi.ssh.dao.BaseDao;

publicclassUserDaoimplementsBaseDao {

privateSession session;

@Override

publicSession getSession() {

returnsession;

}

@Override

publicvoidsetSession(Session session) {

this.session = session;

}

@Override

publicvoidsaveObject(Object obj)throwsHibernateException {

session.save(obj);

}

}

//數(shù)據(jù)持久層的相關(guān)的實(shí)現(xiàn)。

packagecom.ynwi.ssh.daoImpl;

importorg.hibernate.HibernateException;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.cfg.Configuration;

importorg.hibernate.service.ServiceRegistry;

importorg.hibernate.service.ServiceRegistryBuilder;

publicclassHibernateSessionFactory {

privatestaticfinalString CFG_FILE_LOCATION ="/Hibernate.cfg.xml";

privatestaticfinalThreadLocal threadLocal =newThreadLocal();

privatestaticfinalConfiguration cfg =newConfiguration()

.configure(CFG_FILE_LOCATION);

privatestaticServiceRegistryBuilder builder =newServiceRegistryBuilder()

.applySettings(cfg.getProperties());

privatestaticServiceRegistry registry;

privatestaticSessionFactory sessionFactory;

publicstaticSession currentSession()throwsHibernateException {

Session session = threadLocal.get();

if(session ==null|| session.isOpen() ==false) {

if(sessionFactory ==null) {

try{

registry = builder.buildServiceRegistry();

sessionFactory = cfg.buildSessionFactory(registry);

}catch(Exception e) {

e.printStackTrace();

}

}

session = sessionFactory.openSession();

threadLocal.set(session);

}

returnsession;

}

publicstaticvoidcloseSession()throwsHibernateException {

Session session = threadLocal.get();

threadLocal.set(null);

if(session !=null) {

session.close();

}

}

}

//工廠類SessionFactory的內(nèi)容。(這是使用Hibernate4時(shí)候的SessionFactory,Hibernate3時(shí)候sessionFactory的創(chuàng)建估計(jì)會(huì)不一樣,請(qǐng)自行查閱。)

packagecom.ynwi.ssh.serviceImpl;

importorg.hibernate.HibernateException;

importorg.hibernate.Session;

importorg.hibernate.Transaction;

importcom.ynwi.ssh.beans.User;

importcom.ynwi.ssh.dao.BaseDao;

importcom.ynwi.ssh.daoImpl.HibernateSessionFactory;

importcom.ynwi.ssh.daoImpl.UserDao;

importcom.ynwi.ssh.forms.UserForm;

importcom.ynwi.ssh.service.UserManager;

publicclassUserManagerImplimplementsUserManager {

privateBaseDao dao;

privateSession session;

publicUserManagerImpl() {

dao =newUserDao();

}

@Override

publicvoidregUser(UserForm userForm)throwsHibernateException {

session = HibernateSessionFactory.currentSession();

dao.setSession(session);

// 獲取事務(wù)

Transaction ts = session.beginTransaction();

// 構(gòu)造User對(duì)象

User user =newUser();

user.setUsername(userForm.getUsername());

user.setPassword(userForm.getPassword());

user.setGender(userForm.getGender());

// 保存User對(duì)象

dao.saveObject(user);

// 提交事務(wù)

ts.commit();

// 關(guān)閉Session

HibernateSessionFactory.closeSession();

}

}

//相關(guān)的業(yè)務(wù)邏輯。

4.Hibernate的總結(jié):

Hibernate實(shí)際上是在configuration方法的讀取之下,得到相關(guān)的變量然后在通過(guò)此變量得到相關(guān)的sessionfactory類,通過(guò)SessionFactory類來(lái)讀到會(huì)話類(Session)然后Session中的系列方法類進(jìn)行數(shù)據(jù)庫(kù)中的對(duì)應(yīng)增,刪,改,查的操作。當(dāng)然session還可以開啟事物的相關(guān)的操作。

4.Spring整合:

ApplicationContext.xml相關(guān)配置:


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


destroy-method="close">

com.mysql.jdbc.Driver

jdbc:mysql://localhost/project

root

root

80

1

1

20




class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

com/ynwi/ssh/beans/User.hbm.xml

org.hibernate.dialect.MySQLDialect

true

20

class="org.springframework.orm.hibernate3.HibernateTransactionManager">




//對(duì)于用戶中的業(yè)務(wù)邏輯還有持久化操作的邏輯的相關(guān)類,我們放到spring的相關(guān)的容器中進(jìn)行統(tǒng)一的管理。

以上相關(guān)的修改結(jié)果如下(相對(duì)于之前的類來(lái)說(shuō)):BaseDao.java

[java]view plain copy print ?

packagecom.ynwi.ssh.dao;

importorg.hibernate.HibernateException;

publicinterfaceBaseDao {

publicvoidsaveObject(Object obj)throwsHibernateException;

}

UserDao.java

[java]view plain copy print ?

packagecom.ynwi.ssh.daoImpl;

importorg.hibernate.HibernateException;

importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;

importcom.ynwi.ssh.dao.BaseDao;

publicclassUserDaoextendsHibernateDaoSupportimplementsBaseDao {

@Override

publicvoidsaveObject(Object obj)throwsHibernateException {

getHibernateTemplate().save(obj);

}

}

//getHibernateTemplate():HibernateTemplate 提供非常多的常用方法來(lái)完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對(duì)命名SQL查詢的支持,也增加對(duì)分頁(yè)的支持。大部分情況下,使用Hibernate的常規(guī)用法,就可完成大多數(shù)DAO對(duì)象的CRUD操作。 下面是HibernateTemplate的常用方法簡(jiǎn)介:

q void delete(Object entity):刪除指定持久化實(shí)例

q deleteAll(Collection entities):刪除集合內(nèi)全部持久化類實(shí)例

q find(String queryString):根據(jù)HQL查詢字符串來(lái)返回實(shí)例集合

q findByNamedQuery(String queryName):根據(jù)命名查詢返回實(shí)例集合

q get(Class entityClass, Serializable id):根據(jù)主鍵加載特定持久化類的實(shí)例

q save(Object entity):保存新的實(shí)例

q saveOrUpdate(Object entity):根據(jù)實(shí)例狀態(tài),選擇保存或者更新

q update(Object entity):更新實(shí)例的狀態(tài),要求entity是持久狀態(tài)

q setMaxResults(int maxResults):設(shè)置分頁(yè)的大小·····························································································································································在dao層用到getSession()方法來(lái)操作數(shù)據(jù)庫(kù)記錄,但是他還有個(gè)方法getHibernateTemplate(),這兩個(gè)方法究竟有什么區(qū)別呢?

1.使用getSession()方法你只要繼承 sessionFactory,而使用getHibernateTemplate()方法必須繼承HibernateDaoSupport當(dāng)然包括 sessionFactory,這點(diǎn)區(qū)別都不是特別重要的,下面這些區(qū)別就很重要了

2.getSession()方法是沒有經(jīng)過(guò)spring包裝 的,spring會(huì)把最原始的session給你,在使用完之后必須自己調(diào)用相應(yīng)的close方法,而且也不會(huì)對(duì)聲明式事務(wù)進(jìn)行相應(yīng)的管理,一旦沒有及時(shí) 關(guān)閉連接,就會(huì)導(dǎo)致數(shù)據(jù)庫(kù)連接池的連接數(shù)溢出,getHibernateTemplate()方法是經(jīng)過(guò)spring封裝的,例如添加相應(yīng)的聲明式事務(wù)管 理,由spring管理相應(yīng)的連接。

在實(shí)際的使用過(guò)程中發(fā)現(xiàn)的確getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()并沒有提供,這時(shí)我們用HibernateCallback 回調(diào)的方法管理數(shù)據(jù)庫(kù).

例如如下代碼:

/** * 使用 hql 語(yǔ)句進(jìn)行操作

* @param hql HSQL 查詢語(yǔ)句(使用回調(diào)函數(shù)訪問外部變量,必須是final的)

* @param offset 開始取數(shù)據(jù)的下標(biāo)

* @param length 讀取數(shù)據(jù)記錄數(shù)

* @return List 結(jié)果集

*/

public List getListForPage ( final String hql , final int offset , final int length ) {

List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {

public Object doInHibernate ( Session session ) throws HibernateException, SQLException {

Query query = session.createQuery ( hql ) ; query.setFirstResult ( offset ) ; query.setMaxResults ( length ) ; List list = query.list ( ) ; return list ;

}

}) ;

return list ;}

修改后的業(yè)務(wù)邏輯實(shí)現(xiàn)類UserManagerImpl的內(nèi)容。

[java]view plain copy print ?

packagecom.ynwi.ssh.serviceImpl;

importorg.hibernate.HibernateException;

importorg.springframework.beans.BeanUtils;

importcom.ynwi.ssh.beans.User;

importcom.ynwi.ssh.dao.BaseDao;

importcom.ynwi.ssh.forms.UserForm;

importcom.ynwi.ssh.service.UserManager;

publicclassUserManagerImplimplementsUserManager {

privateBaseDao dao;

publicvoidsetDao(BaseDao dao) {

this.dao = dao;

}

@Override

publicvoidregUser(UserForm userForm)throwsHibernateException {

User user =newUser();

BeanUtils.copyProperties(userForm, user);

dao.saveObject(user);

}

}

修改后的用戶注冊(cè)Action類RegisterAction的內(nèi)容。

[java]view plain copy print ?

packagecom.ynwi.ssh.action;

importcom.opensymphony.xwork2.ActionSupport;

importcom.ynwi.ssh.forms.UserForm;

importcom.ynwi.ssh.service.UserManager;

publicclassRegisterActionextendsActionSupport {

privatestaticfinallongserialVersionUID = 1L;

privateUserForm user;

privateUserManager userManager;

publicUserForm getUser() {

returnuser;

}

publicvoidsetUser(UserForm user) {

this.user = user;

}

publicvoidsetUserManager(UserManager userManager) {

this.userManager = userManager;

}

publicString execute() {

try{

userManager.regUser(user);

returnSUCCESS;

}catch(Exception e) {

e.printStackTrace();

returnERROR;

}

}

}

修改后的web.xml的內(nèi)容。

[html]view plain copy print ?


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

SSH Project

SSH

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

SSH

/*

org.springframework.web.context.ContextLoaderListener

index.html

修改后的Struts配置文件struts.xml的內(nèi)容。

[html]view plain copy print ?


"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

/Register.jsp

/Success.jsp

/Fail.jsp

5.總結(jié)

有待改善。

技術(shù)分享:www.kaige123.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容