上一篇中只是简单列出了需要的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&useUnicode=true&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" />
到此,环境搭建完成了,下一篇说说基本的代码编写。