关于WEB路径,如果不以/开头,则默认从当前目录下开始查找资源。以/开头,表示从服务器的”http://ip:port"开始找路径
通常我们给JSP页面上的静态资源,使用/开头的路径
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
pageContext.setAttribute("APP_PATH",request.getContextPath());
%>
<html>
<head>
<title>员工列表</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 101 Template</title>
<link href="${APP_PATH}/static/css/bootstrap.min.css" rel="stylesheet">
<script src="${APP_PATH}/static/js/jquery-3.6.0.min.js"></script>
<script src="${APP_PATH}/static/js/bootstrap.min.js"></script>
</head>
<body>
</body>
</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">«</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">»</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>