struts的类型转换器

  • 基于OGNL的类型转换器

自定义类型转换器需要你继承ognl.DefaultTypeConverter类,并且重写该类中的 converValue()方法。

其中三个参数的意义。

Map context:表示类型转换的上下文环境

Object value:表示需要进行类型转换的参数,由于Struts2框架的类型转换器可以实现双向转换,所以根据转换方向,该参数的意义不同。当把复合类型转换为字符串类型时,该参数表示复合类型。当把字符串类型转换为复合类型时,该参数表示一个字符串数组。

Class toType:表示转换目标的类型,当把复合类型转换为字符串类型时,该参数表示字符串类型。当把字符串类型转换为复合类型时,该参数表示复合类。。


1定义User类

package entity;

public class User {
	
	private String userName;
	private String userPassword;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
}

定义UserAction.java

package action;
import com.opensymphony.xwork2.ActionSupport;
import entity.User;
@SuppressWarnings("serial")
public class UserAction extends ActionSupport{
	private String message;
	private User user;
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String execute(){
		if(getUser() != null){
			message = "您输入的信息为:用户名:"+user.getUserName()+", 密码:"+user.getUserPassword();
			return SUCCESS;
		}else{
			return INPUT;
		}
	}
}

配置userAction

<action name="userAction" class="action.UserAction">
			<result name="success">/loginSuccess.jsp</result>
			<result name="input">/login.jsp</result>
		</action>

自定义类型转换器UserConverter.java

package util;
import java.util.Map;
import entity.User;
import ognl.DefaultTypeConverter;
public class UserConverter extends DefaultTypeConverter {
	@SuppressWarnings("unchecked")
	public Object convertValue(Map context, Object value, Class toType){
		if (toType == User.class ){	//字符串类型转复合类型
			String[] params = (String[])value;
			User user = new User();
			String[] userValues = params[0].split(",");
			user.setUserName(userValues[0]);
			user.setUserPassword(userValues[1]);
			return user;
		}else if (toType == String.class ){	//复合类型转字符串类型
			User user = (User) value;
			return "<" + user.getUserName() + "," + user.getUserPassword() + ">";
		}
		return null ;
	}
}


在Action的包下配置UserAction-conversion.properties

user=util.UserConverter
user表示Action类中的User对象,util.UserConver表示自定义转换器类所在的路劲

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>类型转换</title>
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body >
  <jsp:include page="index.html"></jsp:include>
  	<s:form action="userAction" method="post" >
  		<s:textfield name="user.userName" label="登录"></s:textfield>
  		<s:textfield name="user.userPassword" label="密码"></s:textfield>
  		<s:submit value="提交"></s:submit>
  	</s:form>
  </body>
</html>

loginSuccess.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ taglib prefix="s"  uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>类型转换</title>
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
 <body >
   <jsp:include page="index.html"></jsp:include>
		
		<s:property value="message"/>
  </body>
</html>

  • 注册自定义类型转换器

1.局部类型转换器

文件名的命名规则如XXXXXX-conversion.properties.其中XXXXX代表Action的Name。如:UserAction-conversion.properties

user=util.UserConverter
user表示Action类中的User对象,util.UserConver表示自定义转换器类所在的路劲

2.全局类型转换器
文件名的命名为xwork-conversion.properties

entity.User=util.UserConverter
将User类与UserConverter类直接对应起来

  • 基于Struts2的类型转换

package util;

import java.util.Map;

import entity.User;

import ognl.DefaultTypeConverter;

public class StrutsTypeConverter extends DefaultTypeConverter {

	@Override
	public Object convertValue(Map context, Object value, Class toType) {
		if(toType.equals(String.class)){
			return convertToString(context,value);
		}else if(value instanceof String[]){
			return convertFromString(context,(String[])value,toType);
		}else if(value instanceof String){
			return convertFromString(context,new String[]{(String)value},toType);
		}else{
			return performFallbackConversion(context,value,toType);
		}
	}


	protected Object performFallbackConversion(Map context,Object object,Class toClass){
		return super.convertValue(context, object, toClass);
	}
	/**
	 * 把字符串类型转换为复合类型
	 * @param context
	 * @param values
	 * @param toClass
	 * @return
	 */
	public Object convertFromString(Map context,String[] values,Class toClass) {
		String[] params = values;
		User user = new User();
		String[] userValues = params[0].split(",");
		user.setUserName(userValues[0]);
		user.setUserPassword(userValues[1]);
		return user;
	}
	
	/**
	 * 把复合类型转换为字符串类型
	 * @param context
	 * @param object
	 * @return
	 */
	public String convertToString(Map context,Object object) {
		User user = (User) object;
		return "<" + user.getUserName() + "," + user.getUserPassword() + ">";

	}
}


  • 数组类型转换器

package util;

import java.util.Map;

import entity.User;

import ognl.DefaultTypeConverter;

public class UserConverterArray extends DefaultTypeConverter{
	/**
	 * 字符串转复合类型
	 * @param arg0
	 * @param arg1
	 * @param arg2
	 * @return
	 */
	public Object convertFromString(Map arg0,String[] arg1,Class arg2){
		if(arg1.length > 1){
			User[] user = new User[arg1.length];
			for(int i = 0;i<arg1.length;i ++){
				User u = new User();
				String[] temp = arg1[i].split(",");
				u.setUserName(temp[0]);
				u.setUserPassword(temp[1]);
				user[i] = u;
			}
			return user;
		}else{
			User u = new User();
			String[] str = arg1[0].split(",");
			u.setUserName(str[0]);
			u.setUserPassword(str[1]);
			return u;
		}
	}
	/**
	 *复合转字符串
	 * @param arg0
	 * @param arg1
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public String convertToString(Map arg0,Object arg1){
		if(arg1 instanceof User){
			User u = (User)arg1;
			return "<"+u.getUserName()+","+u.getUserPassword()+">";
		}else if(arg1 instanceof User[]){
			User[] u = (User[])arg1;
			String result = "[";
			for(User us : u){
				result += "<"+us.getUserName()+","+us.getUserPassword()+">";
			}
			return result+"]";
		}else{

			return null;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值