Strut2对于8个原生数据类型以及Date、String等常见类型,Struts2可以使用内建的类型转换器实现自动转换,但是自定义的对象类型来说,需要自己指定类型转换。以下结合具体的Address实例来进行分析。
1)首先在address.jsp页面编写一个文本框,文本框的信息由**省,**市,详细地址构成(由英文字母逗号分隔)。
<body>
<form action="<span style="color:#ff0000;">addressAction.action</span>" method="post">
address:<input type="text" name="address">
<input type="submit" value="submit">
</form>
</body>
2)新建一个Address类
public class Address {
private String province;
private String city;
private String details;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
}
3)然后编写AddressAction类(注意与笔记(一)不同的地方,AddressAction继承了ActionSupport类,然后execute返回SUCCESS)在实际开发中,通常都会继承ActionSupport类,会对子类进行很多辅助的功能。
public class AddressAction extends<span style="color:#ff0000;"> ActionSupport</span> {
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
4)配置struts.xml文件,在package中加入action
<action name="addressAction" class="cn.sict.struts2.AddressAction">
<result name="success">/output.jsp</result>
</action>
5)编写结果输出页面output.jsp
<body>
province:${requestScope.address.province}<br>
city:${requestScope.address.city}<br>
details:${requestScope.address.details}
</body>
6)因为这里面Address是我们自定义的对象类型,Struts2无法自动转换。我们需要自己指定转换类型。编写AddressConverter类,进行自定义转换。继承ognl中默认的类型转换器DefaultTypeConverter
public class AddressConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
// TODO Auto-generated method stub
if(Address.class==toType)
{
String[] addr=(String[])value;
String firstAddr=addr[0];
StringTokenizer st=new StringTokenizer(firstAddr,",");
String province=st.nextToken();
String city=st.nextToken();
String details=st.nextToken();
Address address=new Address();
address.setProvince(province);
address.setCity(city);
address.setDetails(details);
return address;
}
return null;
}
}
7)那如何将我们自定义的类型转化和struts建立联系呢。新建AddressAction-conversion.properties(命名方式是固定的)
address=cn.sict.converter.AddressConverter//AddressAction里面的address属性进行AddressConverter转换
address.jsp页面与output.jsp页面如下:
程序的流程如下:address.jsp页面提交信息-》struts发现Address有自定义的类型转化,到AddressConverter类下,进行相应的类型转换-》将AddressConverter中返回的address类set到AddressAction方法中-》然后通过requestScope显示相应的信息。
总结:对于自定义的类型转化器来说提供了三个信息:1)通过属性文件名AddressAction-conversion.properties获得AddressAction的名字
2)Action中待转换的属性名是通过属性文件的key值获得的。
3)该属性所对应的类型转换器是通过key值所对应的value获得的。
假如在这里,我想输出从后台输出自定义的address对象的详细内容,改写output.jsp,利用struts2的标签库
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:property value="address"/>//访问action中的address属性,返回getAddress()方法,返回之前发现address需要相应的类型转换,先转换再返回。
</body>
正常情况下,会输出address类对应的地址,那我通过改写AddressConverter类,自定义Address输出的类型
public class AddressConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
// TODO Auto-generated method stub
if(Address.class==toType)
{
String[] addr=(String[])value;
String firstAddr=addr[0];
StringTokenizer st=new StringTokenizer(firstAddr,",");
String province=st.nextToken();
String city=st.nextToken();
String details=st.nextToken();
Address address=new Address();
address.setProvince(province);
address.setCity(city);
address.setDetails(details);
return address;
}else if(String.class==toType)//从后台向前端传递(前端显示的一定是String类型)
{
Address address=(Address)value;
String province=address.getProvince();
String city=address.getCity();
String details=address.getDetails();
String addr=province+","+city+","+details;
return addr;
}
return null;
}
}
注意:该题中存在中文提交乱码问题,详细解决方法参考链接:http://blog.csdn.net/hjw506848887/article/details/8966194