<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一葉笑天
    雄關漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
    posts - 73,comments - 7,trackbacks - 0
    在這個項目中,準備用Struts2集成hibernate來完成數據庫的簡單CRUD操作,暫時不涉及集成spring。項目需要的lib文件:
    antlr-2.7.6.jar
    cglib-nodep-2.1_3.jar
    commons-collections-3.1.jar
    commons-logging-1.0.4.jar
    dom4j-1.6.1.jar
    ehcache-1.2.3.jar
    freemarker-2.3.8.jar
    hibernate3.jar
    javassist-3.4.GA.jar
    jta-1.1.jar
    log4j-1.2.15.jar
    mysql-connector-java-5.1.7-bin.jar
    ognl-2.6.11.jar
    servlet-api.jar
    slf4j-api-1.5.6.jar
    slf4j-log4j12-1.5.6.jar
    struts2-core-2.0.14.jar
    xwork-2.0.7.jar

    在這個系統中將完成User對象的增、刪、改、查功能。Uer對象的屬性有id,name和password。

    將分為如下幾個步驟來完成:

    1.編寫Hibernate工具類
    2.編寫Hibernate攔截器控制事務
    3.編寫DAO類
    4.編寫User對象和hibernate映射文件
    5.編寫UserAction類
    6.編寫所需的listUser.jsp和editUser.jsp頁面
    7.編寫struts配置文件
    8.配置web.xml文件
    9.發布測試

    首先新建一個web project項目Struts2Hibernate,將上面所需的jar全部復制到WEB-INF下的lib文件夾中。

    1.編寫Hibernate工具類:

    首先編寫hibernate.cfg.xml文件,文件放在src目錄下。此文件主要配置hibernate的數據庫連接和事務管理。
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
    >

    <hibernate-configuration>

        
    <session-factory>

            
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            
            
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
            
            
    <property name="hibernate.connection.username">root</property>
            
            
    <property name="hibernate.connection.password"></property>
            
            
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            
            
    <property name="hibernate.current_session_context_class">thread</property>
            
            
    <property name="hibernate.transaction.JDBCTransactionFactory">
                org.hibernate.transaction.JDBCTransactionFactory
            
    </property>

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

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

            
    <mapping resource="com/hibernate/domain/User.hbm.xml"/>

        
    </session-factory>

    </hibernate-configuration>


    接著編寫HibernateUtil類,用于獲取SessionFactory實例。此類可以在hibernate-distribution-3.3.1.GA包的\project\tutorials下找到。
    package com.hibernate.util;

    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;

    public class HibernateUtil {
        
        
    private static final SessionFactory sessionFactory;

        
    static {
            
    try {
                
    // Create the SessionFactory from hibernate.cfg.xml
                sessionFactory = new Configuration().configure().buildSessionFactory();
            }
     catch (Throwable ex) {
                
    // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + ex);
                
    throw new ExceptionInInitializerError(ex);
            }

        }


        
    public static SessionFactory getSessionFactory() {
            
    return sessionFactory;
        }

    }


    接著編寫一個ExportDB類,方便用戶直接將寫好的hibernate映射表結構創建到數據庫中。此類可以單獨直接運行。
    package com.hibernate.util;

    import org.hibernate.cfg.Configuration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;

    public class ExportDB {

        
    public static void main(String[] args) {
            
              Configuration cf 
    =   new Configuration().configure();
              
              SchemaExport se 
    =   new SchemaExport(cf);
              se.create(
    falsetrue);
            }

    }


    2.編寫Hibernate攔截器控制事務
    編寫一個SessionInterceptor類來解決hibernate的lazyInitializationException。主要是采用過濾器的方式,在請求到達目標資源之前開始事務,在目標資源響應之后結束事務,來支持請求/響應模式所需的長事務。為了能執行此filter,需要在web.xml中增加filter。
    package com.hibernate.web;

    import java.io.IOException;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;

    import org.hibernate.SessionFactory;
    import org.hibernate.StaleObjectStateException;


    import com.hibernate.util.HibernateUtil;

    public class SessionInterceptor implements Filter  {

        
    private SessionFactory sf = null;

        
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) 
    throws IOException, ServletException {
            
            
    try{
                
    if (sf.getCurrentSession()==null){
                    sf.openSession();
                }
    else{
                    sf.getCurrentSession().beginTransaction();        
                }

                chain.doFilter(request, response);
                sf.getCurrentSession().getTransaction().commit();
            }
    catch(StaleObjectStateException ex){
                
    throw ex;
            }
    catch(Throwable tx){
                tx.printStackTrace();
                
    try{
                    
    if(sf.getCurrentSession().getTransaction().isActive()){
                        sf.getCurrentSession().getTransaction().rollback();
                    }

                }
    catch(Throwable rbEx){
                    System.err.println(rbEx.toString());
                }

            }

        }


        
    public void init(FilterConfig arg0) throws ServletException {    
            sf 
    = HibernateUtil.getSessionFactory();
        }

        
        
    public void destroy() {
            
        }


    }


    3.編寫DAO類

    編寫一個DAOFactorty類用于屏蔽具體的DAO實現。
    package com.hibernate.dao;

    public abstract class DaoFactory {

        
    private static final DaoFactory daoFactory = new HibernateDaoFactory();
        
        
    public static DaoFactory getInstance(){
            
            
    return daoFactory;
        }

        
        
    public abstract UserDao getUserDao();
    }


    編寫HibernateDaoFactory工廠類,獲得具體的DAO實現類。
    package com.hibernate.dao;

    import org.hibernate.Session;

    import com.hibernate.dao.impl.UserDaoImpl;
    import com.hibernate.util.HibernateUtil;

    public class HibernateDaoFactory extends DaoFactory {

        
    public UserDao getUserDao(){
            UserDao userdao 
    = new UserDaoImpl(getCurrentSession());
            
    return userdao;
        }

        
        
    private Session getCurrentSession(){
            
    return HibernateUtil.getSessionFactory().getCurrentSession();
        }

    }


    編寫UserDAO接口,便于不讓上層依賴具體的DAO實現類。
    package com.hibernate.dao;

    import java.util.List;
    import com.hibernate.domain.User;

    public interface UserDao {
      
        
    public User findById(Integer id);
        
    public List<User> findAll();
        
    public void makePersistent(User user);
        
    public void delete(Integer id);
    }


    編寫具體的實現類UserDaoImpl類
    package com.hibernate.dao.impl;

    import java.util.List;

    import org.hibernate.Session;

    import com.hibernate.dao.UserDao;
    import com.hibernate.domain.User;

    public class UserDaoImpl implements UserDao {

        
    private Session session ;
        
        
    public UserDaoImpl(Session session) {
            
    this.session = session;
        }

        
        
    public Session getSession() {
            
    return session;
        }


        
    public void delete(Integer id) {
            session.delete(getSession().get(User.
    class, id));
        }


        
    public List<User> findAll() {
            
    return session.createCriteria(User.class).list();
        }


        
    public User findById(Integer id) {
            
    return (User)session.get(User.class, id);
        }


        
    public void makePersistent(User user) {
            session.saveOrUpdate(user);
        }


    }


    4.編寫User對象和hibernate映射文件

    編寫領域對象User。
    package com.hibernate.domain;

    public class User {
     
        
    private int id;
        
        
    private String name;
        
        
    private String password;

        
    public int getId() {
            
    return id;
        }


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


        
    public String getName() {
            
    return name;
        }


        
    public void setName(String name) {
            
    this.name = name;
        }


        
    public String getPassword() {
            
    return password;
        }


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

        
    }


    對上述領域對象編寫hibernate映射文件User.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 package="com.hibernate.domain">

        
    <class name="User" table="user">
            
    <id name="id" column="id">
                
    <generator class="native"/>
            
    </id>
            
    <property name="name"/>
            
    <property name="password"/>
        
    </class>

    </hibernate-mapping>

    5.編寫UserAction類

    在UserAction中完成User對象的CRUD相關函數的開發。同時需要創建3個屬性,users,user,id
    package com.struts2.action;

    import java.util.List;

    import com.hibernate.dao.DaoFactory;
    import com.hibernate.domain.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.Preparable;


    public class UserAction extends ActionSupport implements Preparable {

        
    private static final long serialVersionUID = -1057922687577124881L;
        
        
    private List<User> users;
        
    private User user;
        
    private Integer id;
        
        
    public List<User> getUsers() {
            
    return users;
        }


        
    public void setUsers(List<User> users) {
            
    this.users = users;
        }


        
    public User getUser() {
            
    return user;
        }


        
    public void setUser(User user) {
            
    this.user = user;
        }


        
    public Integer getId() {
            
    return id;
        }


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


        
    public String list() throws Exception{
            users 
    = DaoFactory.getInstance().getUserDao().findAll();
            
    return SUCCESS;
        }

        
        
    public String delete() throws Exception{
            
    if(id!=null){
              DaoFactory.getInstance().getUserDao().delete(id);
            }

            
    return SUCCESS;
        }

        
        
    public String save() throws Exception{
            DaoFactory.getInstance().getUserDao().makePersistent(user);
            
    return SUCCESS;
        }

        
        
    public void prepare() throws Exception{
            
    if(id!=null){
             user 
    = DaoFactory.getInstance().getUserDao().findById(id);
            }

        }


    }


    6.編寫所需的listUser.jsp和editUser.jsp頁面
    index.jsp如下:
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

    <html>
    <head>
    <title>Struts2Hibernate</title>
    </head>
    <body>
      Welcome to Struts2Hibernate Project
      
    <p>
      
    <a href="listUser.jsp">View all users</a>
    </body>
    </html>

    listUser.jsp如下
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding
    ="ISO-8859-1"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

    <html>
    <head>
    <title>Struts2Hibernate</title>
    </head>
    <body>
    <table>
       
    <tr>
         
    <th>id</th>
         
    <th>name</th>
         
    <th>password</th>
       
    </tr>
        
    <s:iterator value="users">
            
    <tr>
                
    <td><a href="<s:url action="edit-%{id}"/>"><s:property value="id"/></a></td>
                
    <td><s:property value="name" /></td>
                
    <td><s:property value="password" /></td>
                
    <td><a href="<s:url action="delete-%{id}"/>">delete</a></td>
            
    </tr>
        
    </s:iterator>
    </table>
    <p>
    <a href="<s:url action="edit-" includeParams="none"/>">create new user</a>
    </body>
    </html>

    editUser.jsp如下:
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>

    <!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=ISO-8859-1">
    <title>Struts2Hibernate</title>
    </head>
    <body>
      
    <s:if test="user!=null">
        
    <s:text id="title" name="edit user"/>
      
    </s:if>
      
    <s:else>
        
    <s:text id="title" name="create user"/>
      
    </s:else>
      
      
    <s:property value="#title"/>
      
      
    <s:form action="save" method="post">
         
    <s:hidden name="user.id" name="user.id" value="%{user.id}"></s:hidden>
         
    <s:textfield label="name" name="user.name" value="%{user.name}"></s:textfield>
         
    <s:password label="password" name="user.password" value="%{user.password}"></s:password>
         
    <s:submit value="save"></s:submit>
      
    </s:form>
    </body>
    </html>


    7.編寫struts配置文件struts.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!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" />
        
        
    <package name="default" extends="struts-default">
            
    <action name="list" class="com.struts2.action.UserAction" method="list">
                
    <result name="success">/listUser.jsp</result>
                
    <interceptor-ref name="basicStack" />
            
    </action>
     
            
    <action name="edit-*" class="com.struts2.action.UserAction">
                
    <param name="id">{1}</param>
                
    <result>/editUser.jsp</result>
                
    <interceptor-ref name="static-params" />
                
    <interceptor-ref name="basicStack" />
            
    </action>
            
            
    <action name="save" class="com.struts2.action.UserAction" method="save">
                
    <result name="input">/editUser.jsp</result>
                
    <result type="redirect">list.action</result>
            
    </action>
            
            
    <action name="delete-*" class="com.struts2.action.UserAction" method="delete">
                
    <param name="id">{1}</param>
                
    <result type="redirect">list.action</result>
                
    <interceptor-ref name="static-params" />
            
    </action>
            
        
    </package>

    </struts>

    8.配置web.xml文件
    注意:SessionInterceptor的filter要放在第一個filer的位置。
    <?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>Struts2Hibernate</display-name>
        
        
    <welcome-file-list>
            
    <welcome-file>index.jsp</welcome-file>
        
    </welcome-file-list>
        
        
    <filter>
            
    <filter-name>SessionInterceptor</filter-name>
            
    <filter-class>com.hibernate.web.SessionInterceptor</filter-class>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>SessionInterceptor</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>
        
        
    <filter>
            
    <filter-name>struts2</filter-name>
            
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>struts2</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>
        
    </web-app>

    9.發布測試




    posted on 2009-01-08 11:35 一葉笑天 閱讀(1838) 評論(2)  編輯  收藏 所屬分類: Struts技術

    FeedBack:
    # re: Struts2邊學邊練(3)-Struts2集成Hibernate完成CRUD操作[未登錄]
    2009-10-29 18:53 | micheal
    加入你的USER對象要是有100個字段,你的edit頁面怎么處理?  回復  更多評論
      
    # re: Struts2邊學邊練(3)-Struts2集成Hibernate完成CRUD操作[未登錄]
    2010-05-04 19:49 | dd
    原微軟大中華區副總出任Teradata大中華區總裁@micheal
      回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 100000免费啪啪18免进| a在线观看免费视频| 亚洲午夜久久久精品影院| 日韩电影免费在线观看视频| 7m凹凸精品分类大全免费| 免费国产污网站在线观看| 羞羞网站免费观看| 国产亚洲视频在线播放| 成人在线视频免费| 无人影院手机版在线观看免费| 免费一级不卡毛片| 成人免费777777被爆出| 色婷婷亚洲一区二区三区| 亚洲人成7777| 亚洲成A人片77777国产| 国产高清在线免费| 成人免费淫片在线费观看| 西西大胆无码视频免费| 久久国内免费视频| 久久久久久精品免费免费自慰| 激情亚洲一区国产精品| 亚洲高清日韩精品第一区| 亚洲综合成人网在线观看| 亚洲av无码av制服另类专区| 亚洲精品成人网站在线观看| 中文字幕亚洲综合久久男男 | 亚洲免费在线视频播放| 国产传媒在线观看视频免费观看| 欧美男同gv免费网站观看 | 亚洲免费在线视频| 亚洲第一精品在线视频| 色吊丝性永久免费看码| 亚洲AV无码码潮喷在线观看| 中文亚洲AV片不卡在线观看| 亚洲一区爱区精品无码| 午夜精品在线免费观看| 麻豆国产VA免费精品高清在线| 免费黄色电影在线观看| 99视频精品全部免费观看| 毛片免费全部播放无码| AA免费观看的1000部电影|