一、类型转换器的应用场景

类型转换是OGNL的一部分,默认的八种基本类型、String、Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在很多领域,但是在web领域,因为在客户端到服务器端传输的只是字符串,所以这里就有一个需求收缩,我们的需求就变为完成String和复杂对象之间的互相转换。
在Struts2中的类型转换则是在客户端的请求参数往Action的成员属性中设置的时候会被调用。

二、如何使用?

1.理论部分

所有的类型转换器都要实现TypeConverter接口,Struts2有需求收缩,只满足 String<-->复杂对象 就可以了,所以它提供了一个抽象类叫做StrutsTypeConverter,我们自定义的类型转换器只要继承这个类然后实现它的两个抽象接口就可以了。
我们写完了这个类型转换器的代码,但是怎么才能让Struts2知道去使用它呢?这里分为了两种情况:

Action级别
在Action的同级别目录下放置“ActionName-conversion.properties”,在此文件使用“propertyName=typeConverterClassName”的格式为属性指定类型转换器。
比如:
文件名:PointAction-conversion.properties
内容:point=struts_practice_005.PointTypeConverter

全局级别
在类路径下放置“xwork-conversion.properties”,在此文件中使用“ObjectName=typeConverterClassName”的格式为对象指定类型转换器。
比如:
文件名:xwork-conversion.properties
内容:struts_practice_006.Circle=struts_practice_006.CircleTypeConverter

总结一下:
定义一个类型转换器分为两步:
1.继承StrutsTypeConverter,实现它的两个抽象方法。
2.写properties文件告诉Struts2应该如何使用。

2.实践部分

两个例子(Action级别类型转换器 & 全局级别类型转换器):

2.1 一个字符串到Point对象的转换。(使用Action级别)
结构如下:

Point:

/*** 表示一个点* @author CC11001100* */
public class Point {private double x;private double y;public Point() {}public Point(double x, double y) {super();this.x = x;this.y = y;}@Overridepublic String toString() {//toString--> (x,y)return "("+x+","+y+")";}public double getX() {return x;}public void setX(double x) {this.x = x;}public double getY() {return y;}public void setY(double y) {this.y = y;}}

import com.opensymphony.xwork2.ActionSupport;public class PointAction extends ActionSupport {private Point point;@Overridepublic String execute() throws Exception {System.out.println(point);return super.execute();}public Point getPoint() {return point;}public void setPoint(Point point) {this.point = point;}}

import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;/*** 完成 Point对象<-->String 的互相转换* * @author CC11001100* */
public class PointTypeConverter extends StrutsTypeConverter {/*** 这个方法完成从String-->Point的类型转换*/@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {if (values.length > 0) {String s = values[0];String ss[] = s.split(",");if (ss.length != 2)return null;double x = Double.parseDouble(ss[0].substring(1, ss[0].length()));double y = Double.parseDouble(ss[1].substring(0, ss[1].length() - 1));return new Point(x, y);} else {return null;}}/*** 这个方法完成从Point-->String的转换*/@Overridepublic String convertToString(Map context, Object o) {// 偷个懒,直接调用toString()if (o != null)return o.toString();return null;}}

配置PointAction-conversion.properties(Action级别):

point=struts_practice_005.PointTypeConverter

struts.xml:

<struts><package name="default" namespace="/" extends="struts-default"><action name="pointAction" class="struts_practice_005.PointAction"><result >/result.jsp</result></action></package>
</struts>

前端页面:

<form action="pointAction" method="post"><input type="text" name="point" /><input type="submit" value="提交" /></form>

结果当然是转换成功啦,可以看到控制台的打印结果:

前端页面的显示结果:

当客户端发来的请求参数point=(1,2)发送到服务器的时候,它设置之前会看一下是否给这个对象设置了类型转换器,如果设置了就交给类型转换器就可以了,所以这里是调用了PointTypeConverter的convertFromString()方法。

2.2 一个字符串到Circle对象的转换。(使用全局级别)

概览:

Circle:

/*** 表示一个圆* * @author CC11001100* */
public class Circle {// 圆的半径private double r;public Circle() {}public Circle(double r) {super();this.r = r;}@Overridepublic String toString() {// toString() --> "C:rxx"return "C:r" + r;}public double getR() {return r;}public void setR(double r) {this.r = r;}}

CircleAction:

import com.opensymphony.xwork2.ActionSupport;public class CircleAction extends ActionSupport {private Circle circle;@Overridepublic String execute() throws Exception {return SUCCESS;}public Circle getCircle() {return circle;}public void setCircle(Circle circle) {this.circle = circle;}}

CircleTypeConverter:

/*** 完成从 String<-->Circle 的互相转换.* @author CC11001100**/
public class CircleTypeConverter extends StrutsTypeConverter {@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {if (values.length > 0) {String s = values[0];if(s.indexOf("C:r")==-1) return null;s=s.substring(3,s.length());double r=Double.parseDouble(s);return new Circle(r);} else {return null;}}@Overridepublic String convertToString(Map context, Object o) {if(o!=null) return o.toString();return null;}}

struts.xml

<struts><package name="default" namespace="/" extends="struts-default"><action name="circleAction" class="struts_practice_006.CircleAction"><result >/result.jsp</result></action></package>
</struts>

xwork-conversion.properties:

struts_practice_006.Circle=struts_practice_006.CircleTypeConverter

前端:

<form action="circleAction" method="post"><input type="text" name="circle" /> <input type="submit" value="提交" />
</form>

result.jsp:

<s:property value="circle" /><s:debug />

输入:

输出:

<s:property value="circle" /> 得到的值使用了类型转换器,<s:debug />显示的ValueStack中的值没有使用类型转换器,证明:
给类型转换器的convertToString加点料。如下:

public class CircleTypeConverter extends StrutsTypeConverter {...@Overridepublic String convertToString(Map context, Object o) {if(o!=null) return o.toString()+"类型转换器";return null;}}

如图:

三、工作原理?

待更、

转载于:https://www.cnblogs.com/cc11001100/p/5937199.html

Struts2之类型转换器相关推荐

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

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

  2. Struts2自定义类型转换器、自定义拦截器和用户输入数据的验证

    一.自定义类型转换器 1.编写一个类,继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter 2.覆盖掉其中的public Obj ...

  3. Struts2(批量类型转换器struts2.3.4)

    批量类型转换器 package com.wildcat.converter;import java.util.ArrayList; import java.util.List; import java ...

  4. Struts2自定义类型转换器

    重要重要:以后一定要导对包,到错了一个包纠结了一天重点内容 一.Struts2中有自带类型转换器也有自定义类型转换器 1)比如表单提交的信息有 用户名,生日, 年龄, Action中对应的数据类型分别 ...

  5. struts2类型日期类型转换器的bug

    http://www.cnblogs.com/jingpeipei/p/5945724.html 按照操作没有问题.但是自己操作就有问题. 最后发现struts2的类型转换器在输出是必须用strut2 ...

  6. Struts2自定义的转换器

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://www.itivy.com/java/archive/2012/3/6/6346664752875153 ...

  7. 8.Struts2类型转换器

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

  8. Struts2下创建自定义类型转换器(表单中日期的处理)

    在表单提交中需要有日期的输入,默认的Struts2处理机制可能不能满足需求,需要自定义一下类型转换器.如: String----->java.util.Date:输入 java.util.Dat ...

  9. struts2教程:12、自定义类型转换器

    自定义类型转换器 有两种:1.局部.2.全局 java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值.但如果我们需要接收格式为20091221的请求参数,我们必须定义类型 ...

最新文章

  1. python openstack rabbitmq_OpenStack--Rabbitmq组件消息队列
  2. (十二)C3P0连接池使用教程
  3. android触屏音文件地址,Android音视频-音频采集
  4. micropython教程nucleo-f767zi开发板_教你做CMSIS-DAP仿真器(基于Nucleo-F767ZI)
  5. HDU2081 手机短号【水题】
  6. 2021如何提升网站的排名?SEO
  7. [LeetCode] Maxium Subarray
  8. 期货及衍生品基础 - 概述总结
  9. 上海交通大学计算机科学与技术招生网,上海交通大学计算机科学与技术研究生招生...
  10. IP问问区县级别IP地址库---使用帮助(上篇)
  11. 基于python的今日头条文章抓取内含signature算法
  12. 前端需要知道的CSS函数大全
  13. 两种“猿” 两个生活
  14. oracle 01405 提取的值为null,ORA-01405 : fetched column value is NULL
  15. SpringBoot实现Java高并发秒杀系统之Service层开发(二)
  16. 高等工程热力学复习04
  17. 苹果xr十大隐藏功能_苹果iPhone12Pro隐藏功能!简单3步骤“量身高”
  18. 时间频度和时间复杂度
  19. 【Linux 内核】CFS 调度器 ③ ( 计算进程 “ 虚拟运行时间 “ )
  20. [Error] iostream.h: No such file or directory解决办法

热门文章

  1. C++调用CMD,等CMD运行完后继续运行C++
  2. android横向纵向切换,【报Bug】安卓竖屏切换到横屏后,再切换回竖屏,不能正常还原...
  3. android 程序必须有界面,Android开发之开机启动没有界面的应用程序
  4. linux机器的物理内存监控,Linux内存监控工具
  5. Table(name=“xx“)与Entity(name=“xx“) 问题
  6. 虎牙改名字服务器升级维护中,王一博“虎牙直播”被占id,无奈改了名字,新名字却被吐槽...
  7. 搜索,贪心,DP,三者的区别和联系
  8. java post加密_使用Java和PHP的BCrypt,发送加密的密码并对其进行解码 - java
  9. PAT_1032验证身份(15)
  10. 试题训练9 旋转矩阵(数组)