我是靠谱客的博主 爱笑灯泡,最近开发中收集的这篇文章主要介绍springmv基础:(2)参数绑定,数据校验,异常处理,静态资源和json以及与Struts2区别1 参数绑定2 数据校验3 异常处理4 SpringMVC访问静态资源5 JSON数据处理6 Springmvc与Struts2区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

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区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部