S2SH整合

S2SH整合
2011年04月21日
   Struts 2,Spring 2,Hibernate 整合
  开发工具Eclipse 6.5/6.6 GA
  1.首先创建一个web工程,我们暂且启明为s2sh
  这里我们选择的是Java EE 5.0
  
  finish
  2.向工程加入hibernate支持,这里我们使用的是hibernate 3.2
  
  默认就可以,不要忘记将jar包加入到/WebRoot/WEB-INF/lib
  
  接着next
  
  实际上这里的hibernate.cfg.xml不起作用,因为该配置文件的内容由后面的spring配置文件进行管理,我们可以在创建之后将其删除
  默认next
  
  我们根本不用hibernate.cfg.xml,所以这里根本不需要进行数据库配置,当然默认也无所谓。
  继续next
  
  sessionFactory我们在之后也会直接使用spring为我们提供的,所以这里不需要创建。
  finish
  3.向工程加入spring支持,这里我们使用的是spring2
  
  这里我们选择的是spring2,
  
  不要忘记选中这5个库包:
  Spring 2.0 AOP Libraries
  Spring 2.0 Core Libraries
  Spring 2.0 Persistence Core Libraries
  Spring 2.0 Persistence JDBC Libraries
  Spring 2.0 Web Libraries
  也不要忘记将jar包加入到/WebRoot/WEB-INF/lib。
  next
  
  这里我们不需要Enable AOP 所以不需要选中
  不要忘记将配置文件applicationContext.xml指定在/WEB-INF目录下,不然服务器启动时无法加载
  next
  
  这里的sessionFactory我们也不需要,之后会手动配置。
  finish
  4.加入struts2支持,由于MyEclipse并没有加入Struts2的支持,所以我们需要手动导入相关jar包。
  这里我们使用的是struts 2.0.11版本
  需要的相关jar包如下:
  freemarker-2.3.8.jar
  ognl-2.6.11.jar
  struts2-core-2.0.11.jar
  xwork-2.0.4.jar
  struts2-spring-plugin-2.0.11.jar
  4.进行相关文件的配置
  首先我们需要在src下加入struts的配置文件struts.xml
  
  接下来我们配置web.xml
   struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* org.springframework.web.context.ContextLoaderListe ner index.jsp
  到目前为止我们的整合工作已经完成。我们可以将该工程打包,以备下次直接使用。
  这里由一个问题就是如果采用myeclipse加载hibernate和spring的lib包形式发布项目的时候会出现异常,我们可以手动去掉一个asm-2.2.3jar即可。
  5.下面我们做一个简单的应用来验证。
  (1)首先我们使用的是mysql,不要忘记将mysql-jdbc的jar包导入到我们的工程中
  我们创建s2sh数据库,并创建表person
  -- Table "person" DDL CREATE TABLE `person` ( `id` int(11) NOT NULL, `name` varchar(20) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  (2)首先我们创建test.s2sh.bean包,在下面创建我们person表对应的Entity Bean及其映射文件
  Person.java
  package test.s2sh.bean; public class Person { private Integer id; private String name; private int age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
  Person.hbm.xml
  
  (3)在spring配置文件applicationContext.xml配置hibernate的连接数据库信息及sessionFactory创建方式
   true utf-8 org.hibernate.dialect.MySQL Dialect true test/s2sh/bean/Person.hbm.xml
  如果出现乱码问题,可以考虑如下解决方案
   true utf-8 org.hibernate.dialect.MySQL Dialect true
  或者将url后面加入编码串,如下
  
  注意: 这里我的数据库编码是utf-8
  具体那种方案好用大家可以尝试一下,我基本上直接将两种方式都加上了。
  (4)下面我们开始写DAO层,首先创建test.s2sh.dao包放置Dao类的接口,创建test.s2sh.dao.impl包放置Dao类的实现。
  PersonDAO.java
  package test.s2sh.dao; import java.util.List; import test.s2sh.bean.Person; public interface PersonDAO { void savePerson(Person p); void removePerson(Person p); Person findPersonById(Integer id); List findAllPersons(); void updatePerson(Person p); }
  由于使用了spring,所以DAO的实现类我们可以继承HibernateDaoSupport进行实现
  PersonDAOImpl.java
  package test.s2sh.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.support.Hiberna teDaoSupport; import test.s2sh.bean.Person; import test.s2sh.dao.PersonDAO; public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO { public List findAllPersons() { String hql = "from Person p order by p.id desc"; return (List)this.getHibernateTemplate().find(hql); } public Person findPersonById(Integer id) { Person p = (Person) this.getHibernateTemplate().get(Person.class, id); return p; } public void removePerson(Person p) { this.getHibernateTemplate().delete(p); } public void savePerson(Person p) { this.getHibernateTemplate().save(p); } public void updatePerson(Person p) { this.getHibernateTemplate().update(p); } }
  (5)下面我们开始进行service层的设计,这里的service层仅是简单调用DAO层的的方法。
  同样是创建接口包(test.s2sh.service),实现包和接口类(test.s2sh.service.impl),实现类
  PersonService.java
  package test.s2sh.service; import java.util.List; import test.s2sh.bean.Person; public interface PersonService { List findAll(); void save(Person p); void delete(Person p); Person findById(Integer id); void update(Person p); }
  这里我们需要使用spring的ioc将DAO诸如到service中,所以不要忘记在service实现类中加入DAO作为属性。
  PersonServiceImpl.java
  package test.s2sh.service.impl; import java.util.List; import test.s2sh.bean.Person; import test.s2sh.dao.PersonDAO; import test.s2sh.service.PersonService; public class PersonServiceImpl implements PersonService { private PersonDAO personDAO; public void delete(Person p) { this.personDAO.removePerson(p); } public List findAll() { return this.personDAO.findAllPersons(); } public Person findById(Integer id) { return this.personDAO.findPersonById(id); } public void save(Person p) { this.personDAO.savePerson(p); } public void update(Person p) { this.personDAO.updatePerson(p); } public PersonDAO getPersonDAO() { return personDAO; } public void setPersonDAO(PersonDAO personDAO) { this.personDAO = personDAO; } }
  (6)接下来我们开始对action层进行设置,实际项目中的action可能会有很多,所以我们这里需要对action进行分包,因为我们这里针对Person进行操作,所以我们创建test.s2sh.action.person.
  这里先做保存操作
  SavePersonAction.java
  package test.s2sh.action.person; import test.s2sh.bean.Person; import test.s2sh.service.PersonService; import com.opensymphony.xwork2.ActionSupport; public class SavePersonAction extends ActionSupport { private Person p; private PersonService service; public Person getP() { return p; } public void setP(Person p) { this.p = p; } public PersonService getService() { return service; } public void setService(PersonService service) { this.service = service; } public String execute() throws Exception { this.service.save(p); return this.SUCCESS; } public void validate() { if(p.getName()==null||"".equals(p.getName())){ this.addFieldError("p.name", "name is not null"); } } }
  下面创建一个保存人员的提交页面
  save.jsp
   Save Person
  操作成功页面
  save-success.jsp
   Save OK 保存成功

  接下来我们需要配置struts.xml,创建action
   /save-success.jsp /save.jsp
  由于现在的action的创建已经由spring所接管,所以这里class里面使用的是别名,该别名与applicationContext.xml中的id对应.
  接下来我们需要配置applicationContext的ioc。
  
  这里说明一下spring中的单例与设计模式中的单例不同,设计模式的单例是在jvm中只产生一个实例,而spring中的单例
  是针对每个ioc容器来言,如果存在两个ioc容器,那么每个ioc容器都会生成唯一的类实例
  将sessionFactory注入Dao中,这里的Dao来说是无状态的,可以设置为单例singleton。这里的action是使用spring创建的。
  struts2与struts1的action有所不同,因为struts2中的action中可能存在属性,这里是Person,所以struts2的action可能是有状态的。
  如果是有状态的我们就需要将scope设置成原型模式,即每次请求都新建一个action。
  不然可能会出现如果表单提交的第一次出错,之后就再也提交不过去了,值就是应为使用默认的singleton,
  当第一次的时候就将FieldError中加入了错误,每次都是这个action,始终带着这个错误,所以就提交不过去了。
  到目前为止这个整合已经完成了。
  工程下载
  
  
  
  
  
  
  
  
  
  
  
  
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值