今天在整理代码的时候,我的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+hibernate+spring整合泛型DAO"是一种常见的Java Web开发模式,它利用三大框架的优势,结合泛型设计,提高了代码复用,降低了维护成本,使得开发者能更专注于业务逻辑,而不是基础架构。
这个项目的源码提供了使用Spring 2.5、Struts 2和Hibernate 3.2构建应用程序的实例,这对于学习和理解SSH框架的整合及实际应用有着重要的参考价值。 Spring是一个全面的后端应用程序框架,它提供了依赖注入(DI)和...
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
泛型dao 即:不写重复的dao 。这个技术 能让 dao层 和 service层 不写一行代码。外国都用这个泛型DAO了 中国还是一个类一个dao的写,我生气就写了这个文章了。 在本文中,我将为您展示如何避免再三地重复 DAO 代码
标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...
SSH2全注解整合是Java Web开发中一种高效且现代化的方法,它将Spring 2.5、Struts 2.1和Hibernate 3.3这三个流行框架的优势结合起来,以简化开发流程并提高代码的可维护性。在这个项目中,开发者通过使用注解,避免...
简单的ssh项目,泛型BaseAction配置,简单注解配置,applicationContext.xml配置,jar包地址 链接:https://pan.baidu.com/s/14NkywuhG6mESyhE1VMkhOQ 密码:en19
在IT行业中,SSH2(Struts2、Hibernate、Spring)是一种经典的Java Web开发框架组合,它们各自负责不同的职责,以实现高效且灵活的应用程序。在这个项目"SSH2_自动生成数据库框架整合-泛型引用(自写)"中,开发者尝试...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
**基于STRUTS+HIBERNATE+SPRING整合的Blog系统** 在Java Web开发中,STRUTS、HIBERNATE和SPRING是三个非常重要的框架,它们各自负责不同的职责,而将这三个框架整合在一起可以构建出高效、模块化的应用。本资源提供...
SSH2框架主要由Spring、Struts和Hibernate三个部分组成,它为Java Web开发提供了强大的支持。Spring提供依赖注入和AOP(面向切面编程),Struts处理MVC(模型-视图-控制器)架构中的视图和控制,Hibernate则负责对象...
SSH泛型代码实例是关于Java编程中的一种常见技术——Spring、Struts和Hibernate(SSH)框架结合使用泛型的应用示例。泛型是Java SE 5.0引入的一个重要特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动...
这种"SSH"组合(Struts2-Spring-Hibernate)曾是Java Web开发的主流选择,虽然现在有更多现代化框架(如Spring Boot、Spring MVC、Spring Data等),但理解SSH仍然是理解和学习现代Java Web开发历程的重要一环。...
【S2SH整合】指的是Struts2、Spring和Hibernate三个开源框架的集成应用。这是一个常见的Java Web开发技术栈,用于构建高效、灵活的企业级应用程序。Struts2提供了MVC架构,Spring提供了依赖注入和事务管理,...
此外,Spring 2.5 提供了对JSR 303校验的集成,改进了数据访问抽象,包括JDBC、Hibernate和JPA,以及Web MVC框架,与Struts 2可以很好地协同工作。 这三种框架的整合,SSH,提供了完整的MVC解决方案,使得开发者...
2. 实现DAO接口,使用Hibernate的Session和Query对象进行分页查询,并返回结果集。 3. 在Service层中,调用DAO的分页方法,处理业务逻辑,比如根据查询条件动态构建HQL。 4. Struts的Action接收请求,解析参数,然后...
SSH框架是Java开发中常用的三大框架集成,包括Struts2、Spring和Hibernate。这个压缩包文件的标题"SSH 泛型DAO分页"表明它提供了一个实现SSH框架整合的示例,特别关注了泛型DAO(Data Access Object)以及分页功能。...
### Struts+Spring+Hibernate框架技术在Web开发中的研究与应用 #### 1. 引言 当前,基于Struts+Spring+Hibernate架构已经成为J2EE轻量级架构开发的主流选择之一。这三个框架分别在MVC(Model-View-Controller)...