Struts2+Hibernate+Spring环境的搭建
最近这些天一直在学习ssh,有的人说没有必要为了学习框架而学习框架!!我觉得自己就是为了学习框架而学习框架,不过也是形势所逼呀!暂且不管别人是怎么说的了,学习这种东西只要学习了就是自己的,相信知识是不会白学习的,不要“书到用时方恨少”,哈哈...有点未雨绸缪的意思了。先学习用着再说,然后逐步提高吧还是!!
把具体的搭建过程记录一下:(项目运行环境:Myeclipse+Mysql+JDK1.6)
步骤一:在Myeclipse中创建三个user liberary分别是struts2,hibernate,spring运行所必需的jar包,创建项目后引入刚才创建的三个liberary。
步骤二:修改web.xml的配置,具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置加载spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- lazy initial session自动关闭,但是页面请求未完成!-->
<!-- 第二种解决方案openSessionInViewInterceptor -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts2 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
步骤三:修改spring的配置文件,具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:annotation-config />
<!-- 根据annotation注入 -->
<context:component-scan base-package="com.wk" />
<!-- 创建dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring" />
<property name="username" value="root" />
<property name="password" value="wangkang" />
</bean>
<!-- 整合hibernate -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>com.wk.model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- spring_xml事务管理-->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<aop:config>
<aop:pointcut id="serviceBusiness" expression="execution(public * com.web..*.add(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceBusiness"
order="2" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="add*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- HibernateTemplate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>
spring注入的时候用的是Annotation
的方式,hibernate映射的时候也是用的Annotation的方式
。
贴出其他的代码,主要是配置文件写的时候比较费劲,其他的东西还是比较好搞定的:
1.model---Person
package com.wk.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.springframework.stereotype.Component;
@Entity
@Component("person")
public class Person {
private int id;
private String name;
private String address;
private String profession;
public Person() {
super();
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
}
2.dao---PersonDAO
package com.wk.dao;
import com.wk.model.Person;
public interface PersonDAO {
public int save(Person person);
public int delete(int id);
public int update(Person person);
public Person getPerson(int id);
}
3.impl---PersonDAOImpl
package com.wk.dao.impl;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.stereotype.Component;
import com.wk.dao.PersonDAO;
import com.wk.model.Person;
import com.wk.util.HibernateUtil;
@Component("personDAO")
public class PersonDAOImpl implements PersonDAO {
public int delete(int id) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
Person person = new Person();
try {
session.beginTransaction();
person.setId(id);
session.delete(person);
session.beginTransaction().commit();
return 1;
} catch (HibernateException e) {
e.printStackTrace();
}
return 0;
}
public Person getPerson(int id) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
Person person = new Person();
try {
session.beginTransaction();
person = (Person) session.get(Person.class, id);
session.beginTransaction().commit();
return person;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
public int save(Person person) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
try {
session.beginTransaction();
session.save(person);
session.beginTransaction().commit();
return 1;
} catch (HibernateException e) {
e.printStackTrace();
}
return 0;
}
public int update(Person personVo) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
Person person = new Person();
try {
session.beginTransaction();
person = (Person) session.load(Person.class, personVo.getId());
person.setName(personVo.getName());
person.setAddress(personVo.getAddress());
person.setProfession(personVo.getProfession());
session.update(person);
session.flush();//提高效率
session.beginTransaction().commit();
return 1;
} catch (HibernateException e) {
e.printStackTrace();
}
return 0;
}
}
4.strutsAction---PersonAction
package com.wk.action;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionSupport;
import com.wk.dao.PersonDAO;
import com.wk.dao.impl.PersonDAOImpl;
import com.wk.model.Person;
@Component("personAction")
public class PersonAction extends ActionSupport {
private static final long serialVersionUID = -3699819837781302739L;
PersonDAO personDAO = new PersonDAOImpl();
Person person = new Person();
int id = 0;
public String addPerson() {
int flag = personDAO.save(person);
if (flag == 1) {
return "success";
} else {
return "fail";
}
}
public String delPerson() {
int flag = personDAO.delete(id);
if (flag == 1) {
return "success";
} else {
return "fail";
}
}
public String updatePerson() {
int flag = personDAO.update(person);
if (flag == 1) {
return "success";
} else {
return "fail";
}
}
public String searchPerson() {
person = personDAO.getPerson(id);
if (person != null) {
return "success";
} else {
return "fail";
}
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public PersonDAO getPersonDAO() {
return personDAO;
}
@Resource(name = "personDAO")
public void setPersonDAO(PersonDAO personDAO) {
this.personDAO = personDAO;
}
}
差不多就是这样了,这是封装了后代的代码没有前台的展示,不过Junit全部测试通过了。