Spring Boot----嵌入式servlet和外置servlet使用

内置Servlet使用

1、如何定利和修改Servlet容器的相关配置?

1.1 修改server有关的配置(ServerProperties)

通用的servlet容器设置

server.xx

tomcat 设置

server.tomcat.xx

1.1  或者编写一个 WebServerFactoryCustomizer:嵌入式servlet容器的定制器

@Component
public class MyTomcatWebServerCustomizer
		implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

	@Override
	public void customize(TomcatServletWebServerFactory factory) {
		// customize the factory here
	}
}

 

1.2 注册Servlet、Filter、Listener三大组件

对于标注的web目录结构,我们可以在web.xml中配置这三大组件

 

使用嵌入式servlet注册三大组件

1、注册Servlet

class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("xxx");
    }
}

@Configuration
public class MyServletConfig {
    //注册servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean<MyServlet> myServletServletRegistrationBean = new ServletRegistrationBean<>(new MyServlet(), "/xx");
        return myServletServletRegistrationBean;
    }
}

2、注册Filter

class Myfilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("dofilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
    }
}

@Configuration
public class MyFilterConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        //可以传入之前注册的ServletRegistrationBean
        //FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>(new Myfilter(), new ServletRegistrationBean());

        //指定的url
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new Myfilter());
        filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/xx"));
        return filterFilterRegistrationBean;
    }
}

3、注册listener

class MyListener implements  ServletRequestListener, ServletRequestAttributeListener, HttpSessionListener, HttpSessionAttributeListener, ServletContextListener, ServletContextAttributeListener {
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("初始化request");
    }
}
@Configuration
public class MyListenerConfig {
    @Bean
    public ServletListenerRegistrationBean servletListenerRegistrationBean(){
        ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
        servletListenerRegistrationBean.setListener(new MyListener());
        return servletListenerRegistrationBean;
    }
}

  

1.3配置其他嵌入式Servlet容器

1.3.1 springboot支持的嵌入式servlet容器

jetty:适合做聊天,保持长连接

Undertow

netty

tomcat

1.3.2  切换成jetty

1、排除默认依赖

 2、导入jetty

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

3、直接启动

 

 

 

2、使用外置的Servlet容器

2.1嵌入式Servlet容器:

  jar优点:简单、便携;

  缺点:默认不支持ISP、优化定制比较复杂(使用定利器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂

【EmbeddedServletContainerFactory】);

2.2 外置Servlet容器:外面安装tomcat---应用war包方式打包

2.2.1 创建springboot项目

 

 

2.2.2 生成的目录

 

 2.2.3 配置tomcat服务器

 

2.2.4 测试1

2.2.4.1 application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

2.2.4.2 创建/WEB-INF/views/hellow.jsp

2.2.4.3 controller,访问localhost:8080/test

@Controller
public class UserController {
    @GetMapping("/test")
    public String test(){
        //如果没有aplication.properties中的配置
        //return "/WEB-INF/views/hellow.jsp";
        
        return "hellow";
    }
}

 

2.2.4 测试2

导入 thymeleaf,controller中 return "hellow"; 返回的是templates下的html资源了。所以也就访问不到 WEB-INF/views/hellow.jsp,只有将thymeleaf删除,才可以访问/WEB-INF/views/xx.jsp

 

2.2.4 测试3

2.2.4.1 在static目录下创建hellow.html

2.2.4.2 可以访问 localhost:8080/hellow.html

 

 

3、嵌入式Servlet和外置Servlet启动原理

jar包:可执行的jar包可以启动主程序(springBoot main方法),启动IOC容器,创建嵌入式Servlet容器。

war包:启动服务器,服务器启动springBoot应用(SpringBootServletInitializer),启动IOC容器。

 

 

posted @ 2019-08-17 08:49  小名的同学  阅读(464)  评论(0编辑  收藏  举报