關于使用spring和hibernate開發web程式的配置說明和簡單執行個體的詳細說明
作者:yanek
email:[email protected]
一、實作目标:
通過使用spring和hibernate,實作使用者的添加功能。把使用者資訊加入到資料庫中
使用spring 的hibernate模闆實作dao操作。
最終效果: 浏覽器中輸入 http://localhost:8083/hibernatetestweb/user.do 資料庫就增加一條記錄。
二、分層結構
系統采用如下分層結構
1.web層:使用者界面層 采用spring web mvc架構實作
2 service層:業務邏輯層 包括業務接口和實作類組成
3.dao層: 資料通路層 包括資料通路接口和實作類組成
4.持久層:使用hibernate實作 使用hibernate實作資料庫的通路。實作dao接口。
三、資料庫結構
資料庫結構:user_table 表
建表sql語句
create table user_table
(
id varchar2(255) not null,
username varchar2(20),
password varchar2(20)
)
假設使用的是資料庫:oracle9i
使用者名 密碼為test/1234
四、系統設計的相關類及其層次結構
1. user.java 表示使用者實體的值對象類,與資料庫使用者表結構相對應,标準的javabean,提供setter和getter方法。
2. userdao.java dao接口
3. userdaoimp.java dao接口的實作類
4. userservice 業務邏輯層的接口
5. userserviceimp 業務邏輯層的接口的實作類,調用dao接口實作業務邏輯。
6. usercontroller web層客戶調用層,調用業務邏輯層,實作對業務邏輯的處理。(前台)
五、相關配置檔案:(重點,問題出錯的地方)
包括spring 的配置檔案和hibernate配置檔案,以及web.xml檔案
說明:
web.xml,applicationcontext.xml,springhibernatestudy-servlet.xml都在web-inf根目錄下,映射檔案在與實體類相同的目錄下
1.spring 的配置檔案:
這裡配置檔案包括兩個:
1.applicationcontext.xml 對資料源,事務,事務代理,dao ,service層類進行定義和配置
内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!doctype beans public "-//spring//dtd bean//en" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 下面定義資料庫的連接配接資訊,使用類為org.apache.commons.dbcp.basicdatasource-->
<bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close">
<property name="driverclassname">
<value>oracle.jdbc.driver.oracledriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@192.168.1.191:1521:yanek</value>
</property>
<property name="username">
<value>test</value>
<property name="password">
<value>1234</value>
</bean>
<!-- 下面定義sessionfactory來為建立session做準備-->
<bean id="sessionfactory" class="org.springframework.orm.hibernate.localsessionfactorybean">
<property name="datasource">
<ref local="datasource" />
</property>
<property name="mappingresources">
<list>
<value>apps/hibernatetest/ioc/user.hbm.xml</value>
</list>
<property name="hibernateproperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.oracledialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
</props>
<!-- 下面定義hibernate模闆 -->
<bean id="hibernatetemplate" class="org.springframework.orm.hibernate.hibernatetemplate">
<property name="sessionfactory">
<ref local="sessionfactory" />
<!-- 下面定義使用者定義的dao,指定了dao的實作類,dao實作引用到hibernate模闆-->
<bean id="userdao" class="apps.hibernatetest.ioc.userdaoimp">
<property name="hibernatetemplate">
<ref local="hibernatetemplate" />
<!-- 下面定義事務管理器類,引用到sessionfactory-->
<bean id="mytransactionmanager" class="org.springframework.orm.hibernate.hibernatetransactionmanager">
<ref local="sessionfactory"/>
<!-- 下面定義事務代理工廠類類,引用到事務管理器,指定調用方法使用事務處理的比對規則-->
<bean id="mytransactionproxyfactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.transactionproxyfactorybean">
<property name="transactionmanager">
<ref local="mytransactionmanager"/>
<property name="transactionattributes">
<props>
<prop key="user*">propagation_required</prop>
<prop key="insert*">propagation_required</prop>
<prop key="del*">propagation_required</prop>
<prop key="up*">propagation_required</prop>
<prop key="find*">propagation_required,readonly</prop>
<prop key="dis*">propagation_required,readonly</prop>
</props>
<!-- 下面定義業務邏輯類,引用到事務管理器,通過已經定義的dao來自動注入業務邏輯類引用的dao類-->
<bean id="userservice" parent="mytransactionproxyfactory">
<property name="target">
<bean class="apps.hibernatetest.ioc.userserviceimp">
<property name="userdao"><ref local="userdao"/></property>
</bean>
</property>
</bean>
</beans>
2.springhibernatestudy-servlet.xml 主要對mvc web層的javabean定義
注意:這裡名稱要與在web.xml中對org.springframework.web.servlet.dispatcherservlet的對應servlet名稱對應。
這裡web.xml檔案裡配置了名字為springhibernatestudy,是以檔案名必須為:springhibernatestudy-servlet.xml
格式:servlet名稱+-servlet.xml
如果配置名稱為springservlet則,配置檔案應該為:springservlet-servlet.xml
<!doctype beans public "-//spring/dtd bean/en" "http://www.springframework.org/dtd/spring-beans.dtd">
<!-- - application context definition for "springapp" dispatcherservlet. -->
<beans>
<!-- 下面定義web層控制器類,引用到業務處理類,通過已經定義的service類來自動注入web控制器引用的service類-->
<bean id="usercontroller" class="apps.hibernatetest.ioc.usercontroller">
<property name="userservice">
<ref bean="userservice" />
</property>
<!-- 下面定義web層請求通路路徑和控制器類的影射關系以及對請求方式處理類的類配置的方法-->
<bean id="userurlmapping" class="org.springframework.web.servlet.handler.simpleurlhandlermapping">
<property name="mappings">
<props>
<prop key="/user.do">usercontroller</prop>
<!-- 這裡表示 //user.do會由 名稱為usercontroller的對應的控制器來apps.hibernatetest.ioc.usercontroller處理-->
</props>
</property>
</beans>
2.hibernate配置檔案:
這裡主要是映射檔案 :user.hbm.xml 與表user_table 對應
名稱為:user.hbm.xml
詳細配置代碼如下:
<?xml version="1.0"?>
<!doctype hibernate-mapping
public "-//hibernate/hibernate mapping dtd//en"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="apps.hibernatetest.ioc.user" table="user_table">
<id name="id" type="string" unsaved-value="null">
<column name="id" sql-type="varchar2(255)" not-null="true" />
<generator class="uuid.hex"/>
</id>
<property name="username" type="string">
<column name="username" sql-type="varchar2(20)"/>
</property>
<property name="password" type="string">
<column name="password" sql-type="varchar2(20)"/>
</class>
</hibernate-mapping>
注意:
1.類名一定要寫完整路徑帶包名
2.對應的資料庫表明一定要與資料庫一緻
如: <class name="apps.hibernatetest.ioc.user" table="user_table">
name屬性為:實體類名
table屬性為:資料庫表的名稱
3.其字段資訊要與資料庫表結構一緻
4.該配置檔案放在與實體類相同的目錄中,并在spring檔案中給與說明
如:user.java的完整路徑為apps.hibernatetest.ioc.user,對應配置如下
用hibernate往資料庫裡插入資料時,出現net.sf.hibernate.mappingexception: no persister for的解決辦法
根據我的出錯處理經驗,出現no persister for錯誤後有如下三種解決辦法:
1》檢查hbm.xml檔案。
2》檢查cfg.xml檔案,看看類的hbm.xml檔案名是不是已經寫上了。
3》對于one-to-many(parent-to-child)的關系,應該是
child.setparent(parent),而不是child.setparent(parent.id)
3. web.xml檔案:
這裡對servlet等資訊配置:
<!doctype web-app public "-//sun microsystems, inc.//dtd web application 2.3//en" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<listener>
<listener-class>org.springframework.web.context.contextloaderlistener</listener-class>
</listener>
<servlet>
<servlet-name>contextloaderservlet</servlet-name>
<servlet-class>org.springframework.web.context.contextloaderservlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 上面定義監聽器和上下文裝載的servelet,來裝載applicatincontext.xml檔案 -->
<!-- 下面定義配置spring的請求分發器類-->
<servlet-name>springhibernatestudy</servlet-name>
<servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
<load-on-startup>2</load-on-startup>
<servlet-name>debugjsp</servlet-name>
<description>added to compile jsps with debug info</description>
<servlet-class>org.apache.jasper.servlet.jspservlet</servlet-class>
<init-param>
<param-name>classdebuginfo</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
<!-- 下面定義配置spring的請求分發器将處理所有*.do的請求-->
<servlet-mapping>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<url-pattern>*.jsp</url-pattern>
</web-app>
六、相關各個類的詳細代碼極其說明
1.提供setter和getter方法,符合javabean規範
2.實作java.io.serializable可序列化接口。
3.與資料庫表結構一一對應
user.java
package apps.hibernatetest.ioc;
public class user implements java.io.serializable
{
private string id;
private string username;
private string password;
public user(){}
public string getid()
{
return id;
}
public void setid(string id)
this.id = id;
public string getusername()
return username;
public void setusername(string username)
this.username = username;
public string getpassword()
return password;
public void setpassword(string password)
this.password = password;
}
userdao.java
public interface userdao
public void useradd(user user);
1. 繼承hibernatedaosupport
2. 實作dao接口
3.使用模闆類處理資料
userdaoimp.java
import net.sf.hibernate.hibernateexception;
import net.sf.hibernate.query;
import net.sf.hibernate.session;
import org.springframework.orm.hibernate.hibernatecallback;
import org.springframework.orm.hibernate.support.hibernatedaosupport;
public class userdaoimp extends hibernatedaosupport implements userdao
public void useradd(user user)
{
//try
// {
//system.out.println("save="+gethibernatetemplate().save(user));
system.out.println("aaa====>"+user.getusername());
system.out.println("bbb====>"+user.getpassword());
gethibernatetemplate().save(user);
system.out.println("bbb");
/* }
catch(exception e)
{
system.out.println("執行插入使用者錯誤!");
}*/
}
userservice.java
public interface userservice
public void useradd(user user);
1.實作指定的service接口
2.接口實作調用dao接口
3.必須有userdao屬性,并提供setter方法,如下
private userdao userdao;
public userdao getuserdao()
return userdao;
public void setuserdao(userdao userdao)
this.userdao = userdao;
在配置檔案中,通過配置自動實作dao屬性的自動注入。
通過這樣來定義service業務類和dao的依賴關系
userserviceimp.java
public class userserviceimp implements userservice
private user user = new user();
userdao.useradd(user);
usercontroller.java
import org.springframework.web.servlet.mvc.controller;
import org.springframework.web.servlet.modelandview;
import javax.servlet.servletexception;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.*;
import javax.servlet.http.*;
import org.springframework.web.bind.requestutils;
import java.io.ioexception;
import java.util.map;
import java.util.*;
import java.util.hashmap;
import org.apache.commons.beanutils.beanutils;
import org.springframework.context.applicationcontext;
import org.springframework.web.context.support.webapplicationcontextutils;
public class usercontroller implements controller
private userservice userservice;
public void setuserservice(userservice userservice)
this.userservice = userservice;
public modelandview handlerequest(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception
{
string url="";
url="addok.jsp";
user u=new user();
u.setusername("aaa");
u.setpassword("bbbb");
userservice.useradd(u);
return new modelandview(url);
}
1.實作controller接口
2.提供私有屬性,并提供setter方法
如下代碼
3.在控制器在handlerequest中調用屬性userservice調用業務邏輯。
4. 定義url變量,設定其值,作為modelandview類的構造函數的參數,作為業務邏輯處理完後的跳轉位址
七,相關項目說明:
調試環境:jbulder9.0
需要導入如下主要的jar包:
spring.jar
hibernate.java
dhcp.java
classes12
等等
八、代碼下載下傳:
http://www.e-jrsj.com/hibernatetest.rar
九、在main方法中對在配置檔案中的javabean類方法測試的代碼:
注意:applicationcontext.xml檔案放在classes根目錄下
import org.springframework.beans.factory.beanfactory;
import org.springframework.beans.factory.xml.xmlbeanfactory;
import org.springframework.core.io.classpathresource;
import org.springframework.core.io.resource;
import org.apache.commons.logging.log;
import org.apache.commons.logging.logfactory;
public class test
public static void main(string[] args)
//根據配置檔案得到beanfactory(bean工廠)
resource resource = new classpathresource("applicationcontext.xml");
beanfactory factory = new xmlbeanfactory(resource);
//下面通過bean工廠從配置檔案中得到執行個體化的bean,并轉換為相應的接口
userdao dao = (userdao) factory.getbean("userdao");
/*
<bean id="userdao" class="apps.hibernatetest.ioc.userdaoimp">
</bean>
*/
userservice service = (userservice) factory.getbean("userservice");
對應配置檔案
<bean id="userservice" parent="mytransactionproxyfactory">
</bean>
*/
system.out.println("tettet");
user u=new user();
u.setusername("aaa");
u.setpassword("bbbb");
dao.useradd(u);
service.useradd(u);