spring boot 尚桂谷学习笔记07 嵌入式容器 ---Web

------配置嵌入式servlet容器------

  springboot 默认使用的是嵌入的Servlet(tomcat)容器

  问题?

    1)如何定制修改Servlet容器的相关配置:

      1.修改和server有关的配置(ServerProperties配置文件设置)

// 通用的servlet 容器设置
server.xxxx
server.port=8080
server.servlet.context-path=/crud


// tomcat 相关的设置
server.tomcat.xxx
server.tomcat.uri-encoding=UTF-8

      2. 编写一个EnbeddedServletContainerCustomizer:嵌入式servlet 容器的定制器来修改servlet容器默认配置

        在springboot中 会有很多的xxxCustomlzer 帮助我们进行定制配置

    2) 注册Servlet三大组件 【Servlet Filter Lisener

      由于springboot 默认是 以jar包的形式嵌入式的servlet容器启动web应用 没有web.xml 所以注册三大组件用一下方式

      

      1) 注册Servlet ServletRegistrationBean

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("hello myservlet");
    }
}
// 注册Servlet
@Bean
public ServletRegistrationBean myServlet() {
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(), "/MyServlet");
    return registrationBean;
}

      2) 注册filter FilterRegistrationBean

public class MyFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter process");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
// 注册filter
@Bean
public FilterRegistrationBean myFilter() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(new MyFilter());
   // 过滤什么请求 filterRegistrationBean.setUrlPatterns(Arrays.asList(
"/hello", "/")); return filterRegistrationBean; }

      注册lisener ServletListenerRegistrationBean

public class MyLisener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized   web 应用启动");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("web 应用习销毁");
    }
}
// 注册lisener
@Bean
public ServletListenerRegistrationBean myLisener() {
    ServletListenerRegistrationBean<MyLisener> listenerRegistrationBean = new ServletListenerRegistrationBean<MyLisener>(new MyLisener());
    return listenerRegistrationBean;
}

      例子:springboot帮助我们配置springmvc时候 自动注册spirngmvc 的前端控制器

      

    3) springboot 支持其他servlet容器

      tomcat

      jetty (长连接 聊天点对点长时间连接)

      Undertow (不支持JSP 并发性能好)

      默认使用tomcat 可以切换成其他容器 修改pom依赖 移除tomcat 模块

      之后启动就为Jetty 启动了

  嵌入式Servlet 容器优缺点:

    优点:简单 便携

    缺点:不支持jsp 优化定制比较复杂 (使用低定制器【ServerProperties, EnveddedServketCibtauberCystinuzer , 自己编写嵌入式Servlet 嵌入式工厂 EmbeddedServletContainerFactory 】)

  使用外置的servlet容器 :外面安装Tomcat- 应用使用War包方式打包

  新建项目 打包方式 选择War包 之前选择是jar包, 并且配置生成Webapp目录

  生成项目结构最后如下:

  配置外置tomcat 服务器

  启动服务器:

  创建 hello.jsp 以及success.jsp, helloController等  

    hello.jsp

<%--
  Created by IntelliJ IDEA.
  User: UPC
  Date: 2018/5/6
  Time: 19:26 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <a href="abc"></a> </head> <body> </body> </html>

    HelloController

package com.lixuchun.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    @GetMapping("/abc")
    public String hello(Model model) {
        model.addAttribute("message", "你好");
        return "success";
    }

}

    success.jsp

<%--
  Created by IntelliJ IDEA.
  User: UPC
  Date: 2018/5/6
  Time: 19:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
    <h3>${message}</h3>
</head>
<body>

</body>
</html>

    application.properties

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

    访问效果:

    

    

  总结 如何使用外部容器:

    1) 创建一个war项目

    2)将嵌入式的Tomcat指定为 provided

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>    

    3)必须编写一个 springbootServletInitiallzer的子类,并且调用 configure方法

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
     // 传入springboot应用的主程序
return application.sources(SpringBoot04WebJspApplication.class); } }

    4). 启动服务就可以使用了

猜你喜欢

转载自www.cnblogs.com/lixuchun/p/8999323.html