层层递进Struts1(六)自定义转换器
Struts提供的类型转换有限,如果我们强行使用没有的类型转换,则会出现错误,以Date类型为例:
org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception java.lang.IllegalArgumentException: Cannot invoke com.tgb.struts1.TypeCovertActionForm.setUtilDate - argument type mismatch
在此我们来建立java.util.Date的转换器。
Servlet版
Converter
数据转换器,代码如下:
package com.tgb.struts1; import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.commons.beanutils.ConversionException; import com.sun.org.apache.commons.beanutils.Converter; public class UtilDateConverter implements org.apache.commons.beanutils.Converter { public Object convert(Class type, Object value) { if (value instanceof Date) {
return (value);
}
Date date=null;
if (value instanceof String) {
try {
date=new SimpleDateFormat("yyy-MM-dd").parse((String)value);
} catch (Exception e) {
e.printStackTrace();
}
}
return date;
}
}
Servlet
为的是将上面的转换器注册到ConvertUtils中:
package com.tgb.struts1; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import org.apache.commons.beanutils.ConvertUtils; public class UtilServlet extends HttpServlet { public void init()throws ServletException
{
ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
}
}
配置文件
在web.xml中添加配置,因为转换器在Tomcat启动之时就加载,所以此处要将load-on-startup设置为大于0的值:
<servlet>
<servlet-name>UtilServlet</servlet-name>
<servlet-class>com.tgb.struts1.UtilServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
测试
jsp
<h4>测试struts的转换器</h4>
<form action="typeconvert.do" method="post" >
int value:<input type="text" name="intValue" /> <br/>
double value:<input type="text" name="doubleValue" /> <br/>
boolean value:<input type="text" name="booleanvVlue" /> <br/>
java.sql.date:<input type="text" name="sqlDate" /> <br/>
java.util.date:<input type="text" name="utilDate" /> <br/>
<input type="submit" value="提交" /> <br/>
</form>
结果
plugin版
plugin
package com.tgb.struts1; import javax.servlet.ServletException; import org.apache.commons.beanutils.ConvertUtils;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig; public class UtilDateConverterPlugin implements PlugIn { public void destroy() {
// TODO Auto-generated method stub
}
public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
}
}
配置文件
在struts-config中放入:
<plug-in className="com.tgb.struts1.UtilDateConverterPlugin" />
测试结果
总结
在此体会到面向抽象编程所带来的可扩展的好处,这篇博客中的两个自定义的转换器过程基本一致:实现接口写出转换器、更改配置文件保证可以在Tomat加载即注册。
更多相关博客,请至《层层递进Struts1(八)之总结》
层层递进Struts1(六)自定义转换器的更多相关文章
- 层层递进Struts1(八)之总结
先来看一下Struts1学习总结的思维导图,画的主要是Struts1中的重点和博客分布,如下所示: 系列博客的侧重点是: Struts1是什么? 为什么要使用它? 如何使用Struts1? Strut ...
- 层层递进Struts1(三)之Struts组成
这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤:获取路径.封装表单.获取转向列表.转向逻辑处理.转向,与此对应的是:ActionServlet.Act ...
- 层层递进Struts1(七)详解DispatchAction
通过前面几篇博客,不知道大家有没有发现这个问题,虽然现在可以灵活控制跳转了,但是Action的数量还是比较多,如何既能保证跳转灵活,还能减少Action的数量?这就是我们这篇博客所说的Dispatch ...
- 层层递进Struts1(五)之处理流程
这篇博客我们深入Struts框架执行部分源码,从ActionServlet的process函数开始,看一下其内在的执行过程. 流程图 以下流程图展示的是ActionServlet和RequestPro ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- spring mvc 自定义转换器
<!-- 注册转化器 --> <mvc:annotation-driven conversion-service="conversionService" /> ...
- Struts2 请求数据的自动封装 及 自定义转换器类
请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...
- Hadoop化繁为简(二)—层层递进轻松入门hdfs
层层递进-解开hdfs的面纱 1.hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么? 2.hdfs的工作原理是怎样的? 3.每台机器都单独启动有什么弊端?假设有1000台机器需要启动 ...
- Flask自定义转换器,实现路由匹配正则表达式参数
Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...
随机推荐
- 【Nutch2.3基础教程】集成Nutch/Hadoop/Hbase/Solr构建搜索引擎:安装及运行【集群环境】
1.下载相关软件,并解压 版本号如下: (1)apache-nutch-2.3 (2) hadoop-1.2.1 (3)hbase-0.92.1 (4)solr-4.9.0 并解压至/opt/jedi ...
- Javascript兼容收集
1.IE6背景缓存 try{ document.execCommand("BackgroundImageCache", false, true); }catch(e){} 2. e ...
- 在windows下获取硬盘序列号(win7 32位,Windows Server 64位测试,希望在其他平台测试,遇到问题的网友留言分享)
#include <Windows.h> #include <stdio.h> // IOCTL控制码 // #define DFP_SEND_DRIVE_COMMAND CT ...
- Jasper_crosstab_columngroup header position config - (headerPosition="Stretch")
Position of Totals RowThe totalPosition attribute controls the appearance of the row that displays t ...
- [UVA] 11995 - I Can Guess the Data Structure! [STL应用]
11995 - I Can Guess the Data Structure! Time limit: 1.000 seconds Problem I I Can Guess the Data Str ...
- Visual Studio 2013 Professional Key
今天发现家里的VS2013专业版过期了,于是google百度一顿大搜,多数key都不能用,不过还是找到一个key可以使用的. Visual Studio 2013 Professional Key: ...
- PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
本系列文章从最初的初识开始,基本上可以完成一些简单的系统管理了,为了更方便的管理系统,同时为了更好的发掘系统的性能,就需要用到系统提供 的一些高级特性,在Windows Server系列的OS中,如果 ...
- 链接一个外部lib库的时候注意事项
1.注意这个库是Debug版还是Release版,一般windows下,约定是Debug版的库文件名会加个d. 2.注意这个库是x86还是x64版本. 3.注意生成这个lib库的是什么编译器
- Azure Storage Client Library 重试策略建议
有关如何配置 Azure Storage Library 重试策略的信息,可参阅 Gaurav Mantri 撰写的一篇不错的文章<SCL 2.0 – 实施重试策略>.但很难找到关于使用何 ...
- windows10 离线包安装net3.5
找到离线镜像: 管理员命令行运行:dism.exe /online /enable-feature /featurename:netfx3 /Source:E:\sources\sxs 路径根据实际情 ...