原文链接:
http://www.java3z.com/cwbwebhome/article/article8/81137.html
在前两章我为大家详细分析了
JAR
包的选择和必须的配置文件,那么这一章,我就对例子的层次结构进行说明,并实现除
WEB
层的功能代码。
第三部分:建立框架代码
工程结构
大家可以看到,本例一共分为:
dao
、
entity
、
service
、
web
四层。另外在这些层次下,还以业务功能再进行分包,这样做是为了方便在以后的功能扩展中,能更好的管理和维护代码。如果将所有类都直接集中在这
4
个包下面,随着类的增加,会越来越难以维护,而且查找起来也很费劲。
HibernateDao
在本例中,我是通过继承
Spring
提供的
HibernateDaoSupport
来实现持久层的基类。同时引入泛型参数,封装了一些基本操作方法。
这是
HibernateDao
的部分代码,引入的这个泛型参数,其实就是实体类(
User
、
Role
)。通过传递这个实体类,在构造方法中利用反射特性将它从
JVM
中取出来。这里的
getClass()
方法是获得继承
HibernateDao
的类(
UserDao
、
RoleDao
)
getGenericSuperclass()
方法就是通过这些继承了
HibernateDao
的类,来得到父类(父类就是
HibernateDao
)的泛型。注意这个方法的返回值为
Type
,这是一个类型接口。请参考
API
。因为在继承
HibernateDao
的时候,会给它加一个泛型参数。比如,
User
、
Role
实体类。因此超类是参数化类型,所以返回的
Type
对象包含所使用的实际类型参数。这里返回的
Type
对象是
ParameterizedType
接口的实现类
ParameterizedTypeImpl
,所以要将返回类型转型为
ParameterizedType
。
getActualTypeArguments()
方法是
ParameterizedType
接口中的,它的作用就获得实际类型参数
Type
对象的数组,因为我们这里只定义了一个泛型参数,数组里面也只一个值,所以需要在数组下标处填
0
。然后最后一步转型千万别忘记了,因为这个方法返回的可是一个
Type
数组喔。如果对于这部分的说明还有点不理解的话,请到时候有了代码,设个断点跟踪一下,就会全部清楚了。关于
java
反射,它已经超出本文的范围。大象只对本例中用到的部分进行讲解。使用这种写法,是方便我们进行类型转换与类型检查。另外还可以简化某些方法的写法。比如:
createCriteria(Criterion... criterions)
这个方法。参数是
Criterion
类型的可变参数,它是用来设置查询条件。如果要进行对象化查询,那么最简单的写法就可以直接写成
createCriteria()
。另外还有重载的方法,可以根据传入
class
类型来创建自定义查询。
dao
持久层的
Dao
类是根据实体类定义,一般是一个实体类就会有一个对应的
Dao
类。当然这要跟业务需求来设计,不是绝对的。另外你也可以为了简便而去掉
dao
层,将持久化操作与业务逻辑全部写在
service
层。
这些定义的方法是供
service
层调用,在业务层,将不会看到一行与持久层有关的代码,降低藕合性是这样做的目的。
@Repository
注解的作用就是标注这个
UserDao
是一个持久层组件。还记得前一章讲到的扫描器吗?
component-scan
它就是用来将标有
@Repository
,
@Service
这样的注解类扫描到
Spring
的容器里,并且同时对标有
@Autowired
注解的
Bean
启用了自动注入功能。这就是
Spring
从
2.5
开始提供的新特性。我们使用注解的方法,就可以告别那繁琐的配置文件定义。
entity
关于实体的定义就是使用
JPA
注解,关于这部分,我以前写过一篇文章专门讲这个,如果有不清楚的朋友可以先参考一下。
学习
JPA——
Hibernate Annotation
使用实例
本例中,我有两点要讲下。
第一、管理主键的表
generator_table
去掉原来单独定义的那个
ID
主键,把
g_key
设为主键,整个表将只有两个字段,
g_key
和
g_value
。
第二、在
User
实体中,我将角色
ID
(
role_id
)与角色实体(
Role
)做了一个多对一关联。这一点是原来文章中没有讲过的。
请一定注意
role_id
是
user
表的字段。我在本例中设定的是一个角色可以对应多个人员,所以这个
role_id
存的就是
role
表
id
的值。
fetch = FetchType.
LAZY
指定采用延迟检索,如果当你取得了
User
对象,但又不想取
Role
中的信息,这时,
User
对象中的
role
属性是代理状态。
Role
对象中的值都是空的。只有当你使用
role.id
或
role.name
进行取值的时候,
hibernate
才会去数据库中查找对应的记录,因此在一定程度上降低了资源消耗。不过这里有点要注意,采用延迟检索的时候,需要加上前一篇讲到的
OpenSessionInViewFilter
过滤器。否则会遇到
session
关闭的异常。
service
@Service
表示这是业务层组件。在业务层需要对
UserDao
加上
@Autowired
注解,我在这里将业务层的方法名与持久层的方法名定义为一样的,是我的一种习惯,大家可以按自己的想法来做。
测试
既然有了这么多代码,那就来测试一下吧,看看有没有问题。
为了照顾那些坚定的
JUnit
拥护者,再写一个
JUnit
测试。本例使用
junit-4.4.jar
@BeforeClass
注解的方法表示在类实例化之前,也就是在类的构造方法执行之前就会执行。而且使用这个注解的方法必须是
static void
@Test
标明这是测试方法,方法名不用像以前那样必须按照规则进行命名,可以自由定义。
上图显示大象使用
JUnit
方式测试也通过了(如果不会通过我写它干嘛?嘿嘿)。 假如我将张三改成张四,再来看看测试结果。
这个截图可以很明显的说明所有东西。这一篇是给大家讲怎么用代码来实现除
web
层之外的全注解步骤。当然,我主要是讲思路,其实思路比代码重要得多。这一个系列的最后,我会放上所有源码供大家下载。现在这样慢慢分析,是想给大家讲道理。我们应该努力提升自己的境界与层次,而不要只把眼光放在代码上面。下一章将会着重介绍
web
层,以及
struts2
的注解插件
struts2-convention
。
原文链接:
http://www.java3z.com/cwbwebhome/article/article8/81137.html
分享到:
相关推荐
SSH是Java Web开发中的一个经典框架组合,包括Struts、Hibernate和Spring三个核心组件。这个框架结合了MVC设计模式、对象关系映射以及依赖注入等技术,为开发者提供了高效且灵活的开发环境。 **Struts** 是一个开源...
SSH注解实例通常会包含以下步骤: 1. **创建实体类**:在实体类上使用Hibernate注解,如`@Entity`,`@Table`,`@Id`等,定义数据库表和字段映射。 2. **配置Hibernate**:在Spring配置文件中,使用`SessionFactory...
总的来说,SSH2实例和SSH2注解实例是学习SSH2框架和Java Web开发的重要资源。通过对这两个实例的学习和实践,你可以熟练掌握SSH2的使用,提升自己的技能,为未来在复杂的企业环境中开发安全、高效的应用奠定坚实的...
在这个“SSH注解方式整合小例子”中,我们将深入探讨如何使用注解来简化SSH框架的配置过程,使得开发更加便捷。 **Struts2** 是一个基于MVC设计模式的Action驱动的Web应用框架,它通过注解可以实现Action类的声明式...
ssh注解完整实例源代码 可直接运行 初级使用
SSH注解开发是SSH框架中的一项重要技术,它允许开发者在不写XML配置的情况下进行开发,提高开发效率并减少配置错误。 标题“ssh注解开发案例”表明我们将探讨如何在SSH框架中使用注解进行开发。SSH框架通过注解可以...
SSH2整合全注解实例是基于Struts2、Spring和Hibernate这三个开源框架的集成应用,它们共同构建了一个强大的Web应用程序开发平台。SSH2是Java Web开发中的经典组合,提供了模型-视图-控制器(MVC)的设计模式,使得...
SSH,全称Spring、Struts、Hibernate,是Java Web开发中的三大开源框架,它们分别负责应用的业务逻辑层(Spring)、视图层(Struts)和数据持久化层(Hibernate)。SSH框架以其强大的功能和灵活性,长期以来在企业级...
在这个SSH2的全注解实例中,开发者会逐步学习如何在MyEclipse环境下创建项目,配置框架,编写Action、Service、DAO和实体类,并通过注解进行相应的配置。同时,SQL语句的使用和数据库的交互也是实例的重要组成部分,...
总的来说,SSH2框架全注解实例的学习,可以帮助初学者快速掌握Java Web开发的核心技术,理解MVC架构、依赖注入和ORM的工作原理,以及如何在实际项目中应用这些技术。同时,通过CRM_T4实例,可以实践从数据库设计到...
总的来说,SSH注解整合实例是一个实用的学习资源,它可以帮助开发者快速理解如何在实际项目中应用这些注解,提升开发效率,减少配置文件的工作量。在实际开发过程中,灵活运用SSH框架的注解,可以使代码更具有可读性...
总结来说,全注解版SSH增删改查实例是Java Web开发中一个实用的学习资源,它展示了如何在不依赖XML配置的情况下,利用Spring、Struts2和Hibernate的注解实现高效的业务逻辑处理。这样的实例有助于开发者快速理解和...
在这个“SSH纯注解开发”主题中,我们将深入探讨如何利用注解来简化这三大框架的配置,提高开发效率。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它的主要目标是提供一个更加...
本教程将通过注解方式,提供一个简单的SSH应用实例,可以直接运行。 首先,让我们详细了解SSH框架的核心组件: 1. **Struts2**:这是一个基于MVC设计模式的Java Web框架,它简化了创建用户交互层的工作。Struts2...
在"学习SSH2经典实例的jar包3"中,你可能会找到关于这三个框架集成使用的示例代码和库文件。这些实例可能涵盖了用户登录验证、数据展示、表单验证、动态加载数据等常见应用场景,通过实际操作加深对SSH2的理解。此外...
- 这个项目的名称可能是智慧YCweb,可能是一个Web应用,使用SSH框架实现,包含各种Controller、Service、DAO层的注解实例。 - 可能包含了Model类,用Hibernate注解描述数据库模型。 - 控制器类中,使用Struts2和...
SSH框架,全称为Spring、Struts2和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。在本项目中,SSH框架通过注解方式进行配置,使得开发更加简洁高效。Struts2作为控制层,主要负责处理HTTP请求,并将...
总结来说,SSH框架的注解配置大大简化了开发过程,通过注解可以快速定义Action的行为、自动装配bean以及实现ORM映射。这种方式使得代码更加简洁,提高了开发效率,同时也降低了出错的可能性。理解和熟练运用SSH框架...
这个全注解方式的整合Demo应该包含了上述所有配置和示例代码,便于开发者理解和学习如何在实际项目中使用SSH2框架进行注解方式的开发。通过这样的实践,开发者可以更加高效地编写代码,减少繁琐的XML配置,提高开发...
2. **连接管理**:建立SSH2连接通常涉及创建一个SSH2客户端实例,设置必要的参数(如主机名、端口、用户名),然后发起连接请求。注解可用于简化这些步骤,如自动加载配置信息。 3. **通道与会话**:SSH2允许通过...