消息分为field级和action级都在ActionSupport类中预定义了区别是
fieldError是通过个Map来实现事实上记录了field名字和信息因此能在页面上对应field中显示;
而actionError是通过个Collection实现没有记录报错来源只记录了信息
注意下面是简要流程:
(1)页面提交到action的后首先struts会尝试对输入串信息根据Action中定义属性类型进行类型匹配及转换如果输入为空它会将内容置为该类型缺省值(0、0.0、空串等等)对于数据格式不匹配情况比如说在age栏里面输入字母等等struts会自动提示默认并返回input这工作是struts2自动完成
(2)然后验证机制生效validate和XML验证框架中验证逻辑(Struts2 数据输入校验(2) —— XML验证 会提到)检查同时会验证了addFieldError和addActionError页面提交的前struts会ActionSupport(严格说是ValidationAware接口)hasErrors思路方法该思路方法很简单就是检查fieldErrorMap和actionErrorCollection是否为空如果均为空则execute思路方法[*]进行业务逻辑调度否则返回error
(3)最后会根据返回信息执行forward操作struts.xml中则定义了这些返回值所对应跳转逻辑
如果有返回信息会在页面上提示
在Action中所有addFieldError设置信息将在对应field位置显示;
在Action中所有addActionError设置信息将不会显示除非在页面中定义了s:actionerrorControl控件那么将以ul格式显示
对多验证和跳转逻辑支持
对于些Action如果需要重用struts也提供了支持
上述[*]处你也可以指定其它任意名字这需要在struts.xml中修改对应actionmethod属性
<actionname="XXXAction"="com.myspace.myname.XXXAction"method="ExcuteName">
<result>success.jsp</result>
</action>
同时在XXXAction中我们需要定义个思路方法
publicStringExcuteName{ /*dummycode*/}
如果同时还定义了
publicvoidvalidateNewExcuteName{ /*dummycode*/}
那么在执行validate的前会先执行validateNewExcuteName思路方法
可以考虑把所有公用验证逻辑放到validate思路方法中
上述过程完全是靠java反射机制实现效率会低些所以除非真有必要否则不用
提示串本地化
在validator思路方法中直接写信息固然方便但不算是个好习惯同时也不能支持本地化下面简单介绍说明本地化两种方式
1、全局国际化默认提示首先在struts.xml中加入常量
<struts>
<constantname="struts.custom.i18n.resources"value="message"></constant>
</struts>
然后在和struts.xml同级位置建立message.properties中写入
xwork.default.invalid.fieldvalue={0}error
2、针对某个Action验证提示
在和XXXAction同级目录下建立和该Action同名属性文件
XXXAction.properties中写入
invalid.fieldvalue.字段名=信息
最新评论