三、指定集合元素的类型
前面的基于OGNL表达式的类型转换器都指定了集合泛型,Struts2就可以通过反射来创建对应类的对象,并且将这些对象添加到集合中。
我们现在需要思考一下:如果不使用泛型,Struts2肯定是不知道如何处理集合类型的属性的。但是Struts2允许开发者通过局部转换文件来指定集合元素的类型。类型转换文件就是一个properties文件,内容就是类型转换的相关配置信息
我们指定LoginAction.java如下:
public class LoginListAction extends ActionSupport{
private List users;
public List getUsers() {
return users;
}
public void setUsers(List users) {
this.users = users;
}
@Override
public String execute() throws Exception {
System.out.println(getUsers());
// 获取list集合的第一个对象
User fisrtUser = (User) getUsers().get(0);
if(fisrtUser.getUsername().equals("rgx")
&&fisrtUser.getPassword().equals("lj")){
addActionMessage("登录成功");
return SUCCESS;
}
addActionError("登录失败");
return ERROR;
}
}
上面的代码中我们没有为users属性指定泛型。下面就需要通过配置局部类型转换文件的形式来指定处理users属性里集合元素的类型。局部配置文件的命名规则是:ActionName-conversion.proeprties形式,例如下面的
LoginAction-conversion.properties配置文件:
Element_users=edu.ctgu.action.ognl.User
上面的key-value遵循的格式是这样的,Element_<ListPropName>=<ElementType>,<ListPropName>是List集合属性的名称,<ElementType>是集合元素的类型。这样就可以很好的理解上面配置文件的意义了。
但是对于Map类型的属性就不一样了,这样吧,我们还是先来看看,LoginAction.java吧
public class LoginMapAction extends ActionSupport{
private Map users;
public Map getUsers() {
return users;
}
public void setUsers(Map users) {
this.users = users;
}
@Override
public String execute() throws Exception {
System.out.println(getUsers());
User secondUser = (User) users.get("one");
if(secondUser.getUsername().equals("rgx")
&&secondUser.getPassword().equals("lj")
)
{
addActionMessage("登录成功");
return SUCCESS;
}
addActionMessage("登录失败");
return ERROR;
}
}
Map集合比List集合相对复杂,需要同时指定Map的key值和value值类型。所以我的配置文件如下
Key_users=java.lang.String
Element_users=edu.ctgu.action.ognl.User
上面的配置文件中遵循的规则如下
Key_<MapPropName>=<KeyType>
Element_<MapPropName>=<ValueType>
理解上面的List的配置信息规则,这一套规则也就一点就通了。