目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTful API的支持也比struts要好。
MyBatis是ibatis的升级版,作为hibernate的老对手,它 是一个可以自定义SQL、存储过程和高级映射的持久层框架。
与hibernate的主要区别就是mybatis是半自动化的,而hibernate是全自动的,所以当应用需求越来越复杂的时候,自动化的sql显得比较笨拙。
由于前段时间接了个项目要用springmvc做,所以我抱着练手的态度,又玩起了整合框架的游戏。经常搭框架的人应该都清楚,框架搭建的核心就是配置文件。所以我主要贴下几个配置文件的代码。还是那句话,我都是写好配置文件之后,运行报错再加jar。这里列一下我用的jar包(应该是最少的):
备注:上图有一些额外的jar,比如我用的数据库连接池是阿里巴巴的druid、日志框架式logback,所以引入了相关jar。关于这两个框架的使用和配置都是非常简单的,所以这里就不细说。
1.整合SpringMVC
springMybatis-servlet.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<? 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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 启用spring mvc 注解--> < mvc:annotation-driven > </ mvc:annotation-driven > <!-- 自动扫描的包名 ,使Spring支持自动检测组件,如注解的Controller--> < context:component-scan base-package = "com.alibaba.controller" /> < context:component-scan base-package = "com.alibaba.service" /> <!-- 视图解析器:定义跳转的文件的前后缀 --> < bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > < property name = "prefix" value = "/WEB-INF/jsp/" /> < property name = "suffix" value = ".jsp" /> <!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑 --> </ bean > <!--配置拦截器, 多个拦截器,顺序执行 --> < mvc:interceptors > < mvc:interceptor > <!-- 匹配的是url路径 --> < mvc:mapping path = "/" /> < mvc:mapping path = "/user/**" /> < mvc:mapping path = "/test/**" /> < bean class = "com.alibaba.interceptor.CommonInterceptor" ></ bean > </ mvc:interceptor > <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </ mvc:interceptors > </ beans > |
2.整合Mybatis
spring-dao.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<? 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:mybatis = "http://mybatis.org/schema/mybatis-spring" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 该包下的类支持注解,表示会被当作{@code mybatis mapper}处理 配置了之后表示可以自动引入mapper类--> < mybatis:scan base-package = "com.alibaba.dao" /> <!--引入属性文件 --> < context:property-placeholder location = "classpath:configuration.properties" /> <!--数据库连接--> < bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" init-method = "init" destroy-method = "close" > < property name = "url" value = "${jdbc.url}" /> < property name = "username" value = "${jdbc.username}" /> < property name = "password" value = "${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> < property name = "initialSize" >< value >1</ value ></ property > < property name = "maxActive" >< value >5</ value ></ property > < property name = "minIdle" >< value >1</ value ></ property > <!-- 配置获取连接等待超时的时间 --> < property name = "maxWait" >< value >60000</ value ></ property > <!-- 配置监控统计拦截的filters --> < property name = "filters" >< value >stat</ value ></ property > <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> < property name = "timeBetweenEvictionRunsMillis" >< value >60000</ value ></ property > <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> < property name = "minEvictableIdleTimeMillis" >< value >300000</ value ></ property > <!-- <property name="validationQuery"><value>SELECT 'x'</value></property> <property name="testWhileIdle"><value>true</value></property> <property name="testOnBorrow"><value>false</value></property> <property name="testOnReturn"><value>false</value></property> <property name="poolPreparedStatements"><value>true</value></property> <property name="maxOpenPreparedStatements"><value>20</value></property> --> </ bean > <!-- mybatis配置 --> < bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > < property name = "dataSource" ref = "dataSource" /> </ bean > </ beans > |
3.web.xml整合SpringMVC和Mybatis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
<? 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" xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version = "3.0" > <!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css --> <!-- 不拦截静态文件 --> < servlet-mapping > < servlet-name >default</ servlet-name > < url-pattern >/js/*</ url-pattern > < url-pattern >/css/*</ url-pattern > < url-pattern >/images/*</ url-pattern > < url-pattern >/fonts/*</ url-pattern > </ servlet-mapping > <!-- 配置字符集 --> < 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 > < init-param > < param-name >forceEncoding</ param-name > < param-value >true</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >encodingFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > <!-- 初始化 DispatcherServlet时,该框架在 web应用程序WEB-INF目录中寻找一个名为[servlet-名称]-servlet.xml的文件, 并在那里定义相关的Beans,重写在全局中定义的任何Beans --> < servlet > < servlet-name >springMybatis</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >springMybatis</ servlet-name > <!-- 所有的的请求,都会被DispatcherServlet处理 --> < url-pattern >/</ url-pattern > </ servlet-mapping > < context-param > < param-name >contextConfigLocation</ param-name > < param-value >/WEB-INF/config/spring-*.xml</ param-value > </ context-param > < listener > < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > </ listener > <!-- druid web 监控 --> < servlet > < servlet-name >DruidStatView</ servlet-name > < servlet-class >com.alibaba.druid.support.http.StatViewServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >DruidStatView</ servlet-name > < url-pattern >/druid/*</ url-pattern > </ servlet-mapping > < error-page > < error-code >404</ error-code > < location >/error/404.jsp</ location > </ error-page > < error-page > < error-code >500</ error-code > < location >/error/500.jsp</ location > </ error-page > </ web-app > |
4.logback.xml日志配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration > < appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender" > < encoder > < pattern >%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</ pattern > </ encoder > </ appender > < logger name = "test.LogbackTest" level = "TRACE" /> < logger name = "com.alibaba.controller.TestController" level = "TRACE" /> < logger name = "org.springframework.web.servlet.DispatcherServlet" level = "DEBUG" /> < logger name = "druid.sql" level = "INFO" /> <!-- 如果spring-config里面没有配置slf4j,就不会显示sql日志,logback只是slf4j的一个实现 --> < root level = "debug" > < appender-ref ref = "STDOUT" /> </ root > </ configuration > |
5.configuration.properties配置
1
2
3
|
jdbc.url=jdbc\:mysql\://localhost\:3306/druid?useUnicode\=true&characterEncoding\=UTF-8&zeroDateTimeBehavior\=convertToNull jdbc.username=root jdbc.password=123456 |
6.测试搭建是否成功,后台代码
首先是登录,用了加密,可以去掉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
package com.alibaba.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.commons.codec.digest.DigestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.alibaba.model.User; import com.alibaba.service.UserService; import com.alibaba.util.RequestUtil; /** * @author tfj * 2014-7-26 */ @Controller public class SystemController { private final Logger log = LoggerFactory.getLogger(SystemController. class ); @Resource private UserService userService; @RequestMapping (value = "/" ,method = RequestMethod.GET) public String home() { log.info( "返回首页!" ); return "index" ; } @RequestMapping (value = "/test/hello" ,method = RequestMethod.GET) public String testHello() { log.info( "执行了testHello方法!" ); return "testHello" ; } @RequestMapping (value = "/login" ,method = RequestMethod.POST) public String testLogin(HttpServletRequest request, @RequestParam String username, @RequestParam String password) { log.info( "执行了testLogin方法!" ); User user = userService.findUserByName(username); if (user!= null ){ if (user.getPassword().equals(DigestUtils.md5Hex(password))){ request.getSession().setAttribute( "userId" , user.getId()); request.getSession().setAttribute( "user" , username); return "redirect:" + RequestUtil.retrieveSavedRequest(); //跳转至访问页面 } else { log.info( "密码错误" ); request.getSession().setAttribute( "message" , "用户名密码错误,请重新登录" ); return "login" ; } } else { log.info( "用户名不存在" ); request.getSession().setAttribute( "message" , "用户名不存在,请重新登录" ); return "login" ; } } } |
关于service和model就不写了,写一下mybatis的mapper类映射
1
2
3
4
5
6
7
|
<? 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.alibaba.dao.UserMapper" > < select id = "findUserByName" resultType = "com.alibaba.model.User" > select id, username , password from sysuser where username = #{username} </ select > </ mapper > |
7.前台jsp主要是登录和登录成功的页面,就不写了
贴一下截图:
到此,springmvc+mybatis整合成功。后续复杂的功能待添加
注意事项
1.框架中关于druid和logback的配置都是从官网上copy下来的,所以都是最基本的,读者可以忽略,也可以换成读者熟悉的数据库组件和日志框架,如c3p0和log4j。
2.代码里加入了权限管理,即访问前需登录,登录后跳转至待访问页面,关于springmvc的权限管理请看:http://www.zzvips.com/article/84142.html
3.本文是从我的测试代码里剥离出来的最简单的也是最基本的代码,有些没剥离干净的地方还请见谅。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/tonytfjing/article/details/39203121