溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot中如何整合Servlet

發布時間:2021-07-30 13:50:22 來源:億速云 閱讀:161 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關Springboot中如何整合Servlet,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、springboot入門

?  Spring Boot設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。 
?  嵌入的 Tomcat,無需部署 WAR 文件 
?  Spring Boot 并不是對 Spring 功能上的增強,而是提供了一種快速使用 Spring 的方式。

POM.xml

    <!--springboot項目的父類,所有springboot項目都必須繼承于它-->
	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

	<!--springboot啟動器-->
	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
	</dependency>
springBoot啟動器其實就是一些jar包的集合。SprigBoot一共提供44啟動器。
    1 spring-boot-starter-web
    支持全棧式的web開發,包括了romcat和springMVC等jar
    2 spring-boot-starter-jdbc
    支持spring以jdbc方式操作數據庫的jar包的集合
    3 spring-boot-starter-redis
    支持redis鍵值存儲的數據庫操作

Controller

package com.lee.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorld {

    @RequestMapping("/hello")
    public Map<String,Object> hello(){
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("msg","hello world");
        return resultMap;
    }

}

啟動類

package com.lee;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}
@SpringBootApplication包含:
	@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan、@Configuration等注解,它是一個配置類,掃描了當前包和當前包下所有子包下的所有文件

結果:http://localhost:8080/hello

{"msg":"hello world"}

二、Springboot整合Servlet

兩種方式完成組件的注冊:

1、通過注解掃描完成組件的注冊

FirstServlet

package com.lee.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * springboot整合servlet的第一種方式:
 *   原來
 *      <servlet>
 *          <servlet-name>firstServlet</servlet-name>
 *          <servlet-class>com.lee.FirstServlet</servlet-class>
 *      </servlet>
 *      <servlet-mapping>
 *          <servlet-name>firstServlet</servlet-name>
 *          <url-pattern>/firstServlet</url-pattern>
 *      </servlet-mapping>
 */
@WebServlet(name="firstServlet",urlPatterns = "/firstServlet")
public class FirstServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("firstServlet............");
    }
}

啟動類:

package com.lee;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

//該注解會掃描當前包和其子包下的 @WebServlet,
//并在啟動類啟動的時候將其實例化
@ServletComponentScan
@SpringBootApplication
public class SpringbootApplicationServlet1 {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplicationServlet1.class,args);
    }

}

結果:http://localhost:8080/firstServlet

firstServlet............

2、通過方法完成組件的注冊

SecondServlet

package com.lee.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SecondServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("secondServlet....");
    }
}

啟動類

package com.lee;

import com.lee.servlet.SecondServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootApplicationServlet2 {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplicationServlet2.class,args);
    }

    //將scondServlet注冊到servletRegistrationBean中
    @Bean
    public ServletRegistrationBean secondServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(new SecondServlet());
        bean.addUrlMappings("/secondServlet");
        return bean;
    }

}

結果:http://localhost:8080/secondServlet

secondServlet....

三、Springboot整合Filter

兩種方式完成組件的注冊

1、通過注解掃描完成組件的注冊

FirstFilter

package com.lee.filter;


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

/**
 * <filter>
 *     <filter-name>FirstFilter</filter-name>
 *     <filter-class>com.lee.filter.FirstFilter</filter-class>
 * </filter>
 * <filter-mapping>
 *     <filter-name>FirstFilter</filter-name>
 *     <url-patter>/firstServlet</url-patter>
 * </filter-mapping>
 */
//@WebFilter(filterName = "firstFilter",urlPatterns = {"*.do","*.action"})
@WebFilter(filterName = "firstFilter",urlPatterns = "/firstServlet")
public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(" first filter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("enter first filter");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("leave first filter");
    }

    @Override
    public void destroy() {
        System.out.println(" first filter destroy");
    }
}

啟動類

package com.lee;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

//該注解會掃描當前包和其子包下的 @WebServlet @WebFilter等,
//并在啟動類啟動的時候將其實例化
@ServletComponentScan
@SpringBootApplication
public class SpringbootApplicationFilter1 {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplicationFilter1.class,args);
    }

}

結果:http://localhost:8080/firstServlet

first filter init
enter first filter
firstServlet............
leave first filter

2、通過方法完成組件的注冊

SecondFilter

package com.lee.filter;

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

public class SecondFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(" second filter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("enter second filter");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("leave second filter");
    }

    @Override
    public void destroy() {
        System.out.println(" second filter destroy");
    }
}

啟動類

package com.lee;

import com.lee.filter.SecondFilter;
import com.lee.servlet.SecondServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootApplicationFilter2 {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplicationFilter2.class,args);
    }

    //將scondServlet注冊到servletRegistrationBean中
    @Bean
    public ServletRegistrationBean secondServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(new SecondServlet());
        bean.addUrlMappings("/secondServlet");
        return bean;
    }

    @Bean
    public FilterRegistrationBean secondFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new SecondFilter());
        bean.addUrlPatterns("/secondServlet");
        return bean;
    }

}

結果:

second filter init
enter second filter
secondServlet....
leave second filter

四、SpringBoot整合Interceptor

之前在 《springboot使用redis和ThreadLocal做單點登錄 》中,已經使用過攔截器,有興趣的可以看一下。

1、POM

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

2、自定義攔截器

public class MyInterceptor implements HandlerInterceptor {
 
    private final Logger logger = LoggerFactory.getLogger(this.getClass().getCanonicalName());
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        logger.info("{}:在請求處理之前進行調用(Controller方法調用之前)", this.getClass().getSimpleName());
        return true;//只有返回true才會繼續向下執行,返回false取消當前請求
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
        logger.info("{}:請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)", this.getClass().getSimpleName());
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
        logger.info("{}:在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行(主要是用于進行資源清理工作)", this.getClass().getSimpleName());
    }
}

3、添加攔截器

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");//用于添加攔截規則
        // 多個攔截器組成一個攔截器鏈
        // excludePathPatterns 用戶排除攔截
    }
}

關于Springboot中如何整合Servlet就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女