文章目录
Spring Boot对页面参数的接收注意事项
1. 接收日期类型的参数
- 前端页面
<input type="date" name="pressDate" class="el-input__inner">
- 实体类
对于接收日期类的参数,实体类的属性上应加上@DateTimeFormat
注解,并指定接收日期的格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date pressDate;
2. 接收数值类型的参数
- 前端页面
<input type="number" name="wordNum" class="el-input__inner">
- 实体类
注意,接收number
类型的参数,实体类的属性应用Integer
类型,而不能用int
基础类型
private Integer wordNum;
Spring Boot文件上传
配置文件
spring:
http:
multipart:
max-request-size: 10MB #用来控制文件上传大小的限制
max-file-size: 10MB #用来指定服务端最大文件大小
前端页面
注意:method为“POST”,enctype为“multipart/form-data”,后台接收参数名称与“name”相同。
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="coverFile">
</form>
Spring Boot的Controller代码
/**
* 添加图书
* @param book
* @return
*/
@RequestMapping("addBook")
public String addBook(Book book, MultipartFile coverFile, HttpServletRequest request) throws IOException {
//对上传的文件进行处理
if (!coverFile.isEmpty()) {
//获取封面保存路径的绝对地址
String realPath = request.getSession().getServletContext().getRealPath("/cover");
//获取文件后缀(如“.jpg”)
int suffixIndex = coverFile.getOriginalFilename().lastIndexOf(".");
String suffix = coverFile.getOriginalFilename().substring(suffixIndex);
//创建图片的新文件名
String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
//将文件保存到指定路径
coverFile.transferTo(new File(realPath, newFileName));
book.setCover("/cover/" + newFileName);
}
bookService.add(book);
return "redirect:/book/showAll";
}
Spring Boot文件下载
Jsp页面
<a href="${pageContext.request.contextPath}/book/pictureDownload?id=${book.id}">
<img width="32px" height="20px" src="${pageContext.request.contextPath}${book.cover}" >
</a>
Spring Boot代码
注意:根据笔者的亲自测试,对于响应头的设置,Spring Boot对于
attachment
和inline
的效果都是“预览”
/**
* 下载书籍封面图片
* @param id 图书ID
*/
@RequestMapping("pictureDownload")
public void pictureDownload(String id, HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取图书封面的绝对路径
Book book = bookService.queryById(id);
String cover = book.getCover();
String realPath = request.getSession().getServletContext().getRealPath(cover);
//获取文件输入流
FileInputStream is = new FileInputStream(realPath);
//获取输出流
ServletOutputStream os = response.getOutputStream();
//设置响应的头(attachment为附件,inline为在线预览)
response.setHeader("content-disposition", "inline:fileName="+ URLEncoder.encode(book.getName(), "UTF-8"));
//将is流交给os流
IOUtils.copy(is, os);
//关闭IO流
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
效果
Spring Boot全局异常处理
自定义全局异常处理类
package ace.gjh.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(Exception e, HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", e);
modelAndView.addObject("url", request.getRequestURL());
modelAndView.addObject("timestamp",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
modelAndView.addObject("error", e);
modelAndView.addObject("status", "error");
modelAndView.addObject("message", "error");
modelAndView.setViewName("global_error");
return modelAndView;
}
}
自定义全局异常处理页面
global_error.jsp
<%@page isELIgnored="false" language="java" contentType="text/html; UTF-8" pageEncoding="utf-8" %>
<html>
<head>
<title>Error</title>
</head>
<body style="background-color: #b0fffc">
<div style="width: 750px;border: #d31fb4 1px solid;margin: 200px auto;padding: 30px">
<h1>温馨提示</h1>
<font color="blue">${timestamp} ${url}</font> <br>
出现如下异常:<br>
<font color="red">${exception}</font>
</div>
</body>
</html>
显示效果
Spring Boot利用拦截器实现用户登录验证
实现拦截器
package ace.gjh.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前调用,决定是否调用该拦截链中的方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
Object admin = request.getSession().getAttribute("admin");
return admin == null;
}
/**
* 在请求被处理后,视图渲染之前调用
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
modelAndView.setViewName("back/login");
}
/**
* 在整个请求处理完成之后调用的方法
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
注册拦截器
package ace.gjh.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Component
public class LoginInterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/book/*")
.addPathPatterns("/category/*");
}
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/book/*")
.addPathPatterns("/category/*");
}
}