Springboot第三章 SpringBoot 和 web 组件
Posted 王六六的IT日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot第三章 SpringBoot 和 web 组件相关的知识,希望对你有一定的参考价值。
第三章 SpringBoot 和 web 组件
三个组件:拦截器、Servlet 、Filter
3.1 SpringBoot中拦截器
拦截器是SpringMVC中一种对象,能拦截器对Controller的请求。
拦截器框架中有系统的拦截器, 还可以自定义拦截器,实现对请求预先处理。
实现自定义拦截器:
1.创建类实现SpringMVC框架的HandlerInterceptor接口
HandlerInterceptor
有三个默认方法,主要用第一个,来实现对请求的拦截和请求的预先处理,返回值是布尔值。返回值true代表通过拦截器的验证,请求是可以被系统处理的。
2.需在SpringMVC的配置文件中声明拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:path="url" />
<bean class="拦截器类全限定名称"/>
</mvc:interceptor>
</mvc:interceptors>
在SpringMVC 框架中需要以上操作。
接下来是Springboot中怎么创建拦截器以及怎么放进框架中:
1.自定义拦截器:web👉LoginInterceptor
:
重写preHandle方法
👇
public class LoginInterceptor implements HandlerInterceptor
/**
* @param request
* @param response
* @param handler 被拦截器的控制器对象
* @return boolean
* true: 请求能被Controller处理
* false: 请求被截断
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception
System.out.println("执行了LoginInterceptor的preHandle");
return true;
- 需要把拦截器加入容器中才能起作用,自定义一个类实现
WebMvcConfigurer
的接口。
WebMvcConfigurer中有很多默认方法:
重写addInterceptors
:
运行主函数:
访问user/account:
拦截器运行:
访问user/login不会拦截:
3.2 Servlet
在SpringBoot框架中使用Servlet对象。
使用步骤:
- 创建Servlet类。 创建类继承
HttpServlet
- 注册Servlet ,让框架能找到Servlet:
ServletRegistrationBean
例子:
1.创建自定义Servlet类
//创建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();
2.注册Servlet
ServletRegistrationBean
这个类源码:
ServletRegistrationBean
的第一个参数是 Servlet对象, 第二个是url地址:
public ServletRegistrationBean(T servlet, String... urlMappings)
@Configuration
public class WebApplictionConfig
//定义方法, 注册Servlet对象
@Bean
public ServletRegistrationBean servletRegistrationBean()
ServletRegistrationBean bean = new ServletRegistrationBean( new MyServlet(),"/myservlet");
return bean;
运行主函数,浏览器输入访问地址:
servletRegistrationBean的无参构造方法:
@Configuration
public class WebApplictionConfig
//定义方法, 注册Servlet对象
@Bean
public ServletRegistrationBean servletRegistrationBean()
//两个参数
// ServletRegistrationBean bean = new ServletRegistrationBean( new MyServlet(),"/myservlet");
//无参构造
ServletRegistrationBean bean = new ServletRegistrationBean();
bean.setServlet( new MyServlet());
bean.addUrlMappings("/login","/test"); // <url-pattern>
return bean;
运行主函数,在浏览器输入地址:
3.3 过滤器Filter
Filter是Servlet规范中的过滤器,可以处理请求, 对请求的参数、属性进行调整。 常常在过滤器中处理字符编码。
在Springboot框架中使用过滤器:
- 创建自定义过滤器类
- 注册Filter过滤器对象
例子:
1. 自定义过滤器:自定义过滤器类并实现Filter接口
web 👉 MyFilter
// 自定义过滤器
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);
2. 注册Filter: filterRegistrationBean
@Configuration
public class WebApplicationConfig
@Bean
public FilterRegistrationBean filterRegistrationBean()
//无参构造
FilterRegistrationBean bean = new FilterRegistrationBean();
//对象
bean.setFilter( new MyFilter() );
//地址
bean.addUrlPatterns("/user/*");
return bean;
@Controller
public class CustomFilterController
@RequestMapping("/user/account")
@ResponseBody
public String userAccount()
return "访问user/account地址";
@RequestMapping("/query")
@ResponseBody
public String queryAccount()
return "访问/query地址";
执行主函数,在浏览器输入访问地址:
将日志清空,再输入/query
日志输出:
3.4 字符集过滤器
CharacterEncodingFilter
: 解决post请求中乱码的问题
SpringMVC框架中 在web.xml
注册过滤器, 配置它的属性。
第一种方式:
使用步骤:
执行主函数,在浏览器输入访问地址:
Springboot框架中使用过滤器解决乱码问题:
1.在配置类中,配置字符集过滤器,filterRegistrationBean
@Configuration
public class WebSystemConfig
//注册Servlet
@Bean
public ServletRegistrationBean servletRegistrationBean()
MyServlet myServlet = new MyServlet();
ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
return reg;
//注册Filter
@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;
2.修改application.properties文件, 让自定义的过滤器起作用
SpringBoot中默认已经配置了CharacterEncodingFilter。编码默认ISO-8859-1。
设置enabled=false 作用是关闭系统中配置好的过滤器, 使用自定义的CharacterEncodingFilter。
server.servlet.encoding.enabled=false
第二种方式 简单的方式使用字符集过滤器
不需要在config文件中注册过滤器。只需要修改application.properties
文件
server.port=9001
server.servlet.context-path=/myboot
#让系统的CharacterEncdoingFilter生效
server.servlet.encoding.enabled=true
#指定使用的编码方式
server.servlet.encoding.charset=utf-8
#强制request,response都使用charset属性的值
server.servlet.encoding.force=true
以上是关于Springboot第三章 SpringBoot 和 web 组件的主要内容,如果未能解决你的问题,请参考以下文章
springboot第三天---SpringBoot属性配置
(转)SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql