struts2自带的类型转换器StrutsTypeConversion
StrutsTypeConverter继承于DefaultTypeConverter父类,并提供了两个抽象方法
1)CovertFromString将页面对象转换为后台对象
2)CovertToString将后台对象转换为页面字符串
在具体实例中我们只要实现这两个抽象方法就可以实现类型转换。将Struts2学习笔记(二)中自定义的转化类用继承StrutsTypeConverter的类来实现。具体实现如下:
public class AddressConverter2 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
// TODO Auto-generated method stub
StringTokenizer st=new StringTokenizer(arg1[0],",");
Address address=new Address();
address.setProvince(st.nextToken());
address.setCity(st.nextToken());
address.setDetails(st.nextToken());
return address;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
Address address=(Address)arg1;
String province=address.getProvince();
String city=address.getCity();
String details=address.getDetails();
String addr=province+","+city+","+details;
return addr;
}
}
以上讲到的是单个的Address类进行转换,一般用户的地址有多个,如何进行多个Address的转换呢。多个Address转换
1)定义一个multiaddress.jsp页面
<body>
<form action="multiAddressAction.action" method="post">
address1:<input type="text" name="<span style="color:#ff0000;">addresses</span>"><br>//注意name的名字要与MultiAddress中属性的名字相一致
address2:<input type="text" name="addresses"><br>
address3:<input type="text" name="addresses"><br>
<input type="submit" value="submit">
</form>
2)MultiAddressAction类,并配置相应的struts.xml文件
public class MultiAddressAction extends ActionSupport{
private List<Address> addresses;
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
3)定义MultiAddressConverter类,并配置MultiAddressAction-conversion.properties文件
public class MultiAddressConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
// TODO Auto-generated method stub
List<Address> addresses=new ArrayList<Address>();
for(String addr:arg1)
{
StringTokenizer st=new StringTokenizer(addr,",");
Address address=new Address();
address.setProvince(st.nextToken());
address.setCity(st.nextToken());
address.setDetails(st.nextToken());
addresses.add(address);
}
return addresses;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
List<Address> addresses=(List<Address>)arg1;
StringBuffer buffer=new StringBuffer();
for(Address address:addresses)
{
String addr=address.getProvince()+","+address.getCity()+","+address.getDetails();
buffer.append(addr);
}
return buffer.toString();
}
}
MultiAddressAction-conversion.properties
addresses=cn.sict.converter.MultiAddressConverter
4)输出页面output.jsp
<s:property value="addresses"/>
如果是全局的类型转换,则是在src目录下新建xwork-conversion.properties,文件的内容是待转换的类=转换器的名字。即 包名.Address=包名.AddressConverter。