SpringBoot(1)
SpringBoot 8/2
CRUD
-
发送put请求修改数据有三个步骤:
- SpringMVC中配置HiddenHttpMethodFilter
- 页面上创建一个post请求(form标签只能写get和post)
- 创建一个input项目,name="_method",值就是我们所指定方式
<input type="hidden" name="_method" value="put" th:if="${emp!=null}" / >
<input type="hidden" name="id" th:if="${emp!=null}" th:value="${emp.id}">
错误处理机制
-
错误提示有状态码,类型,时间....
-
默认效果:返回一个错误的页面。
-
如果是其他客户端,默认响应一个json数据,时间戳、状态码、错误提示、错误信息、访问路径。
-
如何定制错误信息:
- 一个是定义错误页面
- 一个是定义json数据
-
external libiaries->spring-boot-auto-configure-web-ErrorMvcAutoConfigure容器中四个组件非常重要,分别是:
- DefaultErrorAttributes
- BasicErrorController:默认/error请求
@Controller @RequestMapping({"${server.error.path:${error.path:/error}}"}) public class BasicErrorController extends AbstractErrorController { @RequestMapping( produces = {"text/html"} )//产生html页面 public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { HttpStatus status = this.getStatus(request); Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML))); response.setStatus(status.value()); ModelAndView modelAndView = this.resolveErrorView(request, response, status, model); return modelAndView != null ? modelAndView : new ModelAndView("error", model); } @RequestMapping @ResponseBody//返回json数据 public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL)); HttpStatus status = this.getStatus(request); return new ResponseEntity(body, status); }
但是它是如何区分是网页浏览,还是其它客户端浏览呢?
可以看到浏览器在访问时的请求头accept属性为text/html,
- ErrorPageCustomizer
@Value("${error.path:/error}")
private String path = "/error"; //系统出现错误以后,到error进行请求,
- DefaultErrorViewResolver
一旦发生4..或者5..错误,ErrorPageCustomizer定制错误页面。
配置嵌入式Servlet容器
SpringBoot使用的是默认的Servlet容器(Tomcat)
问题:
-
如何定制和修改Servlet容器的相关配置
-
在application.properties当中修改server相关的配置
-
server.port=8081 server.context-path=/crud //通用的server设置 server.xxx //tomcat的设置 server.tomcat.uri-encoding=UTF-8
-
编写一个EmbeddedServletContainerCustomizer:嵌入式的servlet容器的定制器,来修改servlet容器的配置。
-
(以上两种方式实际上在底层是一样的,都是EmbeddedServletContainerCustomizer)
-
-
能不能支持其他的Servlet容器
注册Servlet、Filter、Listener
Servlet:ServletRegistrationBean
Filter:FilterRegistrationBean
Listener:ServletListenerRegistrationBean
由于SpringBoot默认是以jar包方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
注册三大组件用如下的方式:
//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
return servletRegistrationBean;
}
keep going