SSH專案實戰OA-system模組
在成功搭建OA-portal模組後,現在讓我們一鼓作氣完成OA-system模組的SSH整合.
Dao層整合
由於將spring和hibernate整合之後,就不需要hibernate的配置檔案了,所以並不需要在OA-system-dao中新增hibernate.cfg.xml.
下面我們在OA-system-service的src/main/resources目錄下新建一個spring資料夾,然後在該資料夾下新建一個applicationContext-dao.xml檔案,如下圖所示。
我們在applicationContext-dao.xml檔案當中配置資料庫連線池、sessionFactory(hibernate的連線工廠)、實體類掃描器,配置內容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-- 載入配置檔案 --> <context:property-placeholder location="classpath:resource/*.properties"/> <!-- 配置hibernateTemplate,用於持久層 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- hibernate引數設定 --> <property name="hibernateProperties"> <props> <!-- 資料庫方言 --> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <!-- 顯示sql語句--> <prop key="hibernate.show_sql">true</prop> <!-- 格式化SQL語句 --> <prop key="hibernate.format_sql">true</prop> <!-- create:根據對映關係生成表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop> </props> </property> <!-- 使用註解後,用該方式指定實體類的包 --> <property name="packagesToScan"> <array> <value>com.QEcode.OA.pojo</value> </array> </property> </bean> <!-- 資料庫連線池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driver}" /> <property name="maxActive" value="${jdbc.maxActive}" /> <property name="minIdle" value="${jdbc.minIdle}" /> </bean> </beans>
從中可以看到我們配置資料庫連線池配置的是Druid連線池,Druid是目前最好的資料庫連線池,在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,經過多年生產環境大規模部署的嚴苛考驗。
從applicationContext-dao.xml檔案當中還可看出資料庫的配置直接讀取的是配置檔案,因此我們需要在classpath(src/main/resource)目錄下新建一個properties資料夾,然後在該目錄下新建一個db.properties檔案,如下圖所示。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/oa?characterEncoding=utf-8 jdbc.username=root jdbc.password=123456 jdbc.maxActive=10 jdbc.minIdle=5 |
除此之外,我們還要建立一個包com.QEcode.OA.pojo來存放實體類,所以我們應在OA-system- pojo中建立這個包.
並且還要把system工程所需要的實體類貼上到這個包中.
在匯入實體類後發現,實體類都報錯了.
這是因為我們使用註解的方式來配置實體類,所以我們現在要在pom.xml中新增hibernate的依賴.
<dependencies>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
</dependencies>
最後,我們需要在OA-system-service工程中的pom.xml中新增pojo的依賴.現在pom.xml的內容如下.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.QEcode</groupId>
<artifactId>OA-system</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>OA-system-service</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.QEcode</groupId>
<artifactId>OA-system-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.QEcode</groupId>
<artifactId>OA-system-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.QEcode</groupId>
<artifactId>OA-system-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
</project>
Service層整合
我們需要在OA-system-service工程的src/main/resources/spring目錄下新建一個applicationContext-service.xml檔案,如下圖所示。
applicationContext-service.xml檔案的內容如下所示,可以看到我們配置包掃描器,掃描com.QEcode.OA.controller包。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!-- 配置spring容器建立時要掃描的包 -->
<context:component-scan base-package="com.QEcode.OA.service"></context:component-scan>
</beans>
service一般是由介面和實現類組成,因此我們需要先新建介面所在的目錄,我們把它放在OA-system-interface工程下,介面的實現類放在OA-system-service工程下,我們在OA-system-interface工程的src/main/java目錄下新建com.QEcode.OA.service包,在OA-system-service工程的src/main/java目錄下新建com.QEcode.OA.service.impl包,如下圖所示。
service需要配置事務,以確保資料的安全性,下面我們來配置事務,由於我們把hibernate與spring整合,所以事務也交給spring管理,使用spring的AOP來配置事務.在OA-system-service工程的src/main/resources/spring目錄下新建applicationContext-trans.xml檔案
applicationContext-trans.xml檔案的內容如下所示。其中事務的傳播行為需要說明一下,當介面名以save、insert、add、create、delete、upate開頭時spring會幫我們開啟事務,REQUIRED表示如果當前session有事務則加入,如果沒有則建立一個事務,而find、select、get開頭的介面是查詢,不涉及更改資料庫,因此設為real-only。下面再說說切面,也就是事務的作用範圍,execution(* com.QEcode.OA.service.*.*(..))的意思是,com.QEcode.OA.service包下的任意類的任意方法的任意引數及任意返回值都是事務的切入點。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 傳播行為 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.QEcode.OA.service.*.*(..))" />
</aop:config>
</beans>
在配置完以上spring配置檔案後,不要忘了要在web.xml總配置監聽器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>OA-system-service</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 載入spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
至此,我們的Service層便整合完了.最後一個要整合的就是表現層了.
表現層整合
我們在OA-system-web工程的src/main/resource目錄下新建一個spring資料夾,在該目錄下新建一個applicationContext-web.xml檔案,如下圖所示。
檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<context:component-scan base-package="com.QEcode.OA.controller" />
</beans>
此外還需要在src/main/resource目錄下新建一個struts目錄,在該目錄下新建struts.xml檔案.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置Struts2常量 -->
<!-- 禁用動態方法呼叫 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!-- 開啟開發模式,只在專案開發階段配置 -->
<constant name="struts.devMode" value="true" />
<!-- 配置訪問字尾為action -->
<constant name="struts.action.extension" value="action"/>
<!-- 把主題配置成simple -->
<constant name="struts.ui.theme" value="simple" />
</struts>
現在將jsp頁面匯入OA-system-web工程中.
上面所有的jsp頁面都可以在我的github專案下載
下面我們需要在OA-system-web工程下的web.xml檔案中配置一下編碼和前端控制器,web.xml檔案的配置內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>OA-system-web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 解決post亂碼 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 載入spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- struts2的核心過濾器 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,struts/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
至此,OA-system工程已經整合完畢了,不過還有一件事,那就是配置Tomcat.而且不僅OA-system-web需要釋出到Tomcat中,OA-system-service也需要釋出到Tomcat中,如果不知道如何配置Tomcat的可以參考上一篇部落格:
SSH專案實戰OA-搭建portal工程
新增兩個Tomcat ,OA-system-service,OA-system-web
記錄Tomcat的埠
===============================================================================================
在寫部落格的時候,可能在專案中有一些問題沒有被發現,在我修改後,忘記寫到部落格上,所以我將這個專案上傳到github上,大家可以在github上獲取專案的程式碼
下面是github地址,大家Fork and Star