您的位置:首页 > 编程语言 > Java开发

struts2+spring2.5+hibernate3集成的简单实例

2010-05-24 22:28 441 查看
本文通过一个向数据库添加和删除的实例来演示3个框架的集成过程。

1.首先编写view层文件index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Welcome</title>
<script type="text/javascript"><!--
function btnSubmit(obj) {
if (obj != null) {
var url = "";
if (obj.name == "add") {
url = "login.do";
} else if (obj.name == "delete") {
url = "logout.do";
}
var frm = document.getElementById("userInfoForm");
if (frm != null) {
try {
frm.action = url;
frm.submit();
} catch(ex) {
}
}
}
}
// --></script>
</head>
<body>

This is my JSP page. <br>

<form id="userInfoForm" name="userInfoForm" method="post" onsubmit="return false;">

用户名:

<input name="username" type="text" />

密码:

<input name="password" type="password">

<input name="add" type="button" onclick="btnSubmit(this);" value="增加" />

<input name="res" type="reset" value="重置" />

<input name="delete" type="button" onclick="btnSubmit(this);" value="删除" />

</form>

</body>

</html>


2.在web.xml中配置index.jsp以及配置struts2以响应.do提交和spring的监听类:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>SSH</display-name>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>*.do</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


3.配置applicationContext.xml来实际定位到一个action类:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="LoginAction" class="com.app.web.action.LoginAction " singleton="false">
</bean>
<bean id="LogoutAction" class="com.app.web.action.LogoutAction " singleton="false">
</bean>
</beans>


4.编写action类来测试我们进行的配置是否正确:

package com.app.web.action;

public class LoginAction {

private String username = "";

private String password = "";

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String execute() {
System.out.println("loginaction");
return "success";
}
}


package com.app.web.action;

import com.app.web.bean.UserInfo;

public class LogoutAction {

private String username = "";

private String password = "";

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String execute() {
System.out.println("logout");
return "success";
}
}


此时struts2和spring已经完成集成了。

5.进入Hibernate配置阶段,编写要与数据库表映射的Bean类:

package com.app.web.bean;

import java.io.Serializable;

public class UserInfo implements Serializable{

/**
*
*/
private static final long serialVersionUID = 2394904699860474046L;

private Integer id;

private String username;

private String password;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}


6.编写Hibernate的映射xml文件,对Bean和数据库表进行映射(UserInfo.hbm.xml):
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.app.web.bean.UserInfo" table="userinfo">
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>
<property name="username" type="string"/>
<property name="password" type="string"/>
</class>
</hibernate-mapping>


7.编写DAO类来操作数据Bean:

package com.app.DAO;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.app.web.bean.UserInfo;

public class UserInfoDAO extends HibernateDaoSupport {
public void save(UserInfo um) {
Session ss = getSessionFactory().openSession();
Transaction tx = ss.beginTransaction();
ss.save(um);
tx.commit();
ss = null;
}

public void delete(UserInfo um) {
System.out.println("start");
Session ss = getSessionFactory().openSession();
Transaction tx = ss.beginTransaction();
String sql = "delete from UserInfo where username = '"
+ um.getUsername() + "'" + "and password='" + um.getPassword() + "'";
System.out.println(sql);
Query query = ss.createQuery(sql);
int result = query.executeUpdate();
tx.commit();
ss = null;
System.out.println("end" + result);
}
}


此时Hibernate部分进完成了。

8.编写业务逻辑类来操作DAO:

package com.app.service;

import com.app.DAO.UserInfoDAO;
import com.app.web.bean.UserInfo;

public class LoginService {

private UserInfoDAO userinfoDAO;

public UserInfoDAO getUserinfoDAO() {
return userinfoDAO;

}

public void setUserinfoDAO(UserInfoDAO userinfoDAO) {
this.userinfoDAO = userinfoDAO;

}

public void saveinfo(UserInfo userinfo) {
userinfoDAO.save(userinfo);
}
}


package com.app.service;

import com.app.DAO.UserInfoDAO;
import com.app.web.bean.UserInfo;

public class LogoutService {
private UserInfoDAO userinfoDAO;

public UserInfoDAO getUserinfoDAO() {
return userinfoDAO;
}

public void setUserinfoDAO(UserInfoDAO userinfoDAO) {
this.userinfoDAO = userinfoDAO;
}

public void deleteInfo(UserInfo userInfo) {
userinfoDAO.delete(userInfo);
}
}


9.在Spring的applicationContext.xml中注入Hibernate的DAO类,业务逻辑类以及启动Hibernate需要的SessionFactory,TransactionManager以及TransactionProxy Bean:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<!-- Config DataSource start -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="2" />
<property name="maxActive" value="20" />
</bean>
<!-- Config DataSource end -->

<!-- Set hibernate Configure instance and start sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>
classpath:com/app/web/bean
</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<list>
<ref local="loginService" />
<ref local="logoutService" />
</list>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userinfoDAO" class="com.app.DAO.UserInfoDAO">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="loginService" class="com.app.service.LoginService">
<property name="userinfoDAO">
<ref bean="userinfoDAO" />
</property>
</bean>
<bean id="logoutService" class="com.app.service.LogoutService">
<property name="userinfoDAO">
<ref bean="userinfoDAO" />
</property>
</bean>
<bean id="LoginAction" class="com.app.web.action.LoginAction " singleton="false">
<property name="loginService">
<ref bean="loginService" />
</property>
</bean>
<bean id="LogoutAction" class="com.app.web.action.LogoutAction " singleton="false">
<property name="logoutService">
<ref bean="logoutService" />
</property>
</bean>
</beans>


10:编写数据源属性文件(jdbc.properties):

# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "applicationContext-resources.xml".
# Targeted at system administrators, to avoid touching the context XML files.

#
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:15000/test
jdbc.username=root
jdbc.password=passwd00


11:修正action类,在该类中通过设定一个业务逻辑类来完成添加或删除操作:

package com.app.web.action;

import com.app.service.LoginService;
import com.app.web.bean.UserInfo;

public class LoginAction {

private LoginService loginService;

private String username = "";

private String password = "";

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public LoginService getLoginService() {
return loginService;
}

public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String execute() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername(username);
userInfo.setPassword(password);
loginService.saveinfo(userInfo);
return "success";
}
}


package com.app.web.action;

import com.app.service.LogoutService;
import com.app.web.bean.UserInfo;

public class LogoutAction {
private LogoutService logoutService;

private String username = "";

private String password = "";

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public LogoutService getLogoutService() {
return logoutService;
}

public void setLogoutService(LogoutService logoutService) {
this.logoutService = logoutService;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String execute() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername(username);
userInfo.setPassword(password);
logoutService.deleteInfo(userInfo);
return "success";
}
}


此时Spring和Hibernate就完成的集成。3个框架也完成了集成。启动tomcat进行测试吧。好的开始!

编写过程中遇到的几个问题:

(1)struts.xml配置package节点时,没有指定extends="struts-default",启动服务时报错,无法进行form提交去访问资源;

(2)要想响应.do,还必须在struts.xml中追加<constant name="struts.action.extension" value="do" />节点,默认是.action;

(3)在进行DAO类中删除记录的编写时,没有导入antlr-2.7.6.jar包,导致java.lang.reflect.InvocationTargetException;

(4)在进行DAO类中删除记录的编写时,使用的表名是数据库中的名字,而Hibernate是根据类名进行查询的,所以会not map 错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: