SpringBoot这些Web知识点,你知道吗?

开发 前端
使用Jetty和Tomcat,如果你使用war打包,它应该可以正常工作。当使用java -jar启动时,可执行war可以正常工作,也可以部署到任何标准容器。在使用可执行jar时,不支持jsp。

环境:SpringBoot2.7.16

1. Servlet/Filter/*Listener注册

任何Spring bean的Servlet、Filter或 *Listener实例都会自动注册到容器中。如果你想从应用程序中引用一个值,@Value获取application.properties值。

@Component
public class DemoServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().println("demo servlet") ;
  }
}

直接将Servlet注册为Bean,容器会自动注册。有一点需要注意:如果仅仅只有一个Servlet,那它的访问url是 '/' 。这会与默认的DispatcherServlet路径一样。如果你有多个Servlet,那么访问路径将是:'/beanName/',如上面的DemoServlet默认的访问路径:'/demoServlet/'。

如果基于约定的映射不够灵活,可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean类进行完全控制。

过滤器Filter默认映射路径是:'/*'。

提示:

若要查看应用程序中每个Filter的顺序,请为web日志记录组启用调试级别日志记录(logging.level.web=debug)。注册过滤器的详细信息,包括它们的顺序和URL模式,将在启动时记录下来。

2. Servlet Conetxt初始化

嵌入式Servlet容器不会直接执行Servlet3.0+ javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。这样做是有意为之,目的是降低在war中运行的第三方库破坏Spring Boot应用程序的风险。

如果需要在Spring Boot应用程序中执行Servlet上下文初始化,应该注册一个实现org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。onStartup方法提供了对ServletContext的访问,如果有必要,可以很容易地将其用作现有WebApplicationInitializer的适配器。

3. 扫描Servlet/Filter/*Listener

在使用嵌入式容器时,可以通过使用@ServletComponentScan来启用自动注册带有@WebServlet、@WebFilter和@WebListener注解的类。

@ServletComponentScan在独立容器中没有效果,取而代之的是容器的内置发现机制。

4. ServletWebServerApplicationContext

在底层,Spring Boot使用了另一种类型的ApplicationContext来支持嵌入式servlet容器。ServletWebServerApplicationContext是一种特殊类型的WebApplicationContext,它通过搜索单个ServletWebServerFactory bean来引导自己。通常TomcatServletWebServerFactory、jetttyservletwebserverfactory或UndertowServletWebServerFactory都是自动配置的。

在嵌入式容器设置中,ServletContext被设置为服务器启动的一部分,该启动发生在应用程序上下文初始化期间。因此,ApplicationContext中的bean不能可靠地用ServletContext进行初始化。解决这个问题的一种方法是注入ApplicationContext作为bean的依赖项,并仅在需要时访问ServletContext。另一种方法是在服务器启动后使用回调函数。这可以使用ApplicationListener来监听ApplicationStartedEvent,如下所示:

public class PackContext implements ApplicationListener<ApplicationStartedEvent> {
  private ServletContext servletContext;
  @Override
  public void onApplicationEvent(ApplicationStartedEvent event) {
      ApplicationContext applicationContext = event.getApplicationContext() ;
      this.servletContext = ((WebApplicationContext) applicationContext).getServletContext() ;
  }
}

5. 自定义Servlet容器

可以使用Spring Environment属性来配置常见的Servlet容器设置。通常,会在application.properties或application.yaml文件中定义属性。

常见的服务器设置包括:

  • 网络设置:侦听传入HTTP请求的端口(server.port)、绑定到server.address的接口地址等。
  • 会话设置:会话是否持久(server.servlet.session.persistent),会话超时(server.servlet.session.timeout),会话数据的位置(server.servlet.session.store-dir),以及会话cookie配置(server.servlet.session.cookie.*)。
  • 错误管理:错误页的位置(server.error.path)等等。
  • SSL
  • HTTP compression

Spring Boot尽可能地尝试公开通用设置,但并不总是可行。对于这些情况,专用的命名空间提供特定于服务器的自定义(请参见server.tomcat和server.undertow)。例如,可以用嵌入式Servlet容器的特定功能配置访问日志。

字符编码

用于请求和响应处理的嵌入式servlet容器的字符编码行为可以使用server.servlet.encoding.*配置属性进行配置。

当请求的Accept-Language头指示请求的区域设置时,servlet容器将自动将其映射到字符集。每个容器都提供默认的区域设置到字符集映射,您应该验证它们是否满足应用程序的需要。如果没有,请使用server.servlet.encoding.mapping配置属性自定义映射,如下:

server:
  servlet:
    encoding:
      mapping:
        ko: "UTF-8"

通过编程自定义

如果需要以编程方式配置嵌入式servlet容器,可以注册一个实现WebServerFactoryCustomizer接口的Spring bean。WebServerFactoryCustomizer提供对ConfigurationServletWebServerFactory的访问,其中包括许多自定义setter方法。示例:

@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
  @Override
  public void customize(ConfigurableServletWebServerFactory server) {
    // 设置服务端口
    server.setPort(9000) ;
    // 设置异步超时时间
    server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis())) ; 
  }
}

直接自定义ConfigurableServletWebServerFactory

对于需要从ServletWebServerFactory进行扩展的更高级的用例,你可以自己公开此类类型的bean。该接口提供如下配置

public interface ConfigurableServletWebServerFactory extends ConfigurableWebServerFactory, ServletWebServerFactory, WebListenerRegistry 
  void setContextPath(String contextPath);
  void setDisplayName(String displayName);
  void setSession(Session session);
  void setRegisterDefaultServlet(boolean registerDefaultServlet);
  void setMimeMappings(MimeMappings mimeMappings);
  void setDocumentRoot(File documentRoot);
  void setInitializers(List<? extends ServletContextInitializer> initializers);
  void addInitializers(ServletContextInitializer... initializers);
  void setJsp(Jsp jsp);
  void setLocaleCharsetMappings(Map<Locale, Charset> localeCharsetMappings);
  void setInitParameters(Map<String, String> initParameters);
  void setCookieSameSiteSuppliers(List<? extends CookieSameSiteSupplier> cookieSameSiteSuppliers);
  void addCookieSameSiteSuppliers(CookieSameSiteSupplier... cookieSameSiteSuppliers);
}


6. JSP限制

当运行使用嵌入式servlet容器(并打包为可执行归档文件)的Spring Boot应用程序时,JSP支持存在一些限制。

  • 使用Jetty和Tomcat,如果你使用war打包,它应该可以正常工作。当使用java -jar启动时,可执行war可以正常工作,也可以部署到任何标准容器。在使用可执行jar时,不支持jsp。
  • Undertow不支持JSP。
  • 创建自定义error.jsp页面不会覆盖错误处理的默认视图。应该使用自定义错误页面。

以上是本篇文章的全部内容,希望对你有所帮助。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2023-02-15 08:12:19

http超时过滤器

2024-06-28 09:37:14

技巧.NET开发

2019-11-25 21:46:12

数据湖云计算数据仓库

2021-03-19 18:13:21

手机内存软件

2020-10-28 11:20:55

vue项目技

2020-11-18 07:52:08

2020-12-24 15:26:07

Redis数据库

2015-06-29 09:06:51

2021-02-02 08:21:28

网络面试通信

2023-03-02 11:52:00

自定义自动配置

2023-01-16 08:09:51

SpringMVC句柄

2015-07-03 11:20:41

编程学习方法

2021-08-05 18:21:29

Autowired代码spring

2016-01-11 09:48:07

2018-05-11 15:53:59

2023-06-08 08:06:07

error错误页原理

2017-11-09 15:29:21

CPU温度常识

2019-02-12 11:15:15

Spring设计模式Java

2018-02-06 09:40:25

PythonOOP继承

2019-07-08 10:18:38

MPLSIP数据
点赞
收藏

51CTO技术栈公众号