1,基于OGNL类型转换
1普通对象类型转换(struts2 内部自动转换)
public class TypeTo {
//该对象为 转换对象
private User user;
public String execute(){
return Action.SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
public class User {
private String name;
private String pass;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
//配置action
<action name="tt" class="com.wang.typeto.TypeTo">
<result name="success">/TypeTo/show.jsp</result>
</action>
//提交界面
<s:form action="tt">
<s:textfield name="user.name" label="username"/>
<s:textfield name="user.pass" label="password"/>
<s:submit value="getTo" />
</s:form>
//展示界面
<h1>Type To</h1>
<hr>
<s:property value="user.name"/></br>
<s:property value="user.pass"/>
2Map集合属性类型
private Map<String, User> users;
public Map<String, User> getUsers() {
return users;
}
public void setUsers(Map<String, User> users) {
this.users = users;
}
//提交表单(部分)
<!-- user['key'].属性 形式 为 action属性进行赋值 -->
<s:textfield name="users['one'].name" label="username1"/>
<s:textfield name="users['one'].pass" label="password1"/>
<s:textfield name="users['two'].name" label="username2"/>
<s:textfield name="users['two'].pass" label="password2"/>
<s:submit value="getTo" />
<!-- show -->
<!-- 获取Aciton 中属性值也通过 user['key'].属性 形式-->
<s:property value="users['one'].name"/></br>
<s:property value="users['one'].pass"/></br>
<s:property value="users['two'].name"/></br>
<s:property value="users['two'].pass"/></br>
3List集合类型
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
<!-- user[索引].属性 -->
<s:textfield name="users[0].name" label="username1"/>
<s:textfield name="users[0].pass" label="password1"/>
<s:textfield name="users[1].name" label="username2"/>
<s:textfield name="users[1].pass" label="password2"/>
<s:submit value="getTo" />
<!-- show -->
<s:property value="users[0].name"/></br>
<s:property value="users[0].pass"/></br>
4当集合类型List或Map未指定泛型类型时:指定类型转换
List:
//未指定泛型(通过局部类型转换文件指定 泛型 格式 ActionName-conversion.properties 放在该 Action相同位置)
private List user;
public List getUser() {
return user;
}
public void setUser(List user) {
this.user = user;
}
创建*.properties文件放在对应Action下面(TypeTo-conversion.properties)
# format: Element_<ListPropName>=<ElementType>
# <ListPropName> is property name of List
# <ElementType> is genericity type
Element_users=com.wang.vo.User
Map:
private Map users;
public Map getUsers() {
return users;
}
public void setUsers(Map users) {
this.users = users;
}
创建*.properties文件放在对应Action下面(TypeTo-conversion.properties)
# Map format:
# Key_<MapPropName>=<KeyType>
# Element_<MapPropName>=<ValueType>
# <MapPropName> is property name of Map
# <KeyType> is key of Map
# <ValueType> is value of Map
Key_users=java.lang.String
Element_users=com.wang.vo.User
2,自定类型转换器
(将一个字符串转换成复合对象)
实际上类型转换时依据OGNL框架中 TypeConverter接口 ,自定义类型转化器可实现该接口 ,但接口方法过于复杂,struts2提供了个DefaultTypeConverter实现类 ,可以继承他重写convertValue()方法来自定义类型转换器。(该方法需要实现双向转化此处不做举例)此处讲解其子类(抽象类)StrutsTypeConverter 类
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public class UserConverter extends StrutsTypeConverter{
/**
* 将String转换成复合类型
* context : 转换环境上下文
* values : 需要转换的参数 为数组 因为游览器端可以进行多选项提交
* toClass : 目标类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
User user = new User();
//User user = (User)toClass.newInstance();
String[] userValues = values[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
return user;
}
//将复合类型转换成String类型
@Override
public String convertToString(Map context, Object o) {
User user = (User)o;
return "[" + user.getName() + "," + user.getPass() + "]";
}
}
TypeTo-conversion.properties配置文件(此配置为局部Action配置只对单个Action起作用)
# Type Conversion format:
# <propName>=<ConverterClass>
# <propName> is property name of Action
# <ConverterClass> is Transformation processing class
user=com.wang.typeto.UserConverter
.jsp
<s:textfield name="user"/>
<s:submit value="getTo" />
<s:property value="user.name"/></br>
<s:property value="user.pass"/></br>
<s:property value="user" />
{全局类型转换器配置:不是对特定Action有效而是对特定类型有效果}需要创建 xwork-conversion.properties文件 放在WEB-INF/classes下面即可
# format :
#<proType>=<ConvertClass>
com.wang.vo.User=com.wang.typeto.UserConverter.java
关于Action中Set集合属性使用
//无序集合
private Set users;
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
自定义类型转换类
public class UserConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Set result = new HashSet();
for(String value:values){
User user = new User();
String[] userValues = value.split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
result.add(user);
}
return result;
}
@Override
public String convertToString(Map context, Object o) {
if(Set.class == o.getClass()){
Set users = (Set)o;
String result = "[";
for(Object obj: users){
User user = (User)obj;
result += "<" + user.getName() + "," + user.getPass() + ">";
}
return result+="]";
}
return "";
}
}
TypeTo-conversion.properties配置文件
# Type Conversion format:
# <propName>=<ConverterClass>
# <propName> is property name of Action
# <ConverterClass> is Transformation processing class
users=com.wang.typeto.UserConverter
# Specify Set identifier
# Set format:
# KeyProperty_<SetPropName>=<keyProName>
# <propName> is property name of Action
# <keyProName> is Set elements' element
KeyProperty_users=name
.jsp
<s:textfield name="users"/>
<s:textfield name="users"/>
<s:submit value="getTo" />
<!-- 特别注意此处的圆括号 Set集合专用 List Map 使用方括号 圆括号里面(name)为Set元素唯一标识 前面类型转换器和配置文件 进行设置的 -->
<s:property value="users('wang').name"/></br>
<s:property value="users('wang').pass"/></br>
2,类型转换中的错误处理
自定义类型转换类 重写convertFromString()
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
...
//由于某些原因抛出类型转换异常
throw new TypeConversionException();
}
应为类型转换错误最终action将result将返回"input"
配置TypeTo-conversion.properties(类型转换器)
users=com.wang.typeto.UserConverter
对应Action
public class TypeTo extends ActionSupport {
private User users;
public User getUsers() {
return users;
}
public void setUsers(User users) {
this.users = users;
}
public String execute(){
return Action.SUCCESS;
}
}
配置struts.xml文件配置input结果对应.jsp
<!-- 设置src/in_zh_CN.properties 文件为全局的国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="in" />
<package name="TT" extends="struts-default">
<action name="tt" class="com.wang.typeto.TypeTo">
<result name="success">/TypeTo/show.jsp</result>
<result name="input">/input.jsp</result>
</action>
</package>
src/in_zh_CN.properties 全局国际化资源文件
xwork.default.invalid.fieldvalue={0}字段转换错误
typeto.jsp
<s:form action="tt">
<s:textfield name="users"/>
<s:submit value="getTo" />
</s:form>
input.jsp
<s:fielderror/>
![点击并拖拽以移动 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==](https://i-blog.csdnimg.cn/blog_migrate/7686c965939615948ee6afa9bfb94615.png)