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的类型转换的更多相关文章

  1. struts之类型转换

    Struts2的内置类型转换器: Struts2的内置类型转换器,可以为你处理大多数的类型转换,这包括了以下类型和String类型之间的转换! 1.String 将int,double,boolean ...

  2. Struts中类型转换踩的坑

    出现的异常: 当我输入的数据很大时候,转换后如上,这并不是我想要的, 出现问题的原因: Struts2对常用的数据类型如String.Integer.Double等都添加了转换器进行对应的转换操作. ...

  3. Struts个人总结

    编写Struts2第一个程序 Struts2是目前最流行的MVC框架,吸收了传统Struts和WebWork两者的精华,基于Struts2来进行开发可以大大减少开发时间,提高开发效率,并降低后期维护时 ...

  4. java学习笔记 (2) —— Struts2类型转换、数据验证重要知识点

    1.*Action.conversion-properties 如(point=com.test.Converter.PointListConverter) 具体操作类的配置文件 2.*Action. ...

  5. struts2框架之类型转换(参考第二天学习笔记)

    类型转换 1. 什么是类型转换 刚才学习了封装请求参数,把表单数据封装到Action(模型)的属性中.表单中的数据都是String类型,但Action(模型)的属性不一定什么类型. 将来我们还需要数据 ...

  6. struts2随笔

    1.struts.properties配置常量等同于struts.xml中配置(置于类加载路径下面)struts.multipart.maxSize文件上传最大大小struts.action.exte ...

  7. Struts1使用技巧

    转自:https://blog.csdn.net/chjttony/article/details/6099101 1.Struts1是Apache推出的java web开发领域一个比较早,同时也是使 ...

  8. struts2学习之基础笔记3

    第8章Struts 2类型转换 使用类型转换器 自定义类型转换器 步骤:1. Struts 2 构建流程 2.自定义类型转换器类(继承 DefaultTypeConverter /StrutsType ...

  9. struts基于ognl的自动类型转换需要注意的地方

    好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...

随机推荐

  1. 再分析 返回值加引用&,const

    本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...

  2. Hibernate征途(五)之继承映射和组件映射

    之所以把这两种映射放到一起说,是因为二者都是以复用为目的,减少了代码和配置量,这是相同点:二者之间的不同点类似继承和实现的区别:继承的类是一个事物的抽象,而实现的接口仅仅是功能的抽象. 继承映射 如上 ...

  3. (转)详解LVS负载均衡之三种工作模型原理和10种调度算法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linuxnx.blog.51cto.com/6676498/1195379 LV ...

  4. ASCII码表详解

    第一部分:ASCII非打印控制字符表 ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备.例如,12代表换页/新页功能.此命令指示打印机跳到下一页的开头.(参详ASCII码表 ...

  5. Java版本的删除指定目录及子目录下名叫“xxx.txt”的所有文件

    以前写过一个python版本的,但是在查找文件路径的时候出现错误,无法正确的获取到文件的路径,就造成无法删除该路径下的“xxx.txt”文件. 当时以为是windows版本系统的错误造成这个问题的,也 ...

  6. 如何在 OS X Yosemite 中安装 Java

    如果你的 Mac 纯净的安装了 OS X Yosemite 的话,其中是不会包含 Java 的,如果你的 Mac 需要安装 Java 环境的话,可以通过下面介绍的两种方法来实现.通过手动安装最新版 J ...

  7. poj 2049 Finding Nemo(优先队列+bfs)

    题目:http://poj.org/problem?id=2049 题意: 有一个迷宫,在迷宫中有墙与门 有m道墙,每一道墙表示为(x,y,d,t)x,y表示墙的起始坐标d为0即向右t个单位,都是墙d ...

  8. hibernate实体的几种状态:

    hibernate实体的几种状态: 实体的生命周期中,实体主要经过瞬时(Transient),托管(Attatched或Managed),游离(Detached)和销毁(Removed)四个状态. 瞬 ...

  9. 使用simhash以及海明距离判断内容相似程度

    算法简介 SimHash也即相似hash,是一类特殊的信息指纹,常用来比较文章的相似度,与传统hash相比,传统hash只负责将原始内容尽量随机的映射为一个特征值,并保证相同的内容一定具有相同的特征值 ...

  10. bzoj1293

    简易贪心+heap 注意要用链表 type link=^node;      node=record        loc:longint;        next:link;      end;   ...