springboot jsp,過濾器,攔截器


springboot使用jsp,過濾器,攔截器(攔截器與過濾器區別重點

 

jsp使用配置

  創建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>


  在application.yml(yml格式的好用,把properties改了)文件中,增加視圖解析

server:
#  設置端口為80,訪問時可以省略
  port: 80
#  視圖解析器
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

  標記webapp 。在src/main下建立 webapp目錄 ,然后在Project Structure中,標記為idea識別的webapp

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

在建立的出來的右側,進行一下操作。apply 應用之后ok退出。如果有 Web,但是右側下半部是空的,直接點擊右側下半部的+,指定自己創建的文件即可

到此,建立的jsp文件放到這個webapp目錄下,啟動項目在瀏覽器直接訪問就可以定位到jsp資源。

修改一下配置文件application.properties

server:
  #  設置端口為80,訪問時可以省略
  port: 80
  servlet:
    context-path: /
#  視圖解析器
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

 springboot使用過濾器

    

 首先自己創建一個過濾器  

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使用攔截器

    

自定義個攔截器

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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM