`
hb_keepmoving
  • 浏览: 230526 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

学习SSH全注解实例过程(三)

阅读更多

原文链接: 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

分享到:
评论
1 楼 i_feng 2012-11-05  
lz求源码,还想看你的struts2-convention部分呢,没有找到 

相关推荐

    SSH全注解实例详解,hibernate,struts,spring

    SSH是Java Web开发中的一个经典框架组合,包括Struts、Hibernate和Spring三个核心组件。这个框架结合了MVC设计模式、对象关系映射以及依赖注入等技术,为开发者提供了高效且灵活的开发环境。 **Struts** 是一个开源...

    SSH注解小实例

    SSH注解实例通常会包含以下步骤: 1. **创建实体类**:在实体类上使用Hibernate注解,如`@Entity`,`@Table`,`@Id`等,定义数据库表和字段映射。 2. **配置Hibernate**:在Spring配置文件中,使用`SessionFactory...

    ssh2实例+ssh2注解实例

    总的来说,SSH2实例和SSH2注解实例是学习SSH2框架和Java Web开发的重要资源。通过对这两个实例的学习和实践,你可以熟练掌握SSH2的使用,提升自己的技能,为未来在复杂的企业环境中开发安全、高效的应用奠定坚实的...

    SSH注解方式整合小例子

    在这个“SSH注解方式整合小例子”中,我们将深入探讨如何使用注解来简化SSH框架的配置过程,使得开发更加便捷。 **Struts2** 是一个基于MVC设计模式的Action驱动的Web应用框架,它通过注解可以实现Action类的声明式...

    ssh注解完整实例源代码

    ssh注解完整实例源代码 可直接运行 初级使用

    ssh注解开发案例

    SSH注解开发是SSH框架中的一项重要技术,它允许开发者在不写XML配置的情况下进行开发,提高开发效率并减少配置错误。 标题“ssh注解开发案例”表明我们将探讨如何在SSH框架中使用注解进行开发。SSH框架通过注解可以...

    SSH2整合全注解实例

    SSH2整合全注解实例是基于Struts2、Spring和Hibernate这三个开源框架的集成应用,它们共同构建了一个强大的Web应用程序开发平台。SSH2是Java Web开发中的经典组合,提供了模型-视图-控制器(MVC)的设计模式,使得...

    SSH全注解登录

    SSH,全称Spring、Struts、Hibernate,是Java Web开发中的三大开源框架,它们分别负责应用的业务逻辑层(Spring)、视图层(Struts)和数据持久化层(Hibernate)。SSH框架以其强大的功能和灵活性,长期以来在企业级...

    ssh2注解实例详解

    在这个SSH2的全注解实例中,开发者会逐步学习如何在MyEclipse环境下创建项目,配置框架,编写Action、Service、DAO和实体类,并通过注解进行相应的配置。同时,SQL语句的使用和数据库的交互也是实例的重要组成部分,...

    SSH2框架实例(全注解)

    总的来说,SSH2框架全注解实例的学习,可以帮助初学者快速掌握Java Web开发的核心技术,理解MVC架构、依赖注入和ORM的工作原理,以及如何在实际项目中应用这些技术。同时,通过CRM_T4实例,可以实践从数据库设计到...

    ssh注解整合实例包含jar包

    总的来说,SSH注解整合实例是一个实用的学习资源,它可以帮助开发者快速理解如何在实际项目中应用这些注解,提升开发效率,减少配置文件的工作量。在实际开发过程中,灵活运用SSH框架的注解,可以使代码更具有可读性...

    全注解版SSH增删改查实例

    总结来说,全注解版SSH增删改查实例是Java Web开发中一个实用的学习资源,它展示了如何在不依赖XML配置的情况下,利用Spring、Struts2和Hibernate的注解实现高效的业务逻辑处理。这样的实例有助于开发者快速理解和...

    SSH纯注解开发

    在这个“SSH纯注解开发”主题中,我们将深入探讨如何利用注解来简化这三大框架的配置,提高开发效率。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它的主要目标是提供一个更加...

    SSH环境 注解方式 包含jar 简单实例 直接运行

    本教程将通过注解方式,提供一个简单的SSH应用实例,可以直接运行。 首先,让我们详细了解SSH框架的核心组件: 1. **Struts2**:这是一个基于MVC设计模式的Java Web框架,它简化了创建用户交互层的工作。Struts2...

    学习SSH2经典实例的jar包3

    在"学习SSH2经典实例的jar包3"中,你可能会找到关于这三个框架集成使用的示例代码和库文件。这些实例可能涵盖了用户登录验证、数据展示、表单验证、动态加载数据等常见应用场景,通过实际操作加深对SSH2的理解。此外...

    关于SSH框架注解的小例子

    - 这个项目的名称可能是智慧YCweb,可能是一个Web应用,使用SSH框架实现,包含各种Controller、Service、DAO层的注解实例。 - 可能包含了Model类,用Hibernate注解描述数据库模型。 - 控制器类中,使用Struts2和...

    SSH框架注解方式,struts自身创建Action

    SSH框架,全称为Spring、Struts2和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。在本项目中,SSH框架通过注解方式进行配置,使得开发更加简洁高效。Struts2作为控制层,主要负责处理HTTP请求,并将...

    SSH注解-配置方式

    总结来说,SSH框架的注解配置大大简化了开发过程,通过注解可以快速定义Action的行为、自动装配bean以及实现ORM映射。这种方式使得代码更加简洁,提高了开发效率,同时也降低了出错的可能性。理解和熟练运用SSH框架...

    ssh2全注解方式整合demo

    这个全注解方式的整合Demo应该包含了上述所有配置和示例代码,便于开发者理解和学习如何在实际项目中使用SSH2框架进行注解方式的开发。通过这样的实践,开发者可以更加高效地编写代码,减少繁琐的XML配置,提高开发...

    ssh2 注解 事物

    2. **连接管理**:建立SSH2连接通常涉及创建一个SSH2客户端实例,设置必要的参数(如主机名、端口、用户名),然后发起连接请求。注解可用于简化这些步骤,如自动加载配置信息。 3. **通道与会话**:SSH2允许通过...

Global site tag (gtag.js) - Google Analytics