- 浏览: 1231050 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
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启动后跟着加载就可以了..
发表评论
-
DispatchAction 和DynaValidateActionForm 结合使用时的问题
2011-03-08 16:23 936使用DispatchAction使得程序员能够大大减少acti ... -
ActionForm中使用集合属性并自动组装数据
2011-01-18 14:32 929http://blog.csdn.net/m0085_cn/a ... -
Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
2010-11-10 14:13 976开的过程中碰到问题:Cannot find bean org. ... -
Struts 结合 Validate框架验证详解
2010-10-25 14:00 1508转自:http://student.csdn.net/spac ... -
JSTL与struts1标签
2010-08-31 10:17 1555JSTL与struts标签: http://www.360d ... -
如何自动清空struts表单域
2010-06-30 17:44 1270为了某种需要,formBean的SCOPE设置成了ses ... -
form验证与动态验证框架
2010-06-06 17:22 1391form验证返回ActionErrors. 动态验证则实现J ... -
resourcebundleeditor在eclipse里面的设置和使用
2010-05-30 11:30 1752我们一般使用native2ascii工具得到struts资源文 ... -
使用DispatchAction分发
2010-04-07 18:04 1160应用中经常有增、删、改、查操作,如果象一前一样使用List ... -
forward属性与ForwardAction类
2010-04-07 17:08 1174forward属性与ForwardAction类在配置文件按以 ... -
struts容错处理
2010-04-07 15:20 1189struts容错处理: 当客户请求的action不存在的时候 ... -
struts声明式异常二
2010-04-07 15:18 1176上文如果资源文件改为: error.login.usernu ... -
struts声明式异常一
2010-04-06 23:10 1058struts声明式异常: 在配置文件中配置exception ... -
struts编程式异常--html:error与html:message
2010-04-03 11:39 2042struts编程式异常过程: 截获异常信息;创建异常信息; ... -
struts国际化,从资源文件读取异常信息
2010-04-03 01:56 1201示例演示登录时从资源文件读取用户名或密码错误信息 logon ... -
struts国际化,资源文件读取三
2010-04-02 23:42 1031本示例演示客户进行语言设置,从而更改整个系统语言. 客户在c ... -
struts国际化,资源文件读取二
2010-04-02 22:18 1638package com.lwf.struts.util; ... -
struts国际化,资源文件读取一
2010-04-02 00:19 1378国际化的发展 看本文之前可先看一下properties文件的 ... -
struts html标签自动保存提交的表单值。
2010-04-01 17:01 2064我们之前JSP提交值后如果还要取得值怎么做? 应该是取得a ... -
ActionMapping相关
2010-04-01 16:02 1086一、Map的设置map.put("path" ...
相关推荐
自定义类型转换器是Struts 2的核心特性之一,允许开发者根据业务需求定制数据转换规则。以下将详细介绍如何创建、注册以及使用自定义类型转换器。 1. **创建自定义类型转换器** - 创建一个类,实现`org.apache....
在Struts的配置文件(如struts-config.xml或struts2的struts.xml)中,可以通过`<form-bean>`、`<action>`或者全局转换器配置来指定类型转换策略。例如,我们可以为特定的Action或整个应用指定自定义的转换器。 ...
例如,对于日期类型,你可以创建一个实现了`Converter`接口的`UtilDateConverter`类: ```java public class UtilDateConverter implements Converter { public Object convert(Class type, Object value) { if ...
Struts 1.x 支持数据类型的自动转换,但也可以通过自定义转换器来扩展这种功能。 **1. 自定义数据转换器** - 创建一个实现 `org.apache.struts.util.LabelValueConverter` 接口的类。 - 实现 `convert` 方法来完成...
1. 编写一个Date类型转换类,实现Converter接口,覆盖convert方法以完成从字符串到Date的转换。 2. 在与转换类型相关类的同一包下创建一个`conversion.properties`文件,如`MyClass-conversion.properties`。 3. 在`...
### Struts2中的参数传递 #### 一、概述 在Web开发中,Struts2框架因其灵活、高效的特点被广泛采用。Struts2的核心之一就是...此外,通过自定义类型转换器,开发者还可以扩展Struts2的功能,实现更加灵活的应用场景。
3. **自定义类型转换器**:可以通过继承`StrutsTypeConverter`类并重写其中的方法来实现自定义类型转换器。 ```java public class CustomStrutsTypeConverter extends StrutsTypeConverter { public Object ...
Struts2提供了一种机制来处理不同类型的数据转换,如将字符串转换为整数、日期等。这通常通过`TypeConverter`接口实现。具体来说,`DefaultTypeConverter`是Struts2的核心转换器,负责执行大部分类型转换任务。例如...
为了更好地理解如何在Struts 2.0中实现表单数据校验,下面将通过一个具体的例子来进行讲解。 ##### 4.1 HelloWorld Action 首先,我们来看一下HelloWorld Action类,它是实现数据校验的核心部分之一: ```java ...
- 创建一个实现了`org.apache.commons.beanutils.Converter`接口的自定义转换类`DateConverter`。 - 在项目的`ActionServlet`或基类`Action`中注册该转换器。 2. **代码实现**: ```java package yg.util; ...
#### 一、StrutsForm中Date类型之“argumenttypemismatch”错误解决方法 在Web开发中,特别是在使用Struts框架处理表单数据时,经常会遇到日期类型处理的问题。当用户提交包含日期的表单时,如果表单中的相应字段被...
可以通过实现自定义的类型转换器来处理`java.util.Date`类型的转换。 **表格18**: DateConverter日期转换器类 ```java public class DateConverter implements TypeConverter { @Override public Object convert...