如何定制错误响应
我们在模板引擎的文件夹(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容器?
针对第一个问题:
- 我们可以通过修改
application
配置文件来修改,for instance ,server.port = 8083
这就修改了端口,我们要修改其他的,语法也是一样的。 - 我们可以编写一个嵌入式的servlet容器定制器(WebServerFactoryCustomizer),来实现修改端口。
// 这个方法就写在之前我们配置拦截器和转发器的那个配置类中
@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
factory.setPort(8888);
}
};
}
- 那怎么注册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,总结步骤如下:
- 创建一个war项目
- 将嵌入式的Tomcat指定为provided
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
- 必须编写一个SpringBootServletInitializer的子类,并调用configure方法:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//SpringBootWebJspApplication 这是springboot的启动主程序
return application.sources(SpringBootWebJspApplication.class);
}
}
启动的时候,不能像springboot一样启动主配置类,得要启动这个ServletInitializer
这个类才是正确的,不然启动不了。
下一章进入Docker环节