記錄一下spring+struts+mybatis搭建項目。
目錄:
mybatis-config.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 3 <configuration> 4 <!-- 配置全局屬性 --> 5 <settings> 6 <!-- 使用jdbc的getGeneratedKeys獲取數據庫自增主鍵值 --> 7 <setting name="useGeneratedKeys" value="true" /> 8 9 <!-- 使用列別名替換列名 默認:true --> 10 <setting name="useColumnLabel" value="true" /> 11 12 <!-- 開啟駝峰命名轉換:Table{create_time} -> Entity{createTime} --> 13 <setting name="mapUnderscoreToCamelCase" value="true" /> 14 </settings> 15 16 <plugins> 17 <plugin interceptor="com.github.pagehelper.PageHelper"> 18 <property name="dialect" value="mysql" /> 19 <property name="offsetAsPageNum" value="false" /> 20 <property name="rowBoundsWithCount" value="false" /> 21 <property name="pageSizeZero" value="true" /> 22 <property name="reasonable" value="false" /> 23 <property name="supportMethodsArguments" value="false" /> 24 <property name="returnPageInfo" value="none" /> 25 </plugin> 26 </plugins> 27 </configuration>
spring-context.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" 5 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-4.3.xsd 10 http://www.springframework.org/schema/tx 11 http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 12 http://www.springframework.org/schema/aop 13 http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 14 http://www.springframework.org/schema/mvc 15 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 16 http://www.springframework.org/schema/cache 17 http://www.springframework.org/schema/cache/spring-cache-4.1.xsd"> 18 19 20 <context:annotation-config /> 21 <!-- 接口代理 --> 22 <aop:aspectj-autoproxy proxy-target-class="true" /> 23 24 <!-- 配置文件 --> 25 <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true"/> 26 27 <!-- 掃描路徑 --> 28 <context:component-scan base-package="org.ss2mm.*" /> 29 30 <!-- 數據庫配置 --> 31 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 32 init-method="init" destroy-method="close"> 33 <!-- 基本屬性 url、user、password --> 34 <property name="url" value="${jdbc.url}" /> 35 <property name="username" value="${jdbc.username}" /> 36 <property name="password" value="${jdbc.password}" /> 37 <!-- 配置初始化大小、最小、最大 --> 38 <property name="initialSize" value="${jdbc.initialSize}" /> 39 <property name="minIdle" value="${jdbc.minIdle}" /> 40 <property name="maxActive" value="${jdbc.maxActive}" /> 41 <!-- 配置獲取連接等待超時的時間 --> 42 <property name="maxWait" value="${jdbc.maxWait}" /> 43 <!-- 要啟用PSCache,PSCache對支持游標的數據庫性能提升巨大,比如說oracle,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。 --> 44 <property name="maxOpenPreparedStatements" value="${jdbc.maxOpenPreparedStatements}" /> 45 <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> 46 <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" /> 47 <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> 48 <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" /> 49 <!-- 用來檢測連接是否有效的sql,要求是一個查詢語句 --> 50 <property name="validationQuery" value="${jdbc.validationQuery}" /> 51 <!-- 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測, 如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效 --> 52 <property name="testWhileIdle" value="${jdbc.testWhileIdle}" /> 53 <property name="testOnBorrow" value="${jdbc.testOnBorrow}" /> 54 <property name="testOnReturn" value="${jdbc.testOnReturn}" /> 55 <!-- 配置監控統計攔截的filters --> 56 <property name="filters" value="${jdbc.filters}" /> 57 <!-- 密碼加密 --> 58 <property name="connectionProperties" value="${jdbc.connectionProperties}" /> 59 </bean> 60 61 <bean id="transactionManager" 62 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 63 <property name="dataSource" ref="dataSource" /> 64 </bean> 65 66 <!--使用注解事務管理 --> 67 <tx:annotation-driven transaction-manager="transactionManager" /> 68 69 <!-- 配置SqlSessionFactory對象 --> 70 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 71 <!-- 注入數據庫連接池 --> 72 <property name="dataSource" ref="dataSource" /> 73 <!-- 配置MyBaties全局配置文件:mybatis-config.xml --> 74 <property name="configLocation" value="classpath:mybatis-config.xml" /> 75 <!-- 掃描entity包 使用別名 --> 76 <property name="typeAliasesPackage" value="com.soecode.lyf.entity" /> 77 <!-- 掃描sql配置文件:mapper需要的xml文件 --> 78 <property name="mapperLocations" value="org.ss2mm.dao.*.xml" /> 79 </bean> 80 81 <!-- 配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中 --> 82 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 83 <!-- 注入sqlSessionFactory --> 84 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 85 <!-- 給出需要掃描Dao接口包 --> 86 <property name="basePackage" value="org.ss2mm.dao" /> 87 </bean> 88 89 </beans>
struts.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 <struts> 6 7 <!-- 指定由spring負責action對象的創建 --> 8 <constant name="struts.objectFactory" value="spring"></constant> 9 <!-- 所有匹配*.action的請求都有struts2處理 --> 10 <constant name="struts.action.extension" value="action"></constant> 11 <!-- 是否應用開發模式 --> 12 <constant name="struts.devMode" value="true"></constant> 13 <!-- struts配置文件改動后是否重新加載,2.3.14之前的版本有效 --> 14 <constant name="struts.configuration.xml.reload" value="true"></constant> 15 <!-- 設置瀏覽器是否緩存靜態內容,生產環境中可設置為true --> 16 <constant name="struts.serve.static.browserCache" value="false"></constant> 17 <!-- 請求參數的編碼方式 --> 18 <constant name="struts.i18n.encoding" value="UTF-8"></constant> 19 <!-- 每次HTTP請求都重新加載系統資源,有助於開發--> 20 <constant name="struts.i18n.reload" value="true"></constant> 21 <!-- 文件上傳最大值 --> 22 <constant name="struts.multipart.maxSize" value="104857600"></constant> 23 <!-- 讓struts2支持動態方法調用 --> 24 <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> 25 <!-- action名稱中是否還是用斜線--> 26 <constant name="struts.enable.SlashesInActionNames" value="false"></constant> 27 <!-- 允許標簽中使用表達式語法--> 28 <constant name="struts.tag.Syntax" value="true"></constant> 29 <!-- 對於WebLogic,Orion,OC4J此屬性設置為true--> 30 <constant name="struts.dispather.parametersWorkaroud" value="false"></constant> 31 <!-- 自動注入 --> 32 <constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" /> 33 <!-- package name="spring-default" extends="struts-default,json-default"> 34 <interceptors> 35 <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> 36 </interceptors> 37 </package> --> 38 </struts>
CommonAction:
1 package org.ss2mm.action; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import javax.annotation.Resource; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import org.apache.struts2.ServletActionContext; 11 import org.apache.struts2.convention.annotation.Action; 12 import org.apache.struts2.convention.annotation.Namespace; 13 import org.apache.struts2.convention.annotation.ParentPackage; 14 import org.apache.struts2.convention.annotation.Result; 15 import org.springframework.context.annotation.Scope; 16 import org.springframework.stereotype.Controller; 17 import org.ss2mm.code.RequestCode; 18 import org.ss2mm.service.CommonService; 19 import com.alibaba.fastjson.JSON; 20 import com.opensymphony.xwork2.ActionSupport; 21 @Controller 22 @Scope("prototype") 23 @ParentPackage("json-default") 24 @Namespace("/") 25 public class CommonAction extends ActionSupport{ 26 27 private static final long serialVersionUID = 1L; 28 29 @Resource(name = "commonServiceImp") 30 private CommonService commonServiceImp; 31 32 private RequestCode requestCode; 33 34 private String data; 35 36 @SuppressWarnings("unchecked") 37 @Action(value = "common",results = {@Result(name="success",type = "json",params = {"root","requestCode"})}) 38 public String getAll() { 39 Map<String, Object> where = (Map<String, Object>) JSON.parse(data); 40 List<Map<String, Object>> list = commonServiceImp.getAll(where); 41 requestCode = new RequestCode(); 42 requestCode.setCode(1); 43 requestCode.setData(list); 44 requestCode.setMsg(ActionSupport.SUCCESS); 45 setCrossDomain(); 46 return ActionSupport.SUCCESS; 47 } 48 49 public RequestCode getRequestCode() { 50 return requestCode; 51 } 52 53 public void setRequestCode(RequestCode requestCode) { 54 this.requestCode = requestCode; 55 } 56 57 public String getData() { 58 return data; 59 } 60 61 public void setData(String data) { 62 this.data = data; 63 } 64 65 protected HttpServletRequest getHttpRequest(){ 66 return ServletActionContext.getRequest(); 67 } 68 69 protected HttpServletResponse getHttpResponse(){ 70 return ServletActionContext.getResponse(); 71 } 72 73 protected void setCrossDomain() { 74 getHttpResponse().setHeader("Access-Control-Allow-Origin", getHttpRequest().getHeader("Origin")); 75 getHttpResponse().setHeader("Access-Control-Allow-Credentials", "true"); 76 } 77 }
RequestCode:
1 package org.ss2mm.code; 2 3 import org.apache.struts2.json.annotations.JSON; 4 5 public class RequestCode { 6 7 private Object data; 8 private int code; 9 private String msg; 10 11 public RequestCode() { 12 super(); 13 } 14 public RequestCode(Object data, int code, String msg) { 15 super(); 16 this.data = data; 17 this.code = code; 18 this.msg = msg; 19 } 20 @JSON 21 public Object getData() { 22 return data; 23 } 24 25 public void setData(Object data) { 26 this.data = data; 27 } 28 @JSON 29 public int getCode() { 30 return code; 31 } 32 public void setCode(int code) { 33 this.code = code; 34 } 35 @JSON 36 public String getMsg() { 37 return msg; 38 } 39 40 public void setMsg(String msg) { 41 this.msg = msg; 42 } 43 44 @Override 45 public String toString() { 46 return "RequestCode [data=" + data + ", code=" + code + ", msg=" + msg + "]"; 47 } 48 49 50 }
CommonDao:
1 package org.ss2mm.dao; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import org.springframework.stereotype.Repository; 7 8 @Repository 9 public interface CommonDao { 10 11 public List<Map<String, Object>> getAll(Map<String, Object> where); 12 }
CommonDao.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="org.ss2mm.dao.CommonDao"> 4 <select id="getAll" resultType="map" parameterType="map"> 5 SELECT * FROM city limit 10; 6 </select> 7 </mapper>
CommonService:
1 package org.ss2mm.service; 2 3 import java.util.List; 4 import java.util.Map; 5 6 public interface CommonService { 7 8 public List<Map<String, Object>> getAll(Map<String, Object> where); 9 }
CommonServiceImp:
1 package org.ss2mm.service.imp; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.stereotype.Service; 8 import org.ss2mm.dao.CommonDao; 9 import org.ss2mm.service.CommonService; 10 @Service("commonServiceImp") 11 public class CommonServiceImp implements CommonService{ 12 13 @Autowired 14 private CommonDao dao; 15 16 @Override 17 public List<Map<String, Object>> getAll(Map<String, Object> where) { 18 // TODO Auto-generated method stub 19 //業務處理 20 return dao.getAll(where); 21 } 22 23 }
web.xml:
1 <!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5 <web-app> 6 <display-name>SS2MM</display-name> 7 8 <!-- struts2 --> 9 <filter> 10 <filter-name>struts2</filter-name> 11 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 12 </filter> 13 <filter-mapping> 14 <filter-name>struts2</filter-name> 15 <url-pattern>/*</url-pattern> 16 </filter-mapping> 17 18 <!-- 指定Spring配置文件所在路徑 --> 19 <context-param> 20 <param-name>contextConfigLocation</param-name> 21 <param-value>classpath:spring-context.xml</param-value> 22 </context-param> 23 <!-- 配置Spring的監聽器 --> 24 <listener> 25 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 26 </listener> 27 </web-app>
index.html:
1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6 <title>Spring_Struts_Mybatis_Maven_HTML_TEST_PAGE</title> 7 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> 8 </head> 9 10 <body> 11 <h2>Spring_Struts_Mybatis_Maven_HTML_TEST_PAGE</h2> 12 </body> 13 14 </html> 15 <script type="text/javascript"> 16 $(function() { 17 $.ajax({ 18 type: 'post', 19 url: "/SS2MM/common!getAll.action", 20 data: {data:JSON.stringify({str:"123"})}, 21 async: true, 22 cache: false, 23 success: function(data) { 24 console.log(data); 25 }, 26 crossDomain: true, 27 xhrFields: { 28 withCredentials: true 29 } 30 }); 31 }) 32 </script>
pom.xml:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>Spring_Struts_Mybatis_Maven</groupId> 5 <artifactId>SS2MM</artifactId> 6 <packaging>war</packaging> 7 <version>0.0.1-SNAPSHOT</version> 8 <name>SS2MM Maven Webapp</name> 9 <url>http://maven.apache.org</url> 10 <properties> 11 <java.version>1.8</java.version> 12 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 13 <junit.version>4.12</junit.version> 14 <ch.qos.logback>1.1.7</ch.qos.logback> 15 <fastjson_version>1.2.37</fastjson_version> 16 <org.springframework.version>4.3.16.RELEASE</org.springframework.version> 17 <org.aspectj.aspectjweaver>1.8.7</org.aspectj.aspectjweaver> 18 <org.aspectj.aspectjrt>1.8.7</org.aspectj.aspectjrt> 19 <com.alibaba.druid>1.0.29</com.alibaba.druid> 20 <javax.servlet>3.1.0</javax.servlet> 21 <org.apache.maven.plugins>2.6</org.apache.maven.plugins> 22 <struts.version>2.3.20</struts.version> 23 </properties> 24 <dependencies> 25 <!-- 單元測試 --> 26 <dependency> 27 <groupId>junit</groupId> 28 <artifactId>junit</artifactId> 29 <version>${junit.version}</version> 30 <scope>test</scope> 31 </dependency> 32 <!-- 日志 --> 33 <dependency> 34 <groupId>ch.qos.logback</groupId> 35 <artifactId>logback-classic</artifactId> 36 <version>${ch.qos.logback}</version> 37 </dependency> 38 39 <!-- json --> 40 <dependency> 41 <groupId>com.alibaba</groupId> 42 <artifactId>fastjson</artifactId> 43 <version>${fastjson_version}</version> 44 </dependency> 45 <!-- Spring 核心依賴 --> 46 <dependency> 47 <groupId>org.springframework</groupId> 48 <artifactId>spring-core</artifactId> 49 <version>${org.springframework.version}</version> 50 </dependency> 51 <dependency> 52 <groupId>org.springframework</groupId> 53 <artifactId>spring-context</artifactId> 54 <version>${org.springframework.version}</version> 55 </dependency> 56 <dependency> 57 <groupId>org.springframework</groupId> 58 <artifactId>spring-context-support</artifactId> 59 <version>${org.springframework.version}</version> 60 </dependency> 61 <dependency> 62 <groupId>org.springframework</groupId> 63 <artifactId>spring-test</artifactId> 64 <version>${org.springframework.version}</version> 65 </dependency> 66 <dependency> 67 <groupId>org.springframework</groupId> 68 <artifactId>spring-jdbc</artifactId> 69 <version>${org.springframework.version}</version> 70 </dependency> 71 <dependency> 72 <groupId>org.springframework</groupId> 73 <artifactId>spring-web</artifactId> 74 <version>${org.springframework.version}</version> 75 </dependency> 76 <!-- Struts2和Spring整合依賴 --> 77 <dependency> 78 <groupId>org.apache.struts</groupId> 79 <artifactId>struts2-spring-plugin</artifactId> 80 <version>2.3.20</version> 81 </dependency> 82 <dependency> 83 <groupId>org.apache.struts</groupId> 84 <artifactId>struts2-json-plugin</artifactId> 85 <version>2.3.20</version> 86 </dependency> 87 <dependency> 88 <groupId>org.apache.struts</groupId> 89 <artifactId>struts2-convention-plugin</artifactId> 90 <version>2.3.20</version> 91 </dependency> 92 <dependency> 93 <groupId>org.apache.struts</groupId> 94 <artifactId>struts2-core</artifactId> 95 <version>2.3.20</version> 96 </dependency> 97 <!-- spring與mybatis整合 --> 98 <dependency> 99 <groupId>org.mybatis</groupId> 100 <artifactId>mybatis</artifactId> 101 <version>3.3.1</version> 102 </dependency> 103 <dependency> 104 <groupId>org.mybatis</groupId> 105 <artifactId>mybatis-spring</artifactId> 106 <version>1.2.5</version> 107 </dependency> 108 <!-- 代理 --> 109 <dependency> 110 <groupId>org.aspectj</groupId> 111 <artifactId>aspectjrt</artifactId> 112 <version>${org.aspectj.aspectjrt}</version> 113 </dependency> 114 <dependency> 115 <groupId>org.aspectj</groupId> 116 <artifactId>aspectjweaver</artifactId> 117 <version>${org.aspectj.aspectjweaver}</version> 118 </dependency> 119 <!-- alibaba --> 120 <dependency> 121 <groupId>com.alibaba</groupId> 122 <artifactId>druid</artifactId> 123 <version>${com.alibaba.druid}</version> 124 </dependency> 125 <dependency> 126 <groupId>org.mariadb.jdbc</groupId> 127 <artifactId>mariadb-java-client</artifactId> 128 <version>1.5.9</version> 129 </dependency> 130 <!-- servlet --> 131 <dependency> 132 <groupId>javax.servlet</groupId> 133 <artifactId>javax.servlet-api</artifactId> 134 <version>${javax.servlet}</version> 135 <scope>provided</scope> 136 </dependency> 137 <!-- 分頁插件 --> 138 <dependency> 139 <groupId>com.github.pagehelper</groupId> 140 <artifactId>pagehelper</artifactId> 141 <version>4.1.4</version> 142 </dependency> 143 </dependencies> 144 <build> 145 <finalName>SS2MM</finalName> 146 <plugins> 147 <plugin> 148 <groupId>org.apache.maven.plugins</groupId> 149 <artifactId>maven-compiler-plugin</artifactId> 150 <version>3.1</version> 151 <configuration> 152 <source>${java.version}</source> 153 <target>${java.version}</target> 154 <encoding>${project.build.sourceEncoding}</encoding> 155 </configuration> 156 </plugin> 157 <!-- 打包時跳過單元測試 --> 158 <plugin> 159 <groupId>org.apache.maven.plugins</groupId> 160 <artifactId>maven-surefire-plugin</artifactId> 161 <version>2.19.1</version> 162 <configuration> 163 <skipTests>true</skipTests> 164 </configuration> 165 </plugin> 166 <!-- 不同環境的配置文件選擇 --> 167 <plugin> 168 <groupId>org.apache.maven.plugins</groupId> 169 <artifactId>maven-resources-plugin</artifactId> 170 <version>${org.apache.maven.plugins}</version> 171 <executions> 172 <execution> 173 <id>copy-resources</id> 174 <phase>compile</phase> 175 <goals> 176 <goal>copy-resources</goal> 177 </goals> 178 <configuration> 179 <!-- 覆蓋原有文件 --> 180 <overwrite>true</overwrite> 181 <outputDirectory>${project.build.outputDirectory}</outputDirectory> 182 <!-- 也可以用下面這樣的方式(指定相對url的方式指定outputDirectory) <outputDirectory>target/classes</outputDirectory> --> 183 <!-- 待處理的資源定義 --> 184 <resources> 185 <resource> 186 <!-- 指定resources插件處理哪個目錄下的資源文件 --> 187 <directory>src/main/resources/${package.environment}</directory> 188 <filtering>false</filtering> 189 </resource> 190 </resources> 191 </configuration> 192 <inherited></inherited> 193 </execution> 194 </executions> 195 </plugin> 196 </plugins> 197 <resources> 198 <resource> 199 <directory>src/main/java</directory> 200 <includes> 201 <include>**/*.properties</include> 202 <include>**/*.xml</include> 203 </includes> 204 <filtering>true</filtering> 205 </resource> 206 <resource> 207 <directory>src/main/resources</directory> 208 <includes> 209 <include>**/*.properties</include> 210 <include>**/*.xml</include> 211 </includes> 212 <filtering>true</filtering> 213 </resource> 214 </resources> 215 </build> 216 </project>