论坛首页 Java版 Struts

Struts+spring+hibernate学习笔记!

浏览 36370 次
该帖已经被评为精华帖
作者 正文
时间:2004-09-30
(快刀浪子原创)下面是我学习Struts+spring+hibernate的笔记.

1.WEB.XML的配置:
首先在web.xml中加入:
[code:1]
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
[/code:1]

我的整个web.xml象这样:
[code:1]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>info_web</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-hibernate.xml</param-value>
</context-param>
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>iclass.util.SetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter>
<filter-name>FilterRedirector</filter-name>
<filter-class>org.apache.cactus.server.FilterTestRedirector</filter-class>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FilterRedirector</filter-name>
<url-pattern>/FilterRedirector</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServletRedirector</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<servlet>
<servlet-name>JspRedirector</servlet-name>
<jsp-file>/jspRedirector.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletRedirector</servlet-name>
<url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JspRedirector</servlet-name>
<url-pattern>/JspRedirector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>/tags/struts-nested</taglib-uri>
<taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
</taglib>
</web-app>
[/code:1]

2.spring配置
配置文件为applicationContext-hibernate.xml,在此配置文件中,配了POJO层,商业逻辑层,DAO层,和事务管理
[code:1]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<!-- ========================= Start of PERSISTENCE DEFINITIONS ========================= -->

<!-- Choose the dialect that matches your "dataSource" definition -->

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/info_web?useUnicode=true&characterEncoding=GBK</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>

<bean id="mySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>infoweb/pojo/Answer.hbm.xml</value>
<value>infoweb/pojo/Board.hbm.xml</value>
<value>infoweb/pojo/Image.hbm.xml</value>
<value>infoweb/pojo/Info.hbm.xml</value>
</list>
</property>

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
</props>
</property>

<property name="dataSource"><ref bean="myDataSource"/></property>
</bean>



<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="mySessionFactory"/></property>
</bean>


<!-- ***** Board SERVICE ***** -->
<bean id="boardService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="myTransactionManager"/></property>
<property name="target"><ref local="boardServiceSpring"/></property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly,-BoardException</prop>
<prop key="set*">PROPAGATION_REQUIRED,-BoardException</prop>
<prop key="modify*">PROPAGATION_REQUIRED,-BoardException</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-BoardException</prop>
</props>
</property>
</bean>

<!-- board primary business object implementation -->
<bean id="boardServiceSpring" class="infoweb.service.BoardServiceSpringImpl">
<property name="boardTreeDAO"><ref local="boardTreeDAO"/></property>
</bean>


<!-- DAO board: Hibernate implementation -->
<bean id="boardTreeDAO" class="infoweb.dao.BoardTreeDAOImpl">
<property name="sessionFactory"><ref local="mySessionFactory"/></property>
</bean>

<!-- DAO info: Hibernate implementation -->
<bean id="infoDAO" class="infoweb.dao.InfoDAOImpl">
<property name="sessionFactory"><ref local="mySessionFactory"/></property>
</bean>
</beans>

[/code:1]

3.做DAO代码,
[code:1]
package infoweb.dao;

import java.util.List;
import java.util.Iterator;

import infoweb.pojo.Board;


import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Query;
import net.sf.hibernate.Session;

import org.springframework.orm.hibernate.HibernateCallback;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;


/**
* <p>Title: 版块分类DAOImpl</p>
* <p>Description: 用树型结构实现</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author 段洪杰
* @version 1.0
*/


public class BoardTreeDAOImpl extends HibernateDaoSupport implements
IBoardTreeDAO {


/**
* 构造函数
*/
public BoardTreeDAOImpl() {
super();
}


/**
* 通过ID取得版块
* @param id String
* @return Board
*/

public Board getBoardById(String id) {
Board board = (Board) getHibernateTemplate().load(Board.class, id);
return board;
}


/**
* 取根叶
* @return Iterator
*/
public Iterator getRoots() throws HibernateException {
String queryString =
"select board from Board as board where board.parentId='root' order by board.id desc";
List roots = getHibernateTemplate().find(queryString);
return roots.iterator();
}


/**
* 存根叶
* @param board Board
*/
public void setRoot(Board board) {
board.setParentId("root");
getHibernateTemplate().save(board);
}


/**
* 取子叶
* @param parentid String
* @return List
*/
public Iterator getChildren(String parentid) {
/*
String queryString =
"select board as Board where board.parent_id='parentid' order by board.id desc";
List children = getHibernateTemplate().find(queryString);
return children;
*/
Board parent = (Board) getHibernateTemplate().load(Board.class, parentid);
return parent.getChildren().iterator();
}


/**
* 取子叶数
* @param parentid String
* @return int
*/

public int getChildrenCount(String parentid) {
/*
String queryString =
"select count(*) Board where board.parent_id='parentid' order by board.id desc";
List children = getHibernateTemplate().find(queryString);
int count = ((Integer) children.iterator().next()).intValue();
return count;
*/
Board parent = (Board) getHibernateTemplate().load(Board.class, parentid);
int count = parent.getChildren().size();
return count;
}


/**
* 存子叶
* @param parentLeaf Leaf
*/
public void setChild(Board board, String parentid) {
board.setParentId(parentid);
getHibernateTemplate().save(board);
}


/**
*
* 删除该叶和它的子叶
* @param board Board
*/
public void deleteBranch(Board board) {
getHibernateTemplate().delete(board);
}


/**
* 根据子叶得到父叶
* @param child Board
* @return Board
*/
public Board getParentByChild(Board child) {
String parentId = child.getParentId();
Board parent = (Board) getHibernateTemplate().load(Board.class, parentId);
return parent;
}


/**
* 通过子ID得到父叶
* @param id String
* @return Board
*/
public Board getParentByChildId(String id) {
Board child = (Board) getHibernateTemplate().load(Board.class, id);
Board parent = (Board) getHibernateTemplate().load(Board.class,child.getParentId());
return parent;
}
}

[/code:1]

4.做service层代码

[code:1]
package infoweb.service;

import java.util.List;
import java.util.Iterator;
import infoweb.dao.BoardTreeDAOImpl;
import infoweb.dao.IBoardTreeDAO;
import infoweb.pojo.Board;
import infoweb.exception.BoardException;
import net.sf.hibernate.HibernateException;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author 段洪杰
* @version 1.0
*/
public class BoardServiceSpringImpl implements IBoardService {

private IBoardTreeDAO boardTreeDAO;

public BoardServiceSpringImpl() {
super();
}

/**
* 取所有roots版块
* @return Iterator
*/
public Iterator getRoots() throws BoardException {
Iterator roots = null;
try {
roots = boardTreeDAO.getRoots();
} catch (Exception ex) {
throw new BoardException("取ROOT版块时出错! " + ex.toString());
}
return roots;
}

/**
* 增加Root新版块
* @param board Board
*/
public void setRoot(Board board) throws BoardException {
try {
boardTreeDAO.setRoot(board);
} catch (Exception ex) {
throw new BoardException("增加ROOT版块时出错! " + ex.toString());
}
}

/**
* 删除版块 (包含下级版块)
* @param board Board
*/
public void removeBoard(Board board) throws BoardException {
try {
boardTreeDAO.deleteBranch(board);
} catch (Exception ex) {
throw new BoardException("删除版块时出错! " + ex.toString());
}
}

/**
*
* @return IBoardTreeDAO
*/
public IBoardTreeDAO getBoardTreeDAO() {
return boardTreeDAO;
}

/**
*
* @param boardTreeDAO IBoardTreeDAO
*/
public void setBoardTreeDAO(IBoardTreeDAO boardTreeDAO) {
this.boardTreeDAO = boardTreeDAO;
}

}

[/code:1]

5.做ACTION的父类

[code:1]
package infoweb.web;


import javax.servlet.ServletContext;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionServlet;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import infoweb.service.IBoardService;


/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author 段洪杰
* @version 1.0
*/

public class BaseAction extends Action {

private IBoardService boardService;

public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac =
WebApplicationContextUtils.getRequiredWebApplicationContext(
servletContext);
this.boardService = (IBoardService) wac.getBean("boardService");
}

protected IBoardService getBoardService() {
return boardService;
}

}

[/code:1]

6.做action类
[code:1]
package infoweb.web;

import infoweb.pojo.Board;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.action.*;
import org.apache.log4j.Logger;
import javax.servlet.http.*;
import java.util.Iterator;
import java.util.Date;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author 段洪杰
* @version 1.0
*/


public class SetBoardAction extends BaseAction {

private static Logger log = Logger.getLogger(SetBoardAction.class);

public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws
Exception {

// SessionBean sessionBean = (SessionBean) httpServletRequest.getSession().getAttribute("sessionBean");
BoardForm boardForm = (BoardForm) actionForm;
//String backURL = httpServletRequest.getHeader("Referer");
/*
if (sessionBean==null||!sessionBean.getIsLogon()) {
httpServletRequest.setAttribute("message", "系统超时,或者没有登录 .返回重新登录!");
httpServletRequest.setAttribute("locationFile",
"location='index.jsp';");
return actionMapping.findForward("message");
}
*/
Board board = new Board();
boardForm.setCreateDate(new Date());
PropertyUtils.copyProperties(board, boardForm);
getBoardService().setRoot(board);

httpServletRequest.setAttribute("message", "版块信息录入完成!");
httpServletRequest.setAttribute("locationFile",
"<A HREF=\"javascript:history.back()\">返回</A>");
return (actionMapping.findForward("success"));
}

}

[/code:1]
   
时间:2004-10-01
This is really perfect combination.

Struts gives us VC of MVC
Action + POJO + DAO + Hibernate gives us M of MVC

if there is no applicationContext-hibernate.xml exist, we can not even feel Spring exists.

DAO is a bridge or stagegy DP, decoupling underlying data access. Taking DAO as parameter in POJO is seamless and natural, or we could say this is dependency injection, no invasiving.

The greatest thing is easy replacement in the combination of Struts + Spring + Hibernate, seems Struts has more limitation.
   
0 请登录后投票
时间:2004-10-01
试下webwork吧
   
0 请登录后投票
时间:2004-10-01
豆花香 写道
试下webwork吧

有空写一个类似Webwork的吧。争取这两天也搞一个

我看这个坛子里用Webwork得不多,群众基础不够呀。
   
0 请登录后投票
论坛首页 Java版 Struts

跳转论坛:
JavaEye推荐