TypeConverter的使用

本文介绍如何在Struts2框架中使用自定义转换器处理复杂数据类型的转换过程,包括配置方法及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struts2 中转换器,在action提交时所有提交的都是字符串,在提交到后台都要进行转换,
而默认的转换器就是XWorkConverter,而XWorkConverter 用的是XWorkBasicConverter这个转换器,
XWorkBasicConverter提供了把字符串转换为基本类型,Bigdecimal,
BigInteger,java.util.Date,java.sql.Time,java.sql.Timestamp的转换,
这三种时间转换都提供了几个SimpleDateFormat来
把字符串转换为时间,也提供了把这些转换成字符串
转换是根据你Action属性的Class类型的,如果看过XWorkConver的源代码你就会发现有这么一段
    @Inject
      public void  setObjectFactory(ObjectFactory factory){
           读取xwork-convertion.properties
     }
  也就是在用Container得到XworkConverter时,就已经读取了xwork-convertion.properties(classes下面)这个文件
   这个文件是用来放入放入你的类和转换器的
  比如 struts2.Point = struts2.PointConverter(实现ognl.TypeConverter)的
 也就是说当你Action中有Point属性point时,你在页面
<s:textfield name="point" />提交时,就会去找PointConverter来把字符串转化为Point对象,也把Poing对象
转换为String
当然xwork-convertion.properties存的是全局的转换器
还可以struts2.Point = struts2.PointConverter放入你要使用的Action类下面,名字为ActionName-conversion.properties中,作用是一样的,只是这个是局部的
 
所以,在Action提交时,对Action的属性的转换,首先根据属性类在xwork-convertion.properties找转换器,再到
ActionName-conversion.properties找转换器,没有的话用默认的转换器
例子:
   package struts2;
public class Point {    
int x;    
int y; 
public int getX() {  return x; } 
public void setX(int x) {  this.x = x; } 
public int getY() {  return y; } 
public void setY(int y) {  this.y = y; } 
public String toString(){  return x+"-"+y; }    }
转换器:
package struts2;
import java.lang.reflect.Member;
import java.util.Map;
 
import ognl.TypeConverter;
public class PointerConverter implements TypeConverter {
 
 public Object convertValue(Map context, Object target, Member member,
   String propertyName, Object value, Class toType) {
  
  if (toType == Point.class) {
   try {
    String[] proArray = (String[]) value;
    System.out.println(proArray.length);
    for (String s : proArray) {
     value = s;
    }
   } catch (Exception e) {
   }
   Point p = new Point();
   if (value != null) {
    String str = (String) value;
    String[] s = str.split("-");
    int x, y;
    x = Integer.valueOf(s[0].trim());
    y = Integer.valueOf(s[1].trim());
    p.setX(x);
    p.setY(y);
   }
   return p;
  }
  else if(toType == String.class){
   return value;
  }
  return null;
 }
 
}
然后在xwork-conversion.properties写入
struts2.Point = struts2.PointConverter
 
Action:
package struts2;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.RequestUtils;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class TestLoginAction extends ActionSupport {
 
 private Point point;
 
 public  public Point getPoint() {
  return point;
 }
 public void setPoint(Point point) {
  this.point = point;
 }
 @Override
 public String execute() throws Exception {
 
    if(point != null)
         System.out.println("x="+point.getX()+",y="+point.getY());
  return SUCCESS;
 }
 }
jsp:
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
       <s:head theme="ajax" />  
  </head>
  
  <body>
    登陆界面<br>
    
    <s:form action="login">
    
     <table>
      
       <tr>
         <td>
           <s:textfield name="point" label="坐标"/>  
         </td>
       </tr>
       
       <tr>
       <td>
       <input type="submit" value="提交"/>
       </td>
       </tr>
     </table>
    </s:form>
     
    
  </body>
</html>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值