歡迎您光臨本站 註冊首頁

Struts與Hibernate協同工作

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  安裝篇

  一,下載安裝 j2sdk1.4(www.sun.com))或以上,設置 CLASSPATH,java_home.

  二,下載伺服器,免費版本的有 tomcat,resin,當然也還有 weblogic之類的巨無霸,不過得看你電腦的配置是否承受的了!

  這裡只以resin來說明,其他的配置都差不多,可以查看各個伺服器自帶的說明文件.

  resin 伺服器可以在 caucho.com下載,選擇合適的版本,下載解壓縮就可以直接使用.

  這裡resin有一個 resin-ee版本,這個主要是帶ejb功能支持的. 如果用不到ejb,一般的就足夠了.

  三,然後就是資料庫,有很多資料庫產品可以選擇,DB2,Oracle,MSSQL,MySQL等等太多了.這裡我選擇MySQL,不僅因為它是免費的,它的4.0版本在繼承以前版本的快速穩定的基礎上,整合了InnoDB(http://www.innodb.com)先進的事務處理機制.相信伴隨著Linux的壯大,它將在商業資料庫市場占的一席之地.不過就資料庫本身,它還缺少子查詢等強大功能的支持.

  安裝就不多說了,配置好用戶名,密碼. 然後就可以下載 MySQL-Front 來可視化操作資料庫.

  四,在Java編程上,一個IDE的功能顯然不可缺少,現在流行的IDE很多,有JBuilder,Eclipse,IntellJ IDEA,JCreator等等,其中 eclipse借著開源東風,依靠強大的插件功能被譽為最有前途的工具,JBuilder從來都最強大功能的java工具,不過大到我的電腦實在運行不了,窮啊,可沒錢配新電腦.我還是喜歡JCreator,小巧而又功能不俗,應付小規模的應用綽綽有餘.編譯開發時要想獲得提示支持,需要在 configure--option--JDK Profiles 導入jar文件.

  五,一個站點前台的界面開發,當然離不開大名鼎鼎的 Dreamweaver 了,它支持jsp,asp等很多語言的開發.特別是最近的Dreamweaver MX 2004 增強了站點的功能,可以方便的對一個站點進行控制.面對struts的前台自定義標籤,有一個mxp插件可以用來支持顯示sturts的標籤.使用前還要在編輯--標籤庫 裡面導入.tld文件,目前只支持html,和bean 兩個標籤.

  配置篇

  一,resin虛擬站點配置

  <host id='yourweb:8080' app-dir='e:blog' class-update-interval='2'>

  <web-app id='/'>

  <directory-servlet id='false'/>

  </web-app>

  <error-log id='log/web-error.log'/>

  <host>

  然後在定義的目錄下面建立站點.

  二,Dreamweaver站點的配置就不多說了.

  三,Struts的配置

  這裡我們使用的是struts1.1,下載並解壓縮到臨時文件夾,就假設是tem文件夾吧.

  拷貝tem/lib/下面所有的.tld文件到站點的/WEB-INF/目錄下,再拷貝所有的.jar文件到/WEB-INF/lib/目錄下,web.xml文件中的配置差不多如下:

  <?xml version="1.0" encoding="ISO-8859-1"?>

  <!DOCTYPE web-app

  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

  "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

  <web-app>

  <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>detail</param-name>

  <param-value>2</param-value>

  </init-param>

  <load-on-startup>2</load-on-startup>

  </servlet>

  <servlet-mapping>

  <servlet-name>action</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

  <!-- The Usual Welcome File List -->

  <welcome-file-list>

  <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

  <!-- Struts Tag Library Descriptors -->

  <taglib>

  <taglib-uri>/tags/struts-bean</taglib-uri>

  <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

  </taglib>

  <taglib>

  <taglib-uri>/tags/struts-html</taglib-uri>

  <taglib-location>/WEB-INF/struts-html.tld</taglib-location>

  </taglib>

  <taglib>

  <taglib-uri>/tags/struts-logic</taglib-uri>

  <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

  </taglib>

  <taglib>

  <taglib-uri>/tags/struts-nested</taglib-uri>

  <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>

  </taglib>

  <taglib>

  <taglib-uri>/tags/struts-tiles</taglib-uri>

  <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>

  </taglib>

  </web-app>

  四,Hibernate配置

  下載並拷貝/lib目錄下的

  hibernate2.jar

  commons-beanutils.jar

  commons-collections.jar

  commons-dbcp.jar

  commons-lang.jar

  commons-logging.jar

  commons-pool.jar

  dom4j.jar

  cglib-asm.jar

  connector.jar

  到應用站點的/lib目錄下.接下來配置 hibernate.cfg.xml文件

  <?xml version='1.0' encoding='utf-8'?>

  <!DOCTYPE hibernate-configuration

  PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"

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

  <hibernate-configuration>

  <session-factory>

  <property name="hibernate.connection.url">

  jdbc:mysql://localhost:3306/yourdatabase

  </property>

  <property name="hibernate.connection.driver_class">

  org.gjt.mm.mysql.Driver

  </property>

  <property name="hibernate.connection.username">

  yourname

  </property>

  <property name="hibernate.connection.password">

  youyrpassword

  </property>

  <!?- 是否將運行期生成的SQL輸出到日誌以供調試-->

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

  <!--dialect ,每個資料庫都有其對應的Dialet以匹配其平台特性-->

  <propertyname="dialect">net.sf.hibernate.dialect.MySQLDialect</property>

  <!?- 事務管理類型,這裡我們使用JDBC Transaction -->

  <property name="transaction.factory_class">

  net.sf.hibernate.transaction.JDBCTransactionFactory</property>

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

  <property name="jdbc.use_scrollable_resultset">true</property>

  <!?映射文件配置,注意配置文件名必須包含其相對於根的全路徑-->

  <mapping resource="net/seerlog/hbm/Cat.hbm.xml"/>

  </session-factory>

  </hibernate-configuration>

  以上配置了資料庫連接所用的地址和用戶名,密碼等.具體參數的含義請參考官方文檔.

  映射文件的內容可以手工來寫,也可通過一些工具來自動生成.

  整個需要兩種文件: .hbm.xml配置文件 和 .java持久化對象 , 兩者是相互關聯的,.hbm.xml 對資料庫的映射還需要 .java這個bean來操作.整個過程需要設計好資料庫,然後根據資料庫導出 .hbm.xml文件 ,然後再導出 .java 文件. 有很多工具可以實現這個工程,我們這裡採用 Middlegen-Hibernate來實現 資料庫到.hbm.xml文件的轉化,用Hibernate-Extension工具包中的 hbm2java 來實現 .hbm.xml 到 .java 文件的轉化!

  查找關鍵字」!ENTITY」,得到:

  <!DOCTYPE project [

  <!ENTITY database SYSTEM

  "file:./config/database/hsqldb.xml">

  ]>

  b) Application name

  <property name="name" value="airline"/>

  c) 輸出目錄

  查找關鍵字「name="build.gen-src.dir"」,得到:

  <property name="build.gen-src.dir" value="${build.dir}/gen-src"/>

  d) 對應代碼的Package name

  <hibernate

  destination="${build.gen-src.dir}"

  package="${name}.hibernate"

  genXDocletTags="false"

  genIntergratedCompositeKeys="false"

  javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"

  />

  配置完成後,在MiddleGen 根目錄下運行ant,就將出現MiddleGen的界面:

  選擇需要的表,單擊窗口頂部的Generate 按鈕,MiddleGen 即為我們生成這些資料庫表所對應的Hibernate映射文件.

  接下來的工作通過Hibernate Extension 來完成,Hibernate Extension 的toolsbin目錄下包含三個工具:

  1. hbm2java.bat

  根據映射文件生成對應的POJO.通過MiddleGen 我們已經得到了映射文件,下一步就是通過hbm2java.bat工具生成對應的POJO.

  2. class2hbm.bat

  根據POJO class 生成映射文件,這個工具很少用到,這裡也就不再詳細介紹.

  3. ddl2hbm.bat

  由資料庫導出庫表結構,並生成映射文件以及POJO.這個功能與MiddleGen的功能重疊,但由於目前還不夠成熟(實際上已經被廢棄,不再維護),提供的功能也有限,我們還是採用MiddleGen生成映射文件,之後由hbm2java根據映射文件生成POJO 的方式.

  這裡我們使用第一個hbm2java.bat,利用剛才生成的.hbm.xml文件自動生成 java 文件.

  為了使用這個工具,我們需要配置一些參數,打開toolsbinsetenv.bat 文件,修改其中的JDBC_DRIVER和HIBERNATE_HOME環境變數,使其指向我們的實際JDBC Driver文件和Hibernate所在目錄.同時檢查一下環境變數CP中的各個項目中是否實際存在,特別是%CORELIB%下的jar文件,某些版本的發行包中,默認配置中的文件名與實際的文件名有所出入(如%CORELIB%commons-logging.jar, 在Hibernate 發行包中,可能實際的文件名是commons-logging-1.0.3.jar,諸如此類).

  使用hbm2java,根據MiddleGen生成的映射文件生成Java 代碼:

  打開Command Window,在toolsbin目錄下執行:

  hbm2java c:sampleorghibernatesample*.xml --output=c:sample

  通過以上步驟我們就生成了所需要的所有基本配置文件.接下來就可以來初始化這些配置啦.

  實戰篇

  在這一節我們要配置一個完整的應用配置.其實每一個單獨拿出來都能寫本書,不過我只是側重對自己總結,在以後我會不斷地把學習的經驗教訓寫下來.

  一,Log4j 的初始化

  配置log4j.properties

  ### direct log messages to stdout ###

  #log4j.appender.stdout=org.apache.log4j.ConsoleAppender

  #log4j.appender.stdout.Target=System.out

  #log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

  %c{1}:%L - %m%n

  #log4j.appender.stdout.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n

  log4j.logger.seerlog=DEBUG,A2

  log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender

  log4j.appender.A2.file=d:\log\applog.txt

  log4j.appender.A2.DatePattern='.'yyyy-MM-dd

  log4j.appender.A2.layout=org.apache.log4j.PatternLayout

  log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %m%n

  #log4j.logger.ALL=DEBUG,A1

  log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender

  log4j.appender.A1.file=d:\log\all.log

  log4j.appender.A1.DatePattern='.'yyyy-MM-dd

  log4j.appender.A1.layout=org.apache.log4j.PatternLayout

  log4j.appender.A1.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n

  ### direct messages to file hibernate.log ###

  #log4j.appender.file=org.apache.log4j.FileAppender

  #log4j.appender.file.File=hibernate.log

  #log4j.appender.file.layout=org.apache.log4j.PatternLayout

  #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

  ### set log levels - for more verbose logging change 'info' to 'debug' ###

  ###log4j.rootLogger=warn, stdout

  log4j.rootLogger=info, A1

  #以下是hibernate API需要的配置

  log4j.logger.net.sf.hibernate=info

  ### log just the SQL

  #log4j.logger.net.sf.hibernate.SQL=debug

  ### log JDBC bind parameters ###

  log4j.logger.net.sf.hibernate.type=info

  ### log schema export/update ###

  log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug

  ### log cache activity ###

  #log4j.logger.net.sf.hibernate.cache=debug

  ### enable the following line if you want to track down connection ###

  ### leakages when using DriverManagerConnectionProvider ###

  #log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trac

  配置后如下來調用,需要初始化配置文件,這個過程只需要一次,我們可以在ServletContextListener中來進行.

  String prefix = context.getRealPath("/");

  PropertyConfigurator.configure(prefix "/WEB-INF/classes/log4j.properties");

  這裡需要你的配置文件的路徑來初始化.

  初始化完成後,我們在以後的action中就可以 象下面一樣來調用:

  static Logger log=Logger.getLogger("seerlog");

  log.warn("it's log4j warn");

  log.info("it's log4j info");

  關於 log4j 的完全使用方法,偶會在以後做詳細的說明!

  二,hibernate 的初始化

  我們要把hibernate.cfg.xml 放到應用的 classes 目錄中,然後可以使用hibernate參考文檔提供的例子來封裝對後台的使用.

  public class Hi{

  private static final SessionFactory sessionFactory;

  private static Connection conn;

  static {

  try {

  sessionFactory = new Configuration().configure().buildSessionFactory();

  } catch (HibernateException ex) {

  throw new RuntimeException("Exception building SessionFactory: " ex.getMessage(), ex);

  }

  }

  public static final ThreadLocal session = new ThreadLocal();

  public static Session getSession() throws HibernateException {

  Session s = (Session) session.get();

  // 假如沒有一個可用的線程,開啟一個新 Session,

  if (s == null) {

  conn=DBConnectionManager.getConnection();

  s = sessionFactory.openSession(conn);

  session.set(s);

  }

  return s;

  }

  public static void closeSession() throws HibernateException {

  Session s = (Session) session.get();

  session.set(null);

  if (s != null)

  s.close();

  if(conn!=null)

  DBConnectionManager.returnConnection(conn);

  }

  }

  文中DBConnectionManager.getConnection()是一個DAO類,提供連接池的實現.

  我們使用這個con連接來創建一個 session ,sission是一個資料庫連接操作的會話周期,它提供了強大的管理數據的能力.

  以後我們在action的 execute 方法中就可以使用 Hi.getSession()來獲得一個會話支持.典型的應用如下:

  try{

  //開啟一個會話,並啟動事務回滾能力

  Session session = Hi.getSession();

  Transaction tx= session.beginTransaction();

  //查詢資料庫,使用HQL

  Query q = session.createQuery("from Topic as topic order by topic.id desc");

  q.setFirstResult(0);

  q.setMaxResults(5);

  //得到一個List類型的數據

  List newTopicList = q.list();

  // 業務處理

  NewTopicList ntlBean=new NewTopicList();

  ntlBean.setList(newTopicList);

  req.setAttribute("newtopiclist",ntlBean);

  //事務提交,記得關閉會話!

  tx.commit();

  Hi.closeSession();

  }//因為整個會話會拋出異常,需要用try--catch來包裹

  catch(HibernateException e){

  //日誌記錄

  Log.error(e.toString());

  }

  其中的HQL 可以參考 hibernate 官方文檔來學習.

  三,Struts

  struts 的配置文件 struts-config.xml 放在 應用的 /WEB-INF/目錄下面,大致的配置如下

  <?xml version="1.0" encoding="ISO-8859-1" ?>

  <!DOCTYPE struts-config PUBLIC

  "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"

  "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">

  <struts-config>

  <form-beans>

  <form-bean name="loginForm" type="net.seerlog.vo.LoginForm"/>

  <form-bean name="replyForm" type="net.seerlog.vo.ReplyForm"/>

  </form-beans>

  <global-forwards>

  <forward name="index" path="/first.jsp"/>

  </global-forwards>

  <action-mappings>

  <action path="/login" type="net.seerlog.action.LoginAction" scope="request" name="loginForm" input="/login.jsp">

  <forward name="success" path="/success.jsp"/>

  </action>

  <action path="/blog" type="net.seerlog.action.BlogAction" scope="request">

  <forward name="success" path="/sublog.jsp"/>

  </action>

  <action path="/topic" type="net.seerlog.action.TopicAction" scope="request">

  <forward name="success" path="/sutopic.jsp"/>

  </action>

  <action path="/posttopic" type="net.seerlog.action.PostTopicAction" scope="request" >

  </action>

  <action path="/postreply" type="net.seerlog.action.PostReplyAction" scope="request" name="replyForm" input="/sublog.jsp">

  </action>

  <action path="/index" type="net.seerlog.action.IndexAction" scope="request">

  </action>

  </action-mappings>

  <message-resources parameter="resouse.application">

  </message-resources>

  </struts-config>

  這裡的配置有一個可視化工具叫做 struts-console,目前版本4.8,網上可以免費下載的到.

  配置文件其實不用去記,需要時參考一下,拷貝一個過來修改一下即可.只是這裡的主要是在於設計 ,設計好有什麼formbean,什麼action,他們的關係,等等問題.一個好的設計絕對能為後期節省大量的返工可能性.struts有一本《struts on action》,絕對是學習struts的經典書籍,我手上有翻譯的前8章,有需要的可以聯繫我.

  我們這裡不詳細說明各個配置,只講struts 和hibernate 合作的過程.

  一個action 有一個 execute 方法,當然也可以用 perform方法,不過 perform 方法 在struts1.1已經不推薦使用了,而使用了更強大的execute()方法. package net.seerlog.action;

  //導入所有用的到的包

  import java.util.List;

  import net.seerlog.po.*;

  import net.seerlog.vo.*;

  import net.seerlog.util.*;

  import net.sf.hibernate.*;

  import org.apache.struts.action.*;

  import javax.servlet.*;

  import javax.servlet.http.*;

  import java.io.IOException;

  import javax.servlet.ServletException;

  public class IndexAction extends Action{

  //action的主體方法 execute ,注意要拋出異常

  public ActionForward execute (ActionMapping mapping,ActionForm form,HttpServletRequest req,

  HttpServletResponse res) throws IOException, ServletException{

  try{

  //開啟會話

  Session session = Hi.getSession();

  Transaction tx= session.beginTransaction();

  //查詢

  Query q = session.createQuery("from Topic as topic order by topic.id desc");

  q.setFirstResult(0);

  q.setMaxResults(5);

  List newTopicList = q.list();

  NewTopicList ntlBean=new NewTopicList();

  ntlBean.setList(newTopicList);

  req.setAttribute("newtopiclist",ntlBean);

  //事務提交,關閉session

  tx.commit();

  Hi.closeSession();

  //捕獲異常

  }catch(HibernateException e){

  Log.error(e.toString()); //日誌記錄

  }

  //返回一個 actionForward 對象

  return mapping.findForward("index");

  }

  }

  以上就是 struts hibernate協同工作的全部內容了,這篇文章只能讓你了解整個過程,這裡的例子不能作為實現的學習例子.


[火星人 ] Struts與Hibernate協同工作已經有641次圍觀

http://coctec.com/docs/java/show-post-60458.html