类型转换器:

  Struts2默认情况下可以将表单中输入的文本数据转换为相应的基本数据类型。这个功能的实现,主要是由于Struts2内置了类型转换器。这些转换器在struts-default.xml中可以看到其定义。

  常见的类型,基本均可由String转换为相应的类型。但是注意:Date只能接收 yyyy-MM-dd或yyyy-MM-dd HH:mm:ss 格式的字符串。

  自定义转换器:

    1. 代码: 

package com.tongji.converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.conversion.TypeConversionException;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class MyDateTypeConverter extends DefaultTypeConverter { //value是要转换的数据,且它的类型是字符串数组,因为它要兼容前端传过来的数据,是数组,如checkbox的多选项,或者是单个数据,如text。
//如果是单个数据,在代码中就是取数组中的第一个元素。
//toType是转换成为的数据类型
@Override
public Object convertValue(Object value, Class toType) {
try {
if (toType == Date.class) { //由页面到服务器 是由String到Date类型的转换
String source = ((String[])value)[0];
SimpleDateFormat sdf = getSimpleDateFormat(source);
ActionContext.getContext().getSession().put("sdf", sdf);
return sdf.parse(source);
} else if (toType == String.class) { //数据回显:由服务器到页面 是由Date到String类型的转换
SimpleDateFormat sdf = (SimpleDateFormat) ActionContext.getContext().getSession().get("sdf");
return sdf.format((Date)value);
}
} catch (ParseException e) {
e.printStackTrace();
}
return super.convertValue(value, toType);
} private SimpleDateFormat getSimpleDateFormat(String source) {
SimpleDateFormat sdf = null;
if (Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", source)) {
sdf = new SimpleDateFormat("yyyy/MM/dd");
} else if (Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", source)) {
sdf = new SimpleDateFormat("yyyy-MM-dd");
} else if (Pattern.matches("^\\d{4}\\d{2}\\d{2}$", source)) {
sdf = new SimpleDateFormat("yyyyMMdd");
} else {
throw new TypeConversionException();
} return sdf;
} }

  其中要注意三点:一是value代表的是一个数组,二是数据类型转换是双向的,因为有数据回显的需求;三是因为判断类型转换失败时,要抛出TypeConversionException异常,以便后续处理。

  2.局部类型转换器的配置:

    局部类型转换器,仅仅对指定Action的指定属性起作用。注册方式为,在Action类所在包下放置名称为如下格式的属性文件:ActionClassName-conversion.properties文件。其中ActionClassName是Action类名,-conversion.properties是固定写法。

    该属性文件的内容遵循以下格式:属性名称=类型转换器的全类名。例如:birthday=com.tongji.converter.MyDateTypeConverter

  3. 数据回显的实现:

    (1)表单提交的前端代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<title>index page</title>
</head> <body>
<s:form action="test/login.action" method="POST">
<s:textfield name="age" label="年龄"/>
<s:textfield name="birthday" label="生日"/>
<s:submit value="提交"/>
</s:form>
</body>
</html>

    使用Struts2标签来实现

    (2)struts2.xml 代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<action name="login" class="com.tongji.actions.LoginAction">
<result name="success">/welcome.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>

    数据回显实现的关键是,当数据类型转换失败,抛出TypeConversionException 异常后,页面要求跳转到input视图,因此,要配置input视图对应的前端页面。

    (3)类型转换异常提示信息的修改:

      类型转换异常提示信息,是系统定义好的内容,若直接显示到用户页面,会使页面显得不友好。但,类型转换异常提示信息是可以修改的。步骤如下:

        Action所在包中添加名称为ActionClassName.properties的属性文件,其中ActionClassName为Action的类名。在该文件中写入内容:invalid.fieldvalue.变量名=异常提示信息

    (4)数据回显最终页面显示结果:

      

  4. 全局类型转换器配置:

    全局类型转换器,会对所有的Action的指定类型的属性生效。其注册方式为:在src目录下放置名称为 xwork-conversion.properties 属性文件。该文件的内容格式为:待转换的类型=类型转换器的全类名

    java.util.Date=com.tongji.converter.MyDateTypeConverter

Strusts2笔记4--类型转换器的更多相关文章

  1. SpringMVC学习笔记六:类型转换器及类型转换异常处理

    SpringMVC内部有类型转换器,当从Request中获取参数后,放入Controller中时,会根据Controller中指定的类型进行自动转换,当指的类型SpringMVC不能自动转换时,就需要 ...

  2. [原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

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

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

  4. struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持

    Struts2的上传 1. Struts2默认采用了apache commons-fileupload  2. Struts2支持三种类型的上传组件 3. 需要引入commons-fileupload ...

  5. struts2视频学习笔记 13-14(自定义局部和全局类型转换器(转换Date格式))

    课时13 自定义类型转换器 局部(对某个action类) package tutorial; import java.util.Date; public class HelloWorld { priv ...

  6. Mybatis特殊值Enum类型转换器-ValuedEnumTypeHandler

    引言 typeHandlers 阅读官方文档 typeHandlers 一节 {:target="_blank"} MyBatis 在预处理语句(PreparedStatement ...

  7. Spring MVC类型转换器

    类型转换器引入 为什么页面上输入"12",可以赋值给Handler方法对应的参数?这是因为框架内部帮我们做了类型转换的工作.将String转换成int 但默认类型转换器并不是可以将 ...

  8. SpringMVC类型转换器、属性编辑器

    对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器.类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到D ...

  9. 8.Struts2类型转换器

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

随机推荐

  1. Java中线程安全的集合

    如果多线程并发的访问与一个数据结构,那么很容易破坏一个数据结构. 例如,一个线程可能要向一个散列表中插入一条数据的过程中,被剥夺了控制权.如果另外一个线程也开始遍历同一个链表,很可能造成混乱,抛出异常 ...

  2. Eclipse HTML Editor

    需插件: 1.GEF 3.1 安装程序下载 下载地址: http://download.eclipse.org/tools/gef/downloads/drops/R-3.1-200507071758 ...

  3. MT【131】$a_{n+1}\cdot a_n=\dfrac 1n$

    已知数列\(\{a_n\}\)满足\(a_1=1\),\(a_{n+1}\cdot a_n=\dfrac 1n\)(\(n\in\mathbb N^*\)). (1) 求证:\(\dfrac{a_{n ...

  4. 【比赛】NOIP2017 列队

    一直忘了发,现在赶快补 用权值线段树维护有人的位置,动态开点省空间 多加的人用个vector存下来就可以了 #include<bits/stdc++.h> #define ui unsig ...

  5. 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  6. CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)

    CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先) 题意分析 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天, ...

  7. UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)

    UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...

  8. debian修改默认编辑器

    刚才在一台机器上打开 crontab -e,跳出来的编辑器是nano,太难使... 在debian下是使用 update-alternatives 命令修改默认编辑器. 先查看一下使用帮助 # upd ...

  9. 图像处理之CSC色彩转换

    1 YUV域介绍 根据三基色原理,任意一种色光F都可以用不同分量的R.G.B三色相加混合而成,即F = r [ R ] + g [ G ] + b [ B ],其中r.g.b分别为三基色参与混合的系数 ...

  10. linux命令总结之date命令

    命令简介: date 根据给定格式显示日期或设置系统日期时间.print or set the system date and time 指令所在路径:/bin/date 命令语法: date [OP ...