论坛首页 Java企业应用论坛

struts的自定义类型转换无法成功

浏览 2359 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-23  
不知道为什么,自定义的类型转换器一直没有被调用

package model;

public class Test {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


Action

package action;

import model.Test;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport{

	private Test test;
	
	public String execute(){
		System.out.println("action start");
		System.out.println(test);
		return null;
	}

	public Test getTest() {
		return test;
	}

	public void setTest(Test test) {
		this.test = test;
	}
	
	
}


局部的类型转换文件TestAction-conversion.properties
test=converter.TestConverter


类型转换器
package converter;

import java.util.Map;

import model.Test;

import org.apache.struts2.util.StrutsTypeConverter;

public class TestConverter extends StrutsTypeConverter{

	@Override
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		// TODO Auto-generated method stub
		System.out.println("convertFromString");
		Test test = new Test();
		
		String[] values = arg1[0].split(","); 
		test.setName(values[0]);
		return test;
	}

	@Override
	public String convertToString(Map arg0, Object arg1) {
		// TODO Auto-generated method stub
		return null;
	}

}
   发表时间:2012-05-23  
话说LZ调用转换器了吗?为啥我米有看到调用的地方勒,并且这个不是类型转换吧……
0 请登录后投票
   发表时间:2012-05-23  
happys 写道
话说LZ调用转换器了吗?为啥我米有看到调用的地方勒,并且这个不是类型转换吧……


类型转换器是不需要手动调用。如果这个不是类型转换器,什么是呢?
0 请登录后投票
   发表时间:2012-05-24  
properties文件和action放在同一个包里吗?
0 请登录后投票
   发表时间:2012-05-24  
wsyzx1989 写道
properties文件和action放在同一个包里吗?

放在一个包里了
0 请登录后投票
   发表时间:2012-05-25  
不知道lz是要对test对象进行转换 还是要对test下的name进行转换呢?
如果对test转换 你的请求界面 表单name属性值应该为test

如果 lz是要对test下的name进行类型转换
你action中用的是test对象 所以在你的局部类型转换配置文件中应该这样写:
test.name=converter.TestConverter

同时 应该在你的 test类的同级包下 创建一个Test-converstion.properties文件 内容为:
name=converter.TestConverter
同时你的类型转换器的实现 也要改变一下了....
1 请登录后投票
   发表时间:2012-05-26  
hxlzpnyist 写道
不知道lz是要对test对象进行转换 还是要对test下的name进行转换呢?
如果对test转换 你的请求界面 表单name属性值应该为test

如果 lz是要对test下的name进行类型转换
你action中用的是test对象 所以在你的局部类型转换配置文件中应该这样写:
test.name=converter.TestConverter

同时 应该在你的 test类的同级包下 创建一个Test-converstion.properties文件 内容为:
name=converter.TestConverter
同时你的类型转换器的实现 也要改变一下了....


当我对test下的name进行转换的时候,我发现调用的是convertToString方法,不知道为什么?这样不是得不到请求参数了吗?不知道遗漏了什么步骤?能说说类型转换器的实现怎么改吗?
0 请登录后投票
   发表时间:2012-05-27  
soochief 写道
hxlzpnyist 写道
不知道lz是要对test对象进行转换 还是要对test下的name进行转换呢?
如果对test转换 你的请求界面 表单name属性值应该为test

如果 lz是要对test下的name进行类型转换
你action中用的是test对象 所以在你的局部类型转换配置文件中应该这样写:
test.name=converter.TestConverter

同时 应该在你的 test类的同级包下 创建一个Test-converstion.properties文件 内容为:
name=converter.TestConverter
同时你的类型转换器的实现 也要改变一下了....


当我对test下的name进行转换的时候,我发现调用的是convertToString方法,不知道为什么?这样不是得不到请求参数了吗?不知道遗漏了什么步骤?能说说类型转换器的实现怎么改吗?


如果是对test下name进行类型转换,按照你当前的action,首页你的提交表单 元素 name属性 应该是test.name
struts2会在 action执行set方法之前 检测是否需要对该参数进行类型转换 (通过你的配置文件实现的了)
当检测到需要对其进行类型转换的时候 ,就会执行自定义的类型转换器类了...
convertFormString 该方法是将表单传过来的参数 转换为你所需要的对象(这里 也就是你的test下的name了)
具体实现按照你的业务来了  转换操作完成后 将你转换后的对象返回 就行了 ...struts2会将该返回的对象 通过set方法注入到name了

convertToString方法 一般情况下都是用来 在页面显示 某一个对象时 也就是调用action中的get方法 会将其转换为string类型  记住这里的显示 必须采用struts标签<s:property value="test.name">才能够显示 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics