常规的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. ios 多种传值方式

    在网上看了看传值方法,没有找到完整的.在这把自己看到的几种传值方法写写吧. 1 . 属性传值 2 . 通知传值 3 . 代理传值 4 . block传值 5 . 单列传值 6 . ShareAppli ...

  2. Equls 和==的区别

    对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true.对于 string ...

  3. 素数方阵的工程ing

    2016 12 12 16 12 开始 2016 12 13 17 30   还没开打 2017 1 3 ..... 一星期前貌似打完了... 如下 #include<iostream> ...

  4. form表单修改label样式

    <?php $form = ActiveForm::begin([ 'options'=>['enctype'=>'multipart/form-data','class' => ...

  5. CSS 选择器(转)

    原文转自:http://www.cnblogs.com/xyzhanjiang/p/5447406.html CSS 选择器除了样式表匹配元素时需要用到,在使用 jQuery 等库的时候也可以利用 C ...

  6. JMeter基础之--元件的作用域与执行顺序

    前面有介绍过jmeter的元件类别,对于新手来说,jmeter的元件是还是不少的,如果我们按照每一个元件的每一个参数的含义去学习,无疑会降低学习性能测试的热情,就算我们熟悉了所有元件以及元件上的参数了 ...

  7. 使用jQuery Autocomplete(自动完成)插件

    jQuery 的Autocomplete(自动完成.自动填充)插件有不少,但比较下来我感觉,还是bassistance.de 的比较强大,我们就来写一些代码感受一下. 最简单的Autocomplete ...

  8. 使用扩展方法将DataTable转换为List<T>

    在将DataTable转换为List<T>时,找到了网上的方案,原文链接:http://stackoverflow.com/questions/4593663/fetch-datarow- ...

  9. python---filecmp

    ilecmp可以实现文件,目录,遍历子目录的差异对比功能. 自带filecmp模块,无需安装. 常用方法说明 filecmp提供3个操作方法,cmp(单文件对比),cmpfile(多文件对比),dir ...

  10. Mysql5.5源码安装步骤笔记记录

    1.cmake软件的安装wget https://cmake.org/files/v3.5/cmake-3.5.0-rc3.tar.gztar xf cmake-3.5.0.tar.gzcd cmak ...