1. 处理类型转换错误
在Web的应用中,表现层主要涉及到数据校验和类型转换,这两个是紧密相关的。在实际中,只有通过了类型转换,下一步才会去实现数据上的校验。那么今天,笔者将向大家介绍关于Struts2的类型转换的应用。主要是通过例子来说明,例子的应用大概是在页面中输入用户名、密码、生日,然后校验通过后才可进入数据校验。
1) 创建一个LoginAction.java,这个Action的类必须继承ActionSupport基类,因为Struts2的ActionSupport负责收集类型转换错误、输入校验,并将它们封装成FieldError对象,添加到ActionContext中。
public class LoginAction extends ActionSupport
{
private User user;
// user的setter和getter方法
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return user;
}
// 没有execute方法,直接使用ActionSupport的execute方法
}
2) 配置struts.xml。要求是在登录时,如果类型校验没有通过的话,那么还是要跳到input.jsp的界面,如果成功,那么就转入welcom.jsp界面。
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 定义处理用户请求的Action -->
<action name="login" class="org.crazyit.app.action.LoginAction">
<!-- 配置名为input的逻辑视图,当转换失败后转入该逻辑视图 -->
<result name="input">/WEB-INF/content/input.jsp</result>
<!-- 配置名为success的逻辑视图 --> <result>/WEB-INF/content/welcome.jsp</result> <result name="error">/WEB-INF/content/welcome.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
3) 创建JSP的视图界面,该界面中需要加入<s:fielderror/>的标签,只有这样才可以输出类型转换的错误信息。下面是input.jsp界面。
<body>
<s:fielderror />
<h2>类型转换的错误处理</h2>
<p><b>请输入用户信息</b></p>
<s:form action="login">
<s:textfield name="user.name" label="用户名"/>
<s:textfield name="user.age" label="年龄"/>
<s:textfield name="user.birth" label="生日"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>
</body>
4) 当然还少不了domain的对象User,下面就创建个User.java.
public class User
{
private String name;
private Integer age;
private Date birth;
// 省略setter和getter方法
}
5) 指定在校验某个字段无效时,使用xwork.default.invalid.fieldvalue的消息作为标准的信息提示,注意放在文件的根目录下。同时,在JSP的界面上要加入标签<s:fielderror/>。下面的文件是mess.properties
xwork.default.invalid.fieldvalue={0}字段无效
6) 在第(5)中是对JSP中的表单中的参数做校验,然后输出对应的表单中name的值错误信息提示。如果要用特定的字段指定特别的信息,即对User类中的birth指定特定的信息提示,那么就要用这个形式:invalid.fieldvalue.<propName>=<tipMsg>。其中propName就是类型转换的属性名,如:user.birth.下面是LoginAction.properties,这个文件应该放在XXAction的同包名下。
invalid.fieldvalue.user.birth=生日信息必须满足yyyy-MM-dd格式
7) 最后的页面图。

2. 处理集合属性的转换错误
假如Action的类中含有集合属性,例如类里含有list属性,那我们应该如何处理呢?
1) 创建LoginAction.java
public class LoginAction extends ActionSupport
{
private List<User> users;
// users的setter和getter方法
public void setUsers(List<User> users)
{
this.users = users;
}
public List<User> getUsers()
{
return users;
}
}
2) 定义xwork-conversion.properties说明User的实例对象。这里要提一下,这是一注册类的转换器。这里用的是全局类型转换器,而如果是局部类型转换器,那么应该使用:<propName>=<ConverterClass>,即user= com.owen.app.converter.UserConverter.
com.owen.app.domain.User=com.owen.app.converter.UserConverter
3) 指定集合元素的类。
public class UserConverter extends StrutsTypeConverter
{
// 实现将字符串类型转换成复合类型的方法
public Object convertFromString(Map context
, String[] values , Class toClass)
{
// 创建一个User实例
User user = new User();
// 只处理请求参数数组第一个数组元素,
// 并将该字符串以英文逗号分割成两个字符串
String[] userValues = values[0].split(",");
// 为User实例赋值
user.setName(userValues[0]);
user.setPass(userValues[1]);
// 返回转换来的User实例
return user;
}
// 实现将复合类型转换成字符串类型的方法
public String convertToString(Map context, Object o)
{
// 将需要转换的值强制类型转换为User实例
User user = (User) o;
return "<" + user.getName() + ","
+ user.getPass() + ">";
}
}
4) 创建JSP有界面:input.jsp
<body>
<s:fielderror />
<h3>类型转换的错误处理</h3>
<s:form action="login">
<s:iterator value="{0, 1, 2}" status="stat">
<!-- 将会依次生成多个请求参数 -->
<s:textfield name="users[%{#stat.index}]"
label="第%{#stat.index}个用户信息"/>
</s:iterator>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>
</body>
5) 其它信息与上一个例子相同
6) 结果