1 自定义类型转换器
Struts2已经实现了常用的类型转换器,但是开发者自己定义数据类型,就必须使用自定义的类型转换器类来转换
1.1新建typeConversion.jsp,假设要转化的数据为person 的name,数据形式为:字符串;字符串。请在person input中输入如:id:name(分号间隔)的数据由类型转换器来进行转换。
<body>
<form action="typeConvertor2.action">
person:<input type="text" name="person" />
submit:<input type="submit" value="提交"><br/>
</form>
1.2新建ConverterAction.java
package com.mycom.action;
import com.mycom.bean.Person;
import com.sun.net.httpserver.Authenticator.Success;
public class ConverterAction {
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String execute(){
return "success";
}
}
1.3 创建转换器类PersonConverter.java
package com.mycom.conversion;
import java.util.Map;
import java.util.StringTokenizer;
import javax.xml.registry.infomodel.User;
import com.mycom.bean.Person;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class PersonConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
if(Person.class == toType) { //从页面数据向后台转换
String[] str = (String[])value;
String valueString = str[0];
System.out.println(valueString);
String[] values = valueString.split(";");
String id = values[0];
String name = values[1];
Person person = new Person();
person.setId("id");
person.setName("name");
return person;
} else if(String.class == toType) { //从后台数据向页面转换
Person person = (Person)value;
String str = person.getId()+person.getName()+"HelloWorld";
return str;
}
return super.convertValue(context, value, toType);
}
}
1.4 注册自定义类型自定义类型转换器
在对应的Action同目录定义actionName-conversion.propertiess属性文件,命名规则为:对应的Action的名-conversion.properties.故此处应命名ConverterAction-conversion.propertise
person =com.mycom.conversion.PersonConverter |
1.5 在struts.xml中配置action
<action name="typeConvertor2"
class="com.mycom.action.ConverterAction">
<result name="success">converterResult2.jsp</result>
<result name="input">TypeConversion2.jsp</result>
</action>
1.6 显示页面converterResult.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
.............
<body>
<s:property value="person"/>
</body>
注意:
定义全局类型转化器
在上述中,如果要对多个action中对传过来的字符串转化成同一类型,难道要定义多个属性文件来配置,这里定义全局的转化器就可以了,例子:
注册局部类型转化器:属性=对应的转化器类
ConverterAction3-conversion.properties
person =com.mycom.conversion.PersonConverter |
如要注册全局类型转化器:要进行转化的类=对应的局部类型转化器
xwork-conversion.properties
com.mycom.bean.Person =com.mycom.conversion.PersonConverter |
2 自定义数组类型转换器和集合类型转换器;
这里我们将展示如何来实现类似struts2内置的数组集合类型转换器的功能,这里示例将用户传过来的字符串数据转化成对应的数组类型和集合类型。
2.1用户请求文件typpeConvesion.jsp
<s:form action="typeConverter3" method="get">
<s:textfield name="names" label="name1" ></s:textfield>
<s:textfield name="names" label="name2" ></s:textfield>
<s:textfield name="sports" label="sport1" ></s:textfield>
<s:textfield name="sports" label="sport2" ></s:textfield>
<s:textfield name="sports" label="sport3" ></s:textfield>
<s:textfield name="sports" label="sport4" ></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
2.2配置struts.xml文件的action,定义与处理结果对应的视图资源
<action name="typeConverter3" class="com.mycom.action.ConverterAction3" >
<result name="success">converterResult3.jsp</result>
<result name="input">TypeConversion3.jsp</result>
</action>
2.3相应的action处理类ConverterAction3.java
package com.mycom.action;
import java.util.ArrayList;
import java.util.List;
import com.mycom.bean.Name;
public class ConverterAction3 {
private Name[] names;
private List<String> sports = new ArrayList<String>();
public Name[] getNames() {
return names;
}
public void setNames(Name[] names) {
this.names = names;
}
public List<String> getSports() {
return sports;
}
public void setSports(List<String> sports) {
this.sports = sports;
}
public String execute(){
return "success";
}
}
2.4创建类型转化器NameConverter,ListConverter
package com.mycom.conversion;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.mycom.bean.Name;
public class NameConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("fromString invoke");
Name[] names = new Name[values.length];
for(int i=0;i<values.length;i++){
String[] pramaValues = values[i].split(" ");
String firstName = pramaValues[0];
String lastName = pramaValues[1];
/*names[i].setFirstName(firstName);
names[i].setLastName(lastName);
此时namess数组中的name均为null,直接调用set方法报nullPointException
正解:
*/
Name nb = new Name();
nb.setFirstName(firstName);
nb.setLastName(lastName);
names[i] = nb;
}
System.out.println(names);
return names;
}
@Override
public String convertToString(Map context, Object o) {
Name[] names = (Name[])o;
String str = "";
for(int i=0;i<names.length;i++){
str+="firstName:"+names[i].getFirstName()+" lastName:"+names[i].getLastName()+"||||";
}
System.out.println(str);
return str;
}
}
ListConverter
package com.mycom.conversion;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class ListConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
List<String> lists = new ArrayList<String>();
for(String str:values){
lists.add(str);
}
return lists;
}
@Override
public String convertToString(Map context, Object o) {
List<String> lists = (List<String>)o;
StringBuffer paramString = new StringBuffer("sprots: ");
for(String str:lists){
paramString.append(str).append(",");
}
return paramString.toString();
}
}
2.5在注册转换器ConverterAction3-conversion.properties,在对应的Action的同一目录下
names=com.mycom.conversion.NameConverter
sports=com.mycom.conversion.ListConverter
2.6输出结果ConverterResult3.jsp
<body>
<s:property value="names"/><br/>
<s:property value="sports"/>
</body>
3类型转换的处理流程
用户请求提交请求数据>>>核心控制器>>>业务控制器action>>读取转换器注册文件properties文件或调用内建的转化器>>>调用注册文件对应的转换器返回自定义的类型转换器set到action的属性中
将结果返回给用户:业务控制器action>>>读取转换器注册文件properties文件或调用内建的转化器>>>调用注册文件对应的转换器返回字符串类,通过action的get把字符串数据方法返回返回给用户,显示在页面上。