Struts2型変換の詳細

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"/>

2マップコレクションの属性タイプ

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>

3リストコレクションタイプ

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でジェネリックタイプが指定されていない場合:タイプ変換を指定します

リスト:

//未指定泛型(通过局部类型转换文件指定 泛型 格式 ActionName-conversion.properties 放在该       Action相同位置)
private List user; 
	
public List getUser() {
	return user;
}

public void setUser(List user) {
	this.user = user;
}

* .propertiesファイルを作成し、対応するアクション(TypeTo-conversion.properties)の下に配置します

# format: Element_<ListPropName>=<ElementType> 
# <ListPropName> is property name of List
# <ElementType> is genericity type
Element_users=com.wang.vo.User

地図:

private Map users;

public Map getUsers() {
	return users;
}

public void setUsers(Map users) {
	this.users = users;
}

* .propertiesファイルを作成し、対応するアクション(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構成ファイル(この構成は部分的なアクション構成であり、単一のアクションに対してのみ機能します)

# 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" />

 

{グローバルタイプコンバーター構成:特定のアクションでは効果的ではありませんが、特定のタイプでは効果的です} xwork-conversion.propertiesファイルを作成し、WEB-INF / classesの下に配置する必要があります

# format :
#<proType>=<ConvertClass>
com.wang.vo.User=com.wang.typeto.UserConverter.java

 

アクションでの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();
	}

型変換エラーの場合、最終アクションは結果として「入力」を返します

 

TypeTo-conversion.properties(タイプコンバーター)を構成します

users=com.wang.typeto.UserConverter

対応するアクション

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ファイルを構成して、入力結果を.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 ==

 

 

おすすめ

転載: blog.csdn.net/weixin_41237676/article/details/84142386