springboot使用jsp,过滤器,拦截器(拦截器与过滤器区别重点

 

jsp使用配置

android js交互拦截 拦截器拦截jsp_spring

  创建springboot项目在maven中暂时只添加两个Dependencies :devtools(热部署) web(远程调用,服务支持)

在创建的项目的pom.xml的<dependencies>增加jsp需要的依赖

<!--整合jsp,需要的依赖-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

server:
#  设置端口为80,访问时可以省略
  port: 80
#  视图解析器
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

  标记webapp 。在src/main下建立 webapp目录 ,然后在Project Structure中,标记为idea识别的webapp

 src/main下 新建 Directory 为webapp ,在project structure中 

android js交互拦截 拦截器拦截jsp_拦截器_02

在建立的出来的右侧,进行一下操作。apply 应用之后ok退出。如果有 Web,但是右侧下半部是空的,直接点击右侧下半部的+,指定自己创建的文件即可

android js交互拦截 拦截器拦截jsp_spring_03

到此,建立的jsp文件放到这个webapp目录下,启动项目在浏览器直接访问就可以定位到jsp资源。

修改一下配置文件application.properties

server:
  #  设置端口为80,访问时可以省略
  port: 80
  servlet:
    context-path: /
#  视图解析器
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

 springboot使用过滤器

    

android js交互拦截 拦截器拦截jsp_android js交互拦截_04

 首先自己创建一个过滤器  

package com.xiaoeyu.springboot4.filter;

import javax.servlet.*;
import java.io.IOException;

//通过实现Filter来自定义过滤器
public class Myfilter implements Filter {
    /*
    * filter是servelet规范规定的,只能用于web程序,是servlet容器比如Tomcat支持的,只在请求进入servlet之前,和出来以后起作用
    * 拦截器:既可以在web程序,也可以Application,Swing程序中,是spring框架支持的,是spring的一个组件,可以使用spring里的任何资源,对象
    * 例如  Service对象,数据源,事务管理等通过IOC注入给拦截器即可。拦截器能够深入到方法前后,异常抛出前后,有更大的弹性
    * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter:在请求到达servlet之前执行过滤器");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("doFilter:在请求离开servlet之后离开Tomcat容器之前执行");
    }
}

将过滤器进行注册,就是在springboot中使用上

package com.xiaoeyu.springboot4.config;

import com.xiaoeyu.springboot4.filter.Myfilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//标注是一个配置类,等价于配置文件.xml,springboot框架会在启动的过程中读取该配置中@Bean注解的方法,将其返回值注入到IOC容器中
@Configuration
public class FilterConfig {

    @Bean //等同于在spring配置文件中的<bean>的配置,会把方法的返回值对象,注入到IOC容器中
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new Myfilter());//用什么过滤器进行拦截即注册过滤器
        bean.addUrlPatterns("/*");//配置过滤器拦截的路径
        bean.setOrder(1);//设置启动顺序,正数,越小越优先
        return  bean;
    }
}

 springboot使用拦截器

    

android js交互拦截 拦截器拦截jsp_android js交互拦截_05

自定义个拦截器

package com.xiaoeyu.springboot4.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//拦截器,需要访问Controller中的方法才会触发
public class Myinterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle:在进入拦截器,执行Controller之前调用");
        //返回值为false请求原路返回,但是前台显示的200状态码,任何请求都可以成功,到这里以后不在往下,原路返回
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle:执行完Controller逻辑,在Controller的return ModelAndView 之前执行,可以操控ModelAndView的数据");
        modelAndView.addObject("name", "postHandle:修改姓名JRL");
        System.out.println("postHandle:修改了ModelAndView中的name值");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion:Controller的Return之后,Filter返回给客户端之前(应该是FilterAfter方法执行前)");

    }
}

将拦截器加载进去,在springboot能起作用

package com.xiaoeyu.springboot4.config;

import com.xiaoeyu.springboot4.interceptor.Myinterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//告知springboot这是一个配置类,在实现WebMvcConfigurer的对象中调用addInterceptors方法。把添加的拦截器注入到IOC容器
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Myinterceptor()).addPathPatterns("/*");//拦截的路径
    }
}

通过Controller在触发拦截器。访问静态资源不到不触发拦截器

package com.xiaoeyu.springboot4.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {
    /*从前台通过url localhost/hello?name=冯永康   
    传过来一个参数,并把它打印且放到ModelAndView中,在拦截器中对name进行修改,并跳转到jsp页面,查看效果*/
    @RequestMapping("/hello")
    public ModelAndView hello(String name, ModelAndView mv) {
        System.out.println("name:" + name);
        mv.setViewName("test");
        mv.addObject("name", name);
        return mv;
    }
}

这是用于方便显示数据的 test.jsp  直接返回字符换也可以

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
我是一个jsp页面<br>
获取ModelAndView中的数据 name=${name}<br>
</body>
</html>