`
manjingtou
  • 浏览: 119131 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

struts2 泛型 Hibernate

阅读更多

今天在整理代码的时候,我的Action 和 DAO基类都是使用的泛型:如Action<T> DAO<T>。

 

我用的是Struts2基类代码,如下

public abstract class BaseStrutsAction extends ActionSupport implements ModelDriven<BaseStrutsForm>
{
   public static final Logger log = Logger.getLogger(BaseStrutsAction.class);

}

 先说一下:

一,struts2的ModelDriven (下面来源网络)

 

可以根据Action属性的不同将它分为两类:Field-Driven(属性驱动) Action和Model-Driven(模型驱动) Action。
一、Field-Driven(属性驱动)Action,Action拥有自己的属性,这些属性一般是Java的基本类型。表单字段直接和Action的属性 对应。

二、实现了modelDriven接口可以在action中直接获得例如User对象,它会将Object getModel()取得的User放到ValueStack中。可以理解为将这个User的属性追加到Action中。它主要是作用是实现类似 Struts的FormBean功能。

在struts2中,提供了一种直接使用领域对象的方式,就是让action实现com.opensymphony.xwork2.ModelDriven接口,ModelDriven让你可以直接操作应用程序中的领域对象,允许你在web层和业务层使用相同的对象。

ModelDriven接口只有一个方法

        public Object getModel() {
return null;
}

该方法返回一个用于接收用户输入数据的对象模型,在这个模型对象中的属性可以直接通过(属性名)userName来访问,而不需要使用(对象名.属 性名)user.userName这种格式来访问了,在action也不需要对对象提供getter和setter方法了,但是必须要在action中进 行new操作

如下

// ModelDriven要使用泛型哦

public class LoginAction extends ActionSupport implements ModelDriven<User>{

private static final long serialVersionUID = -6434128483294080524L;

//这里必须要new
private User user=new User();
public String login() throws Exception {
// TODO Auto-generated method stub  
return SUCCESS;
}

//这里是实现接口方法

@Override
public User getModel() {
// TODO Auto-generated method stub

//别忘记了,要把返回值写上哦
return user;
}
}

这样一个ModelDriven就实现完毕了

和属性驱动的Action有很大的区别,下面一一列举:

(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的Java Bean了。

(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。

(3)在Action提供一个泛型的私有对象,这里就是定义一个User的user对象,并提供相应的getter与setter。

好了,上面的三件事做完之后,Action就会去自动调用User的setter将表单中的name属性的值赋给User中的属性。而Action的后续处理的Jsp页面后者是Servlet就可以使用user对象了。

到底是用属性驱动和是模型驱动呢?

这个问题困扰了很多Struts2的初学者,我这里提供一些建议:

(1)请你统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用模型驱动。

(2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,那么就使用模型驱动吧,毕竟看起来代码要整洁得多。

(3)如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则,你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。

二,持久层基类 HibernateDao

 

代码如:

public class HibernateDao<T, PK extends Serializable>  {
	/**
	 * 用于Dao层子类的构造函数.
	 * 通过子类的泛型定义取得对象类型Class.
	 * eg.
	 * public class UserDao extends HibernateDao<User, Long>{
	 * }
	 */
	public HibernateDao() {
		super();
	}

 

上面的代码,基类没有使用HibernateDaoSupport,我们需要自己引入SessionFactory。

持久层基类,一般Spring的Hibernate ORM 框架带来了方便的HibernateDaoSupport类,你的DAO类可以继承它:

  public class DaoHibernate extends HibernateDaoSupport {

  .................

  }

  如果你选择这种设计,就需要动态注入SessionFactory而HibernateDaoSupport包含这个属性.这个类提供了一个方便的方法getHibernateTemplate(); 就能得到HibernateTemplate的一个实例.它也有getSession()和releaseSession,以便于你应为某些原因而不使用HibernateTempate的情况下执行Hibernate操作。

  HibernateDaoSupport提供了基于AOP事务的自动处理,程序员完全可以不用理会事务的开始与提交。在JDBC中一个Connection对象使用一个事务,那么在Hibernate中一个事务肯定要关联一个SessionFactory了,然而这个SessionFactory却没有在DAO中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作,它用一个setSessionFactory方法将SessionFactory进行注入,所以继承自HibernateDaoSupport类的DAO都会具有SessionFactory的属性,从而可以通过SessionFactory创建Session实例操作数据库。

 

如果使用像 public class HibernateDao<T, PK extends Serializable>  这样的泛型基类就会有问题,可以拿个T代表任意类型,Java的泛型拿不到T.class,就无法得到类对象, 如下面的clazz,

public T get(final PK id) {
  Assert.notNull(id, "id不能为空");
  return (T) getSession().load(clazz, id);
 }

最后在网上找到了解决方案,可以使用泛型public class HibernateDao<T, PK extends Serializable>基类了。

abstract public class BaseHibernateEntityDao<T> extends HibernateDaoSupport {
 private Class<T> entityClass;
 public BaseHibernateEntityDao() {
        entityClass =(Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
    }
 public T get(Serializable id) {
        T o = (T) getHibernateTemplate().get(entityClass, id);
}
}

重点这句: entityClass =(Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];

 

 

分享到:
评论

相关推荐

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    虚拟数据层 Struts2、Hibernate、Spring整合的泛型DAO Version 2010.9.27

    Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...

    Struts2+hibernate+spring整合泛型DAO

    减少重复代码的编写,增强DAO层代码的重用。

    虚拟数据层:Struts2、Hibernate、Spring整合的泛型DAO 代码

    泛型dao 即:不写重复的dao 。这个技术 能让 dao层 和 service层 不写一行代码。外国都用这个泛型DAO了 中国还是一个类一个dao的写,我生气就写了这个文章了。 在本文中,我将为您展示如何避免再三地重复 DAO 代码

    SSH2全注解整合(spring2.5+hibernate3.3+struts2.1+泛型DAO+proxool连接池)

    利用ssh(Spring2.5+Struts2.1+Hibernate3.3)全注解整合这3个流行的框架,实现了增、删、改、查的功能,目前功能还比较简单,以后功能再慢慢增加。欢迎大家下载并交流。

    学习struts2,hibernate3(jpa注释编程),spring2,ajax的经典实例

    这个整合与我公司的差不多 不过我公司的是使用了泛型的替换 希望大家喜欢,jar包因为很大 所以我要分开上传 敬请关注

    ssh:struts-2.5+spring4+hibernate5

    简单的ssh项目,泛型BaseAction配置,简单注解配置,applicationContext.xml配置,jar包地址 链接:https://pan.baidu.com/s/14NkywuhG6mESyhE1VMkhOQ 密码:en19

    泛型dao 泛型dao 泛型dao

    Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...

    S2S3H3整合以及泛型Dao与Service封装

    本程序整合了struts-2.2.3.1+spring-framework-3.1.0+hibernate-distribution-3.6.8+JSON+MySQL+Annotation,并且对Dao和Service进行了封装,内含.jar包,并且解决了一对多双向关联的could not initialize proxy - ...

    基于STRUTS+HIBERNATE+SPRIN整合的blog.rar

    本资源比较明了、简单的整合了三大框架、并详细介绍了JAVA中泛型的使用,请感兴趣的朋友下载!

    STRUTS2.1.6+SPRING版本:2.5.6+Hibernate3.4.0整合实例

    STRUTS:2.1.6 Hibernate:3.4.0 SPRING版本:2.5.6整合 应用了泛型来做抽象类,简化了开发,适合初学者下载下来学习,然后自己尝试着搭一遍框架,会对三大框架的配置以及功能会有更深入的认识。

    基于Java web SSH框架的电影后台管理系统(源码+数据库).zip

    - [x] Spring+struts2+Hibernate整合 - [x] 前端全部采用easyui搭建 - [ ] Maven管理jar包 - [x] baseDao定义泛型抽象出基本dao操作 ## 导入项目 ### 导入SQL文件 进入到db文件夹,将ssh.sql文件导入到数据库中 ...

    SSH 泛型DAO分页

    Struts2.1.6+Spring2.5.6+Hibernate3.3.2+mysql整合+分页模板 能用

    SSH2_自动生成数据库框架整合-泛型引用(自写)

    SSH2_自动生成数据库框架整合-泛型引用 数据库是用的是mysql 里面有一个错误 我就先不提示 看看大家能否发现是什么错误,数据库表是不需要建立的 当服务器开启的时候就开始创建表

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

    尚硅谷佟刚Spring4代码及PPT.rar

    JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。

    全套Java经典学习视频资料

    包含了一系列经典的Java学习视频资料,Java初级开发 Java集合框架 ...struts2 spring3 hibernate4 jbpm ssh+jbpm项目 sql开发 html5水果大战 IOS录音机项目 Android局域网对讲机 等一系列的视频资料

    Java学习笔记-个人整理的

    {4.6}泛型}{84}{section.4.6} {4.7}集合的迭代(Iterator)}{85}{section.4.7} {4.8}Collections集合工具类}{86}{section.4.8} {4.9}Comparable与Comparator}{86}{section.4.9} {4.9.1}Comparable}{86}{...

    SSH整合开发框架,可直接用于开发

    2、数据库访问层,此处已经采用了springside的封装方式,方法齐全,能充分满足数据库的大部分增删改查的需求 在做开发时,只需要简单的从genericmanager继承,进行泛型即可。分页也进行了简单的封装。具体方法请看...

Global site tag (gtag.js) - Google Analytics