首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Struts 二与Hibernate整合第一课

2012-11-01 
Struts 2与Hibernate整合第一课书上的一个例子懒得写,在网上一查竟然有这个例子,所以就copy过来了。-------

Struts 2与Hibernate整合第一课
书上的一个例子
懒得写,在网上一查竟然有这个例子,所以就copy过来了。
-----------------------------------------------
一、输入界面:input.jsp与控制器
<%@ page contentType="text/html; charset=GBK" language="java"%>

<%@taglib prefix="s" uri="/struts-tags"%>
<HTML>
<HEAD>
<TITLE>添加新家长</TITLE>
</HEAD>
<BODY>
<s:form action="add.action">
<s:textfield name="name" label="父亲名字:"/>
<s:textfield name="gender" label="性别:"/>
<s:textfield name="sonName" label="儿子名:"/>
<s:textfield name="sonAge" label="儿子年龄:"/>
<s:submit value="提交"/>
</s:form>
</BODY>
</HTML>

 
struts 2配置文件:struts.xml
<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<constant name="struts.custom.i18n.resources" value="messageResource"/>

<package name="lee" extends="struts-default">
  <action name="add" />
                  
                 
所填数据将会保存到数据库struts2hibernate中,这个数据库请事先在MYSQL中创建。





从数据中可以看到刚提交的数据:





二、持久层设计
包括Hibernate持久化访问所需的PO和Hibernate映射文件。

父亲实体类代码:

package org.yeeku.model;
import java.util.*;
public class Person
{
private int id;
private String name;
private String gender;
    private Set< Son> sons = new HashSet< Son>();
public Person()
{
}

public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setGender(String gender) {
this.gender = gender;
}
    public void setSons(Set sons)
    {
        this.sons = sons;
    }
public int getId() {
return (this.id);
}
public String getName() {
return (this.name);
}
public String getGender() {
return (this.gender);
}
    public Set< Son> getSons()
    {
        return this.sons;
    }
} 对应的映射文件:Person.hbm.xml

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.yeeku.model">
<!-- 每个class元素映射一个持久化类 -->
<class name="Person" table="person">
  <id name="id">
    <generator inverse="true">
    <key column="person_id"/>
    <one-to-many encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.yeeku.model">
  <!-- 每个class元素映射一个持久化类 -->
  <class name="Son" table="son">
   <id name="id">
    <generator column="person_id" not-null="true"/>
</class>
</hibernate-mapping>



最后是Hibernate配置文件:hibernate.cfg.xml,指定了数据库连接信息和连接池等。

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/struts2hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>

<!-- C3P0 connection pool -->
<property name="hibernate.c3p0.max_size">500</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>

<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">false</property>

<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>

<mapping resource="Person.hbm.xml"/>
<mapping resource="Son.hbm.xml"/>

</session-factory>

</hibernate-configuration>


三、DAO层设计
由两个DAO组件和一个DAO工厂组成,两个DAO组件的代码大致相同,这里以Person实体对应的DAO组件为例来介绍DAO组件
的实现。

1、Dao接口

package org.yeeku.dao.base;

public interface Dao
{
}

2、PersonDao接口
package org.yeeku.dao;
import org.hibernate.Session;
import org.yeeku.model.*;
import org.yeeku.dao.base.Dao;

import java.util.*;

public interface PersonDao extends Dao {
//包括四个CRUD操作
void save(Session sess , Person p);
void delete(Session sess , Person p);
void delete(Session sess , int id);
void update(Session sess , Person p);
}

3、Dao组件的实现类PersonDaoImpl.java


package org.yeeku.dao.impl;
import org.hibernate.Session;
import org.yeeku.model.*;
import org.yeeku.dao.*;
import java.util.*;
public class PersonDaoImpl implements PersonDao
{
    public void save(Session sess , Person p)
    {
        sess.save(p);
    }
    public void delete(Session sess , Person p)
    {
        sess.delete(p);
    }
    public void delete(Session sess , int id)
    {
        sess.delete(sess.get(Person.class , new Integer(id)));
    }
    public void update(Session sess , Person p)
    {
        sess.update(p);
    }
}
4、DAO工厂
DAO工厂是一个简单的工厂类,该工厂类使用XML文件管理DAO组件,采用XML配置文件管理DAO组件可以让DAO工厂灵活
管理所有DAO组件,避免每次增加DAO组件时都要修改代码。这种DAO组件配置文件的代码结构如下:(daoContext.xml)

<?xml version="1.0" encoding="GBK"?>
<daoContext>
  <dao id="sonDao" encoding="GBK"?>
<appContext>
  <app id="personService" class="org.yeeku.service.impl.PersonServiceImpl"/>
</appContext>

业务逻辑组件工厂根据该文件来初始化所有业务逻辑组件,并将业务逻辑组件放入缓存池中,让控制器Action仅依赖于业务逻辑组件工厂,与业务逻辑组件的耦合降低到接口层次。业务逻辑组件的工厂类代码如下:

package org.yeeku.factory;
import org.yeeku.dao.base.Dao;
import org.yeeku.dao.*;
import org.yeeku.dao.impl.*;
import org.yeeku.service.*;
import org.yeeku.service.impl.*;
import org.yeeku.consttool.*;
import org.dom4j.*;
import org.dom4j.io.*;
import java.util.*;
import java.io.*;
public class AppFactory
{
    private Map appMap = new HashMap();
    private static AppFactory df;
    private AppFactory()throws Exception
    {
        Document doc = new SAXReader().read(new File(ConstantsUtil.realPath + "\\appContext.xml"));
        Element root = doc.getRootElement();
        List el =  root.elements();
        for (Iterator it = el.iterator();it.hasNext() ; )
        {
            Element em = (Element)it.next();
            String id = em.attributeValue("id");
            String impl = em.attributeValue("class");
            Class implClazz = Class.forName(impl);//用反射根据类名创建业务逻辑组件
            Object d = implClazz.newInstance();
            appMap.put(id , d);  //将业务逻辑组件放入缓存池中         
        }
    }
    public static AppFactory instance()throws Exception
    {
        if (df == null)
        {
            df = new AppFactory();
        }
        return df;
    }
    public Object getApp(String id)//根据业务逻辑组件的ID获取业务逻辑组件
    {
        return appMap.get(id);//直接从缓存池中取出业务逻辑组件
    }
}

系统每增加一个业务组件时,无需要修改任何代码,仅仅需要在appContext.xml文件中增加配置。

热点排行