在FormBean的validate验证方法中,如果发生错误,使用errors.add("tt", new ActionMessage("err.err"));方法返回错误消息,在ActionMessage("err.err")需要使用资源文件中的err.err定义消息。那么,在返回消息的时候如何不使用资源文件中的定义??
1:在FormBean的validate验证方法中加入以下
ActionMessages messages = new ActionMessages();
ActionMessage message = new ActionMessage("message.sucess","sucess");
messages.add(ActionMessages.GLOBAL_MESSAGE,message);
saveMessages(request,message);
2:这是<html:errors/>标签doStartTag()方法里的主要代码:
for(Iterator reports = property != null ? errors.get(property) : errors.get(); reports.hasNext();)
{
ActionError report = (ActionError)reports.next();
if(!headerDone)
{
if(headerPresent)
{
message = RequestUtils.message(pageContext, bundle, locale, "errors.header");
results.append(message);
results.append(lineEnd);
}
headerDone = true;
}
if(prefixPresent)
{
message = RequestUtils.message(pageContext, bundle, locale, "errors.prefix");
results.append(message);
}
message = RequestUtils.message(pageContext, bundle, locale, report.getKey(), report.getValues());
if(message != null)
{
results.append(message);
results.append(lineEnd);
}
if(suffixPresent)
{
message = RequestUtils.message(pageContext, bundle, locale, "errors.suffix");
results.append(message);
}
}
重要是这一句,message = RequestUtils.message(pageContext, bundle, locale, report.getKey(), report.getValues());
而message()方法如下:
public static String message(PageContext pageContext, String bundle, String locale, String key, Object args[])
throws JspException
{
MessageResources resources = retrieveMessageResources(pageContext, bundle, false);
Locale userLocale = retrieveUserLocale(pageContext, locale);
if(args == null)
return resources.getMessage(userLocale, key);
else
return resources.getMessage(userLocale, key, args);
}
从中可看出获取的消息是由MessageResources对象从资源文件中对应的key值及相应的替换信息共同组成的.
所以如果使用struts的错误处理,ActionMessage或ActionError构造函数中的key值是必须的....
如果你想所有的错误信息对应同一个键值,却拥有不同的错误显示内容,可以这样
首先在资源文件中配置“message.common={0}”
然后在Action类中使用ActionErrors或ActionMessages时,方法如下:
…
ActionMessages ams = new ActionMessages(); //例外处理
Try{
…
}
catch (Exception ex) {
ex.printStackTrace();
ams.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("message.common", ex.getMessage()));
}
finally {
if (!ams.isEmpty()) {
saveMessages(request, ams);
}
}
…
在jsp页面中使用方法如下:
<html:messages id="msg" message="true">
<font color="red"><bean:write name="msg"/></font>
</html:messages>