例如从前台jsp页面传递过来的日期是字符串形式,如何将字符串转换为Date类型。
方式一:Spring支持的转换器:Convert接口,具体实现方式已经在上一篇博客中体现。这种方式可以实现任意类型的数据转换。
方式二:Fomatter
方式三:注解格式化工厂,使用AnnotationFormatterFactory格式化数据。其中包括两个重要注解:@DateTimeFormat:日期时间格式。@NumberFormat:数字类型包括:货币,正常数字,百分数类型。注解作用于pojo的属性。将页面传递的String转换成对应的格式化数据。注:开发中强烈建议使用这种方式。
package com.gxzj.mobile.vo.json.productinfo; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.NumberFormat; import java.io.Serializable; import java.util.Date; /** * @author Liqingchao * @version $Rev$ * @time 2018/4/11 0011 11:12 * @desc 使用注解格式化工厂的方式将页面传递的String转换成对应的格式化数据。 * @updateAuthor $Author$ * @updateData $Date$ * @updateDesc ${TODO} */ public class User implements Serializable { //日期类型 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; //正常数字类型 @NumberFormat(style = NumberFormat.Style.NUMBER,pattern = "#,###") private int total; //百分数类型 @NumberFormat(style = NumberFormat.Style.PERCENT) private double discount; //货币类型 @NumberFormat(style = NumberFormat.Style.CURRENCY) private double money; }
输入校验分为客户端校验和服务端校验,客户端校验主要是过滤正常用户误操作,通常通过JS完成。服务端校验是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现。对于用户的恶意行为客户端校验将无能为力,必须通过服务端校验,客户端校验能把用户误操作的非法输入阻止在客户端,减少服务器的负载压力。因此必须客户端和服务端同时进行校验。
SpringMVC提供了两种校验方式:1.Spring自带的Validation校验框架。2、JSR303校验。
(1)、Spring自带的Validation校验框架由于硬编码,所以实际开发中显得比较麻烦,因此现在开发更加推荐使用JSR303
(2)、JSR303校验:更加推荐这种方式。
package com.gxzj.mobile.service.impl.biz.shopping; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; import javax.validation.constraints.Past; import javax.validation.constraints.Pattern; /** * @author Liqingchao * @version $Rev$ * @time 2018/4/11 0011 14:22 * @desc 使用JSR303校验数据合法性 * @updateAuthor $Author$ * @updateData $Date$ * @updateDesc ${TODO} */ public class User implements Serializable { @NotBlank(message = "登录名不能为空") private String loginname; @NotBlank(message = "密码不能为空") @Length(min = 6,max = 8,message = "密码长度必须在6到8位之间") private String password; @NotBlank(message = "用户名不能为空") private String username; @Range(min = 15,max = 60,message = "年龄必须在15到60岁之间") private int age; @Email(message = "必须是合法的邮箱地址") private String email; @DateTimeFormat(pattern = "yyyy-MM-dd") @Past(message = "生日必须是过去的一个日期") private Date birthday; @Pattern(regexp = "[1][3,8][3,6,9][0-9]{8}",message = "无效的电话号码") private String phone; }
1、文件上传:图片上传:MultipartFile file 类。可以在Springmvc核心配置文件中对上传图片的大小做限制。
2、文件下载:通知浏览器以attachment(下载方式)打开图片。
public class Interceptor1 implements HandlerInterceptor {
//执行时机:controller已经执行,modelAndview已经返回
//使用场景: 记录操作日志,记录登录用户的ip,时间等.
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("======Interceptor1=======afterCompletion========");
}
//执行时机:Controller方法已经执行,ModelAndView没有返回
//使用场景: 可以在此方法中设置全局的数据处理业务
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("======Interceptor1=======postHandle========");
}
//返回布尔值:如果返回true放行,返回false则被拦截住
//执行时机:controller方法没有被执行,ModelAndView没有被返回
//使用场景: 权限验证
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("======Interceptor1=======preHandle========");
return true;
}
}
登录的权限认证:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//判断当前访问路径是否为登录的路径,如果是则放行
if(request.getRequestURI().indexOf("/login") > 0){
return true;
}
//判断session中是否有登录信息,如果没有则跳转到登录页面,如果有则放行
HttpSession session = request.getSession();
if(session.getAttribute("username") != null){
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}
}
在Springmvc核心配置文件中配置拦截器:
//自定义全局异常处理
public class CustomGlobalExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object arg2, Exception exc) {
//保存异常信息
String msg = "";
//判断异常类型
if(exc instanceof CustomException){
//处理业务级别异常
msg = ((CustomException)exc).getMessage();
} else {
//处理运行时异常
msg = "系统异常, 亲,对不起, 请及时联系管理员哦!";
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", msg);
modelAndView.setViewName("error");
return modelAndView;
}
}
在Springmvc核心配置文件中配置全局异常处理器
在web.xml文件中配置如下: