目录
mybatis.xml里面的配置(里面放mybatis需要的配置)
spring.xml里面的配置(里面房spring需要的配置)
spring_mybatis.xml(里面放spring跟mybatis的共同配置)
在service中注入Dao代理接口,此接口有Spring代理实现
1.导包(上面那个集成mybatis里面我已经导入过了,如果复制的上面的这个包就不用导了)
开启SpringMVC注解(我上面的spring.xml里面也已经写过了,看的时候注意一下)
3.使用@RequestParam("")进行参数绑定,@RequestHeader("")
1. required:参数是否必须。代表页面是否必须传递该参数。如果该值为 true,但没有传递参数,会报错。
2. defaultValue:默认值。代表如果页面没有传递该参数,使用 defaultValue 的值代替。
如果前端传递内容为 json 格式 使用@RequestBody 将 Json 字符串转换为后端 Java 对象
SpringWEB为我们提供了过滤器,只需要在web.xml中配置好即可:
1.SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。
4.SpringWEB 定义了拦截器接口 HandlerInterceptor 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。 boolean preHandle
一.Spring集成Mybatis
Spring集成Mybatis其核心是将SqlSessionFactory交由Spring管理,并由Sprinf管理对dao接口的代理实现.
1.新建一个ssm项目,需要web项目.
2.导入项目需要的依赖
如下:
<!--spring里的核心基础jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!--Spring 结合 mybatis 插件包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- mybatis jar-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mysql jar-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--整合阿里数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- junit jar-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
3.创建各种需要的包
4.添加配置文件
mybatis.xml里面的配置(里面放mybatis需要的配置)
<?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>
<!--
mybatis核心配置文件
-->
<!--导入属性文件, 属性文件是键值对, 主要用来存放项目中的配置的一些参数值-->
<settings>
<!--日志功能-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--
指定mybatis自定映射的策略
NONE: 关闭自动映射,即使是单张表
PARTIAL(部分): 如果有没有嵌套映射,会自动映射结果, 一旦使用了嵌套映射,所有的都不自动映射了, 是mybatis默认值
FULL: 无论是否有嵌套映射,都开启自定映射结果
-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 二级缓存打开-->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
spring.xml里面的配置(里面房spring需要的配置)
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.ffyc.ssm"></context:component-scan>
<import resource="spring_mybatis.xml"></import>
<!-- 开启切面注解-->
<aop:aspectj-autoproxy />
<!-- 开启 springmvc 注解-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
db.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"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:property-placeholder location="classpath:config.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${uname}"></property>
<property name="password" value="${upassword}"></property>
<property name="initialSize" value="10"></property>
<property name="minIdle" value="5"></property>
<property name="maxActive" value="20"></property>
</bean>
<!-- 配置 spring 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
config.properties(数据库的url那些)
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ssm_db?serverTimezone=Asia/Shanghai
uname=root
upassword=root
spring_mybatis.xml(里面放spring跟mybatis的共同配置)
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<import resource="db.xml" ></import>
<!-- 配置 sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml">
</property>
</bean>
<!--指定生成接口代理-->
<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ffyc.ssm.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
</property>
</bean>
</beans>
在service中注入Dao代理接口,此接口有Spring代理实现
public class LoginService {
@Autowired
LoginDao loginDao;
二.搭建SpringWeb
1.SpringWeb概述
SpringWeb 是 spring 框架中的一个模块,基于 Servlet API 构建的原始 web 框架. springWeb 是 Spring 为 web 层开发提供的一整套完备的解决方案。 在web 层框架历经 Strust1,WebWork,Strust2 等诸多产品的历代更选之后,目前业界普遍选择了 springWeb 作为Java EE项目 web 层开发的首选方案。
2.SpringWeb特点
pringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.
基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者 无须额外开发控制器对象.
可以自动绑定用户输入,并正确地转换数据类型.
代码清新简洁,大幅度提升开发效率.
内部组件化程度高,可插拔式组件即插即用.
性能卓著,尤其适合现代大型、超大型互联网项目要求.
3.SpringWeb运行流程
-
客户端发送请求:客户端(通常是浏览器)向服务器发送HTTP请求,请求访问Web应用程序的某个URL。
-
DispatcherServlet接收请求:在Spring Web应用程序中,DispatcherServlet是前端控制器,它接收所有的HTTP请求并将其分发给相应的处理程序。
-
处理程序映射:DispatcherServlet使用处理程序映射器(HandlerMapping)来确定请求应该由哪个处理程序来处理。处理程序映射器根据请求的URL和其他条件将请求映射到相应的处理程序。
-
处理程序执行:一旦确定了请求应该由哪个处理程序来处理,DispatcherServlet将请求发送给该处理程序进行处理。处理程序可以是一个控制器(Controller),它负责处理请求并生成响应。
-
处理程序返回模型和视图:处理程序处理请求后,它将生成一个包含模型数据的模型(Model),并选择一个视图(View)来呈现响应。模型包含处理程序处理请求后生成的数据,视图定义了如何呈现这些数据。
-
视图解析和渲染:DispatcherServlet使用视图解析器(ViewResolver)来解析处理程序返回的视图名称,并将其转换为实际的视图对象。然后,DispatcherServlet将模型数据传递给视图,并要求视图将数据呈现为最终的响应内容。
-
响应返回给客户端:一旦视图完成渲染,DispatcherServlet将生成的响应返回给客户端。响应通常是一个HTML页面或其他类型的数据,如JSON或XML。
4.SpringWEB组件
1. 前端控制器(DispatcherServlet):它是Spring MVC框架的核心组件,负责接收所有的HTTP请求并将其分发给相应的处理程序。它充当了前端控制器的角色,协调整个请求处理流程
2.处理程序映射器(HandlerMapping):处理程序映射器用于确定请求应该由哪个处理程序来处理。它根据请求的URL和其他条件将请求映射到相应的处理程序。
3.处理程序适配器(HandlerAdapter):处理程序适配器负责将请求分发给相应的处理程序,并协调处理程序的执行过程。它根据处理程序的类型和配置选择适当的策略来执行处理程序。
4.处理器:Handler(也称之为 Controller,需要工程师开发)。 注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可 以去正确执行 Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
三.搭建SpringWeb
1.导包(上面那个集成mybatis里面我已经导入过了,如果复制的上面的这个包就不用导了)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.配置DispatcherServlet
在web.xml文件中配置DispatcherServlet,配置spring核心请求分发器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置 spring 核心请求分发器-->
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 请求映射 -->
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
开启SpringMVC注解(我上面的spring.xml里面也已经写过了,看的时候注意一下)
<mvc:annotation-driven></mvc:annotation-driven>
处理器类搭建
@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB 控制器类.
Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及 子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器 中,注入依赖。
@RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方 法上。
接收请求
@RequestMapping
@RequestMapping 是一个用来为处理器地址映射的注解,可用于类或方法上. 作用在类上,在整个项目中不能重复,作用在方法上,整个类中不能重复. 常用属性 path,value,method. path 和 value 用来定义地址 method 用来定义请求方式
@RestController
@RequestMapping(value = "loginCtl")
public class LoginController {
@Autowired
LoginService loginService;
//@RequestMapping(value = "/test1" ,method = RequestMethod.POST)
@PostMapping(path = "/test1")
public String Test1(){
System.out.println("我是test1");
return "test1";
}
//@RequestMapping(value = "/test2" ,method = RequestMethod.GET)
@GetMapping(value ="test2" )
public String Test2(){
System.out.println("test2");
return "test2";
}
}
获取请求数据
Spring WEB 支持对多种类型的请求参数进行封装
1. 使用 request 对象接收
@GetMapping(path = "/test")
public voidtset(HttpServletRequest request){
System.out.println(request.getParameter("num"));
}
在处理中如果需要使用到HttpServletRequest对象只需定义即可
2.spring自动封装
@RequestMapping("/save")
public void save(String userName,Integer age){
}
注意:Spring 会自定进行数据封装,这里要注意的是,处理器接收参数的形参名称必须 和表单的 name 属性保持一致,否则会接收失败!
3.使用@RequestParam("")进行参数绑定,@RequestHeader("")
@RequestMapping("/save")
public voidsave(@RequestParam("userName") String name,
@RequestParam("userAge") Integer age){
}
表单的name和控制器的形参并不一致,但是@RequestParam注解的value值必须和表单的name保持一致.
另外,@RequestParam 注解还有两个属性:
1. required:参数是否必须。代表页面是否必须传递该参数。如果该值为 true,但没有传递参数,会报错。
2. defaultValue:默认值。代表如果页面没有传递该参数,使用 defaultValue 的值代替。
@RequestMapping("/save")
public void save(@RequestParam(value = "userName",
required = true,defaultValue = "jim") String name){
}
@RequestHeader("host") 可以用来接收请求头中的数据
4.使用实体类对象接收
@GetMapping(path = "/login")
public String login(Admin admin){
System.out.println(admin.getAccount());
System.out.println(admin.getPassword());
Admin a = loginService.findAdmin(admin);
return "success";
}
属性类型为 Date 类型需要指定转换格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
如果前端传递内容为 json 格式 使用@RequestBody 将 Json 字符串转换为后端 Java 对象
中文乱码处理
SpringWEB为我们提供了过滤器,只需要在web.xml中配置好即可:
<filter>
<filter-name>characterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
返回JSON
Springweb中向前端返回数据为json时,只需要在方法上添加@ResponseBody 注解即可,由于在类上面已经使用@RestController 注解 ,所以不需要再次添加,@RestController 中已经包含
但是必须在项目中导入相应的json组件才可以直接将响应的对象转化为json
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
响应结果
四.拦截器
1.SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。
2、应用场景
1、日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计等。
2、权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。
3、性能监控:典型的是慢日志
3.与过滤器的区别
Spring 中的拦截器与过滤器有着本质的区别,过滤器是 servlet 规范中定义并实 现的,在进入到 servlet 之前截获请求.而拦截器是 spring 中定义的一种拦截机制, 是对进入到处理器的请求进行拦截.
4.SpringWEB 定义了拦截器接口 HandlerInterceptor 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。 boolean preHandle
预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会 被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三 个参数为被拦截的处理器。如果 preHandle 方法返回 true 表示继续流程(如调 用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他 的拦截器或处理器方法,此时我们需要通过 response 来产生响应;
5.拦截器实现
1.编写一个类,继承 HandlerInterceptorAdapter
public class DemoInterceptor implements HandlerInterceptor{
/* 当请求到达控制器之前被执行
true--继续向下执行,到达下一个拦截器,或控制器
false--不会继续向下执行*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler)throws Exception {
System.out.println("之前执行");
return false;
}
6.注册拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/statics/**"/>
<mvc:exclude-mapping path="/loginCtl/checklogin"/>
<bean id="demo" class="com.ff.springMVC.util.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>