1. Struts2中的类型转换

我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种。所以,我们需要类型转换!

在Struts2中,类型转换的概念除了用于将界面传递过来的字符串转换为特定的类型(convertFromString)之外,还可以用于将特定的类型转换为字符串(即当我们在JSP中要把某种类型的对象呈现的时候,要将它转换为字符串来显示)(converterToString)。

在Struts2中,支持全局类型转换和局部类型转换两种方式。所谓全局类型转换,即在所有的action/model中,都用同一个类型转换器来转换某种特定类型的对象;而局部类型转换,意思就是针对某个action/model中的属性所定义的特定的类型转换器。

问题1: 如何覆盖默认的错误消息?
1). 在对应的 Action 类所在的包中新建
ActionClassName.properties 文件, ActionClassName 即为包含着输入字段的 Action 类的类名

2). 在属性文件中添加如下键值对: invalid.fieldvalue.fieldName=xxx

问题2: 如果是 simple 主题, 还会自动显示错误消息吗? 如果不会显示, 怎么办 ?
1). 通过 debug 标签, 可知若转换出错, 则在值栈的 Action(实现了 ValidationAware 接口) 对象中有一个 fieldErrors 属性.
该属性的类型为 Map<String, List<String>> 键: 字段(属性名), 值: 错误消息组成的 List. 所以可以使用 LE 或 OGNL 的方式
来显示错误消息: ${fieldErrors.age[0]}

2). 还可以使用 s:fielderror 标签来显示. 可以通过 fieldName 属性显示指定字段的错误.

问题3. 若是 simple 主题, 且使用 <s:fielderror fieldName="age"></s:fielderror> 来显示错误消息, 则该消息在一个
ul, li, span 中. 如何去除 ul, li, span 呢 ?
在 template.simple 下面的 fielderror.ftl 定义了 simple 主题下, s:fielderror 标签显示错误消息的样式. 所以修改该
配置文件即可. 在 src 下新建 template.simple 包, 新建 fielderror.ftl 文件, 把原生的 fielderror.ftl 中的内容
复制到新建的 fielderror.ftl 中, 然后剔除 ul, li, span 部分即可.

问题4. 如何自定义类型转换器 ? 
1). 为什么需要自定义的类型转换器 ? 因为 Struts 不能自动完成 字符串 到 引用类型 的 转换.
2). 如何定义类型转换器:
I. 开发类型转换器的类: 扩展 StrutsTypeConverter 类.
II. 配置类型转换器: 
有两种方式
①. 基于字段的配置: 
> 在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件
> 在该文件中输入键值对: fieldName=类型转换器的全类名. 
> 第一次使用该转换器时创建实例. 
> 类型转换器是单实例的!

②. 基于类型的配置:
> 在 src 下新建 xwork-conversion.properties
> 键入: 待转换的类型=类型转换器的全类名.
> 在当前 Struts2 应用被加载时创建实例.

如何编写类型转换器?

不管是全局类型转换,还是局部类型转换,其转换器的编写方法是相同的!只要继承StrutsTypeConverter,重写其中的方法即可。

全局类型转换

即针对整个系统中同样类型的属性定义转换器

只需:

1、  在类路径的根目录下定义xwork-conversion.properties文件

2、  在文件中用这样的格式声明哪个类型使用哪个转换器:

a)       属性类型的全路径类名=转换器的全路径类名

3、  Struts2将能自动发现这个文件,并根据其中的定义,对特定的类型调用你指定的类型转换器进行类型转换

比如Point类型:

package cn.com.leadfar.model;

public class Point {

private int left;

private int right;

public int getLeft() {

return left;

}

public void setLeft(int left) {

this.left = left;

}

public int getRight() {

return right;

}

public void setRight(int right) {

this.right = right;

}

}

针对Point类型的转换器:

package cn.com.leadfar.struts2.actions;

import Java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import cn.com.leadfar.model.Point;

public class PointConverter extends StrutsTypeConverter {

@Override

public Object convertFromString(Map context, String[] value, Class toType) {

//TODO 前提条件判断

String p = value[0];

String[] ps = p.split(",");

int left = Integer.parseInt(ps[0]);

int right = Integer.parseInt(ps[1]);

Point point = new Point();

point.setLeft(left);

point.setRight(right);

return point;

}

@Override

public String convertToString(Map context, Object point) {

Point p = (Point)point;

return p.getLeft()+"-"+p.getRight();

}

}

xwork-conversion.properties文件的内容如下:

cn.com.leadfar.model.Point=cn.com.leadfar.struts2.actions.PointConverter

局部类型转换

即针对某个Action或Model的属性定义的转换器

1、在与Action/Model类同一个包下面,定义 Action/Model类名-conversion.properties 文件

2、文件内部用这样的格式来声明哪个属性需要用哪个类型转换器:

属性名=转换器的全路径类名

比如:对于java.util.Date类型,我们可以声明不同的类使用不同的类型转换器

package cn.com.leadfar.model;

import java.util.Date;

public class User {

private Date endDate;

public Date getEndDate() {

return endDate;

}

public void setEndDate(Date endDate) {

this.endDate = endDate;

}

}

package cn.com.leadfar.struts2.actions;

import java.util.Date;

import cn.com.leadfar.model.Point;

import cn.com.leadfar.model.User;

import com.opensymphony.xwork2.ModelDriven;

public class UserAction implements ModelDriven{

private User user;

private Date beginDate;

@Override

public Object getModel() {

if(user == null){

user = new User();

}

return user;

}

public String add(){

return "success";

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public Date getBeginDate() {

return beginDate;

}

public void setBeginDate(Date beginDate) {

this.beginDate = beginDate;

}

}

假设我们希望UserAction类中的beginDate属性和User类中endDate属性,分别使用不同的类型转换器,如下所示:

package cn.com.leadfar.struts2.actions;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

public class BeginDateConverter extends StrutsTypeConverter {

private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

@Override

public Object convertFromString(Map context, String[] value, Class toType) {

String d = value[0];

try {

return format.parse(d);

catch (ParseException e) {

e.printStackTrace();

}

return null;

}

@Override

public String convertToString(Map context, Object date) {

return format.format(date);

}

}

package cn.com.leadfar.struts2.actions;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

public class EndDateConverter extends StrutsTypeConverter {

private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

@Override

public Object convertFromString(Map context, String[] value, Class toType) {

String d = value[0];

try {

return format.parse(d);

catch (ParseException e) {

e.printStackTrace();

}

return null;

}

@Override

public String convertToString(Map context, Object date) {

return format.format(date);

}

}

那么,我们需要在User类的包:cn.com.leadfar.model下面,创建一个文件,命名如下:

User-conversion.properties,文件的内容如下:

endDate=cn.com.leadfar.struts2.actions.EndDateConverter

表示User类中的endDate属性,使用EndDateConverter这个类型转换器。

然后,在UserAction类所在的包:cn.com.leadfar.struts2.actions下面,再创建一个文件,命名如下:

UserAction-conversion.properties,文件的内容如下:

beginDate=cn.com.leadfar.struts2.actions.BeginDateConverter

表示UserAction类中的beginDate属性,使用BeginDateConveter这个类型转换器。

注:在Struts1中只支持全局类型转换,而不支持局部类型转换!

初始化参数可以配置到web.xml中

  类型转换与复杂属性配合使用(可以被映射到一个属性的属性)

  类型转换与Collection配合使用(常见于需要快速录入批量数据的场合)

struts2类型转换的更多相关文章

  1. Struts2系列笔记(7)---Struts2类型转换

    Struts2类型转换      struts2中内置了大量的类型转换器用来完成数据类型转换的问题,这篇随笔主要通过两个方面来写Struts类型转换 1:Struts2内置的类型转换器 2:如何自定义 ...

  2. 14.怎样自学Struts2之Struts2类型转换[视频]

    14.怎样自学Struts2之Struts2类型转换[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pa ...

  3. struts2 类型转换

    概述 从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串. 在 struts2 中, 把请求参数映射到 action  属性的工作由 Parameters 拦截器负责, ...

  4. struts2类型转换与校验总结

    1.struts2的类型转换分为全部变量转变和局部变量转变. 2.struts2对8中常见的基本类型的属性变量,可以自动转换.如果是User对象,可以手动简历UserAction-coversion. ...

  5. struts2类型转换中的错误处理

    由于类型转换过程中有可能出现原始参数无法转换为目标类型的错误,所以struts2提供了类型转换中的异常处理机制. 在struts2的默认配置文件struts-default.xml中有如下一段配置代码 ...

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

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

  7. struts2 之 struts2类型转换

    1. 在struts2中,相比servlet来时,获取数据时,程序员没有进行手动的类型转换,类型转换工作都有struts2来完成处理,但愿对于自定义类型数据,struts2不会帮助我们完成类型转换工作 ...

  8. 【学习笔记】Struts2 类型转换

    为什么需要类型转换 在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boo ...

  9. struts2类型转换+校验

    1.action中validate()与validateXxx() 用于action执行前的校验,如果校验失败,跳到input视图, 前者校验整个Action: 后者校验该Action中的Xxx方法. ...

随机推荐

  1. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  2. 【WPF】日常笔记

    本文专用于记录WPF开发中的小细节,作为备忘录使用. 1. 关于绑定: Text ="{Binding AnchorageValue,Mode=TwoWay,UpdateSourceTrig ...

  3. 彻底搞懂Javascript的“==”

    本文转载自:@manxisuo的<通过一张简单的图,让你彻底地.永久地搞懂JS的==运算>. 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容让人犯错,从而 ...

  4. 【干货分享】流程DEMO-合同会审表

    流程名: 合同会审表  业务描述: 合同的审批及签订  流程相关文件: 流程包.xml 事务呈批表业务服务.xml 事务呈批表主数据.xml  流程说明: 1.此流程必须先进行事务呈批表流程的配置才可 ...

  5. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  6. Android studio使用git教程

    ①下载Git工具,配置到Android studio中 http://git-scm.com/downloads ------------------------------------------- ...

  7. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  8. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写

    主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...

  9. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  10. 推荐一个不错的在线制图网站---ProcessOn

    http://www.processon.com/ 它是什么? ProcessOn是一个面向垂直专业领域的作图工具和社交网络,成立于2011年6月并于2012年启动.ProcessOn将全球的专家顾问 ...