概述
目录
1 参数绑定
1.1 Springmvc参数绑定过程
1.2 默认支持的类型
1.2.1 简单类型
1.2.2 简单pojo(属性为简单类型)绑定
1.2.3 包装pojo(属性为复合类型)绑定
1.3 自定义参数绑定(类型转换器)
1.3.1 定义pojo类添加Date类型属性
1.3.2 自定义日期类型绑定
2 数据校验
2.1 配置validator
2.1.1 将validator加到处理器适配器
2.1.2 添加验证规则
2.1.3 错误消息文件CustomValidationMessages
2.1.4 捕获错误
2.1.5 新建add.jsp页面
2.2 分组校验
2.2.1 定义分组
2.2.2 指定分组校验
2.3 校验注解
3 异常处理
3.1 异常处理思路
3.2 自定义异常类
3.3 自定义异常处理器
3.4 错误页面
3.5 异常处理器配置
3.6 异常测试
4 SpringMVC访问静态资源
5 JSON数据处理
6 Springmvc与Struts2区别
1 参数绑定
1.1 Springmvc参数绑定过程
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。
Springmvc中,接收页面提交的数据是通过方法形参来接收
处理器适配器调用springmvc提供参数绑定组件将key/value数据转成controller方法的形参
参数绑定组件:在spirngmvc早期版本使用PropertyEditor(只能将字符串传成java对象)
后期使用converter(进行任意类型的传换),spirngmvc提供了很多converter(转换器),在特殊情况下需要自定义converter,对日期数据绑定需要自定义converter
1.2 默认支持的类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
- HttpServletRequest : 通过request对象获取请求信息
- HttpServletResponse: 通过response处理响应信息
- HttpSession: 通过session对象得到session中存放的对象
- Model/ModelMap: model是一个接口,modelMap是一个接口实现 。作用:将model数据填充到request域。
1.2.1 简单类型
通过@RequestParam对简单类型的参数进行绑定。
如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。
如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。
1.2.2 简单pojo(属性为简单类型)绑定
页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。
将pojo对象中的属性名与传递进来的属性名对应,如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中
eg:页面定义如下;
<input type="text" name="name"/>
<input type="text" name="price"/>
Contrller方法定义如下:
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Items items)throws Exception{
System.out.println(items);}
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。
1.2.3 包装pojo(属性为复合类型)绑定
如果采用类似struts中对象.属性的方式命名,需要将pojo对象作为一个包装对象的属性,action中以该包装对象作为形参。
包装对象定义如下:
Public class QueryVo {
private Items items;
}
页面定义:
<input type="text" name="items.name" />
<input type="text" name="items.price" />
Controller方法定义如下:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getItems());}
注意:这里与struts的区别:
在struts2里面的action里面定义一个实体(domain)的get/set方法,那么前台是用domian.property来定义属性名字,方便封装;但是在springmvc里面是直接从实体里面获取属性的不需要用点,除非嵌套对象,就用嵌套对象点(.)属性方法来定义属性名字
1.3 自定义参数绑定(类型转换器)
对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。将请求日期数据串传成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致
1.3.1 定义pojo类添加Date类型属性
public class Items {
private Integer id;
private String name;
private Float price;
private Date date;
//getter和setter方法省略
}
1.3.2 自定义日期类型绑定
public class CustomDateConverter implements Converter<String,Date>{
@Override
public Date convert(String source) {
//将字符串参数转换为指定格式(yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//成功返回需要的格式
return simpleDateFormat.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果失败返回null
return null;
}
}
CustomDateConverter配置方式,在注解驱动中添加转换
<mvc:annotation-driven conversion-service="conversionService"/ >
<!-- 自定义参数绑定 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<!-- 日期类型转换 -->
<bean class="cn.converter.CustomDateConverter"/>
</list>
</property>
</bean>
<!-- 使用自定义的转换器 -->
2 数据校验
在用户信息修改提交时对用户信息内容进行校验,例如用户名称合法性校验,用户密码必须输入
2.1 配置validator
<!-- 加载校验信息资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件的基础名称 -->
<property name="basenames">
<list>
<value>classpath:UserValidationMessage</value>
</list>
</property>
<!-- 资源文件的编码集 -->
<property name="fileEncodings" value="UTF-8"></property>
<!-- 资源文件的缓存时间 -->
<property name="cacheSeconds" value="120"></property>
</bean>
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<property name="validationMessageSource" ref="messageSource"></property>
</bean>
2.1.1 将validator加到处理器适配器
<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>
2.1.2 添加验证规则
public class User{
private Integer id;
@Size(min=6,max=20,message="{username.length.error}")
private String userName;
@NotEmpty(message="{userpass.isnull.error}")
private String userPass;
}
2.1.3 错误消息文件CustomValidationMessages
username.length.error=用户名必须在1到30个字符之间!
userpass.isnull.error=密码不能为空!
如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件。
2.1.4 捕获错误
修改Controller方法
@RequestMapping("/add")
public String add(@Validated User user,BindingResult result,Model model)
throws Exception {
//如果存在校验错误则转到商品修改页面
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for(ObjectError objectError:errors){
System.out.println(objectError.getCode());
System.out.println(objectError.getDefaultMessage());
model.addAttribute("errors", errors);
}
return "add";
}
//省略业务代码
return "success";
}
注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。
2.1.5 新建add.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<font color="red">
<c:forEach items="${errors}" var="err">
${err.defaultMessage}<br>
</c:forEach>
</font>
<form action="user/add" method="post">
用户名:<input type="text" name="userName"><br>
密码:<input type="text" name="userPass"><br>
<input type="submit" value="新增">
</form>
</body>
</html>
2.2 分组校验
如果两处校验使用同一个User类则可以设定校验分组,通过分组校验可以对每处的校验个性化。
需求:用户新增提交只校验用户名称长度
2.2.1 定义分组
定义分组:分组就是一个标识,这里定义一个接口,接口里面啥也没有:
public interface ValidGroup1 {
}
public interface ValidGroup2 {
}
2.2.2 指定分组校验
public class User {
private Integer userId;
//这里指定分组ValidGroup1,此@Size校验只适用ValidGroup1校验
@Size(min=1,max=30,message="{username.length.error}",groups={ValidGroup1.class})
private String userName;
//新增用户
@RequestMapping("/add")
public String add(@Validated(value={ValidGroup1.class}) User user,BindingResult result,
Model model)
throws Exception {
}
}
在@Validated中添加value={ValidGroup1.class}表示商品修改使用了ValidGroup1分组校验规则,也可以指定多个分组中间用逗号分隔,@Validated(value={ValidGroup1.class,ValidGroup2.class })
2.3 校验注解
- @Null 被注释的元素必须为 null
- @NotNull 被注释的元素必须不为 null
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past 被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
- @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
- Hibernate Validator 附加的 constraint
- @NotBlank(message =) 验证字符串非null,且长度必须大于0
- @Email 被注释的元素必须是电子邮箱地址
- @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
- @NotEmpty 被注释的字符串的必须非空
- @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
点击了解SpringBoot服务端数据校验
3 异常处理
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
3.1 异常处理思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:
3.2 自定义异常类
为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息
public class CustomException extends Exception {
public CustomException(String message){
super(message);
}
}
3.3 自定义异常处理器
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ex.printStackTrace();//打印异常堆栈信息
CustomException customException=null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException =new CustomException("未知异常,请与管理员联系!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
3.4 错误页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>错误页面</title>
</head>
<body>
您的操作出现错误如下:<br>
${message}
</body>
</html>
3.5 异常处理器配置
在springmvc.xml中添加:
<!-- 异常处理器 -->
<bean id="handlerExceptionResolver" class="cn.exception.CustomExceptionResolver"/>
3.6 异常测试
@RequestMapping("/add")
public String add(User user) throws Exception{
if(user.getUserName().length()<6){
throw new CustomException("用户名长度不能小于6位!");
}
//调用service中的方法完成用户新增
return "index";
}
4 SpringMVC访问静态资源
在springmvc.xml中添加如下配置
<!-- 处理静态资源 让静态资源可以直接访问-->
<mvc:resources mapping="/static/**" location="/static/"/>
或者当在web.xml 中 DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时,能映射静态资源
<mvc:default-servlet-handler />
5 JSON数据处理
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。 json对象--->java对象
@ResponseBody注解实现将处理结果转换为json对象,并将json对象返回给客户端。 java对象---->json对象
注意:在原生ajax里面需要注意一点:
$.ajax({
url:"user/add.action",
data:jsonData,
//contentType:"application/json",
type:"POST",
dataType:"json",
success:function(data){
alert(data.message);
}
});
如果设置了contentType:"application/json",那么data只能是json字符串类型
在js里面可以使用JSON.stringify(param)把对象转换为json字符串,而且在后台就必须使用@RequestBody来接收参数,否则接不到,如果没有设置contentType:"application/json",那么data只能是json对象,在后台不需要使流的形式来接收
点击此处了解ajax方法详解
6 Springmvc与Struts2区别
Springmvc与Struts2的区别:
- springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器
- springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
- Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
最后
以上就是爱笑灯泡为你收集整理的springmv基础:(2)参数绑定,数据校验,异常处理,静态资源和json以及与Struts2区别1 参数绑定2 数据校验3 异常处理4 SpringMVC访问静态资源5 JSON数据处理6 Springmvc与Struts2区别的全部内容,希望文章能够帮你解决springmv基础:(2)参数绑定,数据校验,异常处理,静态资源和json以及与Struts2区别1 参数绑定2 数据校验3 异常处理4 SpringMVC访问静态资源5 JSON数据处理6 Springmvc与Struts2区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复