关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明
作者:yanek
email:yanek@126.com
一、实现目标:
通过使用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>
<property name="password">
<value>1234</value>
</property>
</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>
<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>
</property>
</bean>
<!-- 下面定义hibernate模板 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- 下面定义用户定义的DAO,指定了DAO的实现类,dao实现引用到hibernate模板-->
<bean id="UserDAO" class="apps.hibernatetest.ioc.UserDAOImp">
<property name="hibernateTemplate">
<ref local="hibernateTemplate" />
</property>
</bean>
<!-- 下面定义事务管理器类,引用到sessionFactory-->
<bean id="mytransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<!-- 下面定义事务代理工厂类类,引用到事务管理器,指定调用方法使用事务处理的匹配规则-->
<bean id="MyTransactionProxyFactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="mytransactionManager"/>
</property>
<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>
</property>
</bean>
<!-- 下面定义业务逻辑类,引用到事务管理器,通过已经定义的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
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
</bean>
<!-- 下面定义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>
</bean>
</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)"/>
</property>
</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,对应配置如下
<property name="mappingResources">
<list>
<value>apps/hibernatetest/ioc/User.hbm.xml</value>
</list>
</property>
用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等信息配置:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<servlet-name>SpringhibernateStudy</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<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>
</servlet>
<!-- 下面定义配置Spring的请求分发器将处理所有*.do的请求-->
<servlet-mapping>
<servlet-name>SpringhibernateStudy</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>debugjsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
</web-app>
六、相关各个类的详细代码极其说明
1. User.java 表示用户实体的值对象类,与数据库用户表结构相对应,标准的javabean,提供setter和getter方法。
注意:
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;
}
}
2. UserDAO.java DAO接口
UserDAO.java
package apps.hibernatetest.ioc;
public interface UserDAO
{
public void userAdd(User user);
}
3. UserDAOImp.java DAO接口的实现类
注意:
1. 继承HibernateDaoSupport
2. 实现dao接口
3.使用模板类处理数据
UserDAOImp.java
package apps.hibernatetest.ioc;
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("执行插入用户错误!");
}*/
}
}
4. UserService 业务逻辑层的接口
UserService.java
package apps.hibernatetest.ioc;
public interface UserService
{
public void userAdd(User user);
}
5. UserServiceImp 业务逻辑层的接口的实现类,调用DAO接口实现业务逻辑。
注意:
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
package apps.hibernatetest.ioc;
public class UserServiceImp implements UserService
{
private UserDAO userDAO;
private User user = new User();
public UserDAO getUserDAO()
{
return userDAO;
}
public void setUserDAO(UserDAO userDAO)
{
this.userDAO = userDAO;
}
public void userAdd(User user)
{
userDAO.userAdd(user);
}
}
6. UserController web层客户调用层,调用业务逻辑层,实现对业务逻辑的处理。(前台)
UserController.java
package apps.hibernatetest.ioc;
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方法
如下代码
private UserService userService;
public void setUserService(UserService userService)
{
this.userService = userService;
}
3.在控制器在handleRequest中调用属性userService调用业务逻辑。
User u=new User();
u.setUsername("aaa");
u.setPassword("bbbb");
userService.userAdd(u);
4. 定义url变量,设置其值,作为ModelAndView类的构造函数的参数,作为业务逻辑处理完后的跳转地址
String url="";
url="addok.jsp";
return new ModelAndView(url);
七,相关项目说明:
调试环境:jbulder9.0
需要导入如下主要的jar包:
spring.jar
hibernate.java
dhcp.java
classes12
等等
八、代码下载:
http://www.e-jrsj.com/hibernatetest.rar
九、在main方法中对在配置文件中的javabean类方法测试的代码:
注意:applicationContext.xml文件放在classes根目录下
package apps.hibernatetest.ioc;
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">
<property name="hibernateTemplate">
<ref local="hibernateTemplate" />
</property>
</bean>
*/
UserService service = (UserService) factory.getBean("userService");
/*
对应配置文件
<bean id="userService" parent="MyTransactionProxyFactory">
<property name="target">
<bean class="apps.hibernatetest.ioc.UserServiceImp">
<property name="userDAO"><ref local="UserDAO"/></property>
</bean>
</property>
</bean>
*/
System.out.println("tettet");
User u=new User();
u.setUsername("aaa");
u.setPassword("bbbb");
dao.userAdd(u);
service.userAdd(u);
}
}
分享到:
相关推荐
白色大气风格的旅游酒店企业网站模板.zip
python实现用户注册
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
内容概要:文档名为《平方表,派表集合.docx》,主要内容是1至1000的平方值以及1至1000与π的乘积结果。每个数字从1开始,逐步增加至1000,对应地计算了平方值和乘以π后的值。所有计算均通过Python脚本完成,并在文档中列出了详细的计算结果。 适合人群:需要进行数学计算或程序验证的学生、教师和研究人员。 使用场景及目标:用于快速查找特定数字的平方值或其与π的乘积,适用于教学、科研及程序测试等场景。 阅读建议:可以直接查阅所需的具体数值,无需从头到尾逐行阅读。建议在使用时配合相应的计算工具,以验证和拓展数据的应用范围。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色大气风格的健身私人教练模板下载.zip
白色简洁风的商务网站模板下载.zip
白色大气风格的前端设计案例展示模板.zip
内容概要:本文介绍了两个有趣的圣诞树项目方向:一是使用Arduino或Raspberry Pi开发可编程的圣诞树灯光控制系统;二是基于MATLAB开发一个圣诞树模拟器。前者通过硬件连接、编写Arduino/Raspberry Pi程序、MATLAB控制程序来实现LED灯带的闪烁;后者则通过创建圣诞树图形、添加动画效果、用户交互功能来实现虚拟的圣诞树效果。 适合人群:具备基本电子工程和编程基础的爱好者和学生。 使用场景及目标:①通过硬件和MATLAB的结合,实现实际的圣诞树灯光控制系统;②通过MATLAB模拟器,实现一个有趣的圣诞树动画展示。 阅读建议:读者可以根据自己的兴趣选择合适的项目方向,并按照步骤进行动手实践,加深对硬件编程和MATLAB编程的理解。
白色扁平风格的温室大棚公司企业网站源码下载.zip
Navicat.zip
内容概要:本文详细介绍了主成分分析(PCA)技术的原理及其在Scikit-learn库中的Python实现。首先讲解了PCA的基本概念和作用,接着通过具体示例展示了如何使用Scikit-learn进行PCA降维。内容涵盖了数据准备、模型训练、数据降维、逆转换数据等步骤,并通过可视化和实际应用案例展示了PCA的效果。最后讨论了PCA的局限性和参数调整方法。 适合人群:数据科学家、机器学习工程师、数据分析从业者及科研人员。 使用场景及目标:适用于高维数据处理,特别是在需要降维以简化数据结构、提高模型性能的场景中。具体目标包括减少计算复杂度、提高数据可视化效果和改进模型训练速度。 其他说明:本文不仅提供了详细的代码示例,还讨论了PCA在手写数字识别和机器学习模型中的应用。通过比较原始数据和降维后数据的模型性能,读者可以更好地理解PCA的影响。
VOC格式的数据集转COCO格式数据集 VOC格式的数据集转YOLO格式数据集。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
数字信号处理课程设计.doc
白色扁平化风格的灯饰灯具销售企业网站模板.zip
华豫佰佳组合促销视图.sql
白色大气风格的商务团队公司模板下载.zip
白色大气风格的VPS销售网站模板.zip