[Spring Boot] 使用多個Servlet


當使用Spring boot的嵌入式servlet容器時,可以通過Spring bean或掃描Servlet組件的方式注冊Servlet、Filter和Servlet規范的所有監聽器(例如HttpSessionListener)

  • 當urlMapping不是很復雜時,可以通過ServletRegistrationBeanFilterRegistrationBean 和 ServletListenerRegistrationBean獲得完整控制。如果bean實現了ServletContextInitializer接口的話則可以直接注冊。
  • 當使用@ServletComponentScan掃描Servlet組件時,Servlet、過濾器和監聽器可以是通過@WebServlet@WebFilter@WebListener自動注冊

Application.java

 

package com.yqu.multiservlet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.DispatcherServlet;

@SpringBootApplication
public class Application {

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

  @Bean
  public ServletRegistrationBean dispatcherRegistration(
      DispatcherServlet dispatcherServlet) {
    ServletRegistrationBean registration =
        new ServletRegistrationBean(dispatcherServlet);
    registration.addUrlMappings("/hirest/*");
    printStacks();
    return registration;
  }

  @Bean
  public ServletRegistrationBean servletRegistrationBean() {
    printStacks();
    return new ServletRegistrationBean(
        new SigninServlet(), "/signin");
  }

  private void printStacks() {
    StackTraceElement[] elements = Thread.currentThread().getStackTrace();
    System.out.println("========================");

    for (int i = 0; i < elements.length; i++) {
      System.out.println(elements[i]);
    }
  }
}

SigninServlet.java

package com.yqu.multiservlet;

import javax.servlet.ServletConfig;
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 SigninServlet extends HttpServlet {
  public void init(ServletConfig config)
      throws ServletException {
    super.init(config);

  }

  protected void doGet(
      HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {
    response.sendRedirect("http://blog.sina.com.cn/yandongqu");
  }
}

HelloController.java

package com.yqu.multiservlet;

import org.springframework.hateoas.ResourceSupport;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;

@RestController
public class HelloController {
  @RequestMapping(value = "/", method = RequestMethod.GET)
  @ResponseBody
  public HttpEntity  home() {
    ResourceSupport home = new ResourceSupport();
    home.add(linkTo(methodOn(HelloController.class).home()).withSelfRel());
    return new ResponseEntity(home, HttpStatus.OK);
  }
}

application.properties

server.context-path=/HelloMultiServlet
server.port=8080

applicationDefaultJvmArgs: [
    "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=55558"
]

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.6.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
    baseName = 'hello-multiservlet'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("com.fasterxml.jackson.core:jackson-databind")
    compile("org.springframework.hateoas:spring-hateoas")
    compile("org.springframework.plugin:spring-plugin-core:1.1.0.RELEASE")
    compile("com.jayway.jsonpath:json-path:0.9.1")
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

測試

  • 通過REST訪問http://localhost:8080/HelloMultiServlet/hirest/

 


免責聲明!

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



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