一 视图
1 input.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>类型转换的错误处理</title>
<s:head/>
</head>
<body>
<s:fielderror />
<h3>类型转换的错误处理</h3>
<s:form action="login">
<s:iterator value="{0, 1, 2}" status="stat">
<!-- 只有一个请求参数 -->
<s:textfield name="users"
label="第%{#stat.index}个用户信息"/>
</s:iterator>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>
</body>
</html>
2 ognlinput.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>类型转换的错误处理</title>
<s:head/>
</head>
<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>
</html>
3 welcome.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>转换结果</title>
</head>
<body>
转换结果!<br/>
<s:iterator value="users" status="status">
用户<s:property value="%{#status.index}"/>的用户名:<s:property value="name"/><br/>
用户<s:property value="%{#status.index}"/>的密码:<s:property value="pass"/><br/>
</s:iterator>
</body>
</html>
二 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!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="conversion" extends="struts-default">
<action name="login" class="org.crazyit.app.action.LoginAction">
<result>/WEB-INF/content/welcome.jsp</result>
<result name="error">/WEB-INF/content/welcome.jsp</result>
<result name="input">/WEB-INF/content/ognlInput.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
三 mess.properties
xwork.default.invalid.fieldvalue={0}字段类型转换失败!
四 全局转换器配置文件
org.crazyit.app.domain.User=org.crazyit.app.converter.UserConverter
五 action
package org.crazyit.app.action;
import com.opensymphony.xwork2.Action;
import java.util.Date;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import org.crazyit.app.domain.*;
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;
}
}
六 转换器
package org.crazyit.app.converter;
import java.util.Map;
import org.apache.struts2.util.*;
import org.crazyit.app.domain.*;
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() + ">";
}
}
七 领域模型
package org.crazyit.app.domain;
public class User
{
private String name;
private String pass;
// name的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
// pass的setter和getter方法
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return this.pass;
}
}
八 测试