`

自定义struts转换器实现向Map中存放对象类型数据

阅读更多
1、Document类:重点关注properties属性的映射及如何从页面向这种Map类型中存放数据
@Entity
@Table(name="t_document")
public class Document {
	@Id
	@GeneratedValue
	private int id;
	private String title;
	@Type(type="binary")
	@Column(length=99999999)
	private byte[] annex; //附件
	private long processInstanceId;
	private String description;
	private String status; //状态
	private Date createTime;
	@ManyToOne
	private WorkFlow workFlow;
	
	@ManyToOne
	private User creator; //公文创建者
	
//此属性存放的是集合类型 
	@CollectionOfElements
//为存放这个集合类型添加一张表 name:指定表的名称
	@JoinTable(name="t_documentproperties",
//joinColumns =@JoinColumn(name="documentId"):向新加入的这个表中添加一个字段名称为:documentId,这个值将作为新添加的这个表的主键
			joinColumns =@JoinColumn(name="documentId")
	)
//因为这个属性是Map类型的key是String类型value是DocumentProperty类型,指定这个注解是将Map的key值作为新添加的这个表中的一个字段,并且是主键。
	@MapKey(columns=@Column(name="propertyName"))
	private Map<String, DocumentProperty> properties;


2、DocumentProperty类
@Embeddable
public class DocumentProperty {
	
	private String java_lang_String;
	
	private Integer java_lang_Integer;
	
	@Type(type="binary")
	@Column(length=99999999)
	private byte[] java_io_File;
	
	private Long java_lang_Long;
	
	private Date java_util_Date;
	
	@Column(nullable=false)
	private String propertyType;
}


3、Action中的写法:在Action中不用做特别的定义因为Map类型的properties是Document的一个属性
@Component
@Scope("prototype")
public class DocumentAction extends BaseAction {
	
	private Document doc = new Document();
}


4、页面应该怎么写?

在jsp文件中我们向Map中提交数据对于一些基本的数据类型strtus2都自己能做转换
例如:<input type="xxx" name="properties['username'].java_lang_String" value="xxx" />意为:
'username'是此Map的key值,而java_lang_String 是DocumentProperty对象中的一个属性,那么这个输入域
的value值就赋值给这个字段,我们在DocumentProperty中定义的java_io_File是byte[]类型的,struts2默认
无法将java.io.File转换为byte[]类型,所以我们需要自己写一个转换器。

5、定义自己的转化器将java.io.File类型转化为byte[]类型
//继承strust2给我们提供的DefaultTypeConverter类
public class ByteArrayConverter extends DefaultTypeConverter {

	@Override
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType) {
		File[] files = (File[])value;
		if(files == null || files.length == 0) {
			return null;
		}
		
		try {
			return FileUtils.readFileToByteArray(files[0]);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}


写完上面这个转换器之后,我们还要添加一个配置文件,你要对哪个类中的这个属性进行转换就配置文件就以哪个类名开头然后-conversion.properties。我们这个例子是对DocumentProperty这个类中的java.io.File这个类型进行转换,所以我们配置文件的名称为DocumentProperty-conversion.properties。文件内容:
java_io_File=com.bjsxt.oa.model.ByteArrayConverter

这样当他对java_io_File这个属性赋值的时候就会来找到这个配置文件,然后交给com.bjsxt.oa.model.ByteArrayConverter这个类来处理,在这个类中我们将java.io.File类型转为byte[]类型。这个配置文件默认要放到与要转换的类同一个目录下面struts2才能找得到。

这个地方其实有struts2一个bug我们定义了转换器,但是后台还是会报错文件无法上传,我们还要在DocumentProperty类中增加两个方法才可以:
public void setJava_io_FileFileName(String s){}
	public void setJava_io_FileContentType(String s){}

这两个方法什么都不用做,添加上之后就不会报错了,文件上传成功!
分享到:
评论

相关推荐

    Struts自定义类型转换器

    Struts框架为了更好地处理这种类型转换的需求,提供了自定义类型转换器的功能,使得开发者能够更加灵活地控制数据类型转换的过程。本文主要介绍Struts1和Struts2中的自定义类型转换器,并探讨其实现机制。 #### 二...

    传智播客struts2.1源代码_自定义类型转换器

    接着,当Struts2接收到相关参数时,会自动调用自定义转换器进行转换。 6. **调试与测试** 调试自定义类型转换器通常涉及到设置断点,观察转换过程中的变量状态,以及通过单元测试确保转换逻辑的正确性。在IDE如...

    struts2自定义类型转换器

    3. **处理日期格式**:在自定义转换器中,我们需要解析前端传递的日期字符串并转换为Date对象。这通常涉及到日期格式化。可以使用`SimpleDateFormat`类来完成这个任务。 ```java try { SimpleDateFormat formatter...

    struts 2.0 自定义类型转换器 注册类型转换器 入门实例 简单实例

    - 在Action类中声明需要转换的属性,并在表单提交时,Struts 2会自动调用相应的类型转换器将字符串数据转换为`CustomDate`对象。 4. **简单实例** 假设我们有一个简单的Web表单,用户输入日期,我们可以通过...

    自定义struts时间转换器

    在Struts中,转换器(Converter)扮演着重要的角色,主要负责在表单数据和模型对象之间进行数据类型的转换。自定义Struts时间转换器可以帮助我们更灵活地处理时间格式,满足不同场景下的时间显示和存储需求。 在...

    自定义类型转换器

    在Java编程中,经常需要处理不同数据类型之间的转换。例如,从用户界面获取的数据通常是字符串形式,而程序内部可能需要将其转换为日期、数字等其他类型。Struts2框架提供了一种灵活的方式来实现这种类型的转换——...

    struts2自定义数据类型转换练习

    本练习主要关注如何在Struts2中实现自定义的数据类型转换,以满足特定业务需求。 首先,我们需要了解Struts2的数据转换机制。当用户提交表单数据时,Struts2会通过ActionContext获取到这些数据,并尝试将其转换为...

    Struts2自定义类型转换

    在Web开发中,数据类型转换是一项常见的需求,特别是在用户输入的数据与后端处理的数据类型不一致时。Struts2框架提供了强大的类型转换机制,允许开发者自定义类型转换器,以满足特定业务逻辑的需求。本文将深入探讨...

    Struts 自定义转换器

    然而,对于更复杂的数据类型,或者需要特殊转换规则的情况,我们就需要创建自定义转换器。 创建自定义转换器的步骤如下: 1. **创建转换器类**:首先,你需要创建一个新的Java类,实现Converter接口。在这个类中,...

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    Struts的自定义转换器

    自定义转换器使得Struts框架更加灵活,能够处理复杂或特殊的数据类型,提高了代码的可维护性和用户体验。通过编写自定义转换器,开发者可以确保数据转换过程符合业务规则,减少因类型不匹配导致的错误。在实际开发中...

    struts2 类型转换器

    标签中的“源码”可能意味着博客会深入到Struts2框架的源代码中,解释类型转换器的工作原理和如何根据源代码实现自定义转换器。而“工具”可能指的是使用Struts2提供的工具类或API来辅助类型转换。 在`Struts2_3500...

    自定义struts(实现拦截器)

    在自定义Struts中,你需要定义自己的Action类,继承自`org.struts2.ActionSupport`或类似的基类,并实现你需要的方法。同时,需要在配置文件中声明这些Action,以便Struts框架能够正确地调用它们。 3. **反射**: ...

    struts2注册转换器

    1. **创建自定义转换器类**:继承`org.apache.struts2.util.FieldAwareConverter`或者直接实现`Converter`接口。在这个例子中,我们可能会创建一个名为`CustomDateConverter`的类,该类负责将字符串"20110202"转换为...

    struts2 转换器

    除了自定义转换器,Struts2还提供了一系列内置的转换器,可以处理基本类型和常见的Java对象,如IntegerConverter、DoubleConverter、DateConverter等。这些内置转换器可以根据目标类型自动匹配,无需手动配置。 在...

    Struts2 自定类型转换器(三十四)

    Struts2允许我们创建自己的转换器类来处理输入数据,确保模型对象的属性能够正确地被转换为预期的数据类型。在本教程中,我们将深入探讨如何在Struts2中实现自定义类型转换器。 首先,我们需要了解Struts2的类型...

    struts2自定义类型转换、拦截器实例练习

    总之,"struts2自定义类型转换、拦截器实例练习"将引导你通过实际操作掌握Struts2的核心功能,加深对MVC模式的理解,提高你在Java web开发中的技能水平。在完成这个实例后,你将具备使用Struts2框架构建复杂应用程序...

Global site tag (gtag.js) - Google Analytics