这两天利用那个bookstone工程进行了Struts2.1、Spring3.05和Hibernate3.3整合。
首先利用Myeclipse自带的工具进行整合
首先是在建立的工程中添加Spring框架
因为要利用Spring作为中间桥梁。链接Struts与Hibernate所以需要添加jdbc包。然后下一步
在对话框中添加配置文件。因为在web.xml中配置Spring。所以将配置文件放到WEB-INF中。
添加Struts2.1。
注意要添加struts spring libraries
添加Hibernate
因为要把Hibernate添加到Spring中所以需要选择将配置文件放入Spring文件
选择Spring配置文件
选择连接数据的数据源
我是基于原来已经存在的项目进行修改。所以直接用Myeclipse中已经建立好的数据源
添加数据源可以在DataBase界面中添加数据源
选择不生成sessionFactory
自动过程结束。下面首先需要手工配置项目。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
首先是在web.xml添加监听器。让Spring自动打开
在struts.xml
添加
<constant name="struts.objectFactory" value = "org.apache.struts2.spring.StrutsSpringObjectFactory" />
让spring接管ObjectFactory
由于applicationContext.xml没有生成hibernate的对象关系映射所以需要添加配置文件。
<property name="mappingResources">
<list>
<value>bookstone/book.hbm.xml</value>
</list>
</property>
这个配置文件是配置book数据库与对象的映射。
现在环境已经搭建完成。需要的就是添加程序。
首先建立一个action
public class QueryAction extends ActionSupport {
private String book_id;
static private QBookDao qBookDao;
public String execute() throws Exception{
ActionContext ac = ActionContext.getContext();
List<Book> books=qBookDao.getBook(book_id);
Book book=(Book)books.get(0);
ac.put("books", books);
return "SUCCESS";
}
public String getBook_id() {
return book_id;
}
public void setBook_id(String book_id) {
this.book_id = book_id;
}
public QBookDao getqBookDao() {
return qBookDao;
}
public void setqBookDao(QBookDao qbd) {
qBookDao =qbd;
}
}
由于现在使用Spring是在开启服务器时候加载的bean所以需要设置为静态变变量设置
这样所有的时候都是一个对象。因为没有scope="prototype"的时候只是在开启服务器时候入时注射。而在每次调用时不注射。通过查询得知实现方式是单例。但是不调用set方法。因为是单例在最开始的时候保存的变量已经注射。所以以后都引用次变量不用在注射。在设置scope="prototype" 后每次为动态产生.每次都注射。
可以在applicationContext.xml中设置scope="prototype" 。(这样可以将bean自动设置为单例.即完成静态效果)。开始是这么认为但是实验结果为生成不同对象则所以事实不是这样。
Jsp文件
index.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>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:form action="bookquery" method="get">
<label>请输入书编号</label>
<input type="text" name="book_id"/>
<input type="submit" value="提交"/>
</s:form>
</body>
</html>
Show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="bookstone.pojo.Book" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'show.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<table>
<tr>
<td>书编号</td>
<td>书名</td>
<td>书数量</td>
</tr>
<%
List<Book> books=(List<Book>)request.getAttribute("books");
Iterator<Book> iterator=books.iterator();
for(;iterator.hasNext();){
Book booktmep=iterator.next();
%>
<tr>
<td><%=booktmep.getBook_id() %></td>
<td><%=booktmep.getBook_name() %></td>
<td><%=booktmep.getBook_count() %></td>
</tr>
<%} %>
</table>
</body>
</html>
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>
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<package name="bookstone" namespace="/" extends="struts-default" >
<action name="bookquery" class="QueryAction">
<result name="SUCCESS">/show.jsp</result>
</action>
</package>
</struts>
开始的时候设置的action name为query 但是query是struts关键字.所以开始会出现莫名错误.
No result defined for action bookstone.action.QueryAction and result SUCCESS
所以需要注意自己的action name是否占用了struts2的关键字.
接下来做pojo
public class Book {
private String book_id;
private String book_name;
private String book_count;
public String getBook_id() {
return book_id;
}
public void setBook_id(String book_id) {
this.book_id = book_id;
}
public String getBook_name() {
return book_name;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public String getBook_count() {
return book_count;
}
public void setBook_count(String book_count) {
this.book_count = book_count;
}
}
接下来是db中table与pojo之间的映射.
book.hbm.xml
<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-mapping>
<class name="bookstone.pojo.Book" table="BOOK">
<id name="book_id" column="book_ID">
<generator class="assigned"/>
</id>
<property name="book_name" column="book_NAME"/>
<property name="book_count" column="book_COUNT"/>
</class>
</hibernate-mapping>
下面是写Dao
既然使用Spring那么编写Dao就需要使用面向接口编程思想.对Dao进行设计.
本次目的是将三个框架结合一起.所以只需要做简单的设计.即一个接口,后类实现这个接口
public interface QBookDao {
public List getBook(String book_id);
}
public class QueryBookDao implements QBookDao {
private static SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sf) {
sessionFactory = sf;
}
public List getBook(String book_id) {
List<Book> books=null;
Session session = sessionFactory.openSession();
Criteria criteria=session.createCriteria(bookstone.pojo.Book.class);
if (!(book_id.trim().equals(""))) {
criteria.add(Restrictions.eq("book_id", book_id));
}
books= criteria.list();
return books;
}
}
配置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-3.0.xsd">
<!-- 添加的注射 -->
<bean id="qbd" class="bookstone.dao.QueryBookDao">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="QueryAction" class="bookstone.action.QueryAction" >
<property name="qBookDao">
<ref local="qbd"/>
</property>
</bean>
<!-- 数据源 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@127.0.0.1:1521:XE">
</property>
<property name="username" value="gaojiawei"></property>
<property name="password" value="86672150"></property>
</bean>
<!-- Hibernate的SessionFactory注射 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property>
<!-- Hibernate的对象关系映射. -->
<property name="mappingResources">
<list>
<value>bookstone/book.hbm.xml</value>
</list>
</property>
</bean></beans>
已经完成测试即可
不知道为什么三个框架合在一起,加载就变得很慢..
实验成功 成功将三个框架结合在一起.
最后一定要Spring+Hibernate+Struts加入要不出现莫名错误