`

struts form类型转换问题,通过自定义convert类来实现类型转换一

阅读更多

struts form会自动将表单中输入的值转换为定义的类型.

表单提交过来的类型均为String类型.而在form中可以定义诸如:int,double等类型.

演示如下:

配置文件:

<action path="/convertAction" type="com.lwf.struts.action.ConvertAction" name="convertForm"  scope="request">
			<forward name="success" path="/convertResult.jsp"></forward>
		</action>

 

<form-bean name="convertForm" type="com.lwf.struts.form.ConvertForm"></form-bean>

 

 

表单文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="convertAction.do" method="post">
	intvalue:<input type="text" name="intval"/><br>
	doublevalue:<input type="text" name="doubleval"/><br>
	booleanvalue:<input type="text" name="booleanval"/><br>
	sqldatevalue:<input type="text" name="dateval"/><br>
	<input type="submit" value="submit"/>
</form>
</body>
</html>

 

 

form文件

package com.lwf.struts.form;

import java.sql.Date;

import org.apache.struts.action.ActionForm;

public class ConvertForm extends ActionForm {
	private int intval;
	private double doubleval;
	private boolean booleanval;
	private Date dateval;
	
	public int getIntval() {
		return intval;
	}
	public void setIntval(int intval) {
		this.intval = intval;
	}
	public double getDoubleval() {
		return doubleval;
	}
	public void setDoubleval(double doubleval) {
		this.doubleval = doubleval;
	}
	public boolean isBooleanval() {
		return booleanval;
	}
	public void setBooleanval(boolean booleanval) {
		this.booleanval = booleanval;
	}
	public Date getDateval() {
		return dateval;
	}
	public void setDateval(Date dateval) {
		this.dateval = dateval;
	}
}

 

 

action文件

package com.lwf.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class ConvertAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		return mapping.findForward("success");
	}

}

 

 

结果文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	intvalue:${convertForm.intval }<br>
	doublevalue:${convertForm.doubleval }<br>
	booleanvalue:${convertForm.booleanval }<br>
	sqldatevalue:${convertForm.dateval }<br>
	</body>
</html>

 

 

 

输出结果:

intvalue:0
doublevalue:333.0
booleanvalue:false
sqldatevalue:2009-03-02

 

 

可以改变表单中输入的值:

你会发现:在intvalue中输入非数字类型时,结果会自动显示为0

而doublevalue中输入一个整数如33时,结果会自动显示为33.0

而booleanvalue中输入1或Y或yes或on等结果显示为true.输入0或N或off时结果显示为false.

要注意的是这个测试我们使用的是java.sql.date来测试日期类型,我测试发现当输入2009-03-02时结果输出正确,而如果输入的值为2009/03/02时会报错.这说明类型转换是有选择性的..

上面可以得出一个结论,struts form做了类型转换.那么它是怎么实现的呢?

看struts源代码ActionServlet的init方法调用了initOther方法

里面我们会看到有许多类似以下方法:

ConvertUtils.register(new BooleanConverter(null), Boolean.class);
            ConvertUtils.register(new ByteConverter(null), Byte.class);
            ConvertUtils.register(new CharacterConverter(null), Character.class);
            ConvertUtils.register(new DoubleConverter(null), Double.class);
            ConvertUtils.register(new FloatConverter(null), Float.class);

  这里实际上使用了策略模式.

BooleanConverter,CharacterConverter等都实现了Converter接口.并实现了里面的方法.

所以如果有一些类型struts没有做转换时,如java.util.Date,我们可以写自己的convert类来实现Converter接口

public Object convert(Class type, Object value);

 

 

 

我们列出来initOther方法的源代码

 protected void initOther()
        throws ServletException {
        String value;

        value = getServletConfig().getInitParameter("config");

        if (value != null) {
            config = value;
        }

        // Backwards compatibility for form beans of Java wrapper classes
        // Set to true for strict Struts 1.0 compatibility
        value = getServletConfig().getInitParameter("convertNull");

        if ("true".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value)
            || "on".equalsIgnoreCase(value) || "y".equalsIgnoreCase(value)
            || "1".equalsIgnoreCase(value)) {
            convertNull = true;
        }

        if (convertNull) {
            ConvertUtils.deregister();
            ConvertUtils.register(new BigDecimalConverter(null),
                BigDecimal.class);
            ConvertUtils.register(new BigIntegerConverter(null),
                BigInteger.class);
            ConvertUtils.register(new BooleanConverter(null), Boolean.class);
            ConvertUtils.register(new ByteConverter(null), Byte.class);
            ConvertUtils.register(new CharacterConverter(null), Character.class);
            ConvertUtils.register(new DoubleConverter(null), Double.class);
            ConvertUtils.register(new FloatConverter(null), Float.class);
            ConvertUtils.register(new IntegerConverter(null), Integer.class);
            ConvertUtils.register(new LongConverter(null), Long.class);
            ConvertUtils.register(new ShortConverter(null), Short.class);
        }
    }

 

我们可以看到可能通过设置配置文件里面的参数convertNull来设置form的转换功能.如要取消转换可将convertNull设为N

 

 

将上面的Form中的dateval类型改为java.util.Date再测试发现报错:

DateConverter does not support default String to 'Date' conversion.

这说明当actionForm实例化之后准备setDateval的时候无法将String转换为java.util.Date类型.而上面演示的由String转换成java.sql.Date是可以了.

那么下面自己定义convert类,并注册进去..让它可以把String转换为java.util.Date类型

 

以下:convert类:

package com.lwf.struts.servlet;

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

import org.apache.commons.beanutils.Converter;

public class UtilDateConverter implements Converter {

	public UtilDateConverter(Object object) {
	}

	public Object convert(Class type, Object value) {
		
		if(value == null){
			return value;
		}
			
		if(value instanceof Date){
			return value;
		}
		
		if(value instanceof String){
			try {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
				
				return sdf.parse((String)value);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
	}

}

 

 

增加一个servlet在服务器启动的时候加载

package com.lwf.struts.servlet;

import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.commons.beanutils.ConvertUtils;

public class DateConvertServlet extends HttpServlet{

	public void init() throws ServletException {
		ConvertUtils.register(new UtilDateConverter(null), Date.class);
	}

}

 

 

配置web.xml加入以下内容,并重启web服务

<servlet>
		<servlet-name>DateConvertServlet</servlet-name>
		<servlet-class>com.lwf.struts.servlet.DateConvertServlet</servlet-class>
		<load-on-startup>10</load-on-startup>
	</servlet>

 

 

把convertForm 的dateval改为java.util.Date类型.

在表单中输入2009/03/02

结果为:

intvalue:0
doublevalue:0.0
booleanvalue:false
sqldatevalue:Mon Mar 02 00:00:00 CST 2009

 实践表明,调用了我们上面创建的convert类进行转换,将String类型转换为java.util.Date.

 

总结:

ActionServlet启动时将不同类型的convert放入map中.

  public void register(Converter converter, Class clazz) {

        converters.put(clazz, converter);

    }

 当实例化actionForm后,按照对应的属性类型在map中寻找对应的convert类调用convert方法进行类型转换.

所以我们可以创建自己的convert类,再创建一个servlet在这个servlet的init方法里面注册convert类.并让servlet能够在ActionServlet启动后跟着加载就可以了..

分享到:
评论

相关推荐

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

    自定义类型转换器是Struts 2的核心特性之一,允许开发者根据业务需求定制数据转换规则。以下将详细介绍如何创建、注册以及使用自定义类型转换器。 1. **创建自定义类型转换器** - 创建一个类,实现`org.apache....

    struts 类型转换

    在Struts的配置文件(如struts-config.xml或struts2的struts.xml)中,可以通过`&lt;form-bean&gt;`、`&lt;action&gt;`或者全局转换器配置来指定类型转换策略。例如,我们可以为特定的Action或整个应用指定自定义的转换器。 ...

    struts的[图片]文件上传和类型转换

    例如,对于日期类型,你可以创建一个实现了`Converter`接口的`UtilDateConverter`类: ```java public class UtilDateConverter implements Converter { public Object convert(Class type, Object value) { if ...

    struts的总结(struts1.x)

    Struts 1.x 支持数据类型的自动转换,但也可以通过自定义转换器来扩展这种功能。 **1. 自定义数据转换器** - 创建一个实现 `org.apache.struts.util.LabelValueConverter` 接口的类。 - 实现 `convert` 方法来完成...

    struts2总结第二章

    1. 编写一个Date类型转换类,实现Converter接口,覆盖convert方法以完成从字符串到Date的转换。 2. 在与转换类型相关类的同一包下创建一个`conversion.properties`文件,如`MyClass-conversion.properties`。 3. 在`...

    Struts2中的参数传递

    ### Struts2中的参数传递 #### 一、概述 在Web开发中,Struts2框架因其灵活、高效的特点被广泛采用。Struts2的核心之一就是...此外,通过自定义类型转换器,开发者还可以扩展Struts2的功能,实现更加灵活的应用场景。

    struts笔记

    3. **自定义类型转换器**:可以通过继承`StrutsTypeConverter`类并重写其中的方法来实现自定义类型转换器。 ```java public class CustomStrutsTypeConverter extends StrutsTypeConverter { public Object ...

    struts2验证笔录

    Struts2提供了一种机制来处理不同类型的数据转换,如将字符串转换为整数、日期等。这通常通过`TypeConverter`接口实现。具体来说,`DefaultTypeConverter`是Struts2的核心转换器,负责执行大部分类型转换任务。例如...

    在Struts 2.0中实现表单数据校验

    为了更好地理解如何在Struts 2.0中实现表单数据校验,下面将通过一个具体的例子来进行讲解。 ##### 4.1 HelloWorld Action 首先,我们来看一下HelloWorld Action类,它是实现数据校验的核心部分之一: ```java ...

    javaweb编程中常见的异常及处理方法.doc

    - 创建一个实现了`org.apache.commons.beanutils.Converter`接口的自定义转换类`DateConverter`。 - 在项目的`ActionServlet`或基类`Action`中注册该转换器。 2. **代码实现**: ```java package yg.util; ...

    Web中Date类型解决方法

    #### 一、StrutsForm中Date类型之“argumenttypemismatch”错误解决方法 在Web开发中,特别是在使用Struts框架处理表单数据时,经常会遇到日期类型处理的问题。当用户提交包含日期的表单时,如果表单中的相应字段被...

    ssha 最新 最完整 配置信息

    可以通过实现自定义的类型转换器来处理`java.util.Date`类型的转换。 **表格18**: DateConverter日期转换器类 ```java public class DateConverter implements TypeConverter { @Override public Object convert...

Global site tag (gtag.js) - Google Analytics