一葉笑天
          雄關漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
          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 一葉笑天 閱讀(1841) 評論(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
            回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 获嘉县| 长治县| 腾冲县| 泗水县| 盐源县| 西平县| 罗田县| 水城县| 淮滨县| 绿春县| 汉川市| 六枝特区| 徐水县| 麻城市| 富民县| 阿瓦提县| 平遥县| 香港 | 开原市| 上栗县| 沾化县| 巴塘县| 萨嘎县| 乐业县| 云梦县| 武山县| 方山县| 东宁县| 元氏县| 科技| 县级市| 巴中市| 博爱县| 读书| 洪江市| 泰来县| 佛坪县| 南汇区| 泾源县| 永吉县| 增城市|