zoukankan      html  css  js  c++  java
  • 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). 启动服务就可以使用了

  • 相关阅读:
    js中的call和apply方法
    前端Cookie与Session的区别
    js中的this
    Python基础语法
    Python基础安装
    Python基础字符串、列表、元组、字典
    java回调
    java内存分配与溢出
    “眉毛导航”——SiteMapPath控件的使用(ASP.NET)
    Photoshop制作雪碧图技巧
  • 原文地址:https://www.cnblogs.com/lixuchun/p/8999323.html
Copyright © 2011-2022 走看看