论坛首页 Java版 Struts

struts+hibernate(dao)+filter的例子

浏览 18120 次
该帖已经被评为精华帖
作者 正文
最后更新时间:2004-03-18
最近这一个阶段一直在研究hibernate,总感觉好象什么地方特别扭,研究一段时间,看了论坛上的各位大虾和小虾写的例子,自己也写了一个,在这里贴出来,希望得到大家的批评指正,特别是在架构上如何设计给些意见,因为对照关系如一对一,一对多的实现论坛的例子已经很清楚了.

开发环境:
struts 1.1
tomcat4.1.24
hibernate2.1.2
oracle 8.16

表﹕company

id      公司ID
company_name    公司名稱

配置就不說了﹐

po:company.java
[code:1]public class Company {
private String id;
private String companyname;

public String getId(){
return id;
}
public String getCompanyname(){
return companyname;
}

public void setId(String id){
this.id=id;
}
public void setCompanyname(String companyname){
this.companyname=companyname;
}
}[/code:1]

company持久類對應的映射文件﹕
company.hbm.xml

[code:1]<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class name="com.foxconn.hibernate.po.Company" table="company" dynamic-update="false">
        <id name="id" column="id" type="string" unsaved-value="any" >
            <generator class="assigned">
            </generator>
        </id>
        <property name="companyname" type="string" update="true" insert="true" column="company_name"/>
    </class>
</hibernate-mapping>[/code:1]

配置文件hibernate.cfg.xml
[code:1]<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration D

TD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>

<session-factory>

<property name="connection.datasource">java:comp/env/jdbc/fox221</property>

<property name="show_sql">false</property>

<property name="dialect">net.sf.hibernate.dialect.OracleDialect</property>

<property name="jdbc.fetch_size">50</property>

<property name="jdbc.batch_size">30</property>

<!-- Mapping files -->

<mapping resource="/hbm/Company.hbm.xml"/>

</session-factory>

</hibernate-configuration>[/code:1]

提供session的类HebernateSessionFactory(利用Thread管理session)

[code:1]public class HibernateSessionFactory {
    public static final ThreadLocal session = new ThreadLocal();
    private static SessionFactory sessionFactory;

     static {
        try {
            sessionFactory =
                    new Configuration().configure().buildSessionFactory();
        } catch (HibernateException ex) {
            throw new RuntimeException(
                    "Exception building SessionFactory: " + ex.getMessage(),ex);
        }
    }

    public static Session currentSession() throws HibernateException{
        Session s = (Session) session.get();
        if (s == null) {
            s =  sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }
    public static void closeSession() throws HibernateException{
        Session s = (Session) session.get();
        session.set(null);
        if (s != null) s.close();
    }
   
} [/code:1]

封装CRUD操作的类(我觉的此类应该设置为abstract类)
[code:1]public class HibernateUtil {
    public static void add( Object object )throws HibernateException{        Session s = HibernateSessionFactory.currentSession();
        s.save( object );
        s.flush();
        s.beginTransaction().commit();
    }
    public static void update( Object object ) throws HibernateException {
        Session s = HibernateSessionFactory.currentSession();
        s.beginTransaction();
        s.saveOrUpdate( object );
        s.flush();
    }
    public static void remove(Class clazz, String id) throws HibernateException {
        Session s = HibernateSessionFactory.currentSession();
        s.beginTransaction();
        Object object = s.load(clazz, id);
        s.delete( object );
        s.flush();
    }
    public static Object findById( Class clazz, String id ) throws HibernateException {
        Object obj = null;
        Session s = HibernateSessionFactory.currentSession();
        obj = s.load( clazz, id );
        s.flush();
        return obj;
    }
} [/code:1]

在filter中关闭session,这个filter还可以用于字符集转换.
HibernateFilter.java  

[code:1]public class HibernateFilter implements Filter {
   private String encode = "big5";
  
    public void init(FilterConfig config) {
        this.encode = config.getInitParameter("encode");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        try{
            request.setCharacterEncoding(this.encode);
            response.setContentType("text/html;charset="+encode);
            chain.doFilter(request, response);
        }
        catch(Exception e){
            if(!(e instanceof java.net.SocketException)){
                if(request instanceof HttpServletRequest)
                    Logger.getLogger(this.getClass()).error("error request uri:"+((HttpServletRequest)request).getRequestURI());
                Logger.getLogger(this.getClass()).error(e);
            }
        }finally{
        try{
        HibernateSessionFactory.closeSession();
        }catch(Exception ex){
        System.out.println("Error in closing session");
        }
        }
    }

    public void destroy() {
    }
}[/code:1]
以上是hibernate相关部分.
   
最后更新时间:2004-03-17
companyDAO.java 是个接口.

[code:1]public interface CompanyDAO {
public void addCompany(Company company) throws HibernateException;
}[/code:1]

工厂类HibernateDAOFactory.java
[code:1]public class HibernateDAOFactory implements DAOFactory{
    public static Object getInstance(String subClassName) throws
        ClassNotFoundException,
        InstantiationException,
        IllegalAccessException{
        return (Class.forName(subClassName).newInstance());
    }
}[/code:1]

DAO的实现类CompanyDAOImpl
[code:1]public class CompanyDAOImpl implements CompanyDAO{

public void addCompany(Company company) throws HibernateException{
HibernateUtil.add(company);
}

}[/code:1]

struts的action类只负责控制转发CompanyAction.java
[code:1]public class CompanyControl extends DispatchAction{

public ActionForward saveCompany(ActionMapping mapping,ActionForm form ,HttpServletRequest request,HttpServletResponse response) throws Exception{
    HttpSession session = request.getSession();
   
    String id=request.getParameter("id");
    String name=request.getParameter("name");
   
    Company company=new Company();
    company.setId(id);
    company.setCompanyname(name);
   
    CompanyDAO companyDAO=(CompanyDAO)HibernateDAOFactory.getInstance("CompanyDAOImpl");
    companyDAO.addCompany(company);
   
    return mapping.findForward("success");
    }
}[/code:1]
   
0 请登录后投票
最后更新时间:2004-03-17
下面是相关的两个页面.index.jsp和保存后成功页面success.jsp

index.jsp

<%@ page contentType="text/html; charset=Big5" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> 
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<html:html>
<head>
<link href="<%= request.getContextPath() %>/style/SelfCss.css" rel="stylesheet" type="text/css">
</head>
<body>
<html:form action="company.do?action=saveCompany">
<table>
<tr>
<td>Company ID:</td>
<td><html:text property="id" /></td>
</tr>
<tr>
<td>Company Name:</td>
<td><html:text property="name" /></td>
</tr>
<tr>
<td><html:submit value="submit" /></td>
<td><html:reset value="reset"/></td>
</tr>
</table>
</html:form>
</body>
</html:html>

success.jsp   此画面用来输出成功插入的信息!

<html:html>
<body>
Successful!!!
</body>
</html:html>
   
0 请登录后投票
最后更新时间:2004-03-19
请问能放出源码?
   
0 请登录后投票
最后更新时间:2004-03-22
可以,另外,说明的是,本例子很简单,旨在和大家来讨论在架构上如何设计.以使二者能够发挥各自的优势.
   
0 请登录后投票
最后更新时间:2004-03-22
哥们,我看了你的代码,你的DAOFactory里面什么都没有,我不知道你的DAOFactory有什么意思,那还不如,直接退化成简单工厂模式,把这个DAOFactory接口去掉
   
0 请登录后投票
最后更新时间:2004-03-23
前面的东西还能看得懂
后半部分就看不太懂了
能解释一下吗?
为什么要用Factory之类的?
这几个类之间又是什么关系?

不好意思,新手
   
0 请登录后投票
最后更新时间:2004-03-25
其实也没什么,设计模式里有句话,面向接口编程,而不是面向实现编成.另外使用工厂模式以及上面的编写方法,主要为了系统以后维护方便,论坛中很多这样的贴子,
你可以搜索一下,本想和大家讨论讨论,但没有几个人给意见.
   
0 请登录后投票
最后更新时间:2004-03-25
另外,多谢aloneflasher的意见,本来DAOFctoryImpl中的方法是写到DAOFactory中的.然后在DAOFactoryImpl中实现的.但考虑到静态变量及方法可以直接引用,所以就设置了一个空接口.
   
0 请登录后投票
最后更新时间:2004-03-28
几天没来了,谢谢你的源码。回去看看先。
:)
   
0 请登录后投票
论坛首页 Java版 Struts

跳转论坛:
JavaEye推荐