`
jinnianshilongnian
  • 浏览: 21433723 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404932
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997590
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631404
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257542
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593136
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248958
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847466
Group-logo
跟我学Nginx+Lua开...
浏览量:698110
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780420
社区版块
存档分类
最新评论

第四章 Controller接口控制器详解(7 完)——跟着开涛学SpringMVC

阅读更多

4.16.2、数据验证

1、数据绑定失败:比如需要数字却输入了字母;

2、数据不合法:可以认为是业务错误,通过自定义验证器验证,如用户名长度必须在5-20之间,我们却输入了100个字符等;

3、错误对象:当我们数据绑定失败或验证失败后,错误信息存放的对象,我们叫错误对象,在Spring Web MVC中Errors是具体的代表者;线程不安全对象;

4、错误消息:是硬编码,还是可配置?实际工作应该使用配置方式,我们只是把错误码(errorCode)放入错误对象,在展示时读取相应的错误消息配置文件来获取要显示的错误消息(errorMessage);

 

4.16.2.1、验证流程

 

1、首先进行数据绑定验证,如果验证失败会通过MessageCodesResolver生成错误码放入Errors错误对象;

2、数据不合法验证,通过自定义的验证器验证,如果失败需要手动将错误码放入Errors错误对象;

4.16.2.2、错误对象和错误消息

错误对象的代表者是Errors接口,并且提供了几个实现者,在Spring Web MVC中我们使用的是如下实现:

 

相关的错误方法如下:

Errors存储和暴露关于数据绑定错误和验证错误相关信息的接口,提供了相关存储和获取错误消息的方法:

 

java代码:
package org.springframework.validation;
public interface Errors {
  //=========================全局错误消息(验证/绑定对象全局的)=============================
  //注册一个全局的错误码()
  void reject(String errorCode);
  //注册一个全局的错误码,当根据errorCode没有找到相应错误消息时,使用defaultMessage作为错误消息
  void reject(String errorCode, String defaultMessage);
  //注册一个全局的错误码,当根据errorCode没有找到相应错误消息时(带错误参数的),使用defaultMessage作为错误消息
  void reject(String errorCode, Object[] errorArgs, String defaultMessage);
  //=========================全局错误消息(验证/绑定整个对象的)=============================
  //=========================局部错误消息(验证/绑定对象字段的)=============================
  //注册一个对象字段的错误码,field指定验证失败的字段名
  void rejectValue(String field, String errorCode);
  void rejectValue(String field, String errorCode, String defaultMessage);
  void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage);
  //=========================局部错误消息(验证/绑定对象字段的)=============================
  boolean hasErrors();      ////是否有错误
  boolean hasGlobalErrors(); //是否有全局错误
  boolean hasFieldErrors();  //是否有字段错误
  Object getFieldValue(String field); //返回当前验证通过的值,或验证失败时失败的值;
}

 

getFieldValue:可以得到验证失败的失败值,这是其他Web层框架很少支持的,这样就可以给用户展示出错时的值(而不是空或其他的默认值等)。

 

BindingResult代表数据绑定的结果,继承了Errors接口。

BindException代表数据绑定的异常,它继承Exception,并实现了BindingResult,这是内部使用的错误对象。

 

示例:

(1、控制器

 

java代码:
package cn.javass.chapter4.web.controller;
//省略import
public class ErrorController extends AbstractCommandController {
       public ErrorController() {
              setCommandClass(DataBinderTestModel.class);
              setCommandName("command");
       }
       @Override
       protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {   
              //表示用户名不为空
              errors.reject("username.not.empty");
              //带有默认错误消息
              errors.reject("username.not.empty1", "用户名不能为空1");
              //带有参数和默认错误消息        
              errors.reject("username.length.error", new Object[]{5, 10});
             
              //得到错误相关的模型数据
              Map model = errors.getModel();
              return new ModelAndView("bindAndValidate/error", model);
       }
}

 

errors.reject("username.not.empty")注册全局错误码“username.not.empty”,我们必须提供messageSource来提供错误码“username.not.empty”对应的错误信息(如果没有会抛出NoSuchMessageException异常);

 

errors.reject("username.not.empty1", "用户名不能为空1")注册全局错误码“username.not.empty1”,如果从messageSource没没有找到错误码“username.not.empty1”对应的错误信息,则将显示默认消息“用户名不能为空1”;

 

errors.reject("username.length.error", new Object[]{5, 10})错误码为“username.length.error”,而且错误信息需要两个参数,如我们在我们的配置文件中定义“用户名长度不合法,长度必须在{0}到{1}之间”,则实际的错误消息为“用户名长度不合法,长度必须在5到10之间”

errors.getModel()当有错误信息时,一定将errors.getModel()放入我们要返回的ModelAndView中,以便使用里边的错误对象来显示错误信息。

 

(2、spring配置文件chapter4-servlet.xml

 

java代码:
<bean id="messageSource"
       class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages"/>
    <property name="fileEncodings" value="utf-8"/>
    <property name="cacheSeconds" value="120"/>
</bean>
 
<bean name="/error" class="cn.javass.chapter4.web.controller.ErrorController"/>

 

messageSource用于获取错误码对应的错误消息的,而且bean名字默认必须是messageSource。

 

messages.properties(需要执行NativeToAscii)

 

java代码:
username.not.empty=用户名不能为空
username.length.error=用户名长度不合法,长度必须在{0}到{1}之间

 

3、视图页面(WEB-INF/jsp/bindAndValidate/error.jsp

 

java代码:
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- 表单的默认命令对象名为command -->
<form:form commandName="command">
    <form:errors path="*"></form:errors>
</form:form>

 

form标签库:此处我们使用了spring的form标签库;

<form:form commandName="command">:表示我们的表单标签,commandName表示绑定的命令对象名字,默认为command;

<form:errors path="*"></form:errors>表示显示错误信息的标签,如果path为“*”表示显示所有错误信息。

 

接下来我们来看一下 数据绑定失败和数据不合法时,如何处理。

4.16.2.3、数据绑定失败

如我们的DataBinderTestModel类:

bool:boolean类型,此时如果我们前台传入非兼容的数据,则会数据绑定失败;

date:Date类型,此时如果我们前台传入非兼容的数据,同样会数据绑定失败;

phoneNumber:自定义的PhoneNumberModel类型,如果如果我们前台传入非兼容的数据,同样会数据绑定失败。

 

示例:

(1、控制器,DataBinderErrorTestController

 

 

java代码:
package cn.javass.chapter4.web.controller;
//省略import
public class DataBinderErrorTestController extends SimpleFormController {
       public DataBinderErrorTestController() {
              setCommandClass(DataBinderTestModel.class);
              setCommandName("dataBinderTest");
       }
       @Override
       protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception {
              //如果表单提交有任何错误都会再回到表单展示页面
              System.out.println(errors);
              return super.showForm(request, response, errors);
       }
       @Override
       protected void doSubmitAction(Object command) throws Exception {
              System.out.println(command); //表单提交成功(数据绑定成功)进行功能处理
    }
       @Override
       protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
              super.initBinder(request, binder);
              //注册自定义的属性编辑器
              //1、日期
              DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              CustomDateEditor dateEditor = new CustomDateEditor(df, true);
              //表示如果命令对象有Date类型的属性,将使用该属性编辑器进行类型转换
              binder.registerCustomEditor(Date.class, dateEditor);
             
              //自定义的电话号码编辑器
              binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEditor());
       }
}

此处我们使用SimpleFormController;

showForm展示表单,当提交表单有任何数据绑定错误会再回到该方法进行表单输入(在此处我们打印错误对象);

doSubmitAction表单提交成功,只要当表单的数据到命令对象绑定成功时,才会执行;

 

(2、spring配置文件chapter4-servlet.xml

 

java代码:
<bean name="/dataBindError"
class="cn.javass.chapter4.web.controller.DataBinderErrorTestController">
   <property name="formView" value="bindAndValidate/input"/>
   <property name="successView" value="bindAndValidate/success"/>
</bean>

 

3、视图页面(WEB-INF/jsp/bindAndValidate/ input.jsp

 

java代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- 表单的命令对象名为dataBinderTest -->
<form:form commandName="dataBinderTest">
    <form:errors path="*" cssStyle="color:red"></form:errors><br/><br/>
    bool:<form:input path="bool"/><br/>
    phoneNumber:<form:input path="phoneNumber"/><br/>
    date:<form:input path="date"/><br/>
    <input type="submit" value="提交"/>
</form:form>

 

此处一定要使用form标签库,借此我们可以看到它的强大支持(别的大部分Web框架所不具备的,展示用户验证失败的数据)。

 

<form:form commandName="dataBinderTest">:指定命令对象为dataBinderTest,默认command;

<form:errors path="*" cssStyle="color:red"></form:errors>:显示错误消息,当提交表单有错误时展示错误消息(数据绑定错误/数据不合法);

<form:input path="bool"/>:等价于(<input type=’text’>),但会从命令对象中取出bool属性进行填充value属性,或如果表单提交有错误会从错误对象取出之前的错误数据(而非空或默认值);

<input type="submit" value="提交"/>:spring没有提供相应的提交按钮,因此需要使用html的。

 

(4、测试

在地址栏输入如下地址:http://localhost:9080/springmvc-chapter4/dataBindError

 

全部是错误数据,即不能绑定到我们的命令对象;

 

当提交表单后,我们又回到表单输入页面,而且输出了一堆错误信息

 

1、错误消息不可读;

2、表单元素可以显示之前的错误的数据,而不是默认值/空;

 

(5、问题

这里最大的问题是不可读的错误消息,如何让这些错误消息可读呢?

 

首先我们看我们的showForm方法里输出的“errors”错误对象信息:

 

java代码:
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 3 errors
 
Field error in object 'dataBinderTest' on field 'bool': rejected value [www]; codes [typeMismatch.dataBinderTest.bool,typeMismatch.bool,typeMismatch.boolean,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dataBinderTest.bool,bool]; arguments []; default message [bool]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'bool'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [www]]
 
Field error in object 'dataBinderTest' on field 'date': rejected value [123]; codes [typeMismatch.dataBinderTest.date,typeMismatch.date,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dataBinderTest.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'date'; nested exception is java.lang.IllegalArgumentException: Could not parse date: Unparseable date: "123"]
 
Field error in object 'dataBinderTest' on field 'phoneNumber': rejected value [123]; codes [typeMismatch.dataBinderTest.phoneNumber,typeMismatch.phoneNumber,typeMismatch.cn.javass.chapter4.model.PhoneNumberModel,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dataBinderTest.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'cn.javass.chapter4.model.PhoneNumberModel' for property 'phoneNumber'; nested exception is java.lang.IllegalArgumentException: 类型转换失败,需要格式[010-12345678],但格式是[123]]
 

数据绑定失败(类型不匹配)会自动生成如下错误码(错误码对应的错误消息按照如下顺序依次查找):

1、typeMismatch.命令对象名.属性名

2、typeMismatch.属性名

3、typeMismatch.属性全限定类名(包名.类名)

4、typeMismatch

 

⊙内部使用MessageCodesResolver解析数据绑定错误到错误码,默认DefaultMessageCodesResolver,因此想要详细了解如何解析请看其javadoc;

 

⊙建议使用第1个进行错误码的配置。

 

因此修改我们的messages.properties添加如下错误消息(需要执行NativeToAscii):

 

java代码:
typeMismatch.dataBinderTest.date=您输入的数据格式错误,请重新输入(格式:2012-03-19 22:17:17)
#typeMismatch.date=2
#typeMismatch.java.util.Date=3
#typeMismatch=4

 

再次提交表单我们会看到我们设置的错误消息:

 

到此,数据绑定错误我们介绍完了,接下来我们再看一下数据不合法错误。

4.16.2.4、数据不合法

1、比如用户名长度必须在5-20之间,而且必须以字母开头,可包含字母、数字、下划线;

2、比如注册用户时 用户名已经存在或邮箱已经存在等;

3、比如去一些论坛经常会发现,您发的帖子中包含×××屏蔽关键字等。

 

还有很多数据不合法的场景,在此就不罗列了,对于数据不合法,Spring Web MVC提供了两种验证方式:

◆编程式验证器验证

◆声明式验证

 

先从编程式验证器开始吧。

4.16.2.4.1、编程式验证器

一、验证器接口

 

java代码:
package org.springframework.validation;
public interface Validator {
boolean supports(Class<?> clazz);
void validate(Object target, Errors errors);
}

 

Validator接口:验证器,编程实现数据验证的接口;

supports方法:当前验证器是否支持指定的clazz验证,如果支持返回true即可;

validate方法:验证的具体方法,target参数表示要验证的目标对象(如命令对象),errors表示验证出错后存放错误信息的错误对象。

 

示例:

(1、验证器实现

 

java代码:
package cn.javass.chapter4.web.controller.support.validator;
//省略import
public class UserModelValidator implements Validator {
    private static final Pattern USERNAME_PATTERN = Pattern.compile("[a-zA-Z]\\w{4,19}");
    private static final Pattern PASSWORD_PATTERN = Pattern.compile("[a-zA-Z0-9]{5,20}");
    private static final Set<String> FORBINDDDEN_WORD_SET = new HashSet<String>();
    static {
       FORBINDDDEN_WORD_SET.add("fuc k"); //删掉空格
       FORBINDDDEN_WORD_SET.add("admin");
    }  
    @Override
    public boolean supports(Class<?> clazz) {
       return UserModel.class == clazz;//表示只对UserModel类型的目标对象实施验证
    }
    @Override
    public void validate(Object target, Errors errors) {
       //这个表示如果目标对象的username属性为空,则表示错误(简化我们手工判断是否为空)
       ValidationUtils.rejectIfEmpty(errors, "username", "username.not.empty");
      
       UserModel user = (UserModel) target;
      
       if(!USERNAME_PATTERN.matcher(user.getUsername()).matches()) {
           errors.rejectValue("username", "username.not.illegal");//如果用户名不合法
       }
      
       for(String forbiddenWord : FORBINDDDEN_WORD_SET) {
           if(user.getUsername().contains(forbiddenWord)) {
              errors.rejectValue("username", "username.forbidden", new Object[]{forbiddenWord}, "您的用户名包含非法关键词");//用户名包含屏蔽关键字
              break;
           }
       }
       if(!PASSWORD_PATTERN.matcher(user.getPassword()).matches()) {
           errors.rejectValue("password","password.not.illegal", "密码不合法");//密码不合法
       }  
    }
}
 

supports方法:表示只对UserModel类型的对象验证;

validate方法:数据验证的具体方法,有如下几个验证:

    1、用户名不合法(长度5-20,以字母开头,随后可以是字母、数字、下划线)

    USERNAME_PATTERN.matcher(user.getUsername()).matches() //使用正则表达式验证

    errors.rejectValue("username", "username.not.illegal");//验证失败为username字段添加错误码

 

 

    2、屏蔽关键词:即用户名中含有不合法的数据(如admin)

    user.getUsername().contains(forbiddenWord) //用contains来判断我们的用户名中是否含有非法关键词

    errors.rejectValue("username", "username.forbidden", new Object[]{forbiddenWord}, "您的用户名包含非法关键词");//验证失败为username字段添加错误码(参数为当前屏蔽关键词)(默认消息为"您的用户名包含非法关键词")

 

    3、密码不合法

    在此就不罗列代码了;

    4、ValidationUtils

    ValidationUtils.rejectIfEmpty(errors, "username", "username.not.empty");

    表示如果目标对象的username属性数据为空,则添加它的错误码;

    内部通过(value == null || !StringUtils.hasLength(value.toString()))实现判断value是否为空,从而简化代码。

 

(2、spring配置文件chapter4-servlet.xml

 

java代码:
<bean id="userModelValidator"
class="cn.javass.chapter4.web.controller.support.validator.UserModelValidator"/>
<bean name="/validator"
class="cn.javass.chapter4.web.controller.RegisterSimpleFormController">
    <property name="formView" value="registerAndValidator"/>
    <property name="successView" value="redirect:/success"/>
    <property name="validator" ref="userModelValidator"/>
</bean>

 

此处使用了我们第4.9节创建的RegisterSimpleFormController。

 

(3、错误码配置(messages.properties),需要执行NativeToAscii

 

java代码:
username.not.empty=用户名不能为空
username.not.illegal=用户名错误,必须以字母开头,只能出现字母、数字、下划线,并且长度在5-20之间
username.forbidden=用户名中包含非法关键词【{0}】
password.not.illegal=密码长度必须在5-20之间

 

(4、视图页面(/WEB-INF/jsp/registerAndValidator.jsp

 

java代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form commandName="user">
 
<form:errors path="*" cssStyle="color:red"></form:errors><br/>
 
username:<form:input path="username"/>
<form:errors path="username" cssStyle="color:red"></form:errors>
<br/>
 
password:<form:password path="password"/>
<form:errors path="password" cssStyle="color:red"></form:errors>
<br/>
<input type="submit" value="注册"/>
</form:form>
 

 

form:errors path="username"表示只显示username字段的错误信息;

 

5、测试

地址:http://localhost:9080/springmvc-chapter4/validator

 

当我们输入错误的数据后,会报错(form:errors path="*"显示所有错误信息,而form:errors path="username"只显示该字段相关的)。

 

 

问题:

如MultiActionController控制器相关方法没有提供给我们errors对象(Errors),我们应该怎么进行错误处理呢?

 

此处给大家一个思路,errors本质就是一个Errors接口实现,而且在页面要读取相关的错误对象,该错误对象应该存放在模型对象里边,因此我们可以自己创建个errors对象并将其添加到模型对象中即可。

 

此处我们复制4.15节的UserController类为UserAndValidatorController,并修改它的create(新增)方法添加如下代码片段:

 

java代码:
BindException errors = new BindException(user, getCommandName(user));
//如果用户名为空
if(!StringUtils.hasLength(user.getUsername())) {
    errors.rejectValue("username", "username.not.empty");
}
if(errors.hasErrors()) {
    return new ModelAndView(getCreateView()).addAllObjects(errors.getModel());
}
      

 

√ new BindException(user, getCommandName(user))使用当前的命令对象,和命令对象的名字创建了一个BindException作为errors;

StringUtils.hasLength(user.getUsername())如果用户名为空就是用errors.rejectValue("username", "username.not.empty");注入错误码;

errors.hasErrors()表示如果有错误就返回到新增页面并显示错误消息;

ModelAndView(getCreateView()).addAllObjects(errors.getModel())此处一定把errors对象的模型数据放在当前的ModelAndView中,作为当前请求的模型数据返回。

 

在浏览器地址栏输入:http://localhost:9080/springmvc-chapter4/userAndValidator/create 到新增页面

 

用户名什么都不输入,提交后又返回到新增页面 而且显示了错误消息说明我们的想法是正确的。

 

4.16.2.4.2、声明式验证器

从Spring3开始支持JSR-303验证框架,支持XML风格和注解风格的验证,目前在@RequestMapping时才能使用,也就是说基于Controller接口的实现不能使用该方式(但可以使用编程式验证,有需要的可以参考hibernate validator实现),我们将在第七章详细介绍。

 

 

到此Spring2风格的控制器我们就介绍完了,以上控制器从spring3.0开始已经不推荐使用了(但考虑到还有部分公司使用这些@Deprecated类,在此也介绍了一下),而是使用注解控制器实现(@Controller和@RequestMapping)。

 


私塾在线学习网
原创内容(http://sishuok.com

原创内容,转载请注明私塾在线【http://sishuok.com/forum/blogPost/list/5837.html

39
10
分享到:
评论
18 楼 wangviviying 2016-08-26  
总算结束了,哈哈
17 楼 smartdaic 2013-02-07  
smartdaic 写道
请教一下,您上面的数据绑定的例子,在messages.properties添加了:typeMismatch.dataBinderTest.date = 您输入的数据格式错误,请重新输入(格式:2012-03-19 22:17:17),当前输入的是{0}; 如将当前输入的值传到参数{0}那里呢?在哪里传入呢

如何将当前输入的值传到参数{0}那里呢?在哪里传入呢
16 楼 smartdaic 2013-02-07  
请教一下,您上面的数据绑定的例子,在messages.properties添加了:typeMismatch.dataBinderTest.date = 您输入的数据格式错误,请重新输入(格式:2012-03-19 22:17:17),当前输入的是{0}; 如将当前输入的值传到参数{0}那里呢?在哪里传入呢
15 楼 jinnianshilongnian 2013-01-09  
wqmain 写道
jinnianshilongnian 写道
wqmain 写道
有个问题请问一下,在Controller的某个方法中已经加入如下代码:
if(errors.hasErrors()) { 
    return new ModelAndView(getCreateView()).addAllObjects(errors.getModel()); 
}

但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢?   谢谢!!!

那就自己定义个error属性来存错误即可


关键是想如果页面中JSTL可以获取到,就可以不用自定义属性这种方式了。debug 中可以看到ModelAndView 对象中是有BindExcpetion的错误信息的,就是不知道怎样才能在页面中通过EL表达式拿到,所以来请教你?


1、spring error form tag 内部使用
	protected BindStatus getBindStatus() throws JspException {
		if (this.bindStatus == null) {
			// HTML escaping in tags is performed by the ValueFormatter class.
			String nestedPath = getNestedPath();
			String pathToUse = (nestedPath != null ? nestedPath + getPath() : getPath());
			if (pathToUse.endsWith(PropertyAccessor.NESTED_PROPERTY_SEPARATOR)) {
				pathToUse = pathToUse.substring(0, pathToUse.length() - 1);
			}
			this.bindStatus = new BindStatus(getRequestContext(), pathToUse, false);
		}
		return this.bindStatus;
	}

获取一个BindStatus 再通过BindStatus来获取错误消息;
然后通过如下代码得到错误码,再转成错误消息
		this.errors = requestContext.getErrors(beanName, false);

		if (this.errors != null) {
			// Usual case: A BindingResult is available as request attribute.
			// Can determine error codes and messages for the given expression.
			// Can use a custom PropertyEditor, as registered by a form controller.
			if (this.expression != null) {
				if ("*".equals(this.expression)) {
					this.objectErrors = this.errors.getAllErrors();
				}
				else if (this.expression.endsWith("*")) {
					this.objectErrors = this.errors.getFieldErrors(this.expression);
				}
				else {
					this.objectErrors = this.errors.getFieldErrors(this.expression);
					this.value = this.errors.getFieldValue(this.expression);
					this.valueType = this.errors.getFieldType(this.expression);
					if (this.errors instanceof BindingResult) {
						this.bindingResult = (BindingResult) this.errors;
						this.actualValue = this.bindingResult.getRawFieldValue(this.expression);
						this.editor = this.bindingResult.findEditor(this.expression, null);
					}
				}
			}
			else {
				this.objectErrors = this.errors.getGlobalErrors();
			}
			initErrorCodes();
		}



所以如果你想自己获取肯定是有办法,但到此可以看出比较麻烦,为了不麻烦,建议还是
1、使用spring的 我认为很好用的
2、自定义错误消息key
14 楼 wqmain 2013-01-09  
jinnianshilongnian 写道
wqmain 写道
有个问题请问一下,在Controller的某个方法中已经加入如下代码:
if(errors.hasErrors()) { 
    return new ModelAndView(getCreateView()).addAllObjects(errors.getModel()); 
}

但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢?   谢谢!!!

那就自己定义个error属性来存错误即可


关键是想如果页面中JSTL可以获取到,就可以不用自定义属性这种方式了。debug 中可以看到ModelAndView 对象中是有BindExcpetion的错误信息的,就是不知道怎样才能在页面中通过EL表达式拿到,所以来请教你?
13 楼 houzhiwei900114 2013-01-09  
学习了。
12 楼 jinnianshilongnian 2013-01-09  
wqmain 写道
有个问题请问一下,在Controller的某个方法中已经加入如下代码:
if(errors.hasErrors()) { 
    return new ModelAndView(getCreateView()).addAllObjects(errors.getModel()); 
}

但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢?   谢谢!!!

那就自己定义个error属性来存错误即可
11 楼 wqmain 2013-01-09  
有个问题请问一下,在Controller的某个方法中已经加入如下代码:
if(errors.hasErrors()) { 
    return new ModelAndView(getCreateView()).addAllObjects(errors.getModel()); 
}

但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢?   谢谢!!!
10 楼 jinnianshilongnian 2012-10-17  
piao_liu 写道
写的很深入,比自己摸索的理解的更深入一些。谢谢

谢谢
9 楼 piao_liu 2012-10-17  
写的很深入,比自己摸索的理解的更深入一些。谢谢
8 楼 jinnianshilongnian 2012-08-31  
ForgiDaved 写道
  楼主,将springmvc 的目前的系列都拜读完了,对照着源码,看起来真清晰啊,期待注解部分。楼主加油,威武

很快会有的
7 楼 ForgiDaved 2012-08-31  
  楼主,将springmvc 的目前的系列都拜读完了,对照着源码,看起来真清晰啊,期待注解部分。楼主加油,威武
6 楼 jinnianshilongnian 2012-08-27  
飞天奔月 写道
<form:errors path="*"></form:errors>:表示显示错误信息的标签,如果path为“*”表示显示所有错误信息。

记得以前 不加 path="*" 时候 一直不显示 错误信息


对  *显示所有
5 楼 飞天奔月 2012-08-27  
<form:errors path="*"></form:errors>:表示显示错误信息的标签,如果path为“*”表示显示所有错误信息。

记得以前 不加 path="*" 时候 一直不显示 错误信息

4 楼 jinnianshilongnian 2012-08-26  
joehe 写道
搞复杂了,直接在bean里加验证注解

后续会介绍注解验证的,如果使用Controller接口是不支持的。
3 楼 joehe 2012-08-26  
搞复杂了,直接在bean里加验证注解
2 楼 jinnianshilongnian 2012-08-25  
Healthy183 写道
沙发,不解释!

呵呵,周末还在啊
1 楼 Healthy183 2012-08-25  
沙发,不解释!

相关推荐

    源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1679570

    跟着开涛学SpringMVC

    跟着开涛学SpringMVC,很好的MVC教程,简单易懂,PDF高清版本

    跟着开涛学SpringMVC.pdf

    跟开涛学springmvc pdf电子文档版 适合学习springmvc 非常好的教程

    SpringMvc开涛.rar

    PDF,源代码 开涛学SpringMVC 第一章源...第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化

    跟开涛学 SpringMVC

    跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC

    跟我学SpringMVC 教程

    第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第...

    跟我学SpringMVC

    第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 ...

    SpringMVC教程

    第四章 Controller接口控制器详解(7 完).pdf 第五章 处理器拦截器详解.pdf 第六章 注解式控制器详解1(注解式控制器运行流程及处理器定义).pdf 第六章 注解式控制器详解2(SpringMVC3强大的请求映射规则详解).pdf 第...

    Spring MVC学习(四)-------Controller接口控制器详解1

    Spring MVC学习(四)-------Controller接口控制器详解1

    跟开涛学SpringMVC-高清版

    跟开涛学SpringMVC-高清版,找了好久的,分享给大家。

    跟开涛学SpringMVC(4.6)Controller接

    跟开涛学SpringMVC(4.6)Controller接口控制器详解(6)Java开发Java经验技巧共10页.pdf.zip

    跟开涛学SpringMVC源代码

    跟开涛学SpringMVC源代码汇总

    跟开涛学SpringMVC

    跟开涛学SpringMVC 高清 带书签 pdf 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以...

    跟开涛学SpringMVC(4.3)Controller接

    跟开涛学SpringMVC(4.3)Controller接口控制器详解(3)Java开发Java经验技巧共9页.pdf.zip

    跟开涛学springmvc

    开涛写的中文springmvc开发文档 , 初学者可以下载学习,或者当做字典用。

    跟开涛学习springmvc spring 3 pdf

    跟开涛学习springmvc spring 3 pdf ,非常好的资料。我将原文档的spring合并为一份,查看更方便一些。

    跟开涛学SpringMVC(5)处理器拦截器详解Java开

    跟开涛学SpringMVC(5)处理器拦截器详解Java开发Java经验技巧共13页.pdf.zip

    SpringMVC入门——跟开涛学SpringMVC

    SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行...应用控制器其实拆为处理器映射器(HandlerMapping)进行处理器管理和视图解析器(ViewResolv

Global site tag (gtag.js) - Google Analytics