Struts2+Hibernate+Spring環境的搭建
最近這些天一直在學習ssh,有的人說沒有必要為了學習框架而學習框架?。∥矣X得自己就是為了學習框架而學習框架,不過也是形勢所逼呀!暫且不管別人是怎么說的了,學習這種東西只要學習了就是自己的,相信知識是不會白學習的,不要“書到用時方恨少”,哈哈...有點未雨綢繆的意思了。先學習用著再說,然后逐步提高吧還是??!
把具體的搭建過程記錄一下:(項目運行環境: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全部測試通過了。