springboot开发使用篇restfulCRUD,thymeleaf的标签用法,自定义错误处理机制

普通请求和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;
    }
}
发布了31 篇原创文章 · 获赞 1 · 访问量 5685

猜你喜欢

转载自blog.csdn.net/wjs040/article/details/93737706