今天,小编拿出珍藏已久的文章来和大家共享,说到Struts2类型转换大家也许能够耳熟能详,但是对于不知道原理,只会用的朋友们不妨看看这篇文章,会对你有帮助的。
1,使用struts2内建的OGNL表达式。如下例如示:
struts2页面如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<html>
<head>
<title>直接封装成Object</title>
</head>
<body>
<form action="login.action" method="post">
<table align="center" width="360">
<caption><h3>直接封装成Object</h3></caption>
<tr>
<td>用户名:<input type="text" name="user.name"/></td>
</tr>
<tr>
<td>密 码:<input type="text" name="user.pass"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="转换"/><input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</body>
</html>
Action中的操作如下:
public class LoginAction implements Action
{
private User user;
private String tip;
public void setUser(User user)
{
this.user = user;
}
public void setTip(String tip)
{
this.tip = tip;
}
public User getUser()
{
return (this.user);
}
public String getTip()
{
return (this.tip);
}
public String execute() throws Exception
{
if (getUser().getName().equals("scott")
&& getUser().getPass().equals("tiger") )
{
setTip("转换成功");
return SUCCESS;
}
else
{
setTip("转换失败");
return ERROR;
}
}
}
使用方法1我们还可以直接生成Collection或者Map实例。如下例:
页面代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<html>
<head>
<title>直接封装成Map</title>
</head>
<body>
<form action="login.action" method="post">
<table align="center" width="360">
<caption><h3>直接封装成Map</h3></caption>
<tr>
<td>第一个用户名:<input type="text" name="users['one'].name"/></td>
</tr>
<tr>
<td>第一个密码:<input type="text" name="users['one'].pass"/></td>
</tr>
<tr>
<td>第二个用户名:<input type="text" name="users['two'].name"/></td>
</tr>
<tr>
<td>第二个密码:<input type="text" name="users['two'].pass"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="转换"/><input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</body>
</html>
Action代码如下:
public class LoginAction implements Action
{
private Map<String ,User> users;
private String tip;
public void setUsers(Map<String ,User> users)
{
this.users = users;
}
public void setTip(String tip)
{
this.tip = tip;
}
public Map<String ,User> getUsers()
{
return (this.users);
}
public String getTip()
{
return (this.tip);
}
public String execute() throws Exception
{
System.out.println(getUsers());
if (getUsers().get("one").getName().equals("scott")
&& getUsers().get("one").getPass().equals("tiger") )
{
setTip("转换成功");
return SUCCESS;
}
else
{
setTip("转换失败");
return ERROR;
}
}
}
除了以上在Action中使用泛型来保证赋值的正确性的方法外,还可以通过Struts2的标签来赋值。即通过指定集合元素的类型或者指定集合元素的索引属性来赋值。
2,使用类型转换器,
struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultTypeConverter类的子类,实现该方法时,只需要将它的两个不同转换方向替换成不同方法--当需要把字符串转换成复合类型时,调用convertFromString抽象方法;当需要把复合类型转换成字符串时,调用convertToString抽象方法。
下面是一段示例代码,更详细的情况请参考《struts2权威指南》(李刚编著)一书page142。
public class UserConverter extends StrutsTypeConverter
{
public Object convertFromString(Map context, String[] values, Class toClass)
{
if (values.length > 1)
{
List<User> result = new ArrayList<User>();
for (int i = 0; i < values.length ; i++ )
{
User user = new User();
String[] userValues = values[i].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
result.add(user);
}
return result;
}
else
{
User user = new User();
String[] userValues = values[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
return user;
}
}
public String convertToString(Map context, Object o)
{
if (o instanceof User)
{
User user = (User)o;
return "<" + user.getName() + "," + user.getPass() + ">";
}
else if (o instanceof List)
{
List<User> users = (List<User>)o;
String result = "[";
for (User user : users )
{
result += "<" + user.getName() + "," + user.getPass() + ">";
}
return result + "]";
}
else
{
return "";
}
}
}
方式二并不常用,对于大部分的常用类型,开发者根本无需创建自己的类型转换器,因为struts2可以完成大多数常用类型的转换。