ssh的框架配置

spring集成hibernate于struts最新版本的配置,其中spring配置基于xml+注解的方式实现,即数据集采用xml方式的bean配置,而一些service类则采用基于注解的,持久类也采用基于注解的方式实现。

首先是web.xml的配置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7     <welcome-file-list>
 8     <welcome-file>login.jsp</welcome-file>
 9   </welcome-file-list>
10       <context-param>
11         <param-name>log4jConfigLocation</param-name>
12         <param-value>/WEB-INF/log4j.properties</param-value>
13     </context-param>
14     <context-param>
15         <param-name>log4jRefreshInterval</param-name>
16         <param-value>60000</param-value>
17     </context-param>
18     <listener>
19         <listener-class>
20             org.springframework.web.util.Log4jConfigListener
21         </listener-class>
22     </listener>
23 <!-- end -->
24 <!-- 配置spring 默认在WEB-INF下 -->
25 <context-param>
26     <param-name>applicationContext</param-name>
27     <param-value>/WEB-INF/applicationContext.xml</param-value>
28 </context-param>
29 <!-- 声明web容器监听器不支持监听器就用servlet -->
30  <listener>
31         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
32     </listener>
33  <filter>
34       <filter-name>struts2</filter-name>
35       <filter-class>
36           org.apache.struts2.dispatcher.FilterDispatcher
37       </filter-class>
38       <init-param>
39          <param-name>config</param-name>
40          <param-value>struts-default.xml,struts-plugin.xml,../struts.xml</param-value>
41      </init-param>
42   </filter>
43   <filter-mapping>
44       <filter-name>struts2</filter-name>
45       <url-pattern>/*</url-pattern>
46   </filter-mapping>
47     <filter>
48         <filter-name>encodingFilter</filter-name>
49         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
50         <init-param>
51             <param-name>encoding</param-name>
52             <param-value>UTF-8</param-value>
53         </init-param>
54         <init-param>
55             <param-name>forceEncoding</param-name>
56             <param-value>true</param-value>
57         </init-param>
58     </filter>
59     <filter-mapping>
60         <filter-name>encodingFilter</filter-name>
61         <url-pattern>/*</url-pattern>
62     </filter-mapping>
63   </web-app>

注意日志文件的配置必须在spring容器之前,因为spring容器启动需要开启日志文件,25-28行的配置不写也可以系统默认的spring配置文件

applicationContext.xml就在WEB-INF目录下

applicationContext.xml的内容如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4      xmlns:aop="http://www.springframework.org/schema/aop"
5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
6   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
7   <import resource="spring/application-hibernate.xml"/>
8   <import resource="spring/application-bean.xml" />
9 </beans>

可以看出这种分层次的配置可以使结构更加明晰,即集成orm单独写成一个配置,集成其他bean再写成另外的配置,当然因为这里后者采用的是基于注解的方法所以8行配置文件的

内容暂时为空,可以扩展.下面具体看7行文件配置

WEB-INF/spring/application-hibernate.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:aop="http://www.springframework.org/schema/aop"
 6        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
 7        xsi:schemaLocation=" http://www.springframework.org/schema/beans
 8     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 9     http://www.springframework.org/schema/context
10     http://www.springframework.org/schema/context/spring-context-3.0.xsd
11     http://www.springframework.org/schema/tx
12   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
13   http://www.springframework.org/schema/aop
14   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
15   http://www.springframework.org/schema/jee
16   http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"
17   default-autowire="byName" default-lazy-init="true">
18     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
19         <property name="location" value="/WEB-INF/jdbc.properties" />
20     </bean>
21     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
22         <property name="driverClassName" value="${jdbc.driverClassName}"></property>
23         <property name="url" value="${jdbc.url}" />
24         <property name="username" value="${jdbc.username}" />
25         <property name="password" value="${jdbc.password}" />
26     </bean>
27     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
28         <property name="dataSource" ref="dataSource" />
29         <property name="packagesToScan">
30             <list>
31                 <value>com.hrbourse.application.model</value>
32                 <value>com.hrbourse.hr.model</value>
33             </list>
34         </property>
35         <property name="hibernateProperties">
36             <props>
37                 <prop key="hibernate.dialect">
38                     <!-- Oracle org.hibernate.dialect.Oracle10gDialect -->
39                      <!-- MySql--> org.hibernate.dialect.MySQLDialect 
40                 </prop>
41             <!--<prop key="hibernate.hbm2ddl.auto">create</prop> -->
42                 <prop key="hibernate.show_sql">true</prop>
43                 <prop key="hibernate.format_sql">true</prop>
44                 <prop key="hibernate.jdbc.batch_size">30</prop>
45                 <prop key="hibernate.default_batch_fetch_size">30</prop>
46                 <prop key="hibernate.query.substitutions">true 1, false 0</prop>
47                 <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
48                 <prop key="hibernate.cache.use_second_level_cache">true</prop>
49                 <prop key="hibernate.cache.use_query_cache">true</prop>
50                 <prop key="hibernate.cache.configurationResourceName">/WEB-INF/ehcache.xml</prop>
51             </props>
52         </property>
53     </bean>
54     <!--Hibernate TransactionManager -->
55     <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
56         <property name="sessionFactory" ref="sessionFactory" />
57     </bean>
58     <tx:annotation-driven transaction-manager="transactionManager"/>
59     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
60         <property name="dataSource" ref="dataSource"></property>
61     </bean>
62     
63     <!-- 事务增强切面 将com.feiling.dao下以Dao结尾的类纳入事务管理-->
64     <aop:config>
65         <aop:pointcut id="daoMethod" expression="execution(* com.hrbourse.*.dao.*(..))"/>
66         <aop:pointcut id="utilMethod" expression="execution(* com.hrbourse.*.util.*(..))"/>
67         <aop:advisor pointcut-ref="daoMethod" advice-ref="txAdvice"/>
68         <aop:advisor pointcut-ref="utilMethod" advice-ref="txAdvice"/>
69     </aop:config>
70     <!-- 事务增强切面END -->
71     <!-- 事务增强 -->
72     <tx:advice id="txAdvice" transaction-manager="transactionManager">
73         <tx:attributes>
74             <tx:method name="get*" read-only="true" />
75             <tx:method name="add*" rollback-for="Exception"/>
76             <tx:method name="update*"/>
77             <tx:method name="remove*"/>
78             <tx:method name="save*"/>
79         </tx:attributes>
80     </tx:advice>
81     <!-- 事务增强END -->
82 <!--    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">-->
83 <!--        <property name="sessionFactory" ref="sessionFactory"></property>-->
84 <!--    </bean>-->
85     <context:component-scan base-package="com.hrbourse.*" /><!-- 需要扫描的基类包,Spring容器将会扫描这个基类包里的所有类,并从类的注解信息获得 -->
86 </beans>
default-autowire="byName" default-lazy-init="true"开头的这两个配置,一个是自动装配,就是比如你定义的Service类标注了@Service("appupService"),那么你在action调用它的
时候只需要定义private AppupServiceImpl appupService;然后加上set,get方法就能获取这个实现类的对象了,后面的配置则是延迟加载,注意看第18行这里spring从我们额外配置的
/WEB-INF/jdbc.properties文件中读书数据源,这样做无疑可以更方便我们对资源文件的解耦,想改是直接改配置文件就好了其他什么都不动
/WEB-INF/jdbc.properties:
1 #Mysql
2 jdbc.driverClassName=com.mysql.jdbc.Driver
3 jdbc.url=jdbc:mysql://localhost:3306/hrborse
4 jdbc.username=root
5 jdbc.password=root

注意看29-34行,这里是扫描注释了的持久类,这样写在这些包里的每个带注解的持久类就能被使用hibernate注解的一个持久类实例

  1 package com.hrbourse.hr.model;
  2 
  3 import java.util.Date;
  4 import javax.persistence.AttributeOverride;
  5 import javax.persistence.AttributeOverrides;
  6 import javax.persistence.Column;
  7 import javax.persistence.EmbeddedId;
  8 import javax.persistence.Entity;
  9 import javax.persistence.Table;
 10 import javax.persistence.Temporal;
 11 import javax.persistence.TemporalType;
 12 
 13 
 14 @Entity
 15 @Table(name="tb_hr_jobpost"
 16     ,catalog="hrborse"
 17 )
 18 
 19 public class JobPost  implements java.io.Serializable {
 20 
 21 
 22 
 23     private static final long serialVersionUID = 1L;
 24     private JobPostId id;
 25      private String positionnature;
 26      private Integer recruitingnumbers;
 27      private String special;
 28      private String privacy;
 29      private Date publishtime;
 30      private Integer toemploynum;
 31      private Integer positionnum;
 32      private String state;
 33 
 34 
 35 
 36     public JobPost() {
 37     }
 38 
 39     public JobPost(JobPostId id) {
 40         this.id = id;
 41     }
 42     
 43 
 44    
 45     @EmbeddedId
 46     @AttributeOverrides( {
 47         @AttributeOverride(name="id", column=@Column(name="id", nullable=false, length=32) ), 
 48         @AttributeOverride(name="position", column=@Column(name="position", nullable=false, length=32) ) } )
 49 
 50     public JobPostId getId() {
 51         return this.id;
 52     }
 53     
 54     public void setId(JobPostId id) {
 55         this.id = id;
 56     }
 57     
 58     @Column(name="positionnature", length=32)
 59 
 60     public String getPositionnature() {
 61         return this.positionnature;
 62     }
 63     
 64     public void setPositionnature(String positionnature) {
 65         this.positionnature = positionnature;
 66     }
 67     
 68     @Column(name="recruitingnumbers")
 69 
 70     public Integer getRecruitingnumbers() {
 71         return this.recruitingnumbers;
 72     }
 73     
 74     public void setRecruitingnumbers(Integer recruitingnumbers) {
 75         this.recruitingnumbers = recruitingnumbers;
 76     }
 77     
 78     @Column(name="special", length=32)
 79 
 80     public String getSpecial() {
 81         return this.special;
 82     }
 83     
 84     public void setSpecial(String special) {
 85         this.special = special;
 86     }
 87     
 88     @Column(name="privacy", length=32)
 89 
 90     public String getPrivacy() {
 91         return this.privacy;
 92     }
 93     
 94     public void setPrivacy(String privacy) {
 95         this.privacy = privacy;
 96     }
 97     @Temporal(TemporalType.DATE)
 98     @Column(name="publishtime", length=10)
 99 
100     public Date getPublishtime() {
101         return this.publishtime;
102     }
103     
104     public void setPublishtime(Date publishtime) {
105         this.publishtime = publishtime;
106     }
107     
108     @Column(name="toemploynum")
109 
110     public Integer getToemploynum() {
111         return this.toemploynum;
112     }
113     
114     public void setToemploynum(Integer toemploynum) {
115         this.toemploynum = toemploynum;
116     }
117     
118     @Column(name="positionnum")
119 
120     public Integer getPositionnum() {
121         return this.positionnum;
122     }
123     
124     public void setPositionnum(Integer positionnum) {
125         this.positionnum = positionnum;
126     }
127     
128     @Column(name="state", length=32)
129 
130     public String getState() {
131         return this.state;
132     }
133     
134     public void setState(String state) {
135         this.state = state;
136     }
137     
138    
139 
140 
141 
142 
143 
144 
145 
146 
147 }

这样写就不必在写那么一大堆配置文件,然后还回到我们的application-hibernate.xml的配置文件85行这里的作用是让spring容器扫描这个路径包含的注解了的实体类,将他们注册到spring容器中以便以后谁用就给谁,实现我们的反转控制或者说依赖注入.关于事务方面小弟也一知半解,希望高人在此指点,感激不尽




posted @ 2013-02-06 12:17  塔塔兔  阅读(223)  评论(0编辑  收藏  举报