- 浏览: 21433723 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2404932
-
Spring杂谈
浏览量:2997590
-
跟开涛学SpringMVC...
浏览量:5631404
-
Servlet3.1规范翻...
浏览量:257542
-
springmvc杂谈
浏览量:1593136
-
hibernate杂谈
浏览量:248958
-
跟我学Shiro
浏览量:5847466
-
跟我学Nginx+Lua开...
浏览量:698110
-
亿级流量网站架构核心技术
浏览量:780420
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
第四章 Controller接口控制器详解(7 完)——跟着开涛学SpringMVC
- 博客分类:
- 跟开涛学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:存储和暴露关于数据绑定错误和验证错误相关信息的接口,提供了相关存储和获取错误消息的方法:
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、控制器
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
<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)
username.not.empty=用户名不能为空 username.length.error=用户名长度不合法,长度必须在{0}到{1}之间
(3、视图页面(WEB-INF/jsp/bindAndValidate/error.jsp)
<%@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。
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
<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)
<%@ 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”错误对象信息:
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):
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、编程式验证器
一、验证器接口
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、验证器实现
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
<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
username.not.empty=用户名不能为空 username.not.illegal=用户名错误,必须以字母开头,只能出现字母、数字、下划线,并且长度在5-20之间 username.forbidden=用户名中包含非法关键词【{0}】 password.not.illegal=密码长度必须在5-20之间
(4、视图页面(/WEB-INF/jsp/registerAndValidator.jsp)
<%@ 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(新增)方法添加如下代码片段:
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】
评论
如何将当前输入的值传到参数{0}那里呢?在哪里传入呢
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
if(errors.hasErrors()) {
return new ModelAndView(getCreateView()).addAllObjects(errors.getModel());
}
但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢? 谢谢!!!
那就自己定义个error属性来存错误即可
关键是想如果页面中JSTL可以获取到,就可以不用自定义属性这种方式了。debug 中可以看到ModelAndView 对象中是有BindExcpetion的错误信息的,就是不知道怎样才能在页面中通过EL表达式拿到,所以来请教你?
if(errors.hasErrors()) {
return new ModelAndView(getCreateView()).addAllObjects(errors.getModel());
}
但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢? 谢谢!!!
那就自己定义个error属性来存错误即可
if(errors.hasErrors()) {
return new ModelAndView(getCreateView()).addAllObjects(errors.getModel());
}
但我不想通过<form:errors />标签来获取,用JSTL能直接将错误信息输出来吗?请问要怎么写呢? 谢谢!!!
谢谢
很快会有的
记得以前 不加 path="*" 时候 一直不显示 错误信息
对 *显示所有
记得以前 不加 path="*" 时候 一直不显示 错误信息
后续会介绍注解验证的,如果使用Controller接口是不支持的。
呵呵,周末还在啊
发表评论
-
跟我学SpringMVC目录汇总贴、PDF下载、源码下载
2012-12-22 08:05 619268扫一扫,关注我的公众号 购买地址 ... -
源代码下载——第七章 注解式控制器的数据验证、类型转换及格式化
2012-12-01 07:12 33360源代码请到附件中下载。 其他下载: ... -
SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-23 07:47 2382517.4、数据验证 7.4.1 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 19:18 887477.3、数据格式化 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 16:41 46支持一下博主:------------------ ... -
SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-12 20:08 1229937.1、简介 在编写可 ... -
扩展SpringMVC以支持绑定JSON格式的请求参数
2012-11-08 07:43 125868上一篇:《扩展SpringMVC以支持更精准的数据绑 ... -
扩展SpringMVC以支持更精准的数据绑定1
2012-11-06 07:38 76505最新版请点击查看FormM ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-26 07:57 1525716.6.2、@RequestParam绑定单个请求参 ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-23 14:45 15---------------------------- ... -
SpringMVC强大的数据绑定(1)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-16 07:48 120830到目前为止,请求已经能交给我们的处理器进行处理了,接下来 ... -
Spring MVC 3.1新特性 生产者、消费者请求限定 —— 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-10 14:16 483546.6.5、生产者、消费者限定 6.6.5.1、基 ... -
SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 15:29 104616声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:50 946.5.1.1、普通URL路径映射 @Request ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:48 536.5.2、请求方法映射 ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 10:47 216.5.2、请求方法映射限定 一般我们熟悉的表单 ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 07:05 1636.5.1.1、普通URL路径映射 @Reques ... -
源代码下载 第六章 注解式控制器详解
2012-09-22 07:11 41842源代码请到附件中下载。 其他下载: 跟着 ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 17:47 67225声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 15:54 96.1、注解式控制器简介 一、Spring2. ...
相关推荐
NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1679570
跟着开涛学SpringMVC,很好的MVC教程,简单易懂,PDF高清版本
跟开涛学springmvc pdf电子文档版 适合学习springmvc 非常好的教程
PDF,源代码 开涛学SpringMVC 第一章源...第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化
跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC
第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第...
第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 ...
第四章 Controller接口控制器详解(7 完).pdf 第五章 处理器拦截器详解.pdf 第六章 注解式控制器详解1(注解式控制器运行流程及处理器定义).pdf 第六章 注解式控制器详解2(SpringMVC3强大的请求映射规则详解).pdf 第...
Spring MVC学习(四)-------Controller接口控制器详解1
跟开涛学SpringMVC-高清版,找了好久的,分享给大家。
跟开涛学SpringMVC(4.6)Controller接口控制器详解(6)Java开发Java经验技巧共10页.pdf.zip
跟开涛学SpringMVC源代码汇总
跟开涛学SpringMVC 高清 带书签 pdf 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以...
跟开涛学SpringMVC(4.3)Controller接口控制器详解(3)Java开发Java经验技巧共9页.pdf.zip
开涛写的中文springmvc开发文档 , 初学者可以下载学习,或者当做字典用。
跟开涛学习springmvc spring 3 pdf ,非常好的资料。我将原文档的spring合并为一份,查看更方便一些。
跟开涛学SpringMVC(5)处理器拦截器详解Java开发Java经验技巧共13页.pdf.zip
SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行...应用控制器其实拆为处理器映射器(HandlerMapping)进行处理器管理和视图解析器(ViewResolv