Struts的类型转换
struts中jsp提交的数据,struts会自动转换为action中的属性类型;
对于基本的数据类型以及日期类型会自动转换;
就像前面那一篇博客的代码封装一样,会把字符串类型传过来的数据转化为相应的数据;
现在又有一种情况,日期的类型有很多种形式,我们上次输入的是这种形式:2016-12-13,会正常的显示,并且传给后台,但是日期的格式很多种,而一旦我们改成这样20161213,就会出现问题了,如下:(页面还是会相应的跳转的)

那么,现在问题来了,就需要自定义类型格式的转换;
对于基本数据类型以及yyyy-MM-dd日期类型的日期格式会自动转换;
而其他的格式的转换,需要自定义类型转换器,有两种类型:局部类型转换器和全局类型转换器。
Struts转换器API
—TypeConverter 转换器接口
—DefaultTypeConverter 默认类型的转换器类(实现复杂,一般不去用)
—StrutsTypeConverter 用户编写的转换器接口,继承此类即可
转换器开发步骤
局部转换器
1、写转换器类(一般在工具包写去写)
package com.type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* 自定义类型转换器
* @author Administrator
*要求:格式支持yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日
*/
public class MyConverter extends StrutsTypeConverter {
//先定义格式
DateFormat df[]={
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy年MM月dd")
};
/**
* 把struts转换为指定的类型 [现在 的目标是把string转化为Date]
* @param arg0 当前的上下文环境
* @param arg1 jsp表单提交的字符串的值
* @param arg2 要转换的目标类型
*/
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
// TODO Auto-generated method stub
SimpleDateFormat sdf=new SimpleDateFormat("yyMMdd");
System.out.println("hhh");
//判断
if (arg1 == null || arg1.length==0) {
return null;
}
//判断类型必须为Date
if (Date.class !=arg2) {
return null;
}
//迭代,转换失败,就继续下一个格式的转换,转换成功直接返回
for (int i = 0; i < df.length; i++) {
try {
return df[i].parse(arg1[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
}
2、配置转换器类(告诉struts应用自己的转换器,必须在类的同一个包下写)
在同包的action目录下,新建一个properties文件,
命名规则是:ActionClassName-conversion.properties;
user.birth=com.type.MyConverter
项目截图

总结:这个局部的转换器不能给不其它action使用
这个时候要用全局的转换器
需要写一个转换器,给所有的action用!
配置全局类型转换器
-->src/xwork-conversion.properties
-->内容
java.util.Data=转换器类(com.type.MyConverter)
java.util.Date=com.type.MyConverter
项目截图

js小练习:选项卡2.0版
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>选项卡</title>
<style type="text/css" media="screen">
#div1 {
width: 200px;
position: relative;
}
#div1 span:first-of-type {
position: absolute;
left: 0;
top: 100px;
display: none;
}
#div1 span:last-of-type {
position: absolute;
right: 0;
top: 100px;
display: none;
}
#div1 div {
width: 200px;
height: 200px;
border: 1px #000 solid;
display: none;
}
#div1 input.active {
background: red;
}
#div2 div {
width: 200px;
height: 200px;
border: 1px #000 solid;
display: none;
}
#div2 input.active {
background: red;
}
</style>
</head>
<script type="text/javascript">
window.onload = function() {
tab('div1');
function tab(id) {
var oParent=document.getElementById(id);
var aInput = oParent.getElementsByTagName('input');;
var aDiv=oParent.getElementsByTagName('div');
var aSpan=oParent.getElementsByTagName('span');
var iNow=0;
//按钮点击
for (var i = aInput.length - 1; i >= 0; i--) {
aInput[i].index=i;
aInput[i].onclick=function () {
change(this.index);
iNow=this.index;
}
}
//鼠标靠近选择按钮出现及消失
oParent.onmouseover=function () {
for (var i = aSpan.length - 1; i >= 0; i--) {
aSpan[i].style.display='block';
}
}
oParent.onmouseout=function () {
for (var i = aSpan.length - 1; i >= 0; i--) {
aSpan[i].style.display='none';
}
}
//为span添加点击事件
aSpan[1].onclick=function () {
if (iNow==aDiv.length-1) {
iNow=0;
}else{
iNow++;
}
change(iNow);
}
aSpan[0].onclick=function () {
if (iNow==1) {
iNow=aDiv.length-1;
}else{
iNow--;
}
change(iNow);
}
//因为事件的发生而刺激切换的函数
function change(iNow){
for (var i = aInput.length - 1; i >= 0; i--) {
aInput[i].className='';
aDiv[i].style.display='none';
}
aInput[iNow].className='active';
aDiv[iNow].style.display = 'block';
}
}
}
</script>
<body>
<div id="div1">
<input type="button" class="active" name="" value="1">
<input type="button" name="" value="2">
<input type="button" name="" value="3">
<div style="display: block;">11111111111</div>
<div>22222222222222 </div>
<div>33333333333333 </div>
<span><—</span>
<span>—></span>
</div>
</body>
</html>
效果如图:

Struts的类型转换的更多相关文章
- struts之类型转换
Struts2的内置类型转换器: Struts2的内置类型转换器,可以为你处理大多数的类型转换,这包括了以下类型和String类型之间的转换! 1.String 将int,double,boolean ...
- Struts中类型转换踩的坑
出现的异常: 当我输入的数据很大时候,转换后如上,这并不是我想要的, 出现问题的原因: Struts2对常用的数据类型如String.Integer.Double等都添加了转换器进行对应的转换操作. ...
- Struts个人总结
编写Struts2第一个程序 Struts2是目前最流行的MVC框架,吸收了传统Struts和WebWork两者的精华,基于Struts2来进行开发可以大大减少开发时间,提高开发效率,并降低后期维护时 ...
- java学习笔记 (2) —— Struts2类型转换、数据验证重要知识点
1.*Action.conversion-properties 如(point=com.test.Converter.PointListConverter) 具体操作类的配置文件 2.*Action. ...
- struts2框架之类型转换(参考第二天学习笔记)
类型转换 1. 什么是类型转换 刚才学习了封装请求参数,把表单数据封装到Action(模型)的属性中.表单中的数据都是String类型,但Action(模型)的属性不一定什么类型. 将来我们还需要数据 ...
- struts2随笔
1.struts.properties配置常量等同于struts.xml中配置(置于类加载路径下面)struts.multipart.maxSize文件上传最大大小struts.action.exte ...
- Struts1使用技巧
转自:https://blog.csdn.net/chjttony/article/details/6099101 1.Struts1是Apache推出的java web开发领域一个比较早,同时也是使 ...
- struts2学习之基础笔记3
第8章Struts 2类型转换 使用类型转换器 自定义类型转换器 步骤:1. Struts 2 构建流程 2.自定义类型转换器类(继承 DefaultTypeConverter /StrutsType ...
- struts基于ognl的自动类型转换需要注意的地方
好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...
随机推荐
- int21 h
表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异 ...
- ruby中Block, Proc 和 Lambda 浅析
Block 与Proc的区别: Block是代码块,Proc是对象: 参数列表中最多只能有一个Block, 但是可以有多个Proc或Lambda; Block可以看成是Proc的一个类实例. Proc ...
- 1316. Electronic Auction(树状数组)
1316 我想说 要不要这么坑 WA了一个小时啊 ,都快交疯了,拿着题解的代码交都WA 最后很无语的觉得题解都错了 重读了N遍题意 发现没读错啊 难道写题解的那个人和我都想错了?? 最后把g++换个C ...
- bzoj3294
感觉自己就是不怎么擅长计数的问题 设f[k,i,j]表示前k种颜色占据了i行j列的方案 g[k,i,j]表示第k种颜色占据了i行j列的方案,注意要减去并没占据满i行j列的情况 然后转移就很好写了 像这 ...
- Vs 引用第三方DLL文件 版本不一致问题 (npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案)
最近在 做 MailChimp 与网站功能 集成时,发现 MailChimp 2API 中的 MailChimp.dll 中的依赖项 SerivceStack.Text.dll (版本为3.9.71 ...
- 【转】DBCP连接池原理分析
---------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3. DB ...
- NET下RabbitMQ实践[示例篇]
在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容. 今天将会介绍如果使用rabbitmq进行简单的消息入队, ...
- 基于WebForm+EasyUI的业务管理系统形成之旅 -- ParamQueryGrid行、列合并(Ⅸ)
上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划查询(Ⅷ)>,主要介绍通过报表工具数据钻取,获取施工计划详细信息. 这篇我们看看ParamQueryGrid[行 ...
- 使用VS2010调用matlab的mat格式文件
做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如 ...
- codeforces 629D 树状数组+LIS
题意:n个圆柱形蛋糕,给你半径 r 和高度 h,一个蛋糕只能放在一个体积比它小而且序号小于它的蛋糕上面,问你这样形成的上升序列中,体积和最大是多少 分析:根据他们的体积进行离散化,然后建树状数组,按照 ...