strtus2.3.6+guice4+jpa(hibernate4)的配置-第二篇

上一篇中只是簡單列出了需要的jar包和配置文件,現在進入配置階段。

1.配置strtus2

   我不用strtus很久了,因爲用spring時直接使用了springmvc,感覺也很好用,而且又是spring本身支持的,不需要再配置其他mvc框架,減少了jar包衝突和縮短了學習時間。我目前的考慮是即使用spring也不再使用它的事務管理了,如果不用spring的情況下mvc框架當然要找個成熟並且功能強大的了。我還是選了struts2。如果對於struts2熟悉的人完全可以不看這段,其實也沒啥特殊的,照官方文檔設置一下也就可以了。廢話說完了,開始配置:

  在web.xml中加入strtus2的filter

  <filter-name>struts2</filter-name>
  <filter-class>
  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  </filter-class>
  <init-param>
<param-name>loggerFactory</param-name>
<param-value>
com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory
</param-value>
</init-param>
 </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>*.action</url-pattern>
  </filter-mapping>

 配置很普通,其中loggerFactory這個參數,我使用了conmmon-logging,log4j,所以這麼配置了,如果你不用也可以使用其他的,我前一篇的文章裏也包含此配置的jar包。

在src源代碼目錄下建立struts.xml,strtus配置就基本完成了。啓動一下沒有異常吧。

這裏用myeclipse也能直接生成,不多說了。

 2.Guice配置

    我寫這篇文章的主要目的是用struts與guice結合,所以這裏纔到關鍵的地方。說明一下,我這裏的配置都是參考guice官方的文檔來做的,只不過說的通俗一些。官方文檔個人認爲跟聊齋有一拼,惜墨如金啊。一句都不多說,沒廢話,我配置過程中經常漏掉一句話就導致執行不正常或者啓動不了。

  首先修改web.xml,加入listener和filter

   <listener>
   <listener-class>com.xxx.ServletContextListener</listener-class>
</listener>


<filter>
   <filter-name>guiceFilter</filter-name>
   <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
   <filter-name>guiceFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

  filter是guice提供的,直接寫上就行了。ServletContextListener需要自己編寫代碼,用於進行注入或者模塊的安裝:

   

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.persist.PersistFilter;
import com.google.inject.persist.jpa.JpaPersistModule;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;
import com.google.inject.struts2.Struts2GuicePluginModule;
//import com.ngworld.demo.servlet.HelloWorldServlet;


public class ServletContextListener extends GuiceServletContextListener {


@Override
protected Injector getInjector() {
//PersistService service;
Injector inj =  Guice.createInjector(new ServletModule() {
            protected void configureServlets() {
            install(new JpaPersistModule("unit1"));  // like we saw earlier.
           
                //serve("/helloworld").with(HelloWorldServlet.class);
                
                filter("/*").through(PersistFilter.class);
            }
        },new Struts2GuicePluginModule());



return inj;
}


}

install(new JpaPersistModule("unit1"));  這句,一般要寫在第一個,也就是第一個模塊要安裝jpa持久化模塊,unit1是在persistence.xml中配置的unit的名稱,這兩處需要寫成一樣的,否則加載會不成功。filter("/*").through(PersistFilter.class);是爲程序增加持久化過濾器,這個是web程序必須的,也是不同於普通java程序的地方。

struts2和guice整合配置基本上就可以了。現在可以在action裏面注入guice管理的bean了。

3.下面是persistence.xml的配置

  目前,guice(我用的4.0 beta2)只支持jpa,所以我就用jpa來做事務管理。

首先是persistence.xml的配置文件內容:

  <persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="unit1" transaction-type="RESOURCE_LOCAL">

<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.test.vo.Test</class>
<properties>
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 最大連接數 -->
<property name="hibernate.c3p0.max_size" value="2"/>
<!-- 最小連接數 -->
<property name="hibernate.c3p0.min_size" value="1"/>
<!-- 獲得連接的超時時間,如果超過這個時間,會拋出異常,單位毫秒 -->
<property name="hibernate.c3p0.timeout" value="120"/>
<!-- 最大的PreparedStatement的數量 -->
<property name="hibernate.c3p0.max_statements" value="100"/>
<!-- 每隔120秒檢查連接池裏的空閒連接 ,單位是秒-->
<property name="hibernate.c3p0.idle_test_period" value="120"/>
<!-- 當連接池裏面的連接用完的時候,C3P0一下獲取的新的連接數 -->
<property name="hibernate.c3p0.acquire_increment" value="1"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=gbk"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
</properties>
</persistence-unit>
</persistence>

  數據源使用了c3p0,庫用的mysql5.5。在文件中<class>com.test.vo.Test</class>指定了唯一一個持久化類Test,對應mysql中一個test表。這是個標準的hibernate實體類。項目中如果用到其他實體類,可以增加多個class標記來指定。

    注意:persistence.xml文件的位置,必須是src下META-INF目錄下。我放到webroot/META-INF下試過,結果找不到。

    persistence-unit name="unit1" 這個unit1就是單元的名稱,與GuiceServletContextListener 代碼中那個unit1是一樣的,這兩個必須保持一至。

最後,在struts.xml中增加:

<constant name="struts.objectFactory" value="guice" />

 到此,環境搭建完成了,下一篇說說基本的代碼編寫。


   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章