前言:由于Spring一直在提倡使用Java配置来进行整合,后来的SpringBoot也是由此而生的,故本文主要使用Java注解配置来整合,xml使用于映射文件(由于mybatis的映射xml可以提供的功能和简便性远比Java的要多)以及web.xml(载入log4j配置文件)。
一、项目结构目录(基于Maven):
二、配置类及配置文件
1. WebAppInitializer
package com.inmock.ssm.config;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
/**
* 扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动地配置DispatcherServlet和Spring应用上下文
* ,在容器创建时上述两个就会加载到Servlet中
*/
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
// 将DispatcherServlet映射到“/”
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
// 返回ContextLoaderListener创建地应用上下文的bean
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { SpringMybatisConfig.class };
}
// 返回DispatcherServlet应用上下文的bean
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { DispatcherConfig.class };
}
// 添加过滤器,实现编码过滤
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[]{characterEncodingFilter};
}
}
View Code
在服务器启动时,上述配置类作为入口。
2. DispatcherConfig
package com.inmock.ssm.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc //启用SpringMVC
@ComponentScan(basePackages = {"com.inmock.ssm.controller", "com.inmock.ssm.service", "com.inmock.ssm.dao"}) // 扫描service、repository、controller
public class DispatcherConfig {
// 配置JSP视图解析器
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 解析视图的前缀
resolver.setSuffix(".jsp"); // 视图的后缀
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
}
View Code
该类为springmvc相关的配置类。
@Configuration注解标明该类为配置类
@EnableWebMvc注解标明该类为springmvc的配置类
@ComponentScan注解标明扫描指定的包以加载指定的包内的bean,并加载到Spring应用上下文中
3. SpringMybatisConfig
package com.inmock.ssm.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement //开启事务管理
@MapperScan(basePackages = "com.inmock.ssm.dao") //扫描Mybatis的Mapper接口
@PropertySource("classpath:properties/jdbc.properties") // 读取jdbc配置
public class SpringMybatisConfig {
// 读取jdbc属性文件属性
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.username}")
private String user;
@Value("${jdbc.password}")
private String password;
//配置c3p0数据库
@Bean
public DataSource dataSource() throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 实例化c3p0连接池
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setMaxPoolSize(30); // 设置保持的最大连接数量
dataSource.setMinPoolSize(10); // 设置保持的最小连接数量
dataSource.setInitialPoolSize(10); // 设置连接池初始化的连接数量
dataSource.setAutoCommitOnClose(false); // 关闭连接后不自动提交
dataSource.setCheckoutTimeout(1000); // 设置连接超时时间
dataSource.setAcquireRetryAttempts(3); // 当获取连接失败时重新尝试的次数
return dataSource;
}
//配置mybatis的sqlSessionFactoryBean
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource); // 注入连接池对象
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("config/mybatis-config.xml")); // 注入mybatis配置文件
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); // 注入mapper接口需要的映射文件
sqlSessionFactoryBean.setTypeAliasesPackage("com.inmock.ssm.entity"); // 使用别名(非全类名)
return sqlSessionFactoryBean;
}
//配置事务管理
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
View Code
该类为spring的数据访问层有关的配置类。
@EnableTransactionManagement 是开启spring支持的声明式事务管理,只需在要使用事务管理的类或方法上添加一个@Transactional注解即可。
@MapperScan 是扫描指定的包下的mybatis的映射接口
@PropertySource 是读取jdbc配置
4. mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
View Code
配置mybatis相关的配置文件,由于spring对于mybatis的支持尚未完善,故这里我使用xml的配置形式。
5. web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 日志记录 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:properties/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
</web-app>
View Code
载入log4j的配置文件到spring中
三、属性文件
1. jdbc.properties
#数据库连接
jdbc.username=root
jdbc.password=root
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmdemo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
View Code
jdbc连接的相关属性文件,其中 allowMultiQueries=true 是用于支持多条SQL语句同时发送到数据库。
2. log4j.properties
### set log levels ###
log4j.rootLogger = INFO , console , debug , error
### console ###
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 = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n
### log file ###
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File = /WEB-INF/logs/debug.log
log4j.appender.debug.Append = true
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### exception ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = /WEB-INF/logs/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
View Code
spring日志的相关属性文件,在spring启动时加载到spring上下文中。
四、补全应用所需的类
1. UserDao
package com.inmock.ssm.dao;
import com.inmock.ssm.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao {
User selectUserById(String id);
}
View Code
@Repository标明是一个bean,是mybatis的映射接口
2. UserDao.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.inmock.ssm.dao.UserDao">
<select id="selectUserById" parameterType="string" resultType="User">
SELECT * FROM student WHERE id = #{id}
</select>
</mapper>
View Code
和UserDao映射接口对应的映射文件,具体的数据访问过程
3. UserService
package com.inmock.ssm.service;
import com.inmock.ssm.entity.User;
public interface UserService {
User selectUserById(String id);
}
View Code
服务层接口,提供服务层功能接口
4. UserServiceImpl
package com.inmock.ssm.service.impl;
import com.inmock.ssm.dao.UserDao;
import com.inmock.ssm.entity.User;
import com.inmock.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserDao userDao;
@Override
public User selectUserById(String id) {
return userDao.selectUserById(id);
}
}
View Code
服务层接口实现,提供具体实现
5. UserController
package com.inmock.ssm.controller;
import com.inmock.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(value="/views/user")
public class UserController {
@Autowired
UserService userService;
@RequestMapping(method = RequestMethod.GET)
public String showUserMessage(Model model) {
model.addAttribute("user", userService.selectUserById("1"));
return "user";
}
}
View Code
springmvc的控制层
@Controller 标明是一个bean,是springmvc的控制层
@RequestMapping 标明指定路径为该controller的映射路径
6. User
package com.inmock.ssm.entity;
public class User {
String id;
String name;
String sex;
int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
View Code
User实体
7. user.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<%--
Created by IntelliJ IDEA.
User: chenlongjie
Date: 2018/8/4
Time: 21:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>UserPage</title>
</head>
<body>
user: <c:out value="${user.getName()}"/>
</body>
</html>
View Code
视图层
转载于:https://www.cnblogs.com/chenloveslife/p/9535321.html