需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端 UI 应用或 web 应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始工程就存在冗余代码。
在本文中,我们将使用 Java 语言开发集成环境 IntelliJ IDEA(其倡言是智能编码☺),应用 maven 构建 SpringMVC 整合 Mybatis+MySQL5.7(流行框架)的 web 项目;目的在于快速构建一个简洁纯净版的 web 应用工程,将其作为一个基础 web-demo,以便类似的项目都可以复用本 demo。本文旨在快速搭建 web 项目,并未深入研究原理,有兴趣的可参考其他文章研究 Spring 及 mybatis 原理。
本项目的工程代码,已经提交到 github 上,方便每次下载使用。(https://github.com/High128Net/CharlieWebDemo)
一、IDEA 下构建 maven 的 web 项目
1、新建工程 New-->Project,创建 maven 的 web 项目,选择 maven-archetype-webapp,并配置 Project SDK,本次选用的是本机已安装的 jdk1.8,如下图所示:
2、下一步,填写自己项目的 GroupId,ArtifactId,如下图:
3、下一步,设置 maven 的安装目录,代替 IDEA 自带的 maven 版本,我换成了自己手动安装的 maven 版本,路径存在 D 盘;设置 maven 本地的仓库,我配置了本项目单独的仓库,但没去复用之前项目所用的 maven 仓库,为的是让本工程的依赖 jar 包保持纯净(虽然无关紧要,原谅我有莫名的洁癖☺)。
4、下一步,设置工程的 Project Name。
5、Finish,maven 的 web 项目就创建完成,接下来 maven 会下载相应的资源,下载时速度会很慢(maven 加载 jar 包过程,默认的是先扫描本地仓库,若本地仓库没有,则扫描远程仓库下载。默认的 conf/settings.xml 文件没有配置远程仓库,所以扫描的是 maven 的中央仓库(资源镜像一般在国外),所以慢);由于我使用的网络是 FQ 外网,直接默认 maven 下载方式速度还是可以的(或许也是人品好一点☺),如果大家想快一点,也可以参考网上配置 maven 使用国内镜像的教程。
二、搭建基于 SpringMVC 整合 mybatis 的 web 工程
1、等待 maven 下载资源完成后,注意到工程目录中会出现 src 的文件夹,src 下默认会存在 main 目录,main 下默认存在 resources 和 webapp 文件夹,其中 resources 文件夹主要存放项目的配置或属性等文件,webapp 则是 web 应用的根目录,会存放 HTML,CSS,js,JSP 或资源文件等。我们需要再 main 目录下创建 java 文件夹,java 目录下存放的将是 Java 程序的 package 及 class 文件等。由于我们将搭建 springMVC 框架,我们可以提前搭建好项目的文件目录结构,如下图所示:
其中,java 下创建项目的 package com.charlie,其下可以再分类不同的 package,包括 controller,service,service-->impl,entity,dao,dao-->mapper,dao-->xml,common,util 等,这些包是基于 springmvc+mybatis 所需的,还有可以存放一些公共类或工具类。
webapp 下可创建 css,js,image,WEB-INF-->views 等。
src 可创建 main 的同级目录 test,可以用于后续项目开发过程中的 Junit 程序测试。
2、配置 pom.xml 文件,maven 添加 web 项目必需的以及 SpringMVC 所必需的 dependencies 包。
2.1、以下是引入 Junit,日志,MySQL 驱动的依赖包,注意此次引入的是最新的 mysql-connector-java-6.0.6,会影响后续的 SpringMVC 及 jdbc 等的特殊配置,这将和旧版本的 mysql 驱动包有区别。
- 1 <!-- junit测试包-->
- 2 <dependency>
- 3 <groupId>junit</groupId>
- 4 <artifactId>junit</artifactId>
- 5 <version>4.12</version>
- 6 <scope>test</scope>
- 7 </dependency>
- 8 <!--日志包-->
- 9 <dependency>
- 10 <groupId>org.slf4j</groupId>
- 11 <artifactId>slf4j-log4j12</artifactId>
- 12 <version>1.8.0-alpha2</version>
- 13 </dependency>
- 14 <!--mysql驱动包-->
- 15 <dependency>
- 16 <groupId>mysql</groupId>
- 17 <artifactId>mysql-connector-java</artifactId>
- 18 <version>6.0.6</version>
- 19 </dependency>
这样,已经支持了日志的输出,我们仍然需要日志的属性文件,在 resources 目录下,新增日志属性文件 log4j.properties,并配置如下(配置方式很多种,大家选择一种即可):
- #配置根Logger 后面是若干个Appender
- log4j.rootLogger=DEBUG,A1,R
- #log4j.rootLogger=INFO,A1,R
- # ConsoleAppender 输出
- log4j.appender.A1=org.apache.log4j.ConsoleAppender
- log4j.appender.A1.layout=org.apache.log4j.PatternLayout
- log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
- # File 输出 一天一个文件,输出路径可以定制,一般在根路径下
- log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.R.File=log.txt
- log4j.appender.R.MaxFileSize=500KB
- log4j.appender.R.MaxBackupIndex=10
- log4j.appender.R.layout=org.apache.log4j.PatternLayout
- log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
其中,开发者可设置 rootLogger,开发调试环境时,可设置为 DEBUG 模式,输出系统的详细日志;生产环境时,可设置为 INFO 模式。
2.2、以下是引入 SpringMVC 所必需的依赖包,由于 maven 自动依赖功能,引入以下包时,会自动引入其他相关的依赖包,其中就包括 spring-core,spring-context 等重要的包(注意只要能够引入所有的 Spring 依赖包即可)。
- 1 <!--spring相关包-->
- 2 <dependency>
- 3 <groupId>org.springframework</groupId>
- 4 <artifactId>spring-web</artifactId>
- 5 <version>4.3.8.RELEASE</version>
- 6 </dependency>
- 7 <dependency>
- 8 <groupId>org.springframework</groupId>
- 9 <artifactId>spring-webmvc</artifactId>
- 10 <version>4.3.8.RELEASE</version>
- 11 </dependency>
- 12 <dependency>
- 13 <groupId>org.springframework</groupId>
- 14 <artifactId>spring-context-support</artifactId>
- 15 <version>4.3.8.RELEASE</version>
- 16 </dependency>
- 17 <dependency>
- 18 <groupId>org.springframework</groupId>
- 19 <artifactId>spring-oxm</artifactId>
- 20 <version>4.3.8.RELEASE</version>
- 21 </dependency>
- 22 <dependency>
- 23 <groupId>org.springframework</groupId>
- 24 <artifactId>spring-tx</artifactId>
- 25 <version>4.3.8.RELEASE</version>
- 26 </dependency>
- 27 <dependency>
- 28 <groupId>org.springframework</groupId>
- 29 <artifactId>spring-test</artifactId>
- 30 <version>4.3.8.RELEASE</version>
- 31 </dependency>
- 32 <dependency>
- 33 <groupId>org.springframework</groupId>
- 34 <artifactId>spring-jdbc</artifactId>
- 35 <version>4.3.8.RELEASE</version>
- 36 </dependency>
- 37 <!--aspectj start-->
- 38 <dependency>
- 39 <groupId>org.aspectj</groupId>
- 40 <artifactId>aspectjweaver</artifactId>
- 41 <version>1.8.10</version>
- 42 </dependency>
- 43 <dependency>
- 44 <groupId>org.aspectj</groupId>
- 45 <artifactId>aspectjrt</artifactId>
- 46 <version>1.8.10</version>
- 47 </dependency>
2.3、以下是引入 JSP 的包,以支持 jsp 视图的功能。
- 1 <!-- 支持jsp -->
- 2 <dependency>
- 3 <groupId>javax.servlet</groupId>
- 4 <artifactId>jstl</artifactId>
- 5 <version>1.2</version>
- 6 </dependency>
- 7 <dependency>
- 8 <groupId>taglibs</groupId>
- 9 <artifactId>standard</artifactId>
- 10 <version>1.1.2</version>
- 11 </dependency>
- 12 <!--servlet/jsp api start-->
- 13 <dependency>
- 14 <groupId>javax.servlet</groupId>
- 15 <artifactId>servlet-api</artifactId>
- 16 <version>3.0-alpha-1</version>
- 17 </dependency>
- 18 <dependency>
- 19 <groupId>javax.servlet.jsp</groupId>
- 20 <artifactId>jsp-api</artifactId>
- 21 <version>2.2.1-b03</version>
- 22 </dependency>
2.4、以下是引入 datasource 数据源的包,引入了 2 种方式,但本次项目中,我们使用的是 alibaba 的 Druid DataSource。
- 1 <!-- JDBC连接池 -->
- 2 <dependency>
- 3 <groupId>com.mchange</groupId>
- 4 <artifactId>c3p0</artifactId>
- 5 <version>0.9.5.2</version>
- 6 </dependency>
- 7 <!-- DruidDataSource,本工程的dataSource配置使用的Druid -->
- 8 <dependency>
- 9 <groupId>com.alibaba</groupId>
- 10 <artifactId>druid</artifactId>
- 11 <version>1.0.29</version>
- 12 </dependency>
到此,我们已经引入了 mysql 驱动包,DataSource 连接池,我们还需要配置 jdbc 属性文件,在 resources 下创建 jdbc.properties 文件,内容如下:
- #JDBC Global Setting
- #jdbc.driver=com.mysql.jdbc.Driver
- jdbc.driver=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/charlie_web_demo?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT+8
- jdbc.username=root
- jdbc.password=p@ssw0rd
- ##DataSource Global Setting
- #配置初始化大小、最小、最大
- ds.initialSize=1
- ds.minIdle=1
- ds.maxActive=20
- #配置获取连接等待超时的时间
- ds.maxWait=60000
- #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- ds.timeBetweenEvictionRunsMillis=60000
- #配置一个连接在池中最小生存的时间,单位是毫秒
- ds.minEvictableIdleTimeMillis=300000
其中,配置了 mysql 数据库的连接,用户名,密码等信息。由于使用了最新版本的 mysql-connector-java-6.0.6 驱动,这要求 driver 和 url 的特殊配置,否则项目启动时会报 1 个警告和 2 个异常。jdbc.driver 配置为 com.mysql.cj.jdbc.Driver,可以避免出现警告信息(具体警告信息没有记录下来,大家配置过程中可能会遇到);jdbc.url 里添加 useSSL 属性 --- 配置为 true;若出现 The server time zone value '?й???????' is unrecognized or represents more than one time zone 的错误,则需添加 serverTimezone 属性,设置为 GMT+8 即可解决。
2.5、以下是引入一些其他可能需要的包,包括文件上传等。
- 1 <!--其他需要的包-->
- 2 <dependency>
- 3 <groupId>org.apache.commons</groupId>
- 4 <artifactId>commons-lang3</artifactId>
- 5 <version>3.5</version>
- 6 </dependency>
- 7 <dependency>
- 8 <groupId>commons-fileupload</groupId>
- 9 <artifactId>commons-fileupload</artifactId>
- 10 <version>1.3.2</version>
- 11 </dependency>
3、配置 pom.xml 文件,设置项目的编译属性,编译后的 war 包名称(即 finalName),存放配置或属性文件到 resources 目录下。
- 1 <build>
- 2 <finalName>CharlieWebDemo</finalName>
- 3 <resources>
- 4 <!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
- 5 <resource>
- 6 <directory>${basedir}/src/main/java</directory>
- 7 <includes>
- 8 <include>**/*.properties</include>
- 9 <include>**/*.xml</include>
- 10 </includes>
- 11 </resource>
- 12 <resource>
- 13 <directory>${basedir}/src/main/resources</directory>
- 14 </resource>
- 15 </resources>
- 16 </build>
经过以上的 pom.xml 的配置,项目及 springmvc 所需的依赖包就已经基本引入了,通过 IDEA 右侧栏中的 maven projects 的 reimport 按钮实现依赖包的引入下载(并且,其中常用的是 clean,package,install 等,clean 可以清除生成的 target 目录,install 可以重新生成 target 目录),若 pom.xml 种引入 / 修改了新的依赖包 / 插件或者 Dependencies 存在红色提示,需要重新 reimport 以下。
4、配置项目的 web.xml 文件,包括首页,异常跳转,会话超时,字符编码过滤器 CharacterEncodingFilter,监听器 ContextLoaderListener,前置控制器 DispatcherServlet,静态文件单独处理等等。代码及解释如下:
- <?xml version="1.0" encoding="UTF-8" ?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
- <display-name>
- Archetype Created Web Application
- </display-name>
- <!--welcome pages-->
- <welcome-file-list>
- <welcome-file>
- index.jsp
- </welcome-file>
- </welcome-file-list>
- <!--当系统出现404错误,跳转到页面NoPage.html-->
- <error-page>
- <error-code>
- 404
- </error-code>
- <location>
- /WEB-INF/NoPage.html
- </location>
- </error-page>
- <!--当系统出现java.lang.NullPointerException,跳转到页面error.html-->
- <error-page>
- <exception-type>
- java.lang.NullPointerException
- </exception-type>
- <location>
- /WEB-INF/error.html
- </location>
- </error-page>
- <!--会话超时配置,单位分钟-->
- <session-config>
- <session-timeout>
- 360
- </session-timeout>
- </session-config>
- <!--Spring框架给我们提供过滤器CharacterEncodingFilter 这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码。
- 其中encoding用来设置编码格式,forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,设置为true则强制覆盖之前的编码格式。-->
- <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>
- <init-param>
- <param-name>
- forceEncoding
- </param-name>
- <param-value>
- true
- </param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>
- characterEncodingFilter
- </filter-name>
- <url-pattern>
- /*
- </url-pattern>
- </filter-mapping>
- <!-- 项目中使用Spring时,applicationContext.xml配置文件中并没有BeanFactory,要想在业务层中的class文件中直接引用Spring容器管理的bean可通过以下方式-->
- <!--1、在web.xml配置监听器ContextLoaderListener。ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
- 在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。-->
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
- <!--2、部署applicationContext的xml文件。如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB-INF/applicationContext.xml,
- 在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。 如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:
- 在<param-value> </param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以","号分隔,也可以这样applicationContext-*.xml采用通配符,匹配的文件都会一同被载入。
- 在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。-->
- <context-param>
- <param-name>
- contextConfigLocation
- </param-name>
- <param-value>
- classpath:applicationContext.xml
- </param-value>
- </context-param>
- <!--如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。-->
- <!--方案一:激活Tomcat的defaultServlet来处理静态文件-->
- <!--要写在DispatcherServlet的前面,让defaultServlet先拦截请求,这样请求就不会进入Spring了-->
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.css
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.swf
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.gif
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.jpg
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.png
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.js
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.html
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.xml
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.json
- </url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- default
- </servlet-name>
- <url-pattern>
- *.map
- </url-pattern>
- </servlet-mapping>
- <!--使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一个Servlet,,所以可以配置多个DispatcherServlet-->
- <!--DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。-->
- <!--配置SpringMVC DispatcherServlet-->
- <servlet>
- <!--在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml
- 的配置文件,生成文件中定义的bean。-->
- <servlet-name>
- springMVC
- </servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <init-param>
- <!--指明了配置文件的文件名,不使用默认配置文件名,而使用spring-mvc.xml配置文件。-->
- <param-name>
- contextConfigLocation
- </param-name>
- <!--其中<param-value>**.xml</param-value> 这里可以使用多种写法-->
- <!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml-->
- <!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>-->
- <!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>-->
- <!--4、多个值用逗号分隔-->
- <param-value>
- classpath:spring-mvc.xml
- </param-value>
- </init-param>
- <!--是启动顺序,让这个Servlet随Servlet容器一起启动。-->
- <load-on-startup>
- 1
- </load-on-startup>
- <async-supported>
- true
- </async-supported>
- </servlet>
- <servlet-mapping>
- <!--这个Servlet的名字是dispatcher,可以有多个DispatcherServlet,是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中.-->
- <!--ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用"容器"来表述它更容易理解一些,ApplicationContext则是"应用的容器"了,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出-->
- <servlet-name>
- springMVC
- </servlet-name>
- <!--Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?-->
- <!--1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。-->
- <!--2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。
- -->
- <url-pattern>
- /
- </url-pattern>
- <!--会拦截URL中带"/"的请求。-->
- </servlet-mapping>
- </web-app>
5、由 web.xml 的配置中看出,我们还需要配置 applicationContext.xml 和 spring-mvc.xml,我们在 spring-mvc.xml 中配置 springmvc 的相关配置,如下:
- <?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:mvc="http://www.springframework.org/schema/mvc"
- 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/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd">
- <!--启用spring的一些annotation -->
- <context:annotation-config/>
- <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
- <context:component-scan base-package="com.charlie.controller">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"
- />
- </context:component-scan>
- <!--扫描service-->
- <context:component-scan base-package="com.charlie.service" />
- <!--HandlerMapping 无需配置,SpringMVC可以默认启动-->
- <!--静态资源映射-->
- <!--本项目把静态资源放在了WEB-INF的子目录下,资源映射如下-->
- <mvc:resources mapping="/css/**" location="/css/" />
- <mvc:resources mapping="/css/**" location="/js/" />
- <mvc:resources mapping="/css/**" location="/image/" />
- <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
- <mvc:annotation-driven/>
- <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
- <!-- 默认的视图解析器在上边的解析错误时使用 (默认使用html)- -->
- <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"
- />
- <!--设置JSP文件的目录位置-->
- <property name="prefix" value="/WEB-INF/views/" />
- <property name="suffix" value=".jsp" />
- </bean>
- <!-- SpringMVC文件上传需要配置的节点-->
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <property name="maxUploadSize" value="20971500" />
- <property name="defaultEncoding" value="UTF-8" />
- <property name="resolveLazily" value="true" />
- </bean>
- <!-- 支持返回json,用来处理json格式转换,避免IE执行ajax时,返回json出现下载文件 -->
- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
- <property name="messageConverters">
- <list>
- <ref bean="mappingJacksonHttpMessageConverter" />
- </list>
- </property>
- </bean>
- <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <value>
- application/json;charset=UTF-8
- </value>
- </list>
- </property>
- </bean>
- </beans>
其中:
注解配置:<context:annotation-config/>;
注解驱动:<mvc:annotation-driven/>;
自动扫描 controller 类,自动扫描 service 类:context:component-scan;
静态资源映射(我们 springmvc 配置的是拦截 "/",例如:/user/getUserInfo,REST 风格,但会导致静态文件(jpg,js,css 等)被拦截后不能正常显示):mvc:resources;
模型视图名称的解析(默认路径及后缀):InternalResourceViewResolver;
支持返回 json 格式(前后端分离场景下,返回数据格式):AnnotationMethodHandlerAdapter,MappingJackson2HttpMessageConverter。通常在前后端分离项目中,后台要向前端返回 json 格式的相应数据,以上已经在 spring-mvc.xml 中配置了 json 格式转换的处理,我们仍需要引入 json 支持的依赖包,在 pom.xml 文件中添加以下:
- <!-- 支持json,旧包 -->
- <dependency>
- <groupId>
- org.codehaus.jackson
- </groupId>
- <artifactId>
- jackson-core-asl
- </artifactId>
- <version>
- 1.9.13
- </version>
- </dependency>
- <dependency>
- <groupId>
- org.codehaus.jackson
- </groupId>
- <artifactId>
- jackson-mapper-asl
- </artifactId>
- <version>
- 1.9.13
- </version>
- </dependency>
- <!-- 使用MappingJackson2HttpMessageConverter,加入最新的FastJackson依赖 -->
- <dependency>
- <groupId>
- com.fasterxml.jackson.core
- </groupId>
- <artifactId>
- jackson-core
- </artifactId>
- <version>
- 2.9.0.pr3
- </version>
- </dependency>
- <dependency>
- <groupId>
- com.fasterxml.jackson.core
- </groupId>
- <artifactId>
- jackson-databind
- </artifactId>
- <version>
- 2.9.0.pr3
- </version>
- </dependency>
- <dependency>
- <groupId>
- com.fasterxml.jackson.core
- </groupId>
- <artifactId>
- jackson-annotations
- </artifactId>
- <version>
- 2.9.0.pr3
- </version>
- </dependency>
- <!-- google的json格式支持 -->
- <dependency>
- <groupId>
- com.google.code.gson
- </groupId>
- <artifactId>
- gson
- </artifactId>
- <version>
- 2.8.0
- </version>
- </dependency>
我们注意到,json 依赖包存在旧包和新包,由于本项目使用的 spring4.3.8,所以 mappingJacksonHttpMessageConverter 使用的是 MappingJackson2HttpMessageConverter,代替了 MappingJacksonHttpMessageConverter,否则项目启动时会报错;而使用 MappingJackson2HttpMessageConverter 时,我们就需要引入新的 json 依赖包了,如以上程序注释所示(jackson-core,jackson-databind,jackson-annotations)。我们还添加了 google 的 json 格式依赖包 Gson,Gson 提供了
和
- fromJson()
两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化,后续的 json 数据返回程序示例中会再次提及。
- toJson()
6、配置 applicationContext.xml 文件,在这里我们配置数据源以及与 mybatis 的整合配置,内容如下所示:
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd">
- <!-- 自动扫描SpringMVC包 ,将带有注解的类 纳入spring容器管理 -->
- <context:component-scan base-package="com.charlie" />
- <!-- 引入jdbc配置文件 -->
- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>
- classpath*:jdbc.properties
- </value>
- </list>
- </property>
- </bean>
- <!-- dataSource 配置 -->
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
- destroy-method="close">
- <!-- 基本属性 url、user、password -->
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- <!-- 配置初始化大小、最小、最大 -->
- <property name="initialSize" value="${ds.initialSize}" />
- <property name="minIdle" value="${ds.minIdle}" />
- <property name="maxActive" value="${ds.maxActive}" />
- <!-- 配置获取连接等待超时的时间 -->
- <property name="maxWait" value="${ds.maxWait}" />
- <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
- <property name="timeBetweenEvictionRunsMillis" value="${ds.timeBetweenEvictionRunsMillis}"
- />
- <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
- <property name="minEvictableIdleTimeMillis" value="${ds.minEvictableIdleTimeMillis}"
- />
- <property name="validationQuery" value="SELECT 'x'" />
- <property name="testWhileIdle" value="true" />
- <property name="testOnBorrow" value="false" />
- <property name="testOnReturn" value="false" />
- <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
- <property name="poolPreparedStatements" value="false" />
- <property name="maxPoolPreparedStatementPerConnectionSize" value="20"
- />
- <!-- 配置监控统计拦截的filters -->
- <property name="filters" value="stat" />
- </bean>
- <!-- mybatis文件配置,扫描所有mapper.xml文件 -->
- <!-- 配置mybatisSqlSessionFactoryBean -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="configLocation" value="classpath:mybatis.xml" />
- <property name="mapperLocations" value="classpath*:com/charlie/dao/xml/*Mapper.xml"
- />
- </bean>
- <!-- 配置SqlSessionTemplate -->
- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
- <!-- 配置mybatis mapper接口,扫描所有dao -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
来源: http://www.cnblogs.com/helloyy/p/6826101.html