开始学习SSM,现在来整理一下SSM框架整合。
SSM框架,Spring mvc + Spring + mybatis,先大概概括一下这三个框架。
关于这个SSM框架整合的学习,我是从一篇博客上学习的,现在是基于机子的理解写的。不过还是贴上地址,也是一篇十分好的文章
http://blog.csdn.net/yipanbo/article/details/45644751
MVC框架,与Strusts2相比,首先比较好的一点就是能与Spring完美整合。除了学习用法,我个人觉得最重要的就是学习这个MVC框架的设计思想。
主要就是IoC(依赖注入),AOP(面向切面),目前我对于此也是一知半解,就不说什么了
轻量级ORM框架
图为完整目录结构。
在src/mian/resources目录下,一共有3个配置文件,spring-mybatis.xml包含spring,mybatis的配置,dispatcherServlet-servlet.xml为spring-mvc的配置,log4j2.xml为log4j2的配置,一个资源文件jdbc.properteis,包含关于基本的jdbc连接和数据源的属性
<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>MyWebDemo</groupId>
<artifactId>MyWebDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>MyWebDemo</name>
<description />
<properties>
<!-- 资源配置的编码环境 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--spring使用的版本 -->
<spring.version>4.2.5.RELEASE</spring.version>
<!--mybatis使用的版本 -->
<mybatis.version>3.3.0</mybatis.version>
<!--log4j的使用版本 -->
<log4j.version>2.5</log4j.version>
</properties>
<dependencies>
<!--javaee api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!--jstl的核心包 -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.2</version>
</dependency>
<!--spring的核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring end -->
<!--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.2.2</version>
</dependency>
<!--myabtis end -->
<!--mysql连接的jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!--数据库 end -->
<!--导入log4j的jar包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--用于格式化对象,便于输入 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<!--日志配置 end -->
<!--解释json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.0</version>
</dependency>
<!--用于测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!--标记只用于测试,发布时不含该报 -->
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<version>3.1</version>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?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" 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-4.2.xsd">
<!--自动扫描,扫描在指定包目录下的注释 -->
<context:component-scan base-package="com.example"></context:component-scan>
<!--引入所需要的资源文件,本项目中,引入的就是jdbc.properties -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="default">
<!--向location属性注入jdbc.properties的位置 -->
<property name="location" value="classpath:jdbc.properties"></property>
</bean>
<!--设置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" abstract="false" lazy-init="default" autowire="default" destroy-method="close">
<!--设置driver -->
<property name="driverClassName" value="${driver}"></property>
<!--数据库的url -->
<property name="url" value="${url}"></property>
<!--数据库的用户名 -->
<property name="username" value="${username}"></property>
<!--数据库的密码 -->
<property name="password" value="${password}"></property>
<!--初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!--连接池最大连接数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!--连接池最大空间 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!--连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!--获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>
<!--spring与mybatis的完美整合,负责于与数据库建立会话 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" abstract="false" lazy-init="default" autowire="default">
<property name="dataSource" ref="dataSource"></property>
<!--设置mybatis的配置文件的位置 -->
</bean>
<!--扫描mybatis的映射文件,不需配置mapper.xml,直接配置映射接口即可 -->
<bean id="mapperScannerConf" class="org.mybatis.spring.mapper.MapperScannerConfigurer" abstract="false" lazy-init="default" autowire="default">
<!--扫描mybatis映射接口的包 -->
<property name="basePackage" value="com.example.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!--设置事务管理 -->
<bean id="tansatcionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" abstract="false" lazy-init="default" autowire="default">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
为了方便调试,一般会使用日志记录,输出信息。
log4j的配置基本上是通用的。
这里用的是log4j2,我开始打算用properties配置的,但是貌似并不能。
当然也可以用1.x的版本。
具体的log4j配置,贴个链接吧
http://blog.csdn.net/zhshulin/article/details/37937365
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<!--将日志输入到控制台 -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<!--日志打印的级别 -->
<Loggers>
<Root level="ALL">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
测试一下spring与mybatis的整合效果。
日后在开发中,完成相关的模块的工作,也应该先调试。
pojo类
package com.example.pojo;
public class User {
private String userId;
private String userName;
private String password;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName
+ ", password=" + password + "]";
}
}
接下来编写mybatis的mapper接口
package com.example.dao;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.example.pojo.User;
/** * mybaits的mapper接口 * */
public interface IUserDao {
//每个方法对应相应的sql语句
@Select("SELECT * FROM user WHERE userid = #{userid}")
public User selectOneUserByUserId(String userid);
@Select("SELECT * FROM user")
public List<User> selectUserList();
}
业务层接口
package com.example.service;
import java.util.List;
import com.example.pojo.User;
public interface IUserService {
public User getUserByUserId(String userid);
public List<User> getAllUsers();
}
业务层实现类
package com.example.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.example.dao.IUserDao;
import com.example.pojo.User;
//Service对应业务层实现类,而且名字必须为"userService"
@Service("userService")
public class UserServiceImpl implements IUserService {
//控制反转,使用该注释后,由spring容器获得该属性的实例化控制权
@Resource
private IUserDao userDao;
@Override
public User getUserByUserId(String userid) {
// TODO Auto-generated method stub
return this.userDao.selectOneUserByUserId(userid);
}
@Override
public List<User> getAllUsers() {
// TODO Auto-generated method stub
return this.userDao.selectUserList();
}
}
测试
package myTest;
import javax.annotation.Resource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.fastjson.JSON;
import com.example.pojo.User;
import com.example.service.IUserService;
//表示继承了SpringJUnit4ClassRunner类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring-mybatis.xml" })
public class TestMyBatis {
private static Logger logger = LogManager.getLogger(TestMyBatis.class);
@Resource
private IUserService userService;
@Test
public void test() {
User user = userService.getUserByUserId("141542254");
logger.info(JSON.toJSONString(user));
}
}
测试结果
说一下,这里因为方便没有对密码做相关处理,实际开发中,最低限度都要用MD5处理密码,再存入数据库。不然明文存储密码,会被人打死。
配置dispathcerServlet-servlet.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" 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-4.2.xsd">
<!--扫描指定的包,查找由@Controller注释的控制器 -->
<context:component-scan base-package="com.example.controller"></context:component-scan>
<!-- 解释json,同时避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" abstract="false" lazy-init="default" autowire="default">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!--启动spring mvc的注解功能,完成请求和注解POJO的映射,与RequestMappingHandlerAdapter互相协作 -->
<!--当用户通过域名访问,将映射到相应的Controller -->
<bean id="requestMappingHandlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" abstract="false" lazy-init="default" autowire="default">
</bean>
<!--启动spring mvc的注解功能,完成请求和注解POJO的映射,与RequestMappingHandlerMapping -->
<!--将RequestMappingHandlerMapping返回的Controller适配,然后调用Controller的处理方法 -->
<bean id="requestMappingHandlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" abstract="false" lazy-init="default" autowire="default">
<property name="messageConverters">
<list>
<!-- Json转换器 -->
<ref bean="mappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>
<!--用于支持Servlet、Jsp的视图解析 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" abstract="false" lazy-init="default" autowire="default">
<!--JstlView表示Jsp模板页面需要使用Jstl标签库 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView">
</property>
<!--查找视图页面的前缀和后缀(前缀[视图名]后缀) -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
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" id="WebApp_ID" version="3.1">
<display-name>MyWebDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--上下文加载监听器,spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--上下文的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!--前端处理器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--前端处理器的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcherServlet-servlet.xml</param-value>
</init-param>
<!--表示启动容器时,初始化该servelt -->
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<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>
</web-app>
页面控制器的代码
package com.example.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.pojo.User;
import com.example.service.IUserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
@RequestMapping("/showUser")
public String toIndex(Model model) {
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
//返回的是视图(一般为jsp)的名称
return "showUser";
}
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试</title>
</head>
<body>
<c:forEach items="${users}" var="user">
${user}<br>
</c:forEach>
</body>
</html>
测试结果
SSM框架的整合,基本上到此完成了,最后贴上一个简单的Spring mvc的工作流程图,加深理解,在配置时也更得心应手。