SpringBoot - JSP,Servlet,拦截器(Interceptor),过滤器(Filter),Runner 接口

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot - JSP,Servlet,拦截器(Interceptor),过滤器(Filter),Runner 接口相关的知识,希望对你有一定的参考价值。

一、容器

SpringBoot 在 main 方法中 SpringApplication.run()方法获取返回的 Spring 容器对象,再获取业务 bean进行调用

我们先创建一个service接口以及实现类

@Service("helloService")
public class HelloServiceImpl implements HelloService 
    @Override
    public void salyHello() 
        System.out.println("Hello,Sprng Boot!");
    

在启动类中

@SpringBootApplication
public class Springboot6ContainerApplication 

    public static void main(String[] args) 
        /**
         * SpringApplication.run()返回ConfigurableApplicationContext 接口对象
         * ConfigurableApplicationContext 接口对象继承自 ApplicationContext
         */
        ApplicationContext context = SpringApplication.run(Springboot6ContainerApplication.class, args);

        HelloService helloService = (HelloService) context.getBean("helloService");
        helloService.salyHello();
    

二、ComnandLineRunner 接口 , ApplcationRunner接口

CommandLineRunner 和 ApplicationRunner 接口,在容器启动后执行一些内容

比如读取配置文件,数据库连接等

SpringBoot 提供了两个接口CommandLineRunner 和 ApplicationRunner。他们的执行时机为容器启动完成时

这两个接口中有一个 run 方法,只需要实现这个方法即可

这两个接口的不同之处在于:

ApplicationRunner中run()方法的参数为ApplicationArguments,而CommandLineRunner接口中run()方法的参数为String数组

我们先创建一个service接口以及实现类

@Service("helloService")
public class HelloServiceImpl implements HelloService 
    @Override
    public String sayHello() 
        return  "Hello,Sprng Boot!";
    

启动类中

@SpringBootApplication
public class Springboot7CommandlinerunnerApplication implements CommandLineRunner 
    @Autowired
    HelloService helloService;
    public static void main(String[] args) 
        System.out.println("准备创建容器对象");
        //创建容器对象
        SpringApplication.run(Springboot7CommandlinerunnerApplication.class, args);
        System.out.println("容器对象创建之后");
    

    /**
     * CommandLineRunner 和 ApplicationRunner 接口
     * 在容器启动后执行一些内容。比如读取配置文件,数据库连接等
     * SpringBoot 提供了两个接口CommandLineRunner 和 ApplicationRunner。他们的执行时机为容器启动完成时
     * 这两个接口中有一个 run 方法,只需要实现这个方法即可
     * 这两个接口的不同之处在于:
     * ApplicationRunner中run()方法的参数为ApplicationArguments,而CommandLineRunner接口中run()方法的参数为String数组
     */
    @Override
    public void run(String... args) throws Exception 
        String str  = helloService.sayHello();
        System.out.println("调用容器中的对象="+str);
        //可做自定义的操作,比如读取文件, 数据库等等
        System.out.println("在容器对象创建好,执行的方法");
    

看控制台中输出

三、JSP

springboot默认是不持jsp的, 它的默认Thymeleaf模板, 所以我们要手动对其进行配置

创建一个项目,导入如下依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--处理jsp依赖-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
    </dependencies>

    <build>
        <!--指定jsp编译后的存放目录-->
        <resources>
            <resource>
                <!--jsp原来的目录-->
                <directory>src/main/webapp</directory>
                <!--指定编译后的存放目录-->
                <targetPath>META-INF/resources</targetPath>
                <!--指定处理的目录和文件-->
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

在 application.yml中配置视图解析器

#设置端口号
server:
  port: 8081
  servlet:
    context-path: /myjsp

#视图解析器
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

 设置web项目的根目录

首先在src目录下创建一个 webapp目录

我们选择 file ----> Project Structure ---->  选择模块,选择 Web Resource Directories ,新建webapp 目录即可 

即可看到webapp被设为web项目的根目录,并有一个蓝点的标志 

启动项目运行 

四、Servlet

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, IOException 
        //使用HttpServletResponse输出数据,应答结果
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out  = resp.getWriter();
        out.println("===执行的是Servlet==");
        out.flush();
        out.close();

    

2、注册Servlet类(ServletRegistrationBean

@Configuration
public class WebApplictionConfig 

    /**
     * 定义方法,注册Servlet
     * ServletRegistrationBean:servlet的注册类
     */
    @Bean
    public ServletRegistrationBean servletRegistrationBean()
        //public ServletRegistrationBean(T servlet, String... urlMappings)
        //第一个参数是 Servlet对象, 第二个是url地址

        //ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(),"/myservlet");
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(new MyServlet());
        servletRegistrationBean.addUrlMappings("/login","/test");// <url-pattern>

        return servletRegistrationBean;
    

五、拦截器(Interceptor)

1、自定义拦截器

/**
 * 自定义拦截器
 */
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;
    

2、添加拦截器,注入到spring容器中

@Configuration
public class MyAppConfig implements WebMvcConfigurer 

    //添加拦截器对象, 注入到容器中
    @Override
    public void addInterceptors(InterceptorRegistry registry) 
        //创建拦截器对象
        HandlerInterceptor interceptor = new LoginInterCeptor();

        //指定拦截的请求uri地址
        String path[] = "/user/**";
        //指定不拦截的URI地址
        String excludePath[] = "/user/login";

        registry.addInterceptor(interceptor).addPathPatterns(path).excludePathPatterns(excludePath);
    

 通过controller访问测试

@Controller
public class MyController 
    @RequestMapping("/user/account")
    @ResponseBody
    //会执行Interceptor中的preHandle()方法
    public String userAccount()
        return "访问user/account地址";
    

    @RequestMapping("/user/login")
    @ResponseBody
    //不会执行Interceptor中的preHandle()方法
    public String userLogin()
        return "访问user/login地址";
    

六、过滤器(Filter)

1、自定义过滤器

//自定义过滤器
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、注册过滤器(FilterRegistrationBean)

@Configuration
public class WebApplicationConfig 
    //FilterRegistrationBean注册过滤器
    @Bean
    public FilterRegistrationBean filterRegistrationBean() 
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/user/*");
        return bean;
    

3、controller测试

@Controller
public class FilterController 
    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount()
        return "user/account";
    


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

七、字符集过滤器 (CharacterEncodingFilter )

字符集过滤器CharacterEncodingFilter : 解决post请求中乱码的问题

我们有两种配置方式

(1)application.yml文件, 让自定义的过滤器起作用

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

(2)application.yml文件,启动系统的过滤器,并指定编码方式

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

      #设置系统的CharacterEncdoingFilter是否生效
      enabled: true
      #指定使用的编码方式
      charset: utf-8
      #强制request,response都使用charset属性的值
      force: true

1、application.yml配置文件

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

      #设置系统的CharacterEncdoingFilter是否生效
      enabled: true
      #指定使用的编码方式
      charset: utf-8
      #强制request,response都使用charset属性的值
      force: true

#让系统的CharacterEncdoingFilter生效
#server.servlet.encoding.enabled=true
#指定使用的编码方式
#server.servlet.encoding.charset=utf-8
#强制request,response都使用charset属性的值
#server.servlet.encoding.force=true

2、自定义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, IOException 
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("===在Servlet输出中文,默认编码ISO-8859-1===");
        out.flush();
        out.close();
    

3、 注册拦截器,过滤器

@Configuration
public class WebConfig 

    //注册Servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean()
        ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
        return bean;
    

    //注册Filter
    @Bean
    public FilterRegistrationBean filterRegistrationBean()
        FilterRegistrationBean bean = new FilterRegistrationBean();

        //使用框架中过滤器类
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        //指定使用编码方式
        filter.setEncoding("utf-8");
        //指定request,response 都使用encoding编码
        filter.setForceEncoding(true);

        bean.setFilter(filter);
        //指定过滤的url地址
        bean.addUrlPatterns("/*");
        return bean;
    

以上是关于SpringBoot - JSP,Servlet,拦截器(Interceptor),过滤器(Filter),Runner 接口的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot - JSP,Servlet,拦截器(Interceptor),过滤器(Filter),Runner 接口

springboot整合jsp模板

Springboot-添加对jsp支持

SpringBoot使用Jsp

SpringBoot集成jsp

SpringBoot 的应用场景是什么?