Struts 2,Spring 2,Hibernate 整合 html
整合完畢的項目下載地址http://download.csdn.net/detail/woaiwoaini121/4599429 java
下載以後導入到myeclipse9.0中可直接使用mysql
開發工具Eclipse
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
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <package name="s2sh" extends="struts-default">
- </package>
- </struts>
接下來咱們配置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">
- <!-- 配置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>
-
- <!-- 配置spring的監聽器 -->
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
-
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
-
- </web-app>
到目前爲止咱們的整合工做已經完成。咱們能夠將該工程打包,以備下次直接使用。
這裏由一個問題就是若是採用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
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
- <hibernate-mapping>
- <class name="test.s2sh.bean.Person" table="person">
- <id name="id" type="java.lang.Integer" column="id">
- <generator class="increment"></generator>
- </id>
- <property name="name" type="string" column="name"
- length="20"></property>
- <property name="age" type="java.lang.Integer" column="age"></property>
- </class>
- </hibernate-mapping>
(3)在spring配置文件applicationContext.xml配置hibernate的鏈接數據庫信息及sessionFactory建立方式
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
- <!-- apache.dbcp鏈接池的配置 -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
- <property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
- <property name="username" value="root"></property>
- <property name="password" value=""></property>
- <!-- 最大活動鏈接數 -->
- <property name="maxActive" value="100"></property>
- <!-- 最大可空閒鏈接數 -->
- <property name="maxIdle" value="30"></property>
- <!-- 最大可等待鏈接數 -->
- <property name="maxWait" value="500"></property>
- <!-- 默認的提交方式(若是不須要事務能夠設置成true,在實際應用中通常設置爲false,默認爲false) -->
- <property name="defaultAutoCommit" value="true"></property>
- </bean>
- <!-- 這裏直接使用spring對hibernate3支持的sessionFactory -->
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource"></property>
- <!-- hibernate方言等相關配置 -->
- <property name="hibernateProperties">
- <props>
- <prop key="connection.useUnicode">true</prop>
- <prop key="connection.characterEncoding">utf-8</prop>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
- <prop key="hibernate.show_sql">true</prop>
- </props>
- </property>
- <!-- hbm.xml的映射文件 -->
- <property name="mappingResources">
- <list>
- <value>test/s2sh/bean/Person.hbm.xml</value>
- </list>
- </property>
- </bean>
-
- </beans>
若是出現亂碼問題,能夠考慮以下解決方案
- <property name="hibernateProperties">
- <props>
- <prop key="connection.useUnicode">true</prop>
- <prop key="connection.characterEncoding">utf-8</prop>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
- <prop key="hibernate.show_sql">true</prop>
- </props>
- </property>
或者將url後面加入編碼串,以下
- <property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
注意 : 這裏個人數據庫編碼是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<Person> 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.HibernateDaoSupport;
-
- import test.s2sh.bean.Person;
- import test.s2sh.dao.PersonDAO;
-
- public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {
-
- public List<Person> findAllPersons() {
- String hql = "from Person p order by p.id desc";
- return (List<Person>)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<Person> 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<Person> 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
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
-
- <title>Save Person</title>
-
- </head>
-
- <body>
- <s:form action="savePerson">
- <s:textfield name="p.name" label="name"></s:textfield>
- <s:textfield name="p.age" label="age"></s:textfield>
- <s:submit></s:submit>
- </s:form>
- </body>
- </html>
操做成功頁面
save-success.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Save OK</title>
- </head>
-
- <body>
- 保存成功 <br>
- </body>
- </html>
接下來咱們須要配置struts.xml,建立action
- <action name="savePerson" class="savePersonAction">
- <result name="success" type="redirect">/save-success.jsp</result>
- <result name="input">/save.jsp</result>
- </action>
因爲如今的action的建立已經由spring所接管,因此這裏class裏面使用的是別名,該別名與applicationContext.xml中的id對應.
接下來咱們須要配置applicationContext的ioc。
- <bean id="personDAO" class="test.s2sh.dao.impl.PersonDAOImpl" scope="singleton">
- <!-- 因爲該類是繼承於HibernateDaoSupport,因此須要將sessionFactory注入 -->
- <property name="sessionFactory" >
- <ref bean="sessionFactory"/>
- </property>
- </bean>
- <bean id="personService" class="test.s2sh.service.impl.PersonServiceImpl">
- <property name="personDAO" ref="personDAO"></property>
- </bean>
- <bean id="savePersonAction" class="test.s2sh.action.person.SavePersonAction" scope="prototype">
- <property name="service" ref="personService"></property>
- </bean>
這裏說明一下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,始終帶着這個錯誤,因此就提交不過去了。web
S2SH整個項目的下載地址:http://download.csdn.net/detail/woaiwoaini121/4599429spring
下載以後能夠直接使用。sql