视频链接:https://www.bilibili.com/video/BV1XQ4y1m7ex/?vd_source=9545770e4a2968c05878ffac8589ec6c
视频选集:P30— P57
文章目录
1.Web组件
1.1 复习springMVC拦截器
拦截器是SpringMVC中一种对象,能拦截对Controller的请求。
拦截器框架中有系统的拦截器,还可以自定义拦截器。实现对请求预先处理。
实现自定义拦截器:
- 创建类实现SpringMVC框架的Handlerlnterceptor接口
- 需在SpringMVC的配置文件中,声明拦截器
1.2 springboot中拦截器
自定义拦截器:
package com.bjpowernode.web;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定义的拦截器
public class LoginInterceptor implements HandlerInterceptor {
/**
*
* @param request
* @param response
* @param handler 被拦截的的控制器对象
* @return boolean
* true:请求能被Controller处理
* false:请求被截断
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("执行了LoginInterceptor的preHandle");
return true;
}
}
将拦截器注入到容器中:
package com.bjpowernode.config;
import com.bjpowernode.web.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyAppConfig implements WebMvcConfigurer {
//添加拦截器对象,注入到容器中
@Override
public void addInterceptors(InterceptorRegistry registry) {
//创建拦截器对象
HandlerInterceptor interceptor = new LoginInterceptor();
//指定拦截的请求url地址
String path []= {"/user/**"};
//指定不拦截的地址
String excludePath []= {"/user/login"};
registry.addInterceptor(interceptor)
.addPathPatterns(path)
.excludePathPatterns(excludePath);
}
}
controller:
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class BootController {
@RequestMapping("/user/account")
@ResponseBody
public String userAccount(){
return "访问user/account地址";
}
@RequestMapping("/user/login")
@ResponseBody
public String userLogin(){
return "访问user/login地址";
}
}
测试效果:
1.3 springboot中使用servlet
在SpringBoot框架中使用Servlet对象。
使用步骤∶
- 创建Servlet类。创建类继承HttpServlet
- 注册Servlet ,让框架能找到Servlet
创建自定义的servlet:
package com.bjpowernode.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//创建servlet类
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用HttpServletResponse输出数据,应答结果
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("执行的是Servlet");
out.flush();
out.close();
}
}
注册servlet:
package com.bjpowernode.config;
import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebApplictionConfig {
//定义方法,注册Servlet对象
@Bean
public ServletRegistrationBean servletRegistrationBean(){
//public ServletRegistrationBean(T servlet, String... urlMappings)
//第一个参数是Servlet对象,第二个是url地址
ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(),"/myservlet");
return bean;
}
}
测试:
注意:
1.4 springboot中使用过滤器Filter
Filter是Servlet规范中的过滤器,可以处理请求,对请求的参数,属性进行调整。常常在过滤器中处理字符编码
在框架中使用过滤器︰
- 创建自定义过滤器类
- 注册Filter过滤器对象
创建自定义过滤器:
package com.bjpowernode.web;
import javax.servlet.*;
import java.io.IOException;
//自定义过滤器
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("执行了MyFilter,doFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
}
注册Filter过滤器对象:
package com.bjpowernode.config;
import com.bjpowernode.web.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebApplicationConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new MyFilter());
bean.addUrlPatterns("/user/*");
return bean;
}
}
创建controller:
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class CustomFilterController {
@RequestMapping("/user/account")
@ResponseBody
public String userAccount(){
return "user/account";
}
@RequestMapping("/query")
@ResponseBody
public String queryAccount(){
return "/query";
}
}
测试:
1.5 字符集过滤器的应用
CharacterEncodingFilter :解决post请求中乱码的问题
在SpringMVC框架,在web.xml注册过滤器。配置他的属性。
1.5.1 展现问题
定义servlet:
package com.bjpowernode.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("在Servlet输出中文");
out.flush();
out.close();
}
}
注册Servlet:
package com.bjpowernode.config;
import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebSystemConfig {
@Bean
//注册Servlet
public ServletRegistrationBean servletRegistrationBean(){
MyServlet myServlet = new MyServlet();
ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
return reg;
}
}
测试:
1.5.2 解决问题
配置字符集过滤器:
package com.bjpowernode.config;
import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
@Configuration
public class WebSystemConfig {
@Bean
//注册Servlet
public ServletRegistrationBean servletRegistrationBean(){
MyServlet myServlet = new MyServlet();
ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
return reg;
}
//字符集过滤器
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean reg = new FilterRegistrationBean();
//使用框架中的过滤器类
CharacterEncodingFilter filter = new CharacterEncodingFilter();
//指定使用的编码方式
filter.setEncoding("utf-8");
//指定request,response都使用encoding的值
filter.setForceEncoding(true);
reg.setFilter(filter);
//指定 过滤的url地址
reg.addUrlPatterns("/*");
return reg;
}
}
修改application.properties文件,让自定义的过滤器起作用:
#SpringBoot中默认已经配置了CharacterEncodingFilter。编码默认ISO-8859-1
#设置enabled=false作用是关闭系统中配置好的过滤器,使用自定义的
server.servlet.encoding.enabled=false
测试:
1.5.3 在application配置设置编码方式
注:server.servlet.encoding.enabled默认就是true,所以可以不用设置
2.ORM操作MySQL
讲解MyBatis框架,读写MySQL 数据。通过SpringBoot +MyBatis实现对数据库学生表的查询操作。
使用MyBatis框架操作数据,在SpringBoot框架集成MyBatis
使用步骤:
- mybatis起步依赖︰完成mybatis对象自动配置,对象放在容器中
- pom.xml指定把src/main/java目录中的xml文件包含到classpath中
- 创建实体类Student
- 创建Dao接口StudentDao,创建一个查询学生的方法
- 创建Dao接口对应的Mapper文件,xml文件,写sql语句
- 创建Service层对象,创建StudentService接口和他的实现类。去调用dao对象的方法。完成数据库的操作
- 创建Controller对象,访问Service
- 写application.properties文件【配置数据库的连接信息】
2.1 创建student表
视频中在navicat中设计表,我在这用IDEA连接MySQL 后,直接操作增加表和添加数据:
2.2 MyBatis起步依赖
<dependencies>
<!--ctrl+shift+/-->
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.3 创建Dao接口和Mapper文件
定义实体类:
package com.bjpowrnode.model;
public class Student {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
创建Dao接口:
package com.bjpowrnode.dao;
import com.bjpowrnode.model.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper //告诉MyBatis这是dao接口,创建此接口的代理对象【位置:在类的上面】
public interface StudentDao {
Student selectById(@Param("stuId") Integer id);
}
创建Dao的Mapper文件:
<?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.bjpowrnode.dao.StudentDao">
<!--定义sql语句-->
<select id="selectById" resultType="com.bjpowrnode.model.Student">
select id,name,age from student where id = #{stuId}
</select>
</mapper>
2.4 创建业务层对象
创建Service接口:
package com.bjpowrnode.service;
import com.bjpowrnode.model.Student;
public interface StudentService {
Student queryStudent(Integer id);
}
接口实现类:
package com.bjpowrnode.service.impl;
import com.bjpowrnode.dao.StudentDao;
import com.bjpowrnode.model.Student;
import com.bjpowrnode.service.StudentService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class StudentServiceImpl implements StudentService {
@Resource //自动注入
private StudentDao studentDao;
@Override
public Student queryStudent(Integer id) {
Student student = studentDao.selectById(id);
return student;
}
}
2.5 创建Controller
package com.bjpowrnode.controller;
import com.bjpowrnode.model.Student;
import com.bjpowrnode.service.StudentService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
@Controller
public class StudentController {
@Resource
private StudentService studentService;
@RequestMapping("/student/query")
@ResponseBody
public String queryStudent(Integer id){
Student student = studentService.queryStudent(id);
return student.toString();
}
}
2.6 配置文件
配置resources插件:
<build>
<!--resources插件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
properties文件:
server.port=8083
server.servlet.context-path=/orm
#连接数据库 mysql驱动新版的驱动类
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
2.7 测试MyBatis访问数据
测试:
2.8 第一种方法:@Mapper
@Mapper:放在dao接口的上面,每个接口都需要使用这个注解。
package com.bjpowrnode.dao;
import com.bjpowrnode.model.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper //告诉MyBatis这是dao接口,创建此接口的代理对象【位置:在类的上面】
public interface StudentDao {
Student selectById(@Param("stuId") Integer id);
}
2.9 第二种方法:@MapperScan
2.10 第三种方法:Dao接口和Mapper文件分开
现在把Mapper文件放在resources目录下
1 )在resources目录中创建子目录(自定义的),例如mapper
2)把mapper文件放到 mapper目录中
3 )在application.properties文件中,指定mapper文件的目录
4)在pom.xml中指定把resources目录中的文件,编译到目标目录中
添加日志信息:
#指定mybatis的日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2.11 spring中的事务控制
Spring框架中的事务∶
- 管理事务的对象︰事务管理器(接口,接口有很多的实现类)
例如︰使用Jdbc或mybatis访问数据库,使用的事务管理器:DataSourceTransactionManager - 声明式事务︰在xml配置文件或者使用注解说明事务控制的内容
控制事务︰隔离级别,传播行为,超时时间 - 事务处理方式︰
1 ) Spring框架中的@Transactional
2) aspectj框架可以在xml配置文件中,声明事务控制的内容
SpringBoot中使用事务︰上面的两种方式都可以。
- 在业务方法的上面加入@Transactional,加入注解后,方法有事务功能了。
- 明确的在主启动类的上面,加入@EnableTransactionManager
2.11.1 修改pom.xml
其中GeneratorMapper.xml为视频中的一个插件,放在目标下的【这木有】
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>GeneratorMapper.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
2.11.2 使用MyBatis生成器
运行效果:
2.11.3 application配置文件
2.11.4 public方法加入@Tranactional
创建service
2.11.5 完成事务设置
创建controller:
在启动类中: