簡單的SSM(Spring+SpringMVC+Mybatis)專案搭建
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三個開源框架整合而成,常作為資料來源較簡單的web專案的框架。
spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
SpringMVC分離了控制器、模型物件、分派器以及處理程式物件的角色,這種分離讓它們更容易進行定製。
MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。
頁面傳送請求給控制器,控制器呼叫業務層處理邏輯,邏輯層向持久層傳送請求,持久層與資料庫互動,後將結果返回給業務層,業務層將處理邏輯傳送給控制器,控制器再呼叫檢視展現資料。
1.首先新建一個Maven的專案
開啟Eclipse,右鍵new—>other,如下圖找到maven project點選next。
專案建立完成。以下是專案結構:
此時pom.xml檔案報錯,檢視原因:
解決方法:右鍵Deployment Descriptor:toolapi 選擇Generate Deployment Descriptor Stub
問題解決,你會發現目錄中webapp下多了web.xml檔案。如下圖:
2.修改pom.xml檔案,加入Spring,SpringMVC,MyBatis的依賴。
如果複製貼上記得替換自己的專案名等資訊。可以全域性替換,搜尋com.mgkj.toolapi,toolapi 全域性替換成相應的名稱。
以下是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> <groupId>com.mgkj.toolapi</groupId> <artifactId>toolapi</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <url>http://maven.apache.org</url> <properties> <!-- spring版本號 --> <spring.version>4.3.6.RELEASE</spring.version> <!-- mybatis版本號 --> <mybatis.version>3.4.2</mybatis.version> <!-- log4j日誌檔案管理包版本 --> <slf4j.version>1.7.22</slf4j.version> <log4j.version>1.2.17</log4j.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>nexus-repository</id> <name>MavenMirror</name> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>java</id> <name>java official repository</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories> <!-- 配置部署的遠端倉庫 --> <distributionManagement> <snapshotRepository> <id>nexus-snapshots</id> <name>nexus distribution snapshot repository</name> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> </snapshotRepository> </distributionManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- 表示開發的時候引入,釋出的時候不會載入此包 --> <scope>test</scope> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0.pr2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0.pr2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0.pr2</version> </dependency> <!-- spring核心包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis/spring包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- 匯入Mysql資料庫連結jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.28</version> </dependency> <!-- 匯入dbcp的jar包,用來在applicationContext.xml中配置資料庫 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!-- Redis 相關依賴 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.0.RELEASE</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <!-- JSTL標籤類 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 日誌檔案管理包 --> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- 格式化物件,方便輸出日誌 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <!-- 映入JSON --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <!-- 上傳元件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.25-incubating</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0-b05</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.2-b02</version> </dependency> <dependency> <version>2.0.0.Alpha1</version> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <version>5.4.0.Final</version> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20140107</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency> <!-- dubbo整合 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <!--去除引入的spring --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <!-- https://mvnrepository.com/artifact/com.opensymphony/xwork --> <dependency> <groupId>com.opensymphony</groupId> <artifactId>xwork</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl --> <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6.12</version> </dependency> <!-- https://mvnrepository.com/artifact/io.netty/netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> <version>3.10.5.Final</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.20.0-GA</version> </dependency> <dependency> <artifactId>ehcache</artifactId> <groupId>net.sf.ehcache</groupId> <version>2.7.2</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2.2</version> </dependency> </dependencies> <build> <finalName>tool</finalName> <defaultGoal>compile</defaultGoal> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> <compilerArguments> <extdirs>src\main\webapp\WEB-INF\lib</extdirs> </compilerArguments> </configuration> </plugin> </plugins> </build> </project>
3.新增好專案依賴後,專案報錯:解決方法, 右鍵專案,選擇Maven->Update project
4.新增專案配置檔案,在src/main/resources中新增一些必要配置檔案。如果貼上程式碼請改自己對應的專案名。
4.1 httpclient.properties
http.maxTotal=200
http.defaultMaxPerRoute=50
http.connectTimeout=5000
http.connectionRequestTimeout=500
http.socketTimeout=30000
http.staleConnectionCheckEnabled=true
4.2 jdbc.properties
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url1=此處填寫連結資料庫ip地址+埠號
jdbc_url3=?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc_username=此處是連結資料庫使用者名稱
jdbc_password=此處是連結資料庫密碼
jdbc_initialSize=1
jdbc_maxActive=20
jdbc_maxIdle=5
jdbc_minIdle=1
jdbc_maxWait=10000
4.3 log4j.properties
log4j.rootLogger=DEBUG,Console,File
log4j.logger.org.apache.shiro=DEBUG
log4j.logger.net.sf.ehcache=DEBUG
log4j.logger.org.apache.test=DEBUG
log4j.logger.org.springframework=DEBUG
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]%m%n
log4j.appender.File=org.apache.log4j.RollingFileAppender
log4j.appender.File.File=E:\\gcx_tool_api.log
log4j.appender.File.MaxFileSize=10MB
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
4.4 param.properties
project_name=tool
4.5 spring-httpclient.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
">
<!-- 定義連線管理器 -->
<bean id="httpClientConnectionManager"
class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager"
destroy-method="close">
<!-- 最大連線數 -->
<property name="maxTotal" value="${http.maxTotal}" />
<!-- 設定每個主機地址的併發數 -->
<property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}" />
</bean>
<!-- httpclient物件構建器 -->
<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
<!-- 設定連線管理器 -->
<property name="connectionManager" ref="httpClientConnectionManager" />
</bean>
<!-- 定義Httpclient物件 -->
<bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient"
factory-bean="httpClientBuilder" factory-method="build" scope="prototype">
</bean>
<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
<!-- 建立連線的最長時間 -->
<property name="connectTimeout" value="${http.connectTimeout}" />
<!-- 從連線池中獲取到連線的最長時間 -->
<property name="connectionRequestTimeout" value="${http.connectionRequestTimeout}" />
<!-- 資料傳輸的最長時間 -->
<property name="socketTimeout" value="${http.socketTimeout}" />
<!-- 提交請求前測試連線是否可用 -->
<property name="staleConnectionCheckEnabled" value="${http.staleConnectionCheckEnabled}" />
</bean>
<!-- 定義請求引數 -->
<bean id="requestConfig" class="org.apache.http.client.config.RequestConfig"
factory-bean="requestConfigBuilder" factory-method="build">
</bean>
</beans>
4.6 spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:property-placeholder location="classpath:param.properties" />
<mvc:annotation-driven />
<!-- <mvc:annotation-driven validator="validator" /> -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 通知spring容器通過註解的方式裝配bean -->
<context:annotation-config />
<!-- 自動掃描該包,使SpringMVC認為包下用了@controller註解的類是控制器 -->
<context:component-scan base-package="com.mgkj.tool.controller" />
<!--避免IE執行AJAX時,返回JSON出現下載檔案 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 啟動SpringMVC的註解功能,完成請求和註解POJO的對映 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON轉換器 -->
</list>
</property>
</bean>
<!-- 攔截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.mgkj.tool.inter.LogInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 定義跳轉的檔案的前後綴 ,檢視模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 這裡的配置我的理解是自動給後面action的方法return的字串加上字首和字尾,變成一個 可用的url地址 -->
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置檔案上傳,如果沒有使用檔案上傳可以不用配置,當然如果不配,那麼配置檔案中也不必引入上傳元件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 預設編碼 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 檔案大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 記憶體中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
</beans>
4.7 spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc_driverClassName}" />
<property name="url" value="${jdbc_url1}${project_name}${jdbc_url3}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
<!-- 初始化連線大小 -->
<property name="initialSize" value="${jdbc_initialSize}"></property>
<!-- 連線池最大數量 -->
<property name="maxActive" value="${jdbc_maxActive}"></property>
<!-- 連線池最大空閒 -->
<property name="maxIdle" value="${jdbc_maxIdle}"></property>
<!-- 連線池最小空閒 -->
<property name="minIdle" value="${jdbc_minIdle}"></property>
<!-- 獲取連線最大等待時間 -->
<property name="maxWait" value="${jdbc_maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置對映檔案 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自動掃描mapping.xml檔案 -->
<property name="mapperLocations"
value="classpath:com/mgkj/${project_name}/mapping/*.xml"></property>
</bean>
<!-- DAO介面所在包名,Spring會自動查詢其下的類 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mgkj.*.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
4.8 spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.3.xsd">
<!-- 引入屬性檔案 -->
<context:property-placeholder
location="classpath:jdbc.properties,classpath:param.properties,classpath:httpclient.properties" />
<import resource="spring-mybatis.xml" />
<!-- 自動掃描(自動注入) -->
<context:component-scan base-package="com.mgkj.*.service..*" />
<!-- 引入httpclient配置 -->
<import resource="spring-httpclient.xml" />
<!-- 引入任務排程器 -->
<task:annotation-driven/>
</beans>
新增完成:
5.建立專案結構目錄
6.配置web.xml 如果複製程式碼,請改對應的專案名稱
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>toolapi</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml;classpath:spring-mybatis.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.liveBeansView.mbeanDomain</param-name>
<param-value>dev</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
</web-app>
7.專案配置完成,下面建立資料庫,新建一張資料庫表:案例中資料庫名稱為tool,表名為SGM_TEST
以下是建表語句,包含三條測試資料:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `SGM_TEST`
-- ----------------------------
DROP TABLE IF EXISTS `SGM_TEST`;
CREATE TABLE `SGM_TEST` (
`ID` int(50) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增ID',
`INSERT_TIME` datetime DEFAULT NULL,
`PUBLISH_TIME` datetime DEFAULT NULL,
`SQFB_TIME` datetime DEFAULT NULL,
`SJFS_TIME` datetime DEFAULT NULL,
`DELETE_FLAG` int(1) DEFAULT '0',
`STATE` int(10) DEFAULT '0',
`TITLE` varchar(255) DEFAULT NULL,
`PROVINCE` varchar(255) DEFAULT NULL,
`PROVINCE_ID` varchar(255) DEFAULT NULL,
`CITY` varchar(255) DEFAULT NULL,
`CITY_ID` varchar(255) DEFAULT NULL,
`TYPE` varchar(255) DEFAULT NULL,
`CLASSIFY` varchar(255) DEFAULT NULL,
`LAIYUAN` varchar(255) DEFAULT NULL,
`CONTENT` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Records of SGM_TEST
-- ----------------------------
INSERT INTO `SGM_TEST` VALUES ('12', '2018-08-09 13:38:10', null, null, '2018-08-09 00:00:00', '0', '0', '標題測試1', '吉林省', null, '長春市', null, '文章型別測試1', '內容分類測試1', '來源測試1', '內容測試1');
INSERT INTO `SGM_TEST` VALUES ('14', '2018-08-09 13:38:11', null, null, '2018-08-11 00:00:00', '0', '0', '標題測試3', '四川省', null, '攀枝花市', null, '文章型別測試3', '內容分類測試3', '來源測試3', '內容測試3');
INSERT INTO `SGM_TEST` VALUES ('15', '2018-08-09 13:38:11', null, null, '2018-08-12 00:00:00', '0', '0', '標題測試4', '吉林省', null, '圖們市', null, '文章型別測試4', '內容分類測試4', '來源測試4', '內容測試4');
8.完成測試介面:
8.1 以下是測試介面所有檔案結構:
8.2 SgmTestController
package com.mgkj.tool.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mgkj.tool.service.SgmTestService;
import com.mgkj.tool.service.util.MyResult;
/**
* @author sunguimin
* @version 建立時間:2018-08-10 16:21:37
*/
@Controller
@RequestMapping("sgmTestController")
public class SgmTestController {
@Autowired
SgmTestService sgmTestService;
//前臺展示
@RequestMapping("showList")
@ResponseBody
public MyResult<Object> showList(HttpServletRequest request,HttpServletResponse response){
MyResult<Object> result = sgmTestService.showList(request,response);
return result;
}
}
8.3 SgmTestMapper
package com.mgkj.tool.dao;
import java.util.List;
import com.mgkj.tool.model.SgmTest;
public interface SgmTestMapper{
List<SgmTest> findByRecord();
}
8.4 LogInterceptor
package com.mgkj.tool.inter;
import java.io.IOException;
/**
* @author Min
* @version 建立時間:2017年7月4日 上午11:53:14
* 類說明:
*/
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
//import com.mgkj.tool.service.impl.CommonImpl;
import com.mgkj.tool.service.impl.HttpClientService;
//import com.mgkj.tool.service.util.User;
import com.mgkj.tool.util.UUIDUtils;
public class LogInterceptor /*extends CommonImpl*/ implements HandlerInterceptor {
private final Logger log = LoggerFactory.getLogger(getClass().getName());
private static final ThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("ThreadLocal StartTime");
@Value("${project_name}")
String project_name;
@Autowired
HttpClientService httpClientService;
/**
* 預處理
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long beginTime = System.currentTimeMillis(); //開始時間
startTimeThreadLocal.set(beginTime); //執行緒繫結變數(該資料只有當前請求的執行緒可見)
log.info("開始計時: {}", new SimpleDateFormat("hh:mm:ss.SSS").format(beginTime));
return true;
}
/**
* 返回處理
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (modelAndView != null){
log.info("ViewName: " + modelAndView.getViewName());
}
}
/**
* 後處理
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//輸出日誌資訊
log.info("訪問地址:" + request.getRequestURI() + ",執行方式:" + request.getMethod());
long beginTime = startTimeThreadLocal.get(); //得到執行緒繫結的區域性變數(開始時間)
long endTime = System.currentTimeMillis(); //結束時間
log.info("計時結束:{}", new SimpleDateFormat("hh:mm:ss.SSS").format(endTime));
// 儲存日誌
//獲取請求引數
Map<String, Object> map = new HashMap<>();
Enumeration<String> keys = request.getParameterNames();
while(keys.hasMoreElements()) {
String k = keys.nextElement();
String v = request.getParameter(k);
map.put(k, v);
}
String json = JSON.toJSONString(map);
//請求的IP
String ip = request.getRemoteAddr();
//使用者
//User user = getUser(request, response);
Map<String, String> params = new HashMap<String, String>();
params.put("id", UUIDUtils.createUuid());
params.put("logSystem", project_name);
params.put("logIp", ip);
params.put("logUri", request.getRequestURI());
params.put("logMethod", request.getMethod());
params.put("logParameters", json);
params.put("logStartTime", beginTime+"");
params.put("logEndTime", endTime+"");
params.put("logUseTime", (endTime - beginTime)+"");
}
}
8.5 SgmTestMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.mgkj.tool.dao.SgmTestMapper">
<resultMap id="BaseResultMap" type="com.mgkj.tool.model.SgmTest">
<id column="ID" property="id" jdbcType="INTEGER" />
<result column="INSERT_TIME" property="insertTime" jdbcType="TIMESTAMP" />
<result column="PUBLISH_TIME" property="publishTime" jdbcType="TIMESTAMP" />
<result column="SQFB_TIME" property="sqfbTime" jdbcType="TIMESTAMP" />
<result column="SJFS_TIME" property="sjfsTime" jdbcType="TIMESTAMP" />
<result column="DELETE_FLAG" property="deleteFlag" jdbcType="INTEGER" />
<result column="STATE" property="state" jdbcType="INTEGER" />
<result column="TITLE" property="title" jdbcType="VARCHAR" />
<result column="PROVINCE" property="province" jdbcType="VARCHAR" />
<result column="PROVINCE_ID" property="provinceId" jdbcType="VARCHAR" />
<result column="CITY" property="city" jdbcType="VARCHAR" />
<result column="CITY_ID" property="cityId" jdbcType="VARCHAR" />
<result column="TYPE" property="type" jdbcType="VARCHAR" />
<result column="CLASSIFY" property="classify" jdbcType="VARCHAR" />
<result column="LAIYUAN" property="laiyuan" jdbcType="VARCHAR" />
<result column="CONTENT" property="content" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List">
ID,
INSERT_TIME,
PUBLISH_TIME,
SQFB_TIME,
SJFS_TIME,
DELETE_FLAG,
STATE,
TITLE,
PROVINCE,
PROVINCE_ID,
CITY,
CITY_ID,
TYPE,
CLASSIFY,
LAIYUAN,
CONTENT
</sql>
<sql id="Common_Where_List">
<if test='record.id != null '>
and ID = #{record.id,jdbcType=INTEGER} </if>
<if test='record.insertTime != null '>
and INSERT_TIME = #{record.insertTime,jdbcType=TIMESTAMP} </if>
<if test='record.publishTime != null '>
and PUBLISH_TIME = #{record.publishTime,jdbcType=TIMESTAMP} </if>
<if test='record.sqfbTime != null '>
and SQFB_TIME = #{record.sqfbTime,jdbcType=TIMESTAMP} </if>
<if test='record.sjfsTime != null '>
and SJFS_TIME = #{record.sjfsTime,jdbcType=TIMESTAMP} </if>
<if test='record.deleteFlag != null '>
and DELETE_FLAG = #{record.deleteFlag,jdbcType=INTEGER} </if>
<if test='record.state != null '>
and STATE = #{record.state,jdbcType=INTEGER} </if>
<if test='record.title != null and record.title != "" '>
and TITLE = #{record.title,jdbcType=VARCHAR} </if>
<if test='record.province != null and record.province != "" '>
and PROVINCE = #{record.province,jdbcType=VARCHAR} </if>
<if test='record.provinceId != null and record.provinceId != "" '>
and PROVINCE_ID = #{record.provinceId,jdbcType=VARCHAR} </if>
<if test='record.city != null and record.city != "" '>
and CITY = #{record.city,jdbcType=VARCHAR} </if>
<if test='record.cityId != null and record.cityId != "" '>
and CITY_ID = #{record.cityId,jdbcType=VARCHAR} </if>
<if test='record.type != null and record.type != "" '>
and TYPE = #{record.type,jdbcType=VARCHAR} </if>
<if test='record.classify != null and record.classify != "" '>
and CLASSIFY = #{record.classify,jdbcType=VARCHAR} </if>
<if test='record.laiyuan != null and record.laiyuan != "" '>
and LAIYUAN = #{record.laiyuan,jdbcType=VARCHAR} </if>
<if test='record.content != null and record.content != "" '>
and CONTENT = #{record.content,jdbcType=VARCHAR} </if>
</sql>
<select id="findByRecord" resultMap="BaseResultMap">
select
<include refid='Base_Column_List' />
from SGM_TEST
</select>
</mapper>
8.6 SgmTest
package com.mgkj.tool.model;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
public class SgmTest {
private Integer id;// 主鍵自增ID
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date insertTime;//
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date publishTime;//
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date sqfbTime;//
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date sjfsTime;//
private Integer deleteFlag;//
private Integer state;//
private String title;//
private String province;//
private String provinceId;//
private String city;//
private String cityId;//
private String type;//
private String classify;//
private String laiyuan;//
private String content;//
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getInsertTime() {
return insertTime;
}
public void setInsertTime(Date insertTime) {
this.insertTime = insertTime;
}
public Date getPublishTime() {
return publishTime;
}
public void setPublishTime(Date publishTime) {
this.publishTime = publishTime;
}
public Date getSqfbTime() {
return sqfbTime;
}
public void setSqfbTime(Date sqfbTime) {
this.sqfbTime = sqfbTime;
}
public Date getSjfsTime() {
return sjfsTime;
}
public void setSjfsTime(Date sjfsTime) {
this.sjfsTime = sjfsTime;
}
public Integer getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Integer deleteFlag) {
this.deleteFlag = deleteFlag;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title == null ? null : title.trim();
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province == null ? null : province.trim();
}
public String getProvinceId() {
return provinceId;
}
public void setProvinceId(String provinceId) {
this.provinceId = provinceId == null ? null : provinceId.trim();
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city == null ? null : city.trim();
}
public String getCityId() {
return cityId;
}
public void setCityId(String cityId) {
this.cityId = cityId == null ? null : cityId.trim();
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type == null ? null : type.trim();
}
public String getClassify() {
return classify;
}
public void setClassify(String classify) {
this.classify = classify == null ? null : classify.trim();
}
public String getLaiyuan() {
return laiyuan;
}
public void setLaiyuan(String laiyuan) {
this.laiyuan = laiyuan == null ? null : laiyuan.trim();
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content == null ? null : content.trim();
}
}
8.7 HttpClientService
package com.mgkj.tool.service.impl;
/**
* @author Min
* @version 建立時間:2017年6月20日 下午2:39:12
* 類說明:
*/
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mgkj.tool.service.util.HttpResult;
@Service
public class HttpClientService {
@Autowired
private CloseableHttpClient httpClient;
@Autowired
private RequestConfig requestConfig;
/**
* 執行GET請求
*
* @param url
* @return
* @throws IOException
* @throws ClientProtocolException
*/
public String doGet(String url) throws ClientProtocolException, IOException {
// 建立http GET請求
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(this.requestConfig);
CloseableHttpResponse response = null;
try {
// 執行請求
response = httpClient.execute(httpGet);
// 判斷返回狀態是否為200
if (response.getStatusLine().getStatusCode() == 200) {
return EntityUtils.toString(response.getEntity(), "UTF-8");
}
} finally {
if (response != null) {
response.close();
}
}
return null;
}
/**
* 帶有引數的GET請求
*
* @param url
* @param params
* @return
* @throws URISyntaxException
* @throws IOException
* @throws ClientProtocolException
*/
public String doGet(String url, Map<String, String> params)
throws ClientProtocolException, IOException, URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(url);
for (String key : params.keySet()) {
uriBuilder.addParameter(key, params.get(key));
}
return this.doGet(uriBuilder.build().toString());
}
/**
* 執行POST請求
*
* @param url
* @param params
* @return
* @throws IOException
*/
public HttpResult doPost(String url, Map<String, String> params) throws IOException {
// 建立http POST請求
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(this.requestConfig);
if (params != null) {
// 設定2個post引數,一個是scope、一個是q
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
for (String key : params.keySet()) {
parameters.add(new BasicNameValuePair(key, params.get(key)));
}
// 構造一個form表單式的實體
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8");
// 將請求實體設定到httpPost物件中
httpPost.setEntity(formEntity);
}
CloseableHttpResponse response = null;
try {
// 執行請求
response = httpClient.execute(httpPost);
return new HttpResult(response.getStatusLine().getStatusCode(),
EntityUtils.toString(response.getEntity(), "UTF-8"));
} finally {
if (response != null) {
response.close();
}
}
}
/**
* 執行POST請求
*
* @param url
* @return
* @throws IOException
*/
public HttpResult doPost(String url) throws IOException {
return this.doPost(url, null);
}
/**
* 提交json資料
*
* @param url
* @param json
* @return
* @throws ClientProtocolException
* @throws IOException
*/
public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException {
// 建立http POST請求
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(this.requestConfig);
if (json != null) {
// 構造一個form表單式的實體
StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
// 將請求實體設定到httpPost物件中
httpPost.setEntity(stringEntity);
}
CloseableHttpResponse response = null;
try {
// 執行請求
response = this.httpClient.execute(httpPost);
return new HttpResult(response.getStatusLine().getStatusCode(),
EntityUtils.toString(response.getEntity(), "UTF-8"));
} finally {
if (response != null) {
response.close();
}
}
}
}
8.8 SgmTestServiceImpl
package com.mgkj.tool.service.impl;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mgkj.tool.dao.SgmTestMapper;
import com.mgkj.tool.model.SgmTest;
import com.mgkj.tool.service.SgmTestService;
import com.mgkj.tool.service.util.MyResult;
/**
* @author sunguimin
* @version 建立時間:2018-08-10 16:21:37
* 類說明:
*/
@Service
public class SgmTestServiceImpl implements SgmTestService {
@Autowired
SgmTestMapper sgmTestDao;
@Override
public MyResult<Object> showList(HttpServletRequest request, HttpServletResponse response) {
try {
List<SgmTest> list = sgmTestDao.findByRecord();
return MyResult.ok(list);
} catch (Exception e) {
e.printStackTrace();
return MyResult.error("查詢失敗");
}
}
}
8.9 HttpResult
package com.mgkj.tool.service.util;
/**
* @author Min
* @version 建立時間:2017年6月20日 下午2:40:54
* 類說明:
*/
public class HttpResult {
/**
* 狀態碼
*/
private Integer status;
/**
* 返回資料
*/
private String data;
public HttpResult() {
}
public HttpResult(Integer status, String data) {
this.status = status;
this.data = data;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
8.10 MyResult
package com.mgkj.tool.service.util;
import java.io.Serializable;
/**
* 資料返回返回結果
* @author Min
*
* @param <T>
*/
public class MyResult<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int status;
private String msg;
private T data;
private int count;
//不帶引數
public static MyResult<Object> ok(){
MyResult<Object> result = new MyResult<Object>();
result.setStatus(0);
result.setMsg("success");
result.setData(null);
return result;
}
//帶 返回值
public static MyResult<Object> ok(Object object){
MyResult<Object> result = new MyResult<Object>();
result.setStatus(0);
result.setMsg("success");
result.setData(object);
return result;
}
//帶 總記錄數 和 返回值
public static MyResult<Object> ok(int count, Object object){
MyResult<Object> result = new MyResult<Object>();
result.setStatus(0);
result.setMsg("success");
result.setData(object);
result.setCount(count);
return result;
}
//不帶引數
public static MyResult<Object> error(){
MyResult<Object> result = new MyResult<Object>();
result.setStatus(1);
result.setMsg("fail");
result.setData(null);
return result;
}
//帶引數
public static MyResult<Object> error(Object object){
MyResult<Object> result = new MyResult<Object>();
result.setStatus(1);
result.setMsg("fail");
result.setData(object);
return result;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "MyResult [status=" + status + ", msg=" + msg + ", data=" + data + ", count=" + count + "]";
}
}
8.11 SgmTestService
package com.mgkj.tool.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mgkj.tool.service.util.MyResult;
/**
* @author sunguimin
* @version 建立時間:2018-08-10 16:21:37
*/
public interface SgmTestService{
MyResult<Object> showList(HttpServletRequest request, HttpServletResponse response);
}
以上程式碼是全部檔案,如複製程式碼,請對應更改專案名稱,實體名稱,包名,類名。。。。
9.啟動專案:
啟動專案, 專案啟動成功。
10.測試介面
資料成功返回。
Spring+SpringMVC+Mybatis 專案搭建成功。