当Formbean 为动态bean时,在action中无法对Formbean数据进行验证,因为Formbean没有具体实现类。action中无法引用 ActionErrors/ActionMessages: (ActionError和ActionMessage已经被废除了,不推荐使用)
有时候你需要向用户提供相关处理信息,包括表单验证时发现错误等。
1. 相关类介绍:
ActionMessage:用于保存一个与资源束对应的提示信息。主要构造函数如:
ActionMessage(String message);
ActionMessage(String message,paramater)。//不常用。
ActionMessages:用于保存多个ActionMessage。并在HTML:errors 和html:messages中起作用。
主要构造函数:
ActionMessages().
主要方法是add(String property,ActionMessage message)
ActionMessages 有一个HashMap类型messages保存多个ActionMessage对象,每个ActionMessage对象都有唯一的一个property 标识。这个property可以是自定义的任意字符串,也可以由 org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE指定
html:messages/html:errors使用property属性访问某个资源 ,前提是在properties文件里声明了有关property的属性!
当然了,要用到这些属性的时候,必须在structs-config.xml文件中定义。当然对于错误的信息,必须在<Action>中注明alidate() 属性为true,而且input 属性也是必须的。
但这个文件必须放在和.class文件夹同目录的空间里。默认的是放在resources中 的Application.properties,当然要实现国际化的话,就要单独编写文件 Application_zh.properties(中国国际化)和Application_en.properties(美国)当然要实现其他国家的语言,就需要单独在浏览器中设置和查看他们国家的相对语法了!
ActionErrors:用于保存一个与资源束对应的错误信息。用法跟ActionMessages差不多。 这就是专门用于Formbean里面对于数据的输入的验证了,在确认表单传递确认的validate()方法里,返回的就是ActionErrors 对象。同样的是调用的是properties文件里规定的属性。用到的标签同样是<html:errors>或<html:messages>当然这里面会有些footer header prefix suffix 属性,这些都是简单的对文字格式的处理。
有时会用到国际化的标签<bean:message>(前提是引入<%@ taglib prefix="bean" uri="http://jakarta.apache.org/struts/tags-bean" %>)有了这个标签就一切搞定了!
2. 版本:
struts1.1中用ActionErrors报告错误,用ActionMessages提供信息。
在struts1.2中使用ActionMessages提供信息和错误,不赞成使用ActionError
struts1.3中已经没有ActionError类了。
3. AtionErrors和ActionMessages的区别
1. ActionErrors是ActionMessages的一个子类,功能几乎相同,不同点在于标签<html:errors/>和<html:messages>的使用上的区别。
html: errors指定了footer和header属性。默认值为errors.header和errors.footer,需要时可以自己指定。如果资源属性文件配置了 errors.header和errors.footer,则任何时候使用html:errors时开头和结尾都是这两个属性对应的资源信息。
而html:message默认情况下没有errors.header和errors.footer值,当然可以自己指定。
2. 在Action类中,对于定义了ActionMessage类的方法的时候,需要对errors进行web服务器存储。这里有两种方法。
request.setAttribute(Globals.ERROR_KEY,errors);
this.saveErrors(request, errors); 两种方法都能实现,都是放在request作用域里的。这样,才能想相对应的properties文件里调用 相对应的error.username(举例)里免的属性。(因为对于每个属性,都是一个HashMap类,所以每对应一个key,都有一个attribute对应,这样就不会调用出错!)
3. 因为 AtionErrors和ActionMessages都是对于信息的处理。相当于坏人和好人,没必要定义两个类。只需要定义一个 人 类就行,对于每个不同属性的人,给他们想对应的 好人 或 坏人的 属性就可。这就是 AtionErrors和ActionMessages两者之间较好理解的解释了! |