常规的String,int能自动转换,但是,有些类型不是这么简单,比如输入字符串,但需要Date、自定义类型,因此需要自定义类型转换
类型转换器分全局局部
按惯例,局部的优先级高于全局

需求:
1.输入yyyy-mm-dd,回显yyyy/mm/dd
2.输入电话号码,如果是座机010-11111111,回显(010)11111111
如果是手机,回显18777777777
这里对于需求1,采用局部类型转换器,对于需求2,采用全局类型转环器

Action:C1.java

package org.ah.s2;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class C1 extends ActionSupport implements ModelDriven<Model>{
private Model m;
// ------------------------------------------------------------------
public String m1() {
return "success";
}
@Override
public Model getModel() {
m = new Model();
return m;
}
}

模型层:Model,M2Tel

package org.ah.s2;

import java.util.Date;

public class Model {
private String uname;
private Date birthday;
private M2Tel tel; public M2Tel getTel() {
return tel;
} public void setTel(M2Tel tel) {
this.tel = tel;
} public String getUname() {
return uname;
} public void setUname(String uname) {
this.uname = uname;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
package org.ah.s2;

public class M2Tel {
private String areaCode;
private String telCode; public String getAreaCode() {
return areaCode;
} public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
} public String getTelCode() {
return telCode;
} public void setTelCode(String telCode) {
this.telCode = telCode;
} }

表示层核心代码:

index.jsp

<s:form action="m1Action" method="post">
<s:textfield name="uname" />
<s:textfield name="birthday" label="生日"/>
<input type="date" name="birthday"/>

<s:textfield name="tel" label="电话"/>
<s:submit value="测试Struts控件传值"></s:submit>
</s:form>

infoMsg.jsp

<s:property value="uname" />
<s:property value="birthday" />
<s:date name="birthday" format="MM/dd/yy"/>

<br/>
<s:property value="tel" />
<s:debug></s:debug>

errorMsg.jsp无关大局,略

类型转化器

DataConverter.java

package org.ah.s2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class DataConverter extends StrutsTypeConverter { @Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) { if (arg1[0] != null && !"".equals(arg1[0])) {
// 判断一下要转为哪种类型 assignable:可指定的
if (Date.class.isAssignableFrom(arg2)) {
return stringToDate(arg1[0]);
} else if (M2Tel.class.isAssignableFrom(arg2)) {
return stringToTel(arg1[0]);
}
}
return null;
} private Date stringToDate(String inPara) {
System.out.println("String转为Date");
Date date = null;
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-mm-dd");
try {
date = fmt.parse(inPara);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
} private M2Tel stringToTel(String inPara) {
System.out.println("String转为Tel");
M2Tel tel = new M2Tel(); if (inPara.indexOf("-") < 0) {
// 手机:indexOf("-")等于-1
tel.setTelCode(inPara);
} else {
// 座机
String[] split = inPara.split("-");
tel.setAreaCode(split[0]);
tel.setTelCode(split[1]);
}
return tel; } @Override
public String convertToString(Map arg0, Object arg1) { String format = "";
if (arg1 instanceof Date) {
return deteToString(arg1);
} else if (arg1 instanceof M2Tel) {
return telToString((M2Tel) arg1);
}
return format;
} private String deteToString(Object Obj_in) {
System.out.println("Date转为String");
SimpleDateFormat fmt = new SimpleDateFormat("yyyy/mm/dd");
return fmt.format(Obj_in);
} private String telToString(M2Tel tel) {
System.out.println("Tel转为String");
String format = tel.getTelCode();
String 区号 = tel.getAreaCode();
if (区号 != null && !"".equals(区号)) {
format = "(" + 区号 + ")" + format;
}
return format;
}
}

配置类型转换器:

局部:和Model放在一起;前缀是“模型类名-”;字段对应转换器
Model-conversion.properties
  

birthday=org.ah.s2.DataConverter

全局:放在src下,固定命名,Model对应转换器
xwork-conversion.properties
  

org.ah.s2.M2Tel=org.ah.s2.DataConverter

测试一下 :
  输入手机,输出
    2017/01/01 01/01/17
    18777777777
  输入座机,输出
    2017/01/01 01/01/17
    (010)88888888

Struts2:类型转换器的更多相关文章

  1. 8.Struts2类型转换器

    类型转换器1.引入在Struts2中,请求参数类型不仅可以是String,还可以是其它类型.如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,则birthday接收到的 ...

  2. struts2类型转换器、 类型转换错误 以及INPUT view

    1.1.1    Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...

  3. Struts2类型转换器

    概述 A .从一个HTML 表单到一个 Action 对象,类型转换是从字符串到非字符串.    –HTTP没有"类型" 的概念.每一项表单输入只可能是一个字符串或一个字符串数组. ...

  4. Struts2基础学习(四)—类型转换器和数据校验

    一.自定义类型转换器 1.概述      Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器.Struts2 类型转换器实际上都是基于OG ...

  5. 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】

    一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...

  6. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器   如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString   注 ...

  7. Struts2框架的自定义类型转换器

    前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...

  8. Struts2之类型转换器

    一.类型转换器的应用场景 类型转换是OGNL的一部分,默认的八种基本类型.String.Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在 ...

  9. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

随机推荐

  1. 转:Task任务调度实现生产者消费者模式 (个人理解后文)

    纯属个人愚见.欢迎加入反驳(PiDou). 1.前文大致就是,利用Queue配置的一个TaskFactory任务调度器.实现生产者消费者模式的例子..首先我就试了 第一种 FIFO(先进先出)的配置. ...

  2. ubuntu12.04静态ip设置问题

    由于linux知识不是学的很深,所以仅代表我自己的设置成功总结. 第一步是设置/etc/network/interfaces 增加静态ip设置 auto eth0iface eth0 inet sta ...

  3. win10删除或更改需要SYSTEM或Administrators权限的文件夹

    有时候我们需要删除一些系统文件夹或者文件,但是却经常会出现如下提示: 遇到这些情况,我们可以采用如下的解决手段. 一.右键单击需要更改或删除的文件夹,选择属性. 二.在弹出的窗口菜单里,选择“安全”选 ...

  4. Qt错误总结

    Qt时常发生的错误总结 1,代码有问题,但是它却告诉你别的地方-比头文件不能读取,贼蛋疼! 2,库文件问题,会出现一大堆错误,这个时候就要好好检查库文件了. 3,版本问题,Qt版本升级时有些东西会变化 ...

  5. js 浏览器兼容的一些方法

    使用js是一件令人很抓狂的事情,很多的浏览器兼容,一大推的代码,谁的脑袋能记住那么多的东西,只有平时多积累,所谓熟能生巧嘛..这里列出一些常用的兼容代码,一点点积累哈~~~     一.以跨浏览器的方 ...

  6. OpenGL投影矩阵

    概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它将所有定点数据从观察坐 ...

  7. malloc原理和内存碎片[转]

    当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4.建立映射关系 ...

  8. CSS实现高度和宽度自适应

    其实用绝对定位也可以实现高度和宽度的自适应,从而出现自适应大小的区域及滚动条. <%@ Page Language="C#" AutoEventWireup="tr ...

  9. Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SS ...

  10. 微信上传文章素材—ASP.NET MVC从View层传数据到Controller层

    View层: $('#btnNews').click(function() { if (!confirm('确定要提交吗?')) { return; } var frontViewData = []; ...