1. 程式人生 > >SpringBoot web--嵌入式Servlet容器(學習筆記20)

SpringBoot web--嵌入式Servlet容器(學習筆記20)

1、配置嵌入式Servlet容器

SpringBoot預設使用Tomcat作為嵌入的Servlet容器;

    

問題:

1、如果是外接的tomcat,我們可以對tomcat的conf目錄中server.xml和web.xml進行定製優化修改。然而對於SpringBoot嵌入式Servlet容器配置如何修改???

        1.1、配置檔案:可以在 application.properties/yml 檔案中設定相關的server資訊,如圖所示:

#設定專案訪問路徑
server.servlet.context-path=/crud
#設定專案埠號
server.port=80

        

        1.2、程式碼配置


        

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
@Configuration
public class MyServerConfig {
	
	/**
	 * 配置嵌入式的servlet容器
	 * @return
	 */
	@Bean
	public TomcatServletWebServerFactory getTomcat(){
		TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();
		tomcatServletWebServerFactory.setContextPath("/test");
		tomcatServletWebServerFactory.setPort(8090);
		return tomcatServletWebServerFactory;
	}

2、SpringBoot能不能支援其它的Servlet容器???

2、註冊servlet三大元件:Servlet、Filter、Listener

      ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean

由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案。

我們這裡建立的 SpringBoot 應用是 jar 的方式,啟動嵌入式的 tomcat 。如果建立的是一個標準的web專案,我們可以在 webapp/WEB-INF/web.xml 中註冊三大元件。

可以通過以下的方式進行註冊:

    2.1、註冊Servlet

    

        /**
	 * 註冊Servlet元件
	 * 通過@Bean載入到容器中
	 * @return
	 */
	@Bean
	public ServletRegistrationBean<MyServlet> myServlet(){
		 ServletRegistrationBean<MyServlet> servletRegistrationBean = new ServletRegistrationBean<MyServlet>(new MyServlet(), "/myServlet");
		 
		 return servletRegistrationBean;
	}

        2.2、註冊Filter

        

        @Bean
    	public FilterRegistrationBean<MyFilter> myFilter(){
		FilterRegistrationBean<MyFilter> filterRegistrationBean = new FilterRegistrationBean<MyFilter>();
		filterRegistrationBean.setFilter(new MyFilter()); // 設定filter
		filterRegistrationBean.setUrlPatterns(Arrays.asList("/myFilter","/myServlet","/test")); // 設定攔截請求的URL
		return filterRegistrationBean;
	}

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyFilter implements Filter {

	private Logger logger = LoggerFactory.getLogger(MyFilter.class); 
	
	/**
	 * filter的銷燬
	 */
	@Override
	public void destroy() {
		
	}

	/**
	 * filter的過濾
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		logger.info("MyFilter process……"); // 列印日誌
		chain.doFilter(request, response); // 放行請求
	}

	/**
	 * filter的初始化
	 */
	@Override
	public void init(FilterConfig config) throws ServletException {
		
	}

}
測試:http://localhost/crud/myFilter、http://localhost/crud/myServlet、http://localhost/crud/test


        2.3、註冊Listener

        

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.demo.springbootweb.filter.MyFilter;

public class MyListener implements ServletContextListener {
	
	private Logger logger = LoggerFactory.getLogger(MyFilter.class); 

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		logger.info("contextDestroyed web應用銷燬……");
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		logger.info("contextInitialized web應用啟動……");
	}

}

        /**
	 * 註冊Listener元件,通過@Bean載入到容器中
	 * @return
	 */
	@Bean
	public ServletListenerRegistrationBean<MyListener> myListener(){
		ServletListenerRegistrationBean<MyListener> myListener = new ServletListenerRegistrationBean<MyListener>(new MyListener());
		return myListener;
	}
下面是MyServerConfig程式碼:
import java.util.Arrays;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.demo.springbootweb.filter.MyFilter;
import com.demo.springbootweb.listener.MyListener;
import com.demo.springbootweb.servlet.MyServlet;

@Configuration
public class MyServerConfig {
	
	/**
	 * 配置嵌入式的servlet容器
	 * @return
	 */
	@Bean
	public TomcatServletWebServerFactory getTomcat(){
		TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();
		tomcatServletWebServerFactory.setContextPath("/test"); // 設定專案訪問路徑
		tomcatServletWebServerFactory.setPort(8090); // 設定專案埠號
		return tomcatServletWebServerFactory;
	}

	/**
	 * 註冊Servlet元件
	 * 通過@Bean載入到容器中
	 * @return
	 */
	@Bean
	public ServletRegistrationBean<MyServlet> myServlet(){
		 ServletRegistrationBean<MyServlet> servletRegistrationBean = new ServletRegistrationBean<MyServlet>(new MyServlet(), "/myServlet");
		 
		 return servletRegistrationBean;
	}
	
	/**
	 * 註冊Filter元件,通過@Bean載入到容器中
	 * @return
	 */
	@Bean
	public FilterRegistrationBean<MyFilter> myFilter(){
		FilterRegistrationBean<MyFilter> filterRegistrationBean = new FilterRegistrationBean<MyFilter>();
		filterRegistrationBean.setFilter(new MyFilter()); // 設定filter
		filterRegistrationBean.setUrlPatterns(Arrays.asList("/myFilter","/myServlet","/test")); // 設定攔截請求的URL
		return filterRegistrationBean;
	}
	
	/**
	 * 註冊Listener元件,通過@Bean載入到容器中
	 * @return
	 */
	@Bean
	public ServletListenerRegistrationBean<MyListener> myListener(){
		ServletListenerRegistrationBean<MyListener> myListener = new ServletListenerRegistrationBean<MyListener>(new MyListener());
		return myListener;
	}
	
}
感謝--尚矽谷