目前主流的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