1. 程式人生 > >SpringBoot-Servlet配置及容器切換

SpringBoot-Servlet配置及容器切換

容器配置

1. 配置檔案

# 簡單配置可以通過application.yml檔案直接進行配置
server.port=8080

2. 程式碼配置

@Configuration
public class Config {
    @Bean
    WebServerFactoryCustomizer webServerFactoryCustomizer(){
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
            @Override
            public
void customize(ConfigurableWebServerFactory factory) { factory.setPort(8080); } }; } }

WebServerFactoryCustomizer:舊版本叫做EmbeddedServletContainerCustomizer

ConfigurableWebServerFactory:記得泛型宣告,預設方法factory是空的

元件註冊

1. 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 { resp.
getWriter().write("response"); } }
  • 註冊
@Configuration
public class Config {
    ServletRegistrationBean<MyServlet> servletServletRegistrationBean(){
        return new ServletRegistrationBean(new MyServlet(), "/myServlet");
    }
}

servletServletRegistrationBean:自動註冊的包裝Bean

new MyServlet():需要註冊的Servlet例項物件

/myServlet:訪問對映地址

@Configuration
public class Config {
    ServletRegistrationBean<MyServlet> servletServletRegistrationBean(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setLoadOnStartup(0);
        bean.setServlet(new MyServlet());
        bean.setUrlMappings(Arrays.asList("/", "/myservlet"));
        return bean;
    }
}

也可以先生成物件,再進行設定。

PS:除去簡單對映,例如LoadOnStartup等資訊也可以進行配置

2. Filter註冊

  • 元件
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("filter");
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
}
  • 註冊
@Configuration
public class Config {
    @Bean
    FilterRegistrationBean<MyFilter> filterFilterRegistrationBean(){
        FilterRegistrationBean<MyFilter> filter = new FilterRegistrationBean<MyFilter>();
        filter.setFilter(new MyFilter());
        filter.setUrlPatterns(Arrays.asList("/", "/index"));
        return filter;
    }
  • 過濾器可以通過路徑進行過濾,分部進行設定
  • 也可以通過ServletRegistrationBean集合直接自動過濾,具體可以檢視構造方法

3. Listener註冊

  • 元件
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("do something");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("do nothing");
    }
}

支援的Listener型別

  1. ServletContextAttributeListener
  2. ServletRequestListener
  3. ServletRequestAttributeListener
  4. HttpSessionAttributeListener
  5. HttpSessionListener
  6. ServletContextListener
  • 註冊
@Configuration
public class Config {
    
    @Bean
    ServletListenerRegistrationBean<MyListener> servletListenerRegistrationBean(){
        ServletListenerRegistrationBean<MyListener> listener = new ServletListenerRegistrationBean<MyListener>();
        listener.setListener(new MyListener());
        listener.setEnabled(true);
        listener.setOrder(1);
        return listener;
    }

同樣的,可以設定監聽方法,還有其他可配置引數。

容器切換

1. 三大容器

容器 優點 缺點 預設
tomcat 功能齊全 龐大,榮澤 true
jetty 輕量 功能不全 false
undertow 非同步,高效 不支援jsp false

2. 容器切換

  • tomcat 在這裡插入圖片描述
  • spring-boot-starter-web預設使用tomcat
  • spring-boot-starter-tomcat:就會引入tomcat
  • jetty
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
	 	<!-- 去除tomcat依賴 -->
        <exclusion>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<groupId>org.springframework.boot</groupId>
		</exclusion>
	</exclusions>
</dependency>
<!--  引入jetty -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

在這裡插入圖片描述

  • undertow
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
	 	<!-- 去除tomcat依賴 -->
        <exclusion>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<groupId>org.springframework.boot</groupId>
		</exclusion>
	</exclusions>
</dependency>
<!--  引入undertow -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

在這裡插入圖片描述