7.类型转换、消息处理与国际化
@(10_Struts2)[JavaEE, Struts2]
- 前边我们说过了 Http协议 有两个缺陷一个是无状态、一个是纯文本。
- 纯文本也就是说Http请求中的内容都是以字符串的形式发送的。
- 但是Java又是一个强类型语言,所以将一个字符串转换成Java中的数据类型这一重任就落在了Struts2的肩膀上。
- 类型转换最常见的可能就是将将10/29/2015转换为一个date类型等。
- 关于类型转换我们要做的主要有两件事:
- 类型转换失败后的处理。
- 特殊类型的自定义类型转换器。
类型转换失败消息处理
-
类型转换失败:
若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样.
-
若 Action 类实现 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用其 Action 方法:
- Struts 将检查相关 action 元素的声明是否包含着一个 name=input 的 result.
- 如果有, Struts 将把控制权转交给那个 result 元素;
- 若没有 input 结果, Struts 将抛出一个异常
实现
ValidationAware接口,在之前的文章中我们提到,我们可以继承com.opensymphony.xwork2.ActionSupport类的形式来实现ValidationAware接口, 在ActionSupport 中已经帮我们实现好了
-
类型转换出错时如何处理
- 如果我们输入错误的数字,想转换为年龄;当我们的 result name="input" 的时候,会返回到这个结果页面。
- 错误的年龄
- 但是对于这种错误的提示,我们需要处理
-
类型转换错误消息的定制
- 作为默认的 default 拦截器的一员, ConversionError 拦截器负责添加与类型转换有关的出错消息(前提: Action 类必须实现了 ValidationAware 接口)和保存各请求参数的原始值.
- 若字段标签使用的不是 simple 主题, 则非法输入字段将导致一条有着如上图格式的出错消息。
-
覆盖默认的出错消息
- 在对应的
Action类所在的包中新建ActionClassName.properties文件, ClassName 即为包含着输入字段的 Action 类的类名 - 在属性文件中添加如下键值对: invalid.fieldvalue.fieldName=Customer Message
- 在对应的
# EmployeeAction.properties
invalid.fieldvalue.age=年龄格式不正确,请重新输入!
- 自定义的消息
-
定制出错消息的样式:
- 每一条出错消息都被打包在一个 HTML span 元素里, 可以通过覆盖其行标为 errorMessage 的那个 css 样式来改变出错消息的格式.
- 显示错误消息: 如果是 simple 主题, 可以通过
<s:fielderror fieldName=“filedname”></s:fielderror>标签显示错误消息 - 通过s:fielderror 标签
<s:form action="emp_update" theme="simple">
<s:hidden name="id"></s:hidden>
姓名:<s:textfield name="name"></s:textfield> <br>
年龄:<s:textfield name="age" ></s:textfield>
<!-- 通过标签获取错误消息 -->
<span style="color:red"><s:fielderror fieldName="age"></s:fielderror></span><br>
部门: <s:textfield name="dept"></s:textfield><br>
职务:<s:textfield name="role"></s:textfield><br>
<s:submit value="修改"></s:submit>
</s:form>
- 但是对于这种错误消息的格式我们是可以修改的,修改其默认的 freemark 模板
- 在struts2-core-2.3.15.3.jar 的 /template/simple/fielderror.ftl,这是 struts2 默认自带的错误消息模板,我们在 src 路径下建立相同的包和模板,并且修改里面的 html 标签。删除文件中错误消息的 的 ul、li、span便签






















