Spring Boot:

SpringBoot-start-web 里面依赖的环境中

如果是外部的Tomcat 容器,可以通过修改config进行配置

内嵌的呢?

如何定制和修改Servlet容器的相关配置;

1、修改和server有关的配置(ServerProperties类【也是EmbeddedServletContainerCustomizer】);

经常用的:

server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF‐8

//通用的Servlet容器设置 server.xxx //Tomcat的设置 server.tomcat.xxx 最大连接数等等

原理:

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties { /**
* Server HTTP port.
*/
private Integer port; /**
* Network address to which the server should bind.
*/
private InetAddress address; @NestedConfigurationProperty
private final ErrorProperties error = new ErrorProperties(); /**
* Whether X-Forwarded-* headers should be applied to the HttpRequest.
*/
private Boolean useForwardHeaders; /**
* Value to use for the Server response header (if empty, no header is sent).
*/
private String serverHeader; /**
* Maximum size of the HTTP message header.
*/
private DataSize maxHttpHeaderSize = DataSize.ofKilobytes(8); /**
* Time that connectors wait for another HTTP request before closing the connection.
* When not set, the connector's container-specific default is used. Use a value of -1
* to indicate no (that is, an infinite) timeout.
*/
private Duration connectionTimeout; @NestedConfigurationProperty
private Ssl ssl; @NestedConfigurationProperty
private final Compression compression = new Compression(); @NestedConfigurationProperty
private final Http2 http2 = new Http2(); private final Servlet servlet = new Servlet(); private final Tomcat tomcat = new Tomcat(); private final Jetty jetty = new Jetty(); private final Undertow undertow = new Undertow(); public Integer getPort() {
return this.port;
} public void setPort(Integer port) {
this.port = port;
} public InetAddress getAddress() {
return this.address;
}

2、编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置 (已经过时了)

@Bean  //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
    return new EmbeddedServletContainerCustomizer() {
        //定制嵌入式的Servlet容器相关的规则
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.setPort(8083);
        }
    };
}

注册Servlet的三大组件 Servlet  Filter  Listener


Spring boot 默认以jar包的方式 启动嵌入式tomcat,而不是标准的web应用。 webapp/WEB-INF/web.xml

没有web.xml 也可以注册哦

ServletRegistrationBean

//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(new
MyServlet(),"/myServlet");
    return registrationBean;
}

举个栗子:

MyServlet:

public class MyServlet extends HttpServlet {

    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello MyServlet");
}
}

config:

@Configuration
public class MyConfig { @Bean
public ServletRegistrationBean<Servlet> myServlet(){ //是个class 直接new出来
ServletRegistrationBean<Servlet> servletServletRegistrationBean =
new ServletRegistrationBean<>(new MyServlet(),"/myServlet");
return servletServletRegistrationBean;
}
}

运行后:注册成功

FilterRegistrationBean

@Bean
public FilterRegistrationBean myFilter(){
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(new MyFilter());
    registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
    return registrationBean;
}

举个栗子:

config中加入组件:

 @Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new MyFilter());
filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return filterFilterRegistrationBean;
}

过滤器:

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("doFilter 方法執行");
filterChain.doFilter(servletRequest,servletResponse);
} @Override
public void destroy() { }
}

请求后:

ServletListenerRegistrationBean

@Bean
public ServletListenerRegistrationBean myListener(){
    ServletListenerRegistrationBean<MyListener> registrationBean = new
ServletListenerRegistrationBean<>(new MyListener());
    return registrationBean;
}

举个栗子:

/**
* listener 有好多的!
*/
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized...............");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed..................");
}
}

组件注册进去:

    @Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(
new MyListener()); //通過構造函數 s
return registrationBean;
}

启动和退出

总结:

Spring boot 帮我们自动配置Spring mvc的时候,自动注册了前端控制器,DispatcherServlet。 (DispatcherServletAutoConfiguration类)

这个类中有个方法:

@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
@ConditionalOnBean(value = DispatcherServlet.class, name =
DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public ServletRegistrationBean dispatcherServletRegistration(
      DispatcherServlet dispatcherServlet) {
   ServletRegistrationBean registration = new ServletRegistrationBean(
         dispatcherServlet, this.serverProperties.getServletMapping());
    //默认拦截: /  所有请求;包静态资源,但是不拦截jsp请求;   /*会拦截jsp
    //可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
   
   registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
   registration.setLoadOnStartup(
         this.webMvcProperties.getServlet().getLoadOnStartup());
   if (this.multipartConfig != null) {
      registration.setMultipartConfig(this.multipartConfig);
   }
   return registration;
}

总结一个思路:

经常在看源码时候,发现定义一个接口,然后实现类是个中Factory命名的。通过某个工厂创建组件 xxFactory 是用來得到xx的!

condition的用法,倒入哪個,那個生效。

最新文章

  1. php留言
  2. 用流来读取文件(getline,istringstream)
  3. Javascript理解this对象
  4. (原创)JS闭包看代码理解
  5. Excel 函数记录
  6. SNMP 和 NetBios协议理解
  7. SqlServer 之 查看表空间
  8. 使用visual studio 2015调用阿里云oss .net sdk 2.2的putobject接口抛出outofmemory异常
  9. 读jQuery官方文档:样式
  10. Ubuntu Apache 伪静态配置 url重写 步骤
  11. Pro/E 5.0安装图解教程(也适用于Creo Elements/Pro 5.0)
  12. Android上成功实现了蓝牙的一些Profile
  13. Linux的一些问题
  14. cordova/phonegap/webapp性能优化方法
  15. VS2017 带参数启动调式程序
  16. Web - TCP的三次握手
  17. 隐马尔可夫(HMM)模型
  18. 【比赛游记】THUWC2019酱油记
  19. BZOJ 2115: [Wc2011] Xor 线性基 dfs
  20. 大白话Docker入门(一)

热门文章

  1. 从TCP三次握手说起--浅析TCP协议中的疑难杂症(1)
  2. 2015.10.9js(页面坐标)
  3. Microsoft Web Application Stress Tool 使用
  4. go练习5--生成md5
  5. 微信小程序 --- loading提示框
  6. stm32的VCC/VDD/VSS/VEE/VBAT的区别
  7. linix防火墙设置之顺序设置问题 -- 解决防火墙规则顺序和插入规则到指定序号的问题
  8. class表与student表之间的关系
  9. 每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它
  10. MVC4中使用Html.DropDownList实现级联