- 浏览: 516890 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
九。类型转换中的错误处理
实际上,表现层数据涉及的 2 个处理: 数据校验和类型转换 ; 只有当输入数据是有效数据时,系统才可以进行有效的类型转换。因此,可以进行有效的类型转换是基础,只有当数据完成了有效的类型转换后,下一步才去做数据校验。
1. 类型转换错误的处理流程
Struts 2 提供了一个名为 conversionError 的拦截器 ,这个拦截器被注册在默认的拦截器栈中。
struts-default.xml:
<interceptor-stack name="defaultStack"> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
在上面默认拦截器包含了 conversionError 的引用,如果 Struts 2 执行类型转换时出现错误,该拦截器将对应的错误封装成表单域错误 (fieldError), 并将这些错误信息放入 ActionContext 中。
注意: 为了让 Struts 2 框架处理类型转换的错误,以及使用后面的数据校验机制,系统的 Action 类都应该继承 ActionSupport 。 ActionSupport 类为完成类型转换错误处理,数据校验实现了许多基础工作。
2. 处理类型转换错误
下面将以最简单的局部类型转换器为示例 ,介绍如何处理类型转换错误
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { //封装请求参数的两个属性 private User user; private String tip; //无参数的构造器 public LoginAction() { } //user属性的setter和getter方法 public void setUser(User user) { this.user = user; } public User getUser() { return this.user; } //tip属性的setter和getter方法 public void setTip(String tip) { this.tip = tip; } public String getTip() { return this.tip; } public String execute() throws Exception { if (getUser().getName().equals("crazyit") && getUser().getPass().equals("leegang") ) { setTip("转换成功"); return SUCCESS; } else { setTip("转换失败"); return ERROR; } } }
conversionError拦截器会处理该异常,然后转入名为 input 的逻辑视图,因此要为Action 增加 input 的逻辑视图定义
。如下:
struts.xml
<?xml version="1.0" encoding="GBK"?> <!-- 指定Struts2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 配置Struts 2的包空间 --> <package name="lee" extends="struts-default"> <!-- 定义处理用户请求的Action --> <action name="login" class="lee.LoginAction"> <!-- 配置名为input的逻辑视图,当校验失败后转入该逻辑视图 --> <result name="input">/input.jsp</result> <!-- 配置名为success的逻辑视图 --> <result name="success">/welcome.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
以上改变后,如果用户的输入不能成功转换成用户实例,系统将转入 input.jsp
3. 输出类型转换错误
转换失败后,系统将进入 input 的视图。 conversionError 会负责将转换错误封装成 fieldError, 并将其放到 ActionContext 中。 因此页面要用 <s:fielderror/> 标签:
<body> <s:fielderror/> <form action="login.action" method="post"> <table align="center" width="360"> <caption><h3>类型转换的出错处理</h3></caption> <tr align="center"> <td>用户信息的用户名和密码以英文逗号隔开</td> </tr> <tr> <td>请输入用户信息:<input type="text" name="user"/></td> </tr> <tr align="center"> <td><input type="submit" value="转换"/> <input type="reset" value="重填" /></td> </tr> </table> </form> </body>
为了显示国际化资源 ,需要配置 struts.xml
<?xml version="1.0" encoding="GBK"?> <!-- 指定Struts2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 指定加载国际化资源文件 --> <constant name="struts.custom.i18n.resources" value="globalMessages"/> <constant name="struts.i18n.encoding" value="GBK"/> <!-- 配置Struts 2的包空间 --> <package name="lee" extends="struts-default"> <!-- 定义处理用户请求的Action --> <action name="login" class="lee.LoginAction"> <!-- 配置名为input的逻辑视图,当校验失败后转入该逻辑视图 --> <result name="input">/input.jsp</result> <!-- 配置名为success的逻辑视图 --> <result name="success">/welcome.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
globalMessages_zh_CN.properties
xwork.default.invalid.fieldvalue={0}\u5b57\u6bb5\u7c7b\u578b\u8f6c\u6362\u5931\u8d25\uff01
globalMessages.properties
xwork.default.invalid.fieldvalue={0}字段类型转换失败!
如果需要特定的提示信息,可以用局部资源文件 ActionName.properties.
invalid.fieldvalue.属性名=提示信息
属性名是 Action 中的属性名,也就是请求参数名, value 是校验失败的提示信息
如:LoginAction.properties
#改变上面的Action中birth属性类型转换后的提示信息 invalid.fieldvalue.birth=生日信息必须满足yyyy-MM-dd格式
LoginAction_zh_CN.properties
invalid.fieldvalue.birth=\u751f\u65e5\u4fe1\u606f\u5fc5\u987b\u6ee1\u8db3yyyy-MM-dd\u683c\u5f0f
action:
import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; import java.util.Date; import java.util.List; public class LoginAction extends ActionSupport { //下面提供了三个属性,分别用于封装name、age和birth三个请求参数 private String name; private Integer age; private Date birth; //无参数的构造器 public LoginAction() { } //初始化全部属性的构造器 public LoginAction(String name , Integer age , Date birth) { this.name = name; this.age = age; this.birth = birth; } //name属性的setter和getter方法 public void setName(String name) { this.name = name; } public String getName() { return this.name; } //age属性的setter和getter方法 public void setAge(Integer age) { this.age = age; } public Integer getAge() { return this.age; } //birth属性的setter和getter方法 public void setBirth(Date birth) { this.birth = birth; } public Date getBirth() { return this.birth; } }
4. 处理集合属性的转换错误
页面包含 3个 名字相同的 users 请求参数。 服务器会接受到一个字符串数组。
下面是处理的 Action
import com.opensymphony.xwork2.Action; import java.util.Date; import java.util.List; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { //users属性 private List<User> users; //无参数的构造器 public LoginAction() { } //初始化全部属性的构造器 public LoginAction(List<User> users) { this.users = users; } //users属性的setter和getter方法 public void setUsers(List<User> users) { this.users = users; } public List<User> getUsers() { return this.users; } }
以上 Action 中已经用了泛型 ,所以 类型转换器会作用于 该 Action 的 users 属性,如果输入不正确,conversionError拦截器会起作用
如果将三个请求参数名字设为 user['0'],user['1'],user['2'], Struts 2 将可以区分每个请求参数,从而显示更加友好的转换错误提示。如:
<body> <div style="color:red"> <s:fielderror /> </div> <form action="login.action" method="post"> <table align="center" width="360"> <caption><h3>类型转换的错误处理</h3></caption> <tr align="center"> <td>输入用户信息</td> </tr> <s:iterator value="new int[3]" status="stat"> <tr> <td>用户<s:property value="%{#stat.index}"/> 的信息 <input name="users['<s:property value="%{#stat.index}"/>']" type="text"/></td> </tr> </s:iterator> <tr align="center"> <td><input type="submit" value="转换"/> <input type="reset" value="重设"/></td> </tr> </table> <form> </body>
上面代码使用了 迭代器标签指定三个表单域的 name, 三个表单域的 name 将分别是
user['0'],user['1'],user['2'],在这种情况下如果任一个表单域类型转换失败,将看到准确,详细的提示信息。
发表评论
文章已被作者锁定,不允许评论。
-
Struts1 与 Struts2 的12点区别
2011-11-16 11:14 7381) 在Action实现类方面 ... -
Struts 2 的 Ajax 支持(四)
2011-03-14 16:21 17365.4 tabbedpanel 标签 ... -
Struts 2 的 Ajax 支持(三)
2011-02-11 13:18 24255.2 submit 和 a 标签 ... -
Struts 2 的 Ajax 支持(二)
2011-01-27 14:08 2390四、 基于 Dojo 的 pub-sub 事件模型 ... -
Struts 2 的 Ajax 支持(一)
2011-01-20 14:55 2481一、 Ajax 概述 ... -
Struts 2 的拦截器(三)
2011-01-20 13:09 2904六、 拦截器示例 : 实现权限控制 权限检 ... -
Struts 2 的拦截器(二)
2011-01-12 16:38 1624四、 开发自己的拦截器 Struts 2 ... -
Struts 2 的拦截器(一)
2010-12-31 16:53 2015一、 理解拦截器 ... -
Struts 2 的标签库(五)
2010-12-29 11:35 11346.8 select 标签 以下代码 都是基 ... -
Struts 2 的标签库(四)
2010-12-24 16:21 1638六、 表单标签 表单标签,分为 2 种 : f ... -
Struts 2 的标签库(三)
2010-12-20 14:15 1966四、 数据标签 数据标签主要 ... -
Struts 2 的标签库(二)
2010-12-15 16:21 2025三、 控制标签 Str ... -
Struts 2 的标签库(一)
2010-12-13 13:47 1357一、 Struts 2 标签库概述 ... -
Struts 2 的国际化(二)
2010-12-09 13:25 2253二、 Struts 2 的国际化入门 ... -
Struts 2 的国际化(一)
2010-12-06 22:44 1301一、 程序国际化简 ... -
Struts2 上传和下载文件(三)
2010-12-03 14:58 1788三、 同时上传多个 ... -
Struts2 上传和下载文件(二)
2010-11-29 13:37 1977二、 Struts 2 的文件上传 ... -
Struts2 上传和下载文件(一)
2010-11-17 22:28 2074一、 文件上传的原理 1. 表单元 ... -
struts2 输入校验 (四)
2010-11-15 22:43 1208六、 手动完成输入校验 对于一些特殊的检验 ... -
struts2 输入校验 (三)
2010-11-08 13:25 1714五、 内建校验器 S ...
相关推荐
在Struts2中,类型转换器(Type Converter)是框架的一个关键特性,用于处理Action类中属性的自动类型转换。这个特性使得开发者无需手动进行数据类型之间的转换,从而提高了开发效率和代码的可读性。 标题中的...
Struts2是一个流行的Java web开发框架,其核心是Action,而类型转换是Struts2处理用户输入数据的一个重要环节。Struts2内置了多种类型转换,可以将HTTP请求中的字符串数据转换为各种基本类型和复杂类型,如日期、...
Struts2是一个强大的MVC框架,它在处理Web应用程序时提供了许多便利,其中包括类型转换功能。类型转换是将用户输入的数据自动转化为服务器端处理所需的类型,这样可以避免手动转换带来的繁琐工作。本篇文章将深入...
在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...
在Struts2中,类型转换和国际化是两个重要的特性,用于处理数据类型之间的转换以及多语言环境下的内容显示。 **类型转换**是Struts2处理请求参数与Action类属性之间数据类型不匹配的过程。当用户通过表单提交请求时...
本篇文章将深入探讨Struts2中的类型转换机制。 1. **类型转换的概念** 类型转换是指将一个数据类型的值转换为另一个数据类型的过程。在网络请求中,用户输入的数据通常是字符串类型,而服务器端的Action类属性可能...
struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括类型转换、拦截器和校验机制。本文将深入探讨这些关键知识点,并通过实际例子来帮助你理解它们的工作原理和应用。 首先,我们来看看**类型转换...
这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...
在处理用户输入时,Struts2框架需要将请求参数转换为对应的Java对象属性,这个过程就涉及到类型转换。然而,当用户输入的数据格式不正确时,就会出现类型转换错误,例如在尝试将字符串转换为日期时。本篇文章将深入...
Struts2是一个强大的MVC框架,它在处理用户请求时提供了丰富的功能,其中包括类型转换(Converter)。类型转换是Struts2框架中一个重要的特性,它允许我们把前端表单提交的数据自动转换为后端Java对象的属性。在这个...
熟悉和掌握Struts2自定义类型转换。 熟悉和掌握Struts2内建校验的操作方法 实验环境与设备: 已经接入局域网的网络实验室,机器上装有IE浏览器等; strtus2.5.8 实验内容: (1) 编写一个...
本练习主要关注如何在Struts2中实现自定义的数据类型转换,以满足特定业务需求。 首先,我们需要了解Struts2的数据转换机制。当用户提交表单数据时,Struts2会通过ActionContext获取到这些数据,并尝试将其转换为...
#### 二、Struts1中的自定义类型转换器 在Struts1中,自定义类型转换器主要是通过继承`com.sun.org.apache.commons.beanutils.Converter`接口并实现其中的方法来完成的。具体实现过程如下: 1. **创建转换器类**:...
这就是"struts2自定义类型转换器"的主题。 首先,理解Struts2的类型转换机制。当Struts2接收到HTTP请求时,它会尝试将请求参数与Action类的属性进行绑定。这个过程涉及到了类型转换,Struts2内置了一套转换器机制,...
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括MVC设计模式的实现、类型转换、国际化、拦截器等。在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理...
在Struts2框架中,自定义类型转换器是开发者为了满足特定需求,对框架默认的类型转换机制进行扩展的一种方式。Struts2允许我们创建自己的转换器类来处理输入数据,确保模型对象的属性能够正确地被转换为预期的数据...
这篇博文深入探讨了Struts2类型转换的细节,以下是对这一主题的详细解读。 1. **Struts2类型转换的原理** 在Struts2中,类型转换是通过`ValueStack`和`TypeConverter`接口实现的。`ValueStack`负责管理Action对象...