普通请求和restfulCRUD
如果使用th:insert/replace等属性进行引入,可以用写~{};但行内写法要加上:
[[~{}]];[(~{})]
thymeleaf公共页面抽取
三种引入功能片段的th属性:
th:insert:将公共片段整个插入到声明引入的元素中
th:replace:将声明引入的元素替换为公共片段,一般为了不改变样式用replace
th:include:将被引入的片段的内容包含进这个标签中
设置springmvc的默认日期格式:
spring.mvc.date-format=yyyy-MM-dd
页面修改表单提交
添加修改二合一页面提交表单注意事项。
由于页面表单只支持get和post两种方式,所以修改时发送put请求时要修改配置参数:
1、SpringMVC中配置HiddenHttpMethodFilter(Springboot自动配置了)
2、页面创建一个post表单(添加时页面本身就是post,所以也不用重新配置)
3、创建一个input项,name="_method";值就是我们指定的请求方式
当修改时页面增加以下代码
//验证是否是修改页面,修改时才需要该条语句,${emp!=null}该句就是判断是否为修改
<input type="hidden" name="_method" value="put" th:if="${emp!=null}">
<input type="hidden" name="id" value="" th:value="${emp.id}" th:if="${emp!=null}">
删除时页面代码的处理
<form th:action="@{/emp/}+${emp.id}" method="post">
<input type="hidden" name="_method" value="delete" />
<button type="submit" class="btn btn-sm btn-danger">删除</button>
</form>
上面那种方式代码冗余太多,下面就是将form表单放到外面,通过js方式进行操作
<button class="btn btn-sm btn-danger deleteBtn">删除</button>
//放到循环外面 解析自定义属性th:attr="del_uri=@{/emp/}+${emp.id}"
<form id= "deleteEmpForm" th:attr="del_uri=@{/emp/}+${emp.id}" method="post">
<input type="hidden" name="_method" value="delete" />
</form>
<script>
$('.deleteBtn').click(function(){
var uri = $(this).attr("del_uri");
//删除当前数据
$('#deleteEmpForm').attr('action',uri).submit();
return false;
});
</script>
错误处理机制
1、springboot默认机制,可以参照ErrorMvcAutoConfiguration;错误处理的自动配置
2、如何定制错误响应:
1)如何定制错误页面;
1、有模板引擎情况下;error/状态码(将错误页面命名为错误状态码.html放在模板引擎文件夹里面的error文件夹下),发生错误的话,就会到对应的错误页面。
我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误。精确优先(优先找精确的状态码.html)
默认错误页面获取的信息(这些属性参数在自定义的错误页面也可以获取到):
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
2、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找。
3、以上都没错误页面,就会到springboot默认的错误提示页面
<h1>status:[[${status}]]</h1>
2)如何定制json错误数据
1、自定义异常处理和返回json数据
@ControllerAdvice
public class MyException {
@ResponseBody
@ExceptionHandler(Exception.class)
public Map<String,Object> HandlerException(Exception e){
Map<String,Object> map=new HashMap<>();
map.put("code","user.notExist");
map.put("message","用户不存在");
return map;
}
}
2、改为自适应的异常处理,即页面访问返回页面异常数据,其他请求返回json数据
@ExceptionHandler(Exception.class)
public String HandlerException(Exception e, HttpServletRequest request){
Map<String,Object> map=new HashMap<>();
//传入我们自己的错误状态码 4xx 5xx 否则就不会到定制的错误页面
/**
* Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
*/
request.setAttribute("javax.servlet.error.status_code",400);
map.put("code","user.notExist");
map.put("message",e.getMessage());
//转发到/error
return "forward:/error";
}
3、将我们定制的数据携带出去
出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到(是AbstractErrorController(ErrorController)规定的方法);
/**
* 容器中加入自定义的errorAttributes
*/
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest,includeStackTrace);
map.put("company","jasonWang");
return map;
}
}
最终版,不仅自适应到页面或json,而且可以携带我们自定义的数据返回
//自定义的异常处理类
@ControllerAdvice
public class MyException {
/*@ResponseBody
@ExceptionHandler(Exception.class)
public Map<String,Object> HandlerException(Exception e){
Map<String,Object> map=new HashMap<>();
map.put("code","user.notExist");
map.put("message","用户不存在");
return map;
}*/
@ExceptionHandler(Exception.class)
public String HandlerException(Exception e, HttpServletRequest request){
Map<String,Object> map=new HashMap<>();
//传入我们自己的错误状态码 4xx 5xx 否则就不会到定制的错误页面
/**
* Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
*/
request.setAttribute("javax.servlet.error.status_code",400);
map.put("code","user.notExist");
map.put("message",e.getMessage());
request.setAttribute("ext",map);
//转发到/error
return "forward:/error";
}
}
/**
* 容器中加入自定义的errorAttributes
* 重写数据携带类的默认方法
*/
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest,includeStackTrace);
map.put("company","jasonWang");
//我们的异常处理器携带的数据
Map<String, Object> ext = (Map<String, Object>)webRequest.getAttribute("ext",0);
map.put("ext",ext);
return map;
}
}