初学SpringBoot--ch04-SpringBoot 与web 组件

ch04-SpringBoot 与web 组件

  • 1.1 SpringBoot 中拦截器
    • 1.1.1 SpringMVC 实现过滤器
      • 1)实现自定义拦截器:
      • 2)需在SpringMVC的配置文件中,声明拦截器
    • 1.1.2 SpringBoot 使用拦截器
      • 1)创建类实现 HandlerInterceptor 接口
      • 2)注册拦截器对象
      • 3)创建测试使用的 Controller
  • 1.2 SpringBoot 中使用 Servlet
    • 1.2.1 SpringBoot 使用 Servlet
      • 1)创建Servlet 继承HttpServlet
      • 2)注册Servlet
  • 1.3 SpringBoot 中使用 Filter
    • 1.3.1 SpringBoot 使用Filter
      • 1)创建 Filter 对象
      • 2)注册 Filter
      • 3)创建 Controller
  • 1.4 字符集过滤器的应用
    • 方法一
      • 1)创建 Servlet,输出中文数据
      • 2)注册 Servlet 和 Filter
      • 3)修改 application.properties 配置文件
    • 方法二
      • 1)修改 application.properties 配置文件

1.1 SpringBoot 中拦截器

拦截器是SpringMVC中一种对象,能拦截器对Controller的请求。
拦截器框架中有系统的拦截器, 还可以自定义拦截器。 实现对请求预先处理。

1.1.1 SpringMVC 实现过滤器

1)实现自定义拦截器:

创建类实现SpringMVC框架的HandlerInterceptor接口

public interface HandlerInterceptor {
 default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     return true;
 }

 default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
 }

 default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
 }
}

2)需在SpringMVC的配置文件中,声明拦截器

<mvc:interceptors>
	<mvc:interceptor>
    	
        <bean class="拦截器类全限定名称"/>
    mvc:interceptor>
mvc:interceptors>

1.1.2 SpringBoot 使用拦截器

1)创建类实现 HandlerInterceptor 接口

package com.suyv.web;

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System. out .println("执行了 LoginInterceptor,preHandle()");
        return true;
    }
}

2)注册拦截器对象

package com.suyv.config;

import com.suyv.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);
    }
}

3)创建测试使用的 Controller

package com.suyv.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.2 SpringBoot 中使用 Servlet

ServletRegistrationBean 用来做在 servlet 3.0+容器中注册 servlet 的功能,但更具有 SpringBean 友好性。

1.2.1 SpringBoot 使用 Servlet

1)创建Servlet 继承HttpServlet

package com.suyv.servlet;

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;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("使用 Servlet 对象");
        out.flush();
        out.close();
    }
}

2)注册Servlet

package com.suyv.config;

import com.suyv.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SystemConfig {

    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean reg = new ServletRegistrationBean();
        reg.setServlet(new MyServlet());
        reg.addUrlMappings("/myServlet");
        return reg;

    }
}

1.3 SpringBoot 中使用 Filter

FilterRegistrationBean 用来注册 Filter 对象。
Filter 是 Servlet 规范中的过滤器,可以处理请求, 对请求的参数, 属性进行调整。 常常在过滤器中处理字符编码。

1.3.1 SpringBoot 使用Filter

1)创建 Filter 对象

package com.suyv.filter;

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("使用了 Servlet 中的 Filter 对象");
        filterChain.doFilter(servletRequest,servletResponse);
    }

}

2)注册 Filter

package com.suyv.config;

import com.suyv.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean reg = new FilterRegistrationBean();
        reg.setFilter(new MyFilter());
        reg.addUrlPatterns("/user/*");
        return reg;
    }
}

3)创建 Controller

package com.suyv.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/account1")
    @ResponseBody
    public String userAccount1(){
        return "user/account1";
    }

    @RequestMapping("/query")
    @ResponseBody
    public String queryAccount(){
        return "query";
    }
}

1.4 字符集过滤器的应用

CharacterEncodingFilter : 解决post请求中乱码的问题。
在SpringMVC框架, 在web.xml 注册过滤器。 配置他的属性。

方法一

1)创建 Servlet,输出中文数据

package com.suyv.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();
    }
}

2)注册 Servlet 和 Filter

package com.suyv.config;

import com.suyv.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
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean reg = new ServletRegistrationBean(new 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;
    }
}

3)修改 application.properties 配置文件

#SpringBoot中默认已经配置了CharacterEncodingFilter。 编码默认ISO-8859-1
#设置enabled=false 作用是关闭系统中配置好的过滤器, 使用自定义的CharacterEncodingFilter
server.servlet.encoding.enabled=false

方法二

1)修改 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学习,spring,boot,java,maven)