四.SSM整合
创建Maven工程,添加依赖
第一步:
<?xml version="1.0" encoding="UTF-8"?>
<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>com.lzw</groupId>
<artifactId>ssm_01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency><dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency><dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency><dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency><!-- <dependency>-->
<!-- <groupId>mysql</groupId>-->
<!-- <artifactId>mysql-connector-java</artifactId>-->
<!-- <version>5.1.47</version>-->
<!-- </dependency>--><dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency><dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency><dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency><dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency><dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies><build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port><!--访问端口号 -->
<path>/</path><!--项目访问路径-->
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
第二步:创建数据库和表
CREATE TABLE t_emp(
emp_id INT primary key AUTO_INCREMENT,
emp_name CHAR(100),
emp_salary DOUBLE(10,5)
);
INSERT INTO t_emp(emp_name,emp_salary)
VALUES("张三",200.33);
INSERT INTO t_emp(emp_name,emp_salary)
VALUES("李四",200.44);
INSERT INTO t_emp(emp_name,emp_salary)
VALUES("王五",200.55);
第三步:创建db.properties属性文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_01
jdbc.username=root
jdbc.password=123456
第四步:JdbcConfig配置类
package com.lzw.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
//配置连接池
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
//Spring事务管理需要的平台事务管理器对象
@Bean
public PlatformTransactionManager
transactionManager(DataSource dataSource){
DataSourceTransactionManager ds = new DataSourceTransactionManager();
ds.setDataSource(dataSource);
return ds;
}
}
六:创建MybatisConfig配置类
package com.lzw.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MyBatisConfig {
//spring管理SqlSessionFactoryBean
@Bean
public SqlSessionFactoryBean
sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setTypeAliasesPackage("com.lzw.pojo");
return factoryBean;
}
//扫描mapper 生成mapper代理对象
@Bean
public MapperScannerConfigurer
mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.lzw.mapper");
return msc;
}
}
七:创建SpringConfig配置类
package com.lzw.config;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan(value = "com.lzw",excludeFilters =@ComponentScan.Filter
(type=FilterType.ANNOTATION,classes =
Controller.class))
@PropertySource("classpath:db.properties")
@Import({JdbcConfig.class,MyBatisConfig.class})
@EnableTransactionManagement //开启Spring事务管理
public class SpringConfig {
}
八:创建SpringMvcConfig配置类
@Configuration
@ComponentScan({"com.lzw.controller","com.lzw.config"})
@EnableWebMvc //开启springmvc注解支持
public class SpringMvcConfig {
}
九:创建WebConfig配置类,加载SpringMvcConfig和SpringConfig配置类
package com.lzw.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import javax.servlet.Filter;public class WebConfig extendsAbstractDispatcherServletInitializer {
//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
@Override
protected WebApplicationContext
createServletApplicationContext() {
//初始化WebApplicationContext对象
AnnotationConfigWebApplicationContext
webApplicationContext= new AnnotationConfigWebApplicationContext();
//加载指定配置类
webApplicationContext.register(SpringMvcConfig.class);
return webApplicationContext;
}
//配置springmvc能够处理的路径
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring相关配置
@Override
protected WebApplicationContext
createRootApplicationContext() {
AnnotationConfigWebApplicationContext
rootApplicationContext= new AnnotationConfigWebApplicationContext();
rootApplicationContext.register(SpringConfig.class);
return rootApplicationContext;
}
//处理POST中文乱码
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter
characterEncodingFilter=new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
return new Filter[]
{characterEncodingFilter};
}
}
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class<?>[] getRootConfigClasses(){
return new Class[]{SpringConfig.class};
}
protected Class<?>[]
getServletConfigClasses() {
return new Class[]
{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
//处理POST中文乱码
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter
characterEncodingFilter=new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
return new Filter[]
{characterEncodingFilter};
}
}
十:静态资源放行
//当前类需要设置为配置类,并被扫描加载
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void
addResourceHandlers(ResourceHandlerRegistryregistry) {
//当访问/pages/xxxx时候,从/pages目录下查找内容
//http://loclahost:8080/js/axios-0.18.0.js
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
创建实体类对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private Integer empId;
private String empName;
private Double empSalary;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private int code;//响应状态码
private String msg;//响应消息
private Object data;//响应数据
}
创建持久层
public interface EmpMapper {
public Emp findEmpById(Integer empId);
}
xml方式查询
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lzw.mapper.EmpMapper">
<!--根据ID查询员工信息-->
<select id="findEmpById" resultType="Emp">
select emp_id empId,emp_name
empName,emp_salary empSalary from t_emp where
emp_id = #{empId}
</select>
</mapper>
注解方式查询
package com.ll.mapper;
import com.ll.pojo.Emp;
import org.apache.ibatis.annotations.*;
import java.util.List;public interface EmpMapper {//根据ID查询@Select("select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{empId}")public Emp findEmpById(Integer empId);//根据Id删除一条数据// @Delete("delete from t_emp where emp_id=#{empId}")// Integer deleteById(Integer empId);//根据id修改一条数据// @Update("update t_emp set emp_name =#{empName},emp_salary = #{empSalary}
//where emp_id = #{empId}")// Integer updateEmpById(@Param("empId") Integer empId,@Param("empName")
//String empName,@Param("empSalary") Double empSalary);//添加一条数据// @Insert("insert into t_emp value(null,#{empName},#{empSalary})")// Integer insertEmp(@Param("empName") String empName,@Param("empSalary")
//Double empSalary);
业务层
业务层接口:
public interface EmpService {
public Emp findEmpById(Integer empId);
}
业务层实现类:
@Service
@Transactional
public class EmpServiceImpl implements
EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public Emp findEmpById(Integer empId) {
return empMapper.findEmpById(empId);
}
}
表现层
@Controller
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
//根据ID查询员工信息
@RequestMapping("/findEmpById")
@ResponseBody
public Result findEmpById(Integer empId){
Emp emp = empService.findEmpById(empId);
if(emp != null){
Result result=new Result(20000,"查询成功",emp);
return result;
}else{
return null;
}
}
}
页面
<%@ page contentType="text/html;charset=UTF-8"language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>根据ID查询员工数据</h2>
<input type="button" value="点我" onclick="fn01()"/>
<script src="/js/axios-0.18.0.js"></script>
<script>
function fn01(){
axios.get("http://localhost:8080/emp/findEmpById?empId=1").then(function(response){
console.log(response.data);
});
}
</script>
</body>
</html>
五.SpringMVC的统一异常处理
5.1 统一异常处理概述
系统中异常包括两类:编译时异常和运行时异常
RuntimeException,前者通过捕获异常从而获取异常信息,
后者主要通过规范代码开发、测试通过手段减少运行时异常的
发生。
系统的DAO、Service出现都通过throws Exception向上抛
出。所有的异常均抛出到表现层进行处理。表现层处理异常,
每个方法中单独书写,代码书写量巨大且意义不强,使用AOP
思想进行解决。
5.2 项目异常处理代码实现
@RestControllerAdvice
public class ProjectException {
@ExceptionHandler(Exception.class)
public Result doException(Exception e) {
Result result = new Result(40000, "页面走丢了", null);
return result;
}
}
5.3 自定义异常处理
public class GlobalNullException extends
RuntimeException{
public GlobalNullException() {
}
public GlobalNullException(String message) {
super(message);
}
}
@RestControllerAdvice
public class ProjectException {
@ExceptionHandler(Exception.class)
public Result doException(Exception e) {
Result result = new Result(40000, "页面走丢了", null);
return result;
}
@ExceptionHandler(GlobalNullException.class)
public Result
doGlobalNullException(GlobalNullException e) {
Result result = new Result(400001, "李xxx来处理异常了", null);
return result;
}
}