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;
	}
	
}
感谢--尚硅谷


猜你喜欢

转载自blog.csdn.net/yufang131/article/details/80425919
今日推荐