深入理解SpringBoot (4)

如何定制错误响应

我们在模板引擎的文件夹(templates)下面新建一个error文件夹,我们建立一个 404.html ,以后发生404错误直接会跳到该html页面,我们还可以新建一个 4xx.html ,如果碰到其他的,比如是400/403等错误,会直接跳到该页面,先精准匹配,再模糊匹配,如果碰到403错误,先去error下面找403.html,如果没有的话,再去找4xx.html页面,同理,5xx错误也是一样的。

错误页面能获取哪些消息?

  • timestamp:时间戳
  • status:状态码
  • error:错误提示
  • exception:异常对象
  • message:异常消息
  • errors:JSR303数据校验错误

我们可以直接在页面这样获取:

<h1>status : [[${status}]]</h1>
<h1>message: [[${message}]]</h1>
......
......

配置嵌入式servlet容器

如何定制和修改Servlet容器的相关配置?(因为springboot的tomcat是内嵌的)
springboot 能不能支持其他的servlet容器?

针对第一个问题:

  1. 我们可以通过修改application配置文件来修改,for instance , server.port = 8083这就修改了端口,我们要修改其他的,语法也是一样的。
  2. 我们可以编写一个嵌入式的servlet容器定制器(WebServerFactoryCustomizer),来实现修改端口。
// 这个方法就写在之前我们配置拦截器和转发器的那个配置类中
 @Bean
 public WebServerFactoryCustomizer webServerFactoryCustomizer(){
     return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
         @Override
         public void customize(ConfigurableServletWebServerFactory factory) {
             factory.setPort(8888);
         }
     };
 }
  1. 那怎么注册servlet的三大组件?(Servlet, Filter, Listener) 下面是个注册servlet的例子:
// 新建一个MyServlet类
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 servlet");
    }
}

再在配置类中注册:

  @Bean
  public ServletRegistrationBean myservlet(){
      ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myservlet");
      return registrationBean;
  }

最后,我们通过在浏览器中访问 localhost:8080/myservlet 就能访问到 hello servlet

再看看注册Filter的例子:

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("Filter running ~~~~");
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {

    }
}

配置类中注册:

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

针对第二个问题,我们怎么引入其他的servlet容器?

如果我们想引入jetty,只需要如下配置:

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

使用外置的Servlet容器

嵌入式的 springboot 不支持JSP,需要使用外置的servlet容器才能,此外还要打包成war,不能打包成jar,总结步骤如下:

  1. 创建一个war项目
  2. 将嵌入式的Tomcat指定为provided
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
</dependency>
  1. 必须编写一个SpringBootServletInitializer的子类,并调用configure方法:
public class ServletInitializer extends SpringBootServletInitializer { 
    @Override  
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {  
    //SpringBootWebJspApplication  这是springboot的启动主程序
        return application.sources(SpringBootWebJspApplication.class);  
    }  
}

启动的时候,不能像springboot一样启动主配置类,得要启动这个ServletInitializer这个类才是正确的,不然启动不了。

下一章进入Docker环节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值