- 浏览: 7944916 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
spring,hibenate,再搭配一个X(就是本文标题中的+x),已经几乎横扫目前的JAVA应用界,好象目前
一讲JAVA应用开发,都必须要懂这三样东西的。最近花了些时间来学习之,发现其实还是有不少模式和规律可以找到的,
现将心得小结之,总结这些带规律的“板斧”类东西,呵呵。
以一个最简单的一对多例子来讲解。比如有目录category,产品类product,目录和产品的关系是一对多关系。于是咱们先来搞个
PO(下面的代码都只是写重点部分,其他的就省略了,学过或看过的,一看就明,只起到提点作用)
1、建好基础:MODEL层
category.java
public class category
{
.......id,description之类的属性
private Set products; //用集合来表示产品
public Set getProducts()
{
return products;
}
/**
* @param products The products to set.
*/
public void setProducts(Set products)
{
this.products = products;
}
}
product实体
public class Product
{
......
private Category category;
public Category getCategory()
{
return category;
}
/**
* @param category The category to set.
*/
public void setCategory(Category category)
{
this.category = category;
}
}
之后我们马上搞映射文件了
catagory.hbm.xml中,要特别注意设置为
<set cascade="none" name="products" inverse="true" order-by="name asc">
<key column="CATEGORY_ID" />
<one-to-many class="cn.liao.model.Product" />
</set>
而products.hbm.xml中,特别注意设置为
<many-to-one column="CATEGORY_ID" name="category"/>
好了,model层搞好了,我们放到cn.liao.model这个包下,这个包我们专放model层的东西
2、接下来,我们来搞持久层了,其实持久层的话,之前我们用传统的JDBC去玩的,现在换了hibernate而已,注意在这层里,我们要把PO持久保存到数据库了,和PO打交道了,接受来自业务层的对象了,这里等于临门一脚了,所以一般我们用DAO模式去搞的,比如搞个工厂之类的东西,可扩展性好,下面的例子里,只是简单给出接口,然后再实现之,实现时,通过getHibernateTemplate()得到spring中所定义的操作模版
Icategory.java(category的DAO接口)
public interface CategoryDao
{
// 保存商品分类
public Category saveCategory( Category category );
// 修改商品分类
public Category updateCategory( Category category );
// 得到所有的商品分类
public List getAllCategorys();
// 得到某个商品分类的信息
public Category getCategory( String categoryId );
// 删除某个商品分类的信息
public void deleteCategory( Category category );
}
而实现呢,我们命名一个叫categoryDaoHibernateImpl的类(注意我们为了规范,一般用impl做名字的后缀)
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;i
mport cn.liao.dao.CategoryDao;
import cn.liao.model.Category;
public class CategoryDaoHibernateImpl
extends HibernateDaoSupport
implements CategoryDao
{
public Category saveCategory(Category category)
{
this.getHibernateTemplate().save( category );
this.getHibernateTemplate().flush();
return category;
}
public List getAllCategorys()
{
String sql = "from Category c order by c.name";
return this.getHibernateTemplate().find( sql );
}
public void deleteCategory(Category category)
{
this.getHibernateTemplate().delete( category );
}
public Category getCategory(String categoryId)
{
Category category = (Category)this.getHibernateTemplate()
.get( Category.class, categoryId );
return category;
}
public Category updateCategory(Category category)
{
this.getHibernateTemplate().update( category );
this.getHibernateTemplate().flush();
return category;
}
}
呵呵,看到了吧,我们在这里,继承了HiberanteDaoSupport,又把很多东西简单化了,完全就是get呀,update呀,delete等傻瓜方法了,
那个sessionfactory哪去了?我们等阵注入给它。注意,这时我们的持久层搞好了,我们把它放到cn.liao.dao包里去,方便管理
3、好了,接下来我们来搞业务层。业务逻辑层是很关键的,它要进行一些实际的运算之类的,处理后再把对象传给持久层进行保存。
为了解藕合,我们依然用接口式编程。比如对category类,如果要增,删,改,查的话,我们依然定义IcategoryService接口:
public Interface IcategorySerivce
{
// 保存商品分类信息
public Category saveCategory( Category category ) throws xxxexcepiton;
// 修改商品分类信息
public Category updateCategory( Category category ) throws xxxexception;
// 得到所有的商品分类信息
public List getAllCategorys();
// 得到某个商品分类的信息
public Category getCategory( String categoryId ) throws xxxexception;
// 删除某个商品分类的信息
public void deleteCategory( String categoryId ) throws xxxexception;
}
}
接下来,真正实现这个业务接口的实现类为
public class CategoryServiceImpl implements CategoryService
{
//要用到DAO层的对象了
private CategoryDao categoryDao;
public CategoryDao getCategoryDao()
{
return categoryDao;
}
public void setCategoryDao(CategoryDao categoryDao)
{
this.categoryDao = categoryDao;
}
// 保存商品分类信息
public Category saveCategory( Category category ) throws xxxexcepiton
{
try
{
//比如这里再进行一些商业逻辑计算
。。。。。。。。
//调用持久层去保存对象了
Category c = this.getCategoryDao().saveCategory( category );
return c;
}
catch (....)
{
}
.........//其他如此类推
}
注意的是,我们在这里要用到的是DAO层的categoryDao对象了,但我们并不在这里硬编码,而是依靠spring里进行注入
4、好了,我们现在来搞前端的控制层了(controller)了。我们这里用jsf+spring+hibernate的,
这里我们先提供一个基类baseaction,提取大家都要用到的一些东西,减少在开发时的代码量,其实换了structs的话,也可以先搞个baseaction的,让它继承自Action。我们的这个JSF的baseaction这样搞
public class BaseBean
{
protected ServiceLocator serviceLocator;
public ServiceLocator getServiceLocator()
{
return this.serviceLocator;
}
public void setServiceLocator(ServiceLocator newServiceLocator)
{
this.serviceLocator = newServiceLocator;
this.init();
}
protected void init()
{
}
}
注意,这里的 ServiceLocator 类,我们接下来会编写,我们再这里,依然是接口编程
public interface ServiceLocator
{
public ICategoryService getCategoryService();
public IUserService getUserService();
。。。。。这里可能还有很多其他的服务
}
记得吧,IcategoryService就是我们刚才已经做好了的处理目录类的业务逻辑接口,这里,还存在很多其他业务相关的逻辑接口的,可以一一列出,这个接口的目的是定义了所有业务层对象实例的方法。
然后又是对其的一个实现类,命名为ServiceLocatorImpl,
public class ServiceLocatorImpl implements ServiceLocator {
private ApplicationContext appContext;
public ServiceLocatorImpl() {
//这里先获得ServletContext
ServletContext context = FacesUtils.getServletContext();
this.appContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(context);
}
public Object lookupService(String serviceBeanName) {
return appContext.getBean(serviceBeanName);
}
public CategoryService getCategoryService() {
return (CategoryService) lookupService(“categoryservice”);
}
}
这里,首先得到getServletContext对象的实例,然后通过spring的WebApplicationContextUtils类的getRequiredWebApplicationContext得到applicationcontext对象的实例,最后通过ApplicationContext对象的实例得到这些业务方法类的实例
这个时候,我们把这些业务层的所有东西,都放到一个统一的包里,比如
cn.liao.services或者叫cn.liao.business。
好了,我们最后看下JSF里的前置bean如何写法,JSF里,其实就是把actionform和action都结合在一起了,用javabean的形式来表达,大概构造为:
public class CategoryBean extends BaseBean
{
。。。。。一系列的SET,GET方法
//增加产品的action
public String createAction()
{
try
{
this.getServiceLocator().getCategoryService().saveCategory( category );
}
return SUCCESS
catch (…..)
{
};
}
private Category convertToCategory()
{
Category category = new Category();
category.setId( this.id );
category.setName( this.name );
category.setDescription( this.description );
return category;
}
在上面的代码中,首先用convertToCategory(),构造出了Category 对象,十分简单,都是用set 的方法(前台的JSF会帮你自动绑定好)。接着在createaction里,就用
this.getServiceLocator().getCategoryService().saveCategory( category );来调用业务层的方法了,调用成功的话返回字符串success,这个success是在JSF的配置文件里去配置去导航的。
5、我们接着要写JSF的faces-managed-beans.xml,这个是其配置前置BEAN的文件,可以看做是一个粘合剂
<managed-bean>
<description>
Service locator of the business services
</description>
<managed-bean-name>serviceLocatorBean</managed-bean-name>
<managed-bean-class>
cn.liao.services.ServiceLocatorImpl
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<managed-bean>
<description>
Backing bean that contains category information.
</description>
<managed-bean-name>categoryBean</managed-bean-name>
<managed-bean-class>
cn.liao.services.CategoryBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>id</property-name>
<value>#{param.categoryId}</value>
</managed-property>
<managed-property>
<property-name>serviceLocator</property-name>
<value>#{serviceLocatorBean}</value>
</managed-property>
</managed-bean>
在上面的配置文件中,首先指出了serviceLocatorBean这个BEAN的实际位置是代表cn.liao.services.ServiceLocatorImpl,接下来我们配置categoryBean
了,由于在categorybean里,需要获得id号,所以用#{param.categoryId}的形式就可以实现了,象需要servicelocator,也在这里通过<value>#{serviceLocatorBean}</value>注入进去了
而在面对最终用户的V层,这里就不详细阐述了,只是提点一下,V层其实和STRUCTS差不多,只不过换了JSF的一些标签,而比如在象提交按钮这里,可以这样写
<h:commandButton value="#{msgs.create}"
action="#{categoryBean.createAction}"/>
这里,留意action="#{categoryBean.createAction}",记得吧,categoryBean就是我们刚才写好的前置控制器的javabean,而这里是调用了其中的createAction方法(见前面的代码)。
我们还要配置faces-navigation.xml文件,这个文件主要是JSF里配置页面的导航,还记得之前我们那个提交成功后的那个success么,其实是来自下面的定义
<navigation-rule>
<from-view-id>/category/categoryCreate.jsp</from-view-id>
<navigation-case>
<description>Create Category Success</description>
<from-outcome>success</from-outcome>
<to-view-id>/category/categoryCreate.jsp</to-view-id>
</navigation-case>
这里,<from-view-id>是说当从/category/categoryCreate.jsp页面进来的请求作如何的处理,<from-outcome>success</from-outcome>就是success了,当success时,要跳转到另外的V层的categorycreate.jsp
6、最后的SPRING大组装
一切都搞好了,就要把它们装配起来,下面给出applicationcontext.xml文件
<beans>
<!-- ============ Start of PERSISTENCE DEFINITIONS =========== -->
<!-- DataSource Definition -->
//设置datasource
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/show?useUnicode=true&characterEncoding=utf8&autoReconnect=true&autoReconnectForPools=true</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>xxxxx</value>
</property>
</bean>
//spring和hibernate的结合
<!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>cn/hxex/library/model/Category.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="current_session_context_class">thread</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<prop key="connection.pool_size">10</prop>
//这里设置hbm2ddl为auto,则只需要之前在MYSQL里建好数据库,不需要建表,其他都自动在运行时生成表了
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!-- Spring Data Access Exception Translator Defintion -->
<bean id="jdbcExceptionTranslator"
class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
<!-- Hibernate Template Defintion -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
<property name="jdbcExceptionTranslator">
<ref bean="jdbcExceptionTranslator"/>
</property>
</bean>
<!-- Category DAO Definition: Hibernate implementation -->
<bean id="categoryDao"
class="cn.hxex.library.dao.hibernate.CategoryDaoHibernateImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate"/>
</property>
</bean>
//对事务的定义
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="categoryServiceTarget"
class="cn.liao.service.CategoryServiceImpl">
<property name="categoryDao">
<ref local="categoryDao"/>
</property>
</bean>
<bean id="categoryService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target"><ref local="categoryServiceTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
发表评论
-
git学习小结
2017-01-23 20:14 601http://www.liaoxuefeng.com/wiki ... -
国内IT技术大会小结
2012-06-15 12:47 3434搞IT的就要多交流,这个应该成为大家的共同认识,比如国内目前有 ... -
国内IT技术大会小结束
2012-06-15 12:44 0搞IT的就要多交流,这个应该成为大家的共同认识,比如国内目前有 ... -
国内IT技术大会小结束
2012-06-15 12:42 0搞IT的就要多交流,这个应该成为大家的共同认识,比如国内目前有 ... -
神奇的“触觉振动”:谈W3C的震动API
2012-02-17 12:28 2120说起“触觉反馈”,大家可能从字面上并不能理解它是如何工作的。触 ... -
Chrome赶超IE:谷歌为何再度联手火狐
2011-12-27 20:16 2436http://tech.it168.com/a2011/122 ... -
(转10款难看但好用的SEO工具
2011-09-07 06:53 1403人不可貌相,SEO工具也不例外。 SEO专业网站SEOmoz ... -
一个很好的开源CRM项目
2005-01-15 19:56 1632http://www.sugarcrm.com,还有简体中文包 ... -
PHP中得到指定的时间段
2005-01-15 19:59 1948最近在项目中,遇到个比较特殊的要求,比如,MYSQL中,比如今 ... -
给大家推荐一个SQL好的站点
2005-01-15 20:20 1126,给大家推荐一个SQL好的站点 http://sqlteam. ... -
记得打补丁
2005-04-14 19:33 1045之前遇到个很怪的问题: 买了个新硬盘,160G,重新装了VS. ... -
express beta 2版本出来了
2005-04-18 11:30 1049在没下到VS。NET 2005之前,也可以用轻量级的EXPRE ... -
SQL SEVER 2005 CTP APRIL出来了
2005-04-20 20:02 1081http://lab.msdn.microsoft.com/e ... -
ms reporting service sp2 出来了
2005-04-24 08:27 1205SQL Server 2000 Reporting Servi ... -
php5 读书心得(1)
2005-04-25 19:48 1157由于工作中要用到PHP,最近下了本《PHP5 POWER PR ... -
PHP5 心得(2)
2005-04-28 19:41 1186在OOP中,构造函数和析构函数是很重要的,在PHP4中,可 ... -
vs.net 2005 beta 2安装问题
2005-04-28 22:50 1207我之前已经卸载了BETA 1了,但可惜安装后,在新建工程后,还 ... -
PHP5心得3
2005-04-29 20:47 1134今天讲的是parent::和self::两个新的关键字。se ... -
PHP5心得4
2005-05-01 17:11 11601 instanceof操作 该操作中,判断某个类是 ... -
vs 2005中的 Visualizer debugger
2005-05-05 21:01 1147在vs.net 2005 中,增加了可视化的调试器,甚至可以自 ...
相关推荐
这个"jsp+Spring+hibernate"博客系统展示了如何利用现代Java技术栈构建一个功能完善的Web应用。通过结合JSP的视图呈现、Spring的控制层管理和Hibernate的数据持久化,开发者能够快速、高效地开发出具有复杂业务逻辑...
spring mvc + spring + hibernate 全注解整合开发视频教程 06.haozip03
综上所述,"gwt+spring+hibernate"的整合旨在展示如何在Java Web应用中同时利用GWT的富客户端特性、Spring的架构优势和Hibernate的数据持久化能力。通过这样的整合,开发者可以构建出用户体验良好、业务逻辑清晰且...
Spring MVC、Spring 和 Hibernate 是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个强大而灵活的后端架构。Spring MVC 负责处理HTTP请求并将其路由到相应的控制器,Spring 提供了依赖注入(DI)和面向...
在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第11部分,重点可能是建立在前几部分的基础之上,进一步深化对这三个核心技术的理解和实践。 ...
简单struts+spring+hibernate搭建,配置,适合初学者
基于struts+spring+hibernate+oracle的移动ssh项目源码 基于struts+spring+hibernate+oracle的移动ssh项目源码 基于struts+spring+hibernate+oracle的移动ssh项目源码 基于struts+spring+hibernate+oracle的移动ssh...
农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts ...
DWR+Struts+spring+hibernate的订货系统,自己添加的dwr功能
**Spring+Hibernate+MySql应用实例详解** 在Java Web开发领域,Spring、Hibernate和MySQL是三个非常关键的技术组件。Spring作为一个全面的框架,提供了一种轻量级的控制反转(IoC)和面向切面编程(AOP)的解决方案...
标题中的"idea工具创建的Spring+SpringMVC+Hibernate+maven项目"指的是使用IntelliJ IDEA这个集成开发环境(IDE)构建的一个Java Web项目,该项目整合了四个关键的技术框架:Spring、SpringMVC、Hibernate以及Maven...
一个简单的spring+struts2+hibernate+mybatis整合(数据库脚本放在项目资源文件的sql目录下) 因为没想好mvc用springmvc好,还是struts2好 所以没有整合进去
《图书管理系统spring+struts+hibernate》是一款基于Java技术栈开发的图书管理软件,其核心框架包括Spring、Struts和Hibernate。该系统利用MySQL作为数据库存储数据,提供了完整的数据库备份,确保了数据的安全性与...
Ajax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+Hibernate
这个"JSF+Spring+Hibernate小例子"为我们提供了一个整合这三者的基础应用,帮助开发者理解如何将它们有效地结合在一起。 **JavaServer Faces (JSF)** JSF是一种MVC(Model-View-Controller)框架,主要用于构建用户...
基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于...
在IT行业中,SSH(Struts + Spring + Hibernate)是一个经典的Java Web开发框架组合,用于构建高效、可扩展的Web应用程序。本项目通过SSH框架实现了图书管理系统的图书修改和删除功能,下面将详细介绍这三个核心组件...
《疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发》是《基于J2EE的Ajax宝典》的第二版。《基于J2EE的Ajax宝典》面市近2年,作为Ajax领域最全面、实用的图书,一直深受读者的好评。全书主要分为三个...
在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发视频教程 04”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring、Spring MVC和Hibernate的集成与应用,尤其是通过注解实现的简化配置。...
一个spring+struts+hibernate的例子,是eclipse的工程,用tomcat5和mysql,文件夹下包含所有的源码和库,另外还有一个.sql的文件用于建立数据库。大家觉得它有什么不好,欢迎交流