struts2自定义类型转换器

虽然内建的类型转换器能满足大多数需求,但是有时候还是需要使用自定义的类型转换器来实现特定的需求。

比如在页面上面输入width:height,形如16:9,这个时候就需要自定义类型转换器了。

如何实现自定义类型转换器呢

1 写一个类继承StrutsTypeConverter类,这个抽象类有两个方法需要用户实现:

   public Object convertFromString(Map context, String[] values, Class toClass)  实现字符串向对象的转换 

   public String convertToString(Map context, Object o) 实现对象向字符串的转换 

在提交表单的时候,会调用convertFromString方法,在显示结果页面的时候,会调用convertToString方法。

<span style="font-family:SimHei;font-size:18px;">package com.login;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

 

 

import com.domain.Rectangle;
 
 

public class AllConverter   extends StrutsTypeConverter {
private static SimpleDateFormat dateformat=new SimpleDateFormat("yyyyMMdd"); 
	 
	public Object convertFromString(Map context, String[] values, Class toClass) {
		System.out.println("values length="+values.length);
		System.out.println("values="+values[0]);
		if(toClass==Date.class){
			
			String s=values[0];
			Date d=null;
			try {
				if("".equals(s.trim())){
					return "";
				}
				d = dateformat.parse(s);
			} catch (ParseException e) {
				 
				e.printStackTrace();
			}
			return d;
			
		}else if(toClass==Rectangle.class){
			String s=values[0];
			System.out.println(s);
			String str[]=s.split(":");
			System.out.println(str);
			if(str.length<2){
				throw new TypeConversionException("请输入正确的宽度和高度,形如 宽度:高度");
			}
			
			int width=Integer.parseInt(str[0]);
			int height=Integer.parseInt(str[1]);
			System.out.println(width);
			System.out.println(height);
			Rectangle r=new Rectangle();
			r.setHeight(height);
			 r.setWidth(width);
			 return r;
			
		}
		
		
		return null;
	}

 
	public String convertToString(Map context, Object o) {
		
		if(o instanceof Rectangle){
			
			Rectangle r=(Rectangle)	o;
			String s=r.getWidth()+":"+r.getHeight();
			return s;
			
		}
		
		 
		return null;
	}

}
</span>


2 提交表单页面 

<span style="font-family:SimHei;font-size:18px;">    <form action="helloworld.action" method="post">
       rectangle:<input type="text" name="rectangle"><br>    
                 <input type="submit" value="submit"><br>
    </form>
</span>



3 实现action  

<span style="font-family:SimHei;font-size:18px;">package com.login;

 

import com.domain.*;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.*;

import javax.servlet.ServletContext;
import javax.servlet.http.*;

import org.apache.struts2.*;
public class HelloWorldAction extends ActionSupport {
    private static final long serialVersionUID = 7227184666830968247L;
	 
	private Rectangle rectangle ;
	
	 
	
	public String execute() {
	    System.out.println("  Height=  "+rectangle.getHeight()+" , Width= "+rectangle.getWidth());
	    return "success";

	}
	 
	public Rectangle getRectangle() {
		return rectangle;
	}
	public void setRectangle(Rectangle rectangle) {
		this.rectangle = rectangle;
	}
	 
	

}</span>

4  显示结果页面 

  

<span style="font-family:SimHei;font-size:18px;">     rectangle:<s:property value="rectangle"/><br></span>

 以上这句话会引用自定义类型转换器,因为这时候要把一个字符串转换成Rectangle对象。


5  注册自定义转换器 

   1  如果是全局类型转换器在src下建立一个xwork-conversion.properties文件,这个文件中用全类型=这个类对应的类型转换器全类名。

       xwork-conversion.properties 文件名

      com.domain.Rectangle=com.login.AllConverter

   2 如果是类级类型转换器,在使用该类型的action同包下面建立一个Action名-conversion.properties文件,属性名=这个类对应的类型转换器全类名。

    HelloWorldAction-conversion.properties 文件名

    rectangle=com.login.AllConverter

   3 类级类型转换器会覆盖全局类型转换器的引用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值