- 浏览: 21504029 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2418678
-
Spring杂谈
浏览量:3008775
-
跟开涛学SpringMVC...
浏览量:5639489
-
Servlet3.1规范翻...
浏览量:259916
-
springmvc杂谈
浏览量:1597314
-
hibernate杂谈
浏览量:250217
-
跟我学Shiro
浏览量:5858950
-
跟我学Nginx+Lua开...
浏览量:702003
-
亿级流量网站架构核心技术
浏览量:785224
文章分类
- 全部博客 (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
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 620589扫一扫,关注我的公众号 购买地址 ... -
源代码下载——第七章 注解式控制器的数据验证、类型转换及格式化
2012-12-01 07:12 33465源代码请到附件中下载。 其他下载: ... -
SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-23 07:47 2388967.4、数据验证 7.4.1 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 19:18 889877.3、数据格式化 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 16:41 46支持一下博主:------------------ ... -
SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-12 20:08 1233117.1、简介 在编写可 ... -
扩展SpringMVC以支持绑定JSON格式的请求参数
2012-11-08 07:43 126062上一篇:《扩展SpringMVC以支持更精准的数据绑 ... -
扩展SpringMVC以支持更精准的数据绑定1
2012-11-06 07:38 76769最新版请点击查看FormM ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-26 07:57 1528436.6.2、@RequestParam绑定单个请求参 ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-23 14:45 15---------------------------- ... -
SpringMVC强大的数据绑定(1)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-16 07:48 121052到目前为止,请求已经能交给我们的处理器进行处理了,接下来 ... -
Spring MVC 3.1新特性 生产者、消费者请求限定 —— 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-10 14:16 484776.6.5、生产者、消费者限定 6.6.5.1、基 ... -
SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 15:29 104866声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
请求映射之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 42035源代码请到附件中下载。 其他下载: 跟着 ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 17:47 67423声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 15:54 96.1、注解式控制器简介 一、Spring2. ...
相关推荐
PDF,源代码 开涛学SpringMVC 第一章源...第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化
1. **MVC架构**:首先,我们需要了解MVC模式,它是一种设计模式,将应用程序分为三个主要组件——模型(Model)、视图(View)和控制器(Controller)。在SpringMVC中,模型处理业务逻辑,视图负责展示数据,而控制...
该框架通过将应用程序的不同部分——模型(Model)、视图(View)和控制器(Controller)分离,使得各个部分能够各司其职,从而提高代码的可读性和可维护性。 - **模型(Model)**:负责处理应用程序的数据逻辑,...
《基于SSM的图书馆管理系统毕业设计详解》 SSM(Spring、SpringMVC、MyBatis)是一个在Java开发领域广泛应用的开源框架组合,它在构建企业级Web应用时提供了强大的支持。本毕业设计——“基于SSM的图书馆管理系统”...
4. 支付模块:与第三方支付平台接口对接,实现在线支付功能,涉及安全支付协议。 5. 库存模块:实时更新库存信息,确保订单执行的准确性。 四、核心技术点 1. Spring框架:利用IoC容器管理对象,实现依赖注入,提升...
2. **SpringMVC**:作为Spring的Web MVC框架,处理HTTP请求和响应,通过DispatcherServlet、Controller、ModelAndView等组件实现模型-视图-控制器模式,使业务逻辑和展示层分离。 3. **MyBatis**:作为持久层框架,...
2. SpringMVC:作为Spring框架的一部分,SpringMVC是一个用于构建Web应用的模型-视图-控制器(MVC)架构。它简化了HTTP请求的处理,使得业务逻辑与表示层更易于解耦。 3. MyBatis:是一个持久层框架,它简化了SQL...
《KTV点歌系统——基于SSM框架的Java毕业设计详解》 KTV点歌系统是一种常见的娱乐场所管理系统,主要用于帮助顾客便捷地选择并播放歌曲。在这个项目中,我们将深入探讨一个基于SSM(Spring、SpringMVC、MyBatis)...
在洗衣店预约系统中,SpringMVC扮演着控制器的角色,协调各个组件的工作。 3. **MyBatis**:MyBatis是一个持久层框架,它允许开发者将SQL语句直接写在XML配置文件或注解中,与Java对象进行映射,从而简化了数据访问...
- SpringMVC:负责处理HTTP请求,通过DispatcherServlet调度控制器,与视图层进行交互,实现了Model-View-Controller的设计模式。 - MyBatis:是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...
4. 支付功能:集成第三方支付接口,如微信支付,实现在线支付功能。 5. 系统设置:管理员可以进行系统配置,如价格设定、营业时间设定等。 在开发过程中,可能会采用Maven或Gradle作为项目构建工具,确保项目的依赖...
SpringMVC则是Spring框架的一部分,专门用于处理Web请求,它通过模型-视图-控制器(Model-View-Controller,MVC)的设计模式,将业务逻辑、数据处理和用户界面分离,提升了系统的可扩展性和可测试性。 MyBatis作为...