一、前言

笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解。好了,不说废话。

1.1、类型转换为何存在?什么是类型转换?

在MVC框架中,都是属于表示层解决方案,都需要负责收集用户请求的参数,并且将请求参数传给应用的控制器组件,但是,这里有一个问题,客户端提交的请求参数都是字符串数据类型,而java这门语言本身就是强类型语言,所以我们需要类型转换,就是把字符串类型转化为你所需要的类型。

在MVC框架中,表示层数据处理分为两个方法:客户端输入数据,服务端输出数据;客户端输入数据需要进行类型转换才能确保我们的数据类型是正确的,服务端输出数据无需经过类型转换。

简单说就是:

在javaweb中,当你在jsp页面提交一个username到servlet中,你是否在通过request.getParameter("username")去获取数据;但是

如果是一个Date时间类型呢?你是否要先指定时间的转换格式,然后再根据request.getParameter("date");获取数据之后再去转换呢?但是,你想过没有?如果是多个页面请求数据的话,那你每次打getParameter();这个方法,累吗?你不累,程序都累了。所以,Struts2 为我们提供了一种类型转换器,只需要编写固定的操作就能得到你想要的数据,简单说来,就是把表单的数据赋值给实体类。

1.2、类型转换器简单介绍

1.2.1、类型转换器需要继承DefaultTypeConverter类,需要重写该类的convertType方法。

convertType方法的作用:

1、负责对类型的转换,不过这种转换是双向的,我们可以通过判断数据的类型判断转换的方向

2、该方法有三个参数:

  context:是类型转换环境的上下文

  value:    是需要转换的参数(随转换方向不同,如果字符串向实例转换时,它是字符串数组;如果实例字符串转换时,它是实例)

  toType: 是转换后的目标参数

1.2.2、当然,你也可以继承StrutsTypeConverter是,它是Struts2为我们简化的类型转换器,是DefaultTypeConverter的子类,默认产生两个方法,更加明确的告诉你你要在哪个方法进行转换,这样就不用跟继承DefaultTypeConverter类一样,通过convertType方法里的参数toType每次去判断。继承StrutsTypeConveter该类比较简单。这里两种继承都有说到。

二、类型转换器

2.1、类型转换器有两种:局部类型转换器和全局类型转换器,就字面上的意思一样,全局和局部的。

关于类型转换器的注册方式有三种:

1、局部类型转换器仅仅对某个Action起作用

2、全局类型转换器对所有Action特定类型的属性都会起作用

3、我们可以通过注解的方式来生成类型转换器(JDK1.5以上的注解)

2.2、局部类型转换器:

新建实体类userbean:

package com.TypeConverter;

import java.util.Date;

public class userbean {
private String uname;
private String upwd;
private int uage;
private Date udate;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
public Date getUdate() {
return udate;
}
public void setUdate(Date date) {
this.udate = date;
}
public userbean(){
}
public userbean(String uname, String upwd, int uage, Date udate) {
this.uname = uname;
this.upwd = upwd;
this.uage = uage;
this.udate = udate;
}
}

userbean

建立jsp视图:这里的是Test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>局部类型转换器</title>
</head>
<body>
<h2>请输入您的注册信息</h2>
<form action="user">
<!-- 注意:name的名字必须是userbean1,跟useraction里面属性名字一样 -->
<label>用户名:</label><input type="text" name="userbean1"><br/>
<label>密&nbsp;码:</label><input type="text" name="userbean1"><br/>
<label>年&nbsp;龄:</label><input type="text" name="userbean1"><br/>
<label>生&nbsp;日:</label><input type="text" name="userbean1"><br/>
<input type="submit">
</form>
</body>
</html>

在struts.xml配置信息。我们只需要配置这个

这里的<result name="input">是错误机制处理程序,就是说当页面跳转错误或者异常问题的时候,会跳转到你指定的页面,这里笔者是让其自动跳转到原来的页面。

我们可以定义一个局部的错误处理消息提示,这里笔者没有做,但是可以了解下:

新建useraction.properties,放在同级目录下,
这里的useraction是值你继承ActionSupport的类,然后往该文件中写入:
invalid.fieldvalue.属性名=提示消息(其中属性名可以是:uname或者upwd等)
当类型转换错误就会跳转,你可以在页面上使用JSTL打印,如:
<%@ taglib uri="/struts-tags" prefix="s"%>
然后使用<s:fielderror/>该标签显示出你的提示消息

错误消息处理机制

新建useraction类,继承ActionSupport。

package com.TypeConverter;

import com.opensymphony.xwork2.ActionSupport;

//使用的是局部的类型转化器
public class useraction extends ActionSupport {
private userbean userbean1;
public userbean getUserbean1() {
return userbean1;
}
public void setUserbean1(userbean userbean1) {
this.userbean1 = userbean1;
}
public String execute(){
System.out.println(userbean1.getUname());
System.out.println("useraction");
return SUCCESS;
}
}

重点来了:我们需要新建类去继承DefaultTypeConverter,然后重写里面的方法。

这里的类名是TestType

package com.TypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; //
public class TestType extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
//需要将字符串向userbean类型转换时
if(toType==userbean.class){
//系统的请求参数是一个字符串数组
System.out.println("TestType");
String params[] = (String[]) value;
userbean user = new userbean();
user.setUname(params[0]);
user.setUpwd(params[1]);
user.setUage(Integer.parseInt(params[2]));
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
try {
user.setUdate(s.parse(params[3]));
} catch (ParseException e) {
e.printStackTrace();
}
return user;
}else if(toType==String.class){
userbean user = (userbean) value;
System.out.println("--------------------");
return "<"+user.getUname()+">";
}
System.out.println("--------------------");
return null;
}
}

在这里笔者遇到一点小问题:就是使用

SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");

s.format(param[3]);

一直报错误:Unexpected Exception caught setting 'userbean1' on 'class com.TypeConverter.useraction: Error setting expression 'userbean1' with value ['admin', '123', '20', '1992-1-2', ],直到我把userbean中的udate类型改为Date类型才能够正常走,并且把s.format换成s.parse(param[3])。疑惑。

笔者测试代码走的顺序:

先走继承DefaultTypeConverter类的TestType,然后跳转到useraction类中的execute方法。

注意:我们还需要在建一个文件,告诉程序说,我们要把数据填充到类是哪一个?新建Actionname-conversion.properties

其中-conversion.properties是固定的,需要改变只是Actionname(表示继承ActionSupport的类,这里是useraction。对应struts.xml的class)

新建useraction-conversion.properties。放在同级目录下:

该文件的内容有:

这里的userbean1是你在useraction中实例化的名字。

后面的TestType是你继承DefaultTypeConverter类的名字。这里是TestType

代码运行结果如下:

Test.jsp界面

target.jsp界面效果:

target.jsp的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>类型转化器输出结果</title>
</head>
<body>
用户名:${userbean1.uname }<br/>
密码:${userbean1.upwd }<br/>
年龄:${userbean1.uage }<br/>
生日:${userbean1.udate }<br/>
</body>
</html>

target.jsp的代码

2.3、全局类型转换

2.3.1、对指定的类型的全部属性有效。基本操作一样,只是有一点不同,properties文件放的位置和名字不同。

新建jsp页面,页面名:Test1.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用全局的类型转换器</title>
</head>
<body>
<h2>使用全局的类型转换器</h2>
<form action="Stubean">
<label>用户名:</label><input type="text" name="stu"><br/>
<label>年&nbsp;龄:</label><input type="text" name="stu"><br/>
<input type="submit">
</form>
</body>
</html>

Test1.jsp

新建实体类StuBean:

package com.TypeConverter.global;

public class StuBean {
private String uname;
private int uage;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
}

StuBean

配置struts.xml

新建StuAction类继承ActionSupport

package com.TypeConverter.global;

import com.opensymphony.xwork2.ActionSupport;

//使用全局的类型转换器
//执行顺序:类型转换器——>execute public class StuAction extends ActionSupport {
private StuBean stu; public StuBean getStu() {
return stu;
} public void setStu(StuBean stu) {
this.stu = stu;
} public String execute(){
System.out.println("StuAction");
System.out.println(stu.getUname());
return SUCCESS;
}
}

StuAction

新建GlobalTypeConverter类继承StrutsTypeConverter,这里的StrutsTypeConverter是简化类型转换器,它是DefaultTypeConverter的子类。以下是代码:

package com.TypeConverter.global;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

public class GlobalTypeConverter extends StrutsTypeConverter {

    //转化为javabean对象
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
System.out.println("Global...");
StuBean stu = new StuBean();
stu.setUname(arg1[0]);
stu.setUage(Integer.parseInt(arg1[1]));
return stu;
} //转化为String对象
@Override
public String convertToString(Map arg0, Object arg1) {
StuBean s = (StuBean)arg1;
return s.getUname()+"!!";
} }

GlobalTypeConverter

注意:全局与局部不同的地方在于properties文件名和放的位置不同,全局的文件名为:xwork-conversion.properties

位置在:

放在classes之下,有些没有classes文件,需要自己创建。

内容为:

前面的是该StuBean实体类的路径,后面的是继承StrutsTypeConverter类的类型转换器

如果要设置错误处理消息的话,我们可以添加一行代码,当页面出错的时候提示,这里笔者没有做,但是可以了解,添加代码为:

xwork.default.invalid.fieldvalue=提示消息

显示效果上面有介绍。如果你需要的话可以使用。

代码运行结果为:

Test1.jsp界面

target1.jsp界面

有谁能介绍一个录制操作的软件,谢谢。

以上就是Struts2 类型转换器的基本知识,有不足的请下方留言。谢谢。

Struts2入门(三)——数据类型转换的更多相关文章

  1. Struts2中的数据类型转换

    Struts2对数据的类型转换 一.Struts2中自带类型转换拦截器 Struts2内部提供了大量转换器,用来完成数据类型转换的问题,有如下 * boolean 和 Boolean * char和 ...

  2. Struts2入门(四)——数据输入验证

    一.前言 1.1.什么是输入验证?为什么需要输入验证? 在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我 ...

  3. Sql Server函数全解<三>数据类型转换函数和文本图像函数

    阅读目录 一:数据类型转换函数 二:文本和图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和flo ...

  4. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

  5. Sql Server函数全解(三)数据类型转换函数和文本图像函数

    一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...

  6. java struts2入门学习---自定义类型转换

    自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的. 比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区) 这里涉及到的知识点即是将String转换为任 ...

  7. <MySQL>入门三 数据定义语言 DDL

    -- DDL 数据定义语言 /* 库和表的管理 一.库的管理:创建.修改.删除 二.表的管理:创建.修改.删除 创建:create 修改:alter 删除:drop */ 1.库的管理 -- 库的管理 ...

  8. Struts2(二)之封装请求正文、数据类型转换、数据验证

    一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...

  9. Struts2(接受表单参数)请求数据自动封装和数据类型转换

    Struts2请求数据自动封装: (1)实现原理:参数拦截器 (2)方式1:jsp表单数据填充到action中的属性:        普通的成员变量,必须给set,get可以不给的.    注意点,A ...

随机推荐

  1. 写个Fragment方便的抽象基类 BaseFragment

    package com.zb.zhihuianyang.base; import android.app.Activity; import android.os.Bundle; import andr ...

  2. 不该活着的SqlHelper和DBHelper

    前言: 还记得刚学ADO.NET的情景么? 还记得当年是怎么从ADO.NET被忽悠到用SqlHelper的么? 话说从入门到走上工作岗位那些年,我们就一直被纯纯地教导或引导,ADO.NET太原始,得封 ...

  3. 扑面而来的碎片--图片3D炸裂效果初体验

    之前逛园子的时候看到 ChokCoco 的爆炸效果作品:[BOOM]一款有趣的Javascript动画效果 (大神英文有没有拼错呀←.←),觉得蛮有意思的,效果如下: 不过觉得这个爆炸效果还是偏软了一 ...

  4. 《深入理解Java虚拟机》内存分配策略

    上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...

  5. C++ std::list

    std::list template < class T, class Alloc = allocator > class list; List Lists are sequence co ...

  6. Linux命令:ps,netstat,top

    ps ps用于查看当前运行的进程.如果想查看动态的进程信息,可以使用top命令.查看详细命令帮助使用man ps. ps最常用的选项组合就是ps aux: # ps aux USER PID %CPU ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(61)-如何使用框架来开发

    系列目录 前言: 有些园友经常问如何正确快速开发,但是我告诉你没有什么帮助文档比自己动手做更加实在,不用代码生成器 这一节专门抽了些时间来非常非常详细演示这个框架的数据流,废话不多说,现在开始!下面看 ...

  8. 【前端安全】JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...

  9. MUI APP关于页面之间的传值,plusready和自定义事件

    最近在用MUI开发这个APP,发现有时候这个plusready不起作用,表现在,这个页面如果重复打开,这个plusready就进不去,然后上一个页面传过来的值,就没法接收了.这个经过MUI官方确认,是 ...

  10. jQuery的DOM操作实例(3)——创建节点&&编写一个弹窗

    一.原生JavaScript编写弹窗 二.jQuery编写弹窗 知识点归纳总结: 在原生JavaScript中,创建一个节点: var oDiv=document.createElement(&quo ...