关于WEB路径,如果不以/开头,则默认从当前目录下开始查找资源。以/开头,表示从服务器的”http://ip:port"开始找路径
通常我们给JSP页面上的静态资源,使用/开头的路径

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%
  3. pageContext.setAttribute("APP_PATH",request.getContextPath());
  4. %>
  5. <html>
  6. <head>
  7. <title>员工列表</title>
  8. <meta charset="utf-8">
  9. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  10. <meta name="viewport" content="width=device-width, initial-scale=1">
  11. <title>Bootstrap 101 Template</title>
  12. <link href="${APP_PATH}/static/css/bootstrap.min.css" rel="stylesheet">
  13. <script src="${APP_PATH}/static/js/jquery-3.6.0.min.js"></script>
  14. <script src="${APP_PATH}/static/js/bootstrap.min.js"></script>
  15. </head>
  16. <body>
  17. </body>
  18. </html>

分页

JSP页面引入c foreach标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

foreach循环遍历显示所有信息

                <c:forEach items="${pageInfo.list}" var="emp">
                    <tr>
                        <th>${emp.empId}</th>
                        <th>${emp.empName}</th>
                        <th>${emp.gender=="M"?"男":"女"}</th>
                        <th>${emp.email}</th>
                        <th>${emp.department.deptName}</th>
                        <th>
                            <button class="btn btn-primary">
                                <span class="glyphicon glyphicon-pencil btn-sm" aria-hidden="true"></span>编辑
                            </button>
                            <button class="btn btn-danger">
                                <span class="glyphicon glyphicon-trash btn-sm" aria-hidden="true"></span>删除
                            </button>
                        </th>
                    </tr>
                </c:forEach>

分页判断逻辑

                <nav aria-label="Page navigation">
                    <ul class="pagination">
                        <li><a href="${APP_PATH}/empls?pn=1">首页</a></li>
                        <c:if test="${pageInfo.isFirstPage==false}">
                            <li>
                                <a href="${APP_PATH}/empls?pn=${pageInfo.pageNum-1}" aria-label="Previous">
                                    <span aria-hidden="true">&laquo;</span>
                                </a>
                            </li>
                        </c:if>
                        <c:forEach items="${pageInfo.navigatepageNums}" var="page_num">
                            <c:if test="${page_num==pageInfo.pageNum}">
                                <li class="active"><a href="${APP_PATH}/empls?pn=${page_num}">${page_num}</a></li>
                        </c:if>
                            <c:if test="${page_num!=pageInfo.pageNum}">
                                <li><a href="${APP_PATH}/empls?pn=${page_num}">${page_num}</a></li>
                            </c:if>
                        </c:forEach>
                        <c:if test="${pageInfo.isLastPage==false}">
                            <li>
                                <a href="${APP_PATH}/empls?pn=${pageInfo.pageNum+1}" aria-label="Next">
                                    <span aria-hidden="true">&raquo;</span>
                                </a>
                            </li>
                        </c:if>
                        <li><a href="${APP_PATH}/empls?pn=${pageInfo.pages}">尾页</a></li>
                    </ul>
                </nav>

通用返回对象

JSP页面这种方式,是跟Java代码深度绑定的。为了能适应不同的客户端不同的处理平台,服务器的接口一般返回JSON格式的数据。而返回JSON格式数据一般会定义一个通用的返回格式
定义通用返回格式类Msg

public class Msg {

    /**
     * 通用成功返回
     * @return
     */
    public static Msg success(){
        Msg msg = new Msg();
        msg.setCode(100);
        msg.setMessage("处理成功");
        return msg;
    }

    /**
     * 通用失败返回
     * @return
     */
    public static Msg error(){
        Msg msg = new Msg();
        msg.setCode(200);
        msg.setMessage("处理失败");
        return msg;
    }

    /**
     * 链式调用方法
     * @param key
     * @param value
     * @return
     */
    public Msg add(String key,Object value){
        this.getExtend().put(key,value);
        return this;
    }

    /**
     * 处理状态码
     */
    private Integer code;

    /**
     * 提示消息
     */
    private String message;

    /**
     * 数据
     */
    private Map<String,Object> extend=new HashMap<String ,Object>();


}

数据校验

数据分为前端校验和后端校验,前端校验可以过滤掉一些基本的错误,但是熟悉的人可以绕过前端攻击。后端校验是一层保障
使用JSR303做后端数据校验
导入jar包

    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.4.3.Final</version>
    </dependency>

在需要校验的类字段上,添加注解

    @Pattern(regexp = "^[a-zA-Z0-9_-]{3,16}$",message = "用户名验证失败")
    private String empName;

    @Email()
    private String email;

在需要校验的方法上添加注解

    public Msg saveEmpl(@Valid Employ employ, BindingResult result){
        if(result.hasErrors()){
            List<FieldError> fieldErrors = result.getFieldErrors();
            Map<String,Object> map=new HashMap<>();
            for (FieldError fieldError : fieldErrors){
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                map.put(field,message);
            }
            Msg error = Msg.error();
            error.setExtend(map);
            return error;
        }else{
            employService.saveEmpl(employ);
            /**
             * TODO 判断插入是否成功
             */
            return Msg.success();
        }
    }

PUT请求问题

在TOMCAT中,只会把POST请求的数据,封装成MAP,然后springMVC可以调用request.getParamter获取数据,封装对象。
当我们发送PUT请求,然后要springMVC也封装数据时,就需要配置FormContentFilter(spring 5之后),HttpPutContentFilter(spring 5之前)

  <!--解析PUT delete这些请求-->
  <filter>
    <filter-name>formContentFilter</filter-name>
    <filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>formContentFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>