SSH整合实例详解
項目構建
新建web項目ssh2,建好后添加struts功能
添加spring功能:(注意選擇的spring版本,并且取消掉MyEclipse自帶的jar包,我們之后手動加入相應的jar包)
完成之后添加hibernate功能:
這里的數據庫驅動連接加不加都是可以的,因為后面我們要有一個dbconfig.properties文件手動配置數據庫驅動。
完成之后,我們手動加入struts2+spring+hibernate需要的jar包:
spring整合hibernate和struts,只要在配好了applicationContext.xml,在struts的action中直接調用就可以了。hibernate訪問數據庫的操作都在spring中實現了,spring的調用又在stuts的action中實現了。所以我們刪掉了無用的hibernate配置文件hibernate.cfg.xml。
之后就可以在相應的層里實現需要的功能了。以下實現一個簡單的注冊用戶功能:
完成之后我們的項目文件就是下面這樣的:
實現代碼
User.java
package com.lmb.domain;import java.io.Serializable; import java.util.Date;public class User implements Serializable{private static final long serialVersionUID = 1L;private Long id;private String loginname;private String password;private Integer age;private Date birthday;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getLoginname() {return loginname;}public void setLoginname(String loginname) {this.loginname = loginname;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((age == null) ? 0 : age.hashCode());result = prime * result+ ((birthday == null) ? 0 : birthday.hashCode());result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result+ ((loginname == null) ? 0 : loginname.hashCode());result = prime * result+ ((password == null) ? 0 : password.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (age == null) {if (other.age != null)return false;} else if (!age.equals(other.age))return false;if (birthday == null) {if (other.birthday != null)return false;} else if (!birthday.equals(other.birthday))return false;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;if (loginname == null) {if (other.loginname != null)return false;} else if (!loginname.equals(other.loginname))return false;if (password == null) {if (other.password != null)return false;} else if (!password.equals(other.password))return false;return true;}}User實體類配置文件:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <!-- xml文件配置Hibernate實體映射 --> <hibernate-mapping package="com.lmb.hibernate.domain"><!--實體類所在的包 --> <!-- 實體類 --> <class name="User" table="user"><!-- name=""用來指定實體類, table=""用來指定數據庫表格 --> <id name="id" column="id" type="java.lang.Long"><!-- id主鍵 --> <generator class="native"/><!--數據庫自動增長 --> </id> <property name="loginname" type="java.lang.String"></property><!-- 配置實體類變量--> <property name="password" type="java.lang.String"></property><!-- 配置實體類變量--> <property name="age" type="java.lang.Integer"></property><!-- 配置實體類變量--> <property name="birthday" type="java.util.Date"></property><!-- 配置實體類變量--></class> </hibernate-mapping>UserManagerImpl.java
package com.lmb.manager;import com.lmb.dao.UserDao; import com.lmb.domain.User;public class UserManagerImpl implements UserManager{private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void saveUser(User user) {userDao.insertObject(user);}}UserAction.java
package com.lmb.web.action;import com.lmb.domain.User; import com.lmb.manager.UserManager; import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{private User user;private UserManager userManager;public void setUserManager(UserManager userManager) {this.userManager = userManager;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String execute(){userManager.saveUser(user);return SUCCESS;}}application-user.xml把有關User的操作的配置從applicationContext.xml分離出來,單獨配置;
application-user.xml
<?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:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="userDao" class="com.lmb.dao.UserDaoImpl" parent="baseDao"></bean><bean id="userManager" class="com.lmb.manager.UserManagerImpl"><property name="userDao" ref="userDao"></property></bean><bean id="userAction" class="com.lmb.web.action.UserAction" scope="prototype"><property name="userManager" ref="userManager"></property></bean></beans>本例中的applicationContext.xml實現了以下作用:
1、配置數據源;
2、配置SessionFactory;
3、配置事務管理;
4、導入分離出的配置文件application-user.xml;
applicationContext.xml
<?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:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!-- 讀取屬性文件 --><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:dbconfig.properties"></property></bean><!-- 配置數據源 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="url" value="${URL}"></property><property name="driverClassName" value="${DRIVER_CLASS}"></property><property name="username" value="${USER_NAME}"></property><property name="password" value="${PASSWORD}"></property> </bean><!-- 配置SessionFactoryBean --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><!-- 注入數據源 --><property name="dataSource" ref="dataSource"></property><!-- 加載映射配置文件 --><property name="mappingResources"><list><value>com/lmb/domain/User.hbm.xml</value></list></property><!-- -如果使用的是@注解的形式,映射的實體類應該以下面這種形式加載-> <property name="annotatedClasses"> <list><value>實體類全路徑</value> </list></property><!-- 關于hibernate屬性的配置 --><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop></props></property></bean><bean id="baseDao" class="com.lmb.dao.BaseDaoImpl" abstract="true"><property name="sessionFactory" ref="sessionFactory"></property></bean><import resource="application-user.xml" /></beans>數據庫驅動屬性文件:
dbconfig.properties
struts.xml中配置控制層的action,因為SSH整合之后struts是由spring來管理的,所以這里的class屬性只需要給出spring配置文件中相應action具體實現的id即可;
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts><package name="ssh" extends="struts-default" ><action name="userAction" class="userAction"><result>/ok.jsp</result></action></package></struts>在web.xml中配置struts的分發器和spring的上下文對象applicationcontext的構建監聽器,所有的請求都被映射到struts2上,項目啟動時構建applicationcontext對象,并保存到servletContext對象中,在運行時就可以使用spring的上下文對象,這個對象永遠不會消失。
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"><display-name></display-name> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 該監聽器的作用:項目啟動時構建applicationcontext對象,并保存到servletContext對象中,在運行時就可以使用spring的上下文對象,這個對象永遠不會消失 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 通過該節點告訴servletContext對象到哪里去讀取applicationcontext的配置文件,如果配置文件讀取失敗applicationcontext對象就會構建失敗 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>index.jsp
<form action="userAction.action">用戶名:<input type="text" name="user.loginname" /><br/>密碼:<input type="password" name="user.password"/><br/>年齡:<input type="text" name="user.age"/><br/>出生日期:<input type="text" name="user.birth"/><br/><input type="submit" value="submit"/><br/></form>有關幾個配置文件的總結:
1、web.xml
web.xml中要配置struts的分發器,所有的請求都被映射到struts2上。還要配置一個spring的監聽器用于構建spring的上下文對象applicationcontext,以便項目啟動時構建就applicationcontext對象,并保存到servletContext對象中,在運行時就可以使用spring的上下文對象;
2、struts.xml
struts.xml中只需要配置控制層action的相關信息,要注意因為SSH整合之后spring整合hibernate和struts,所以struts的配置文件struts.xml要依賴于spring的配置文件applicationContext.xml.
以上配置也充分體現了struts的功能: struts 負責 web 層 .ActionFormBean 接收網頁中表單提交的數據,然后通過 Action 進行處理,再 Forward 到對應的網頁。在 struts.xml 中定義 <action>, 相應的Action就 會加載。
3、applicationContext.xml
spring配置文件applicationContext.xml的作用:
1)、配置數據源;
2)、配置SessionFactory;
3)、配置事務管理;
4)、配置數據持久層;xxxDao
5)、配置業務邏輯層; xxxService(xxxManager)
6)、配置控制層; xxxAction
7)、配置POJO;xxx
在實際的業務應用中,實體會有很多,如果都配置在applicationContext.xml中,管理起來非常麻煩,所以,我們可以把有關實體的配置抽取出來,單獨寫到一個文件中去application-xxx.xml,該配置文件實現的功能就是:
4)、配置數據持久層;xxxDao
5)、配置業務邏輯層; xxxService(xxxManager)
6)、配置控制層; xxxAction
7)、配置POJO;xxx
而applicationContext.xml只需要將抽取出的配置文件引入并實現以下功能:
1)、配置數據源;
2)、配置SessionFactory;
3)、配置事務管理;
以上配置也充分體現了spring的功能:
spring 負責業務層管理,即 Service (或 Manager).
1) . service (或 Manager)為 action 提供統一的調用接口,封裝持久層的 DAO.
2 ).可以寫一些自己的業務方法。
3 ).統一的 javabean 管理方法
4 ).聲明式事務管理:集成 Hiberante
4、xxx.hbm.xml
配置Hibernate實體映射 ,該實體映射也可以用@注解的形式配置。
Hibernate的配置文件hibernate.cfg.xml的作用是配置數據庫驅動,并聲明用XML文件或者@注解配置的實體類,但SSH整合之后spring整合hibernate和struts,有關數據庫驅動和聲明用XML文件或者@注解配置的實體類的配置被放到applicationContext.xml下的SessionFactoryBean配置中,所以該配置文件不需要再用到。
總結
- 上一篇: 【Java线程】Thread Runn
- 下一篇: 【JFreeChart】JFreeCha