3. 类型转换初体验 !--圣思园Struts 2.2笔记
类型转换范例:
<form action="userAction.action">
<!-- 以;分割 -->
USER:<input id="user" name="user" /><BR/>
<input type="submit" value="submit"/>
</form>
<action name="userAction" class="discovery.struts2.login.UserAction">
<result name="success">/webs2/userInfo.jsp</result>
</action>
# UserAction中需要类型转换的属性=类型转换器# 说明需要对UserAction的user属性使用该类型转换器进行转换
user=discovery.struts2.coverter.UserCoverter
package discovery.struts2.coverter;
import java.util.Map;
import java.util.StringTokenizer;
import ognl.DefaultTypeConverter;
import discovery.struts2.login.bean.User;
/**
* 类型转换器
*/
public class UserCoverter extends DefaultTypeConverter {
/**
* 类型转换:
* 将页面字符串转换为后台对象
* 将后台对象转换为页面字符串
*/
@Override
public Object convertValue(Map context, Object value, Class toType) {
if(User.class == toType){
System.out.println("将页面字符串转换为后台对象");
String[] str = (String[])value;
String firstValue = str[0];
StringTokenizer st = new StringTokenizer(firstValue, ";");
String username = st.nextToken();
String password = st.nextToken();
User user = new User();
user.setPassword(password);
user.setUsername(username);
return user;
}else if(String.class == toType){
System.out.println("将后台对象转换为页面字符串");
User user = (User)value;
String username = user.getUsername();
String password = user.getPassword();
String userInfo = "username: " + username + ", password: " + password;
return userInfo;
}
return null;
}
}
package discovery.struts2.login;
import com.opensymphony.xwork2.ActionSupport;
import discovery.struts2.login.bean.User;
public class UserAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
return SUCCESS;
}
}
- public abstract class StrutsTypeConverter
- extends com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter
Base class for type converters used in Struts. This class provides two abstract methods that are used to convert both to and from strings -- the critical functionality that is core to Struts's type coversion system.
Type converters do not have to use this class. It is merely a helper base class, although it is recommended that you use this class as it provides the common type conversion contract required for all web-based type conversion.
There's a hook (fall back method) called performFallbackConversion
of which could be used to perform some fallback conversion if convertValue
method of this failed. By default it just ask its super class (Ognl's DefaultTypeConverter) to do the conversion.
To allow the framework to recognize that a conversion error has occurred, throw an XWorkException or preferable a TypeConversionException.
package discovery.struts2.coverter;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import discovery.struts2.login.bean.User;
public class UserStruts2Coverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("convertFromString将页面字符串转换为后台对象");
String firstValue = values[0];
StringTokenizer st = new StringTokenizer(firstValue, ";");
String username = st.nextToken();
String password = st.nextToken();
User user = new User();
user.setPassword(password);
user.setUsername(username);
return user;
}
@Override
public String convertToString(Map context, Object o) {
System.out.println("convertToString将后台对象转换为页面字符串");
User user = (User)o;
String username = user.getUsername();
String password = user.getPassword();
String userInfo = "username: " + username + ", password: " + password;
return userInfo;
}
}
# UserAction中需要类型转换的属性=类型转换器
# user=discovery.struts2.coverter.UserCoverter
user=discovery.struts2.coverter.UserStruts2Coverter
package org.apache.struts2.util;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public abstract class StrutsTypeConverter extends DefaultTypeConverter {
public Object convertValue(Map context, Object o, Class toClass) {
if (toClass.equals(String.class)) {
return convertToString(context, o);
} else if (o instanceof String[]) {
return convertFromString(context, (String[]) o, toClass);
} else if (o instanceof String) {
return convertFromString(context, new String[]{(String) o}, toClass);
} else {
return performFallbackConversion(context, o, toClass);
}
}
/**
* Hook to perform a fallback conversion if every default options failed. By default
* this will ask Ognl's DefaultTypeConverter (of which this class extends) to
* perform the conversion.
*/
protected Object performFallbackConversion(Map context, Object o, Class toClass) {
return super.convertValue(context, o, toClass);
}
/**
* Converts one or more String values to the specified class.
*/
public abstract Object convertFromString(Map context, String[] values, Class toClass);
/**
* Converts the specified object to a String.
*/
public abstract String convertToString(Map context, Object o);
}
批量类型转换:
package discovery.struts2.login;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import discovery.struts2.login.bean.User;
public class UserListAction extends ActionSupport {
private List<User> user;
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
@Override
public String execute() throws Exception {
for(User u:user){
System.out.println(u.getUsername());
}
return SUCCESS;
}
}