`

struts2 类型转换 (二)

阅读更多


九。类型转换中的错误处理

      实际上,表现层数据涉及的 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'],在这种情况下如果任一个表单域类型转换失败,将看到准确,详细的提示信息。

 

 

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    struts2 类型转换器

    在Struts2中,类型转换器(Type Converter)是框架的一个关键特性,用于处理Action类中属性的自动类型转换。这个特性使得开发者无需手动进行数据类型之间的转换,从而提高了开发效率和代码的可读性。 标题中的...

    STRUTS2类型转换

    Struts2是一个流行的Java web开发框架,其核心是Action,而类型转换是Struts2处理用户输入数据的一个重要环节。Struts2内置了多种类型转换,可以将HTTP请求中的字符串数据转换为各种基本类型和复杂类型,如日期、...

    Struts2类型转换(一)----常规类型,自定义类型,错误处理

    Struts2是一个强大的MVC框架,它在处理Web应用程序时提供了许多便利,其中包括类型转换功能。类型转换是将用户输入的数据自动转化为服务器端处理所需的类型,这样可以避免手动转换带来的繁琐工作。本篇文章将深入...

    struts2简单实例(类型转换)

    在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...

    struts2类型转换和国际化

    在Struts2中,类型转换和国际化是两个重要的特性,用于处理数据类型之间的转换以及多语言环境下的内容显示。 **类型转换**是Struts2处理请求参数与Action类属性之间数据类型不匹配的过程。当用户通过表单提交请求时...

    struts2类型转换

    本篇文章将深入探讨Struts2中的类型转换机制。 1. **类型转换的概念** 类型转换是指将一个数据类型的值转换为另一个数据类型的过程。在网络请求中,用户输入的数据通常是字符串类型,而服务器端的Action类属性可能...

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2类型转换 拦截器 校验的例子

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括类型转换、拦截器和校验机制。本文将深入探讨这些关键知识点,并通过实际例子来帮助你理解它们的工作原理和应用。 首先,我们来看看**类型转换...

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    Struts处理类型转换错误,如时间转换

    在处理用户输入时,Struts2框架需要将请求参数转换为对应的Java对象属性,这个过程就涉及到类型转换。然而,当用户输入的数据格式不正确时,就会出现类型转换错误,例如在尝试将字符串转换为日期时。本篇文章将深入...

    Struts2 ConverterType类型转换 案例源码

    Struts2是一个强大的MVC框架,它在处理用户请求时提供了丰富的功能,其中包括类型转换(Converter)。类型转换是Struts2框架中一个重要的特性,它允许我们把前端表单提交的数据自动转换为后端Java对象的属性。在这个...

    Struts2类型转换与输入校验 .zip

     熟悉和掌握Struts2自定义类型转换。  熟悉和掌握Struts2内建校验的操作方法  实验环境与设备:  已经接入局域网的网络实验室,机器上装有IE浏览器等;  strtus2.5.8  实验内容: (1) 编写一个...

    struts2自定义数据类型转换练习

    本练习主要关注如何在Struts2中实现自定义的数据类型转换,以满足特定业务需求。 首先,我们需要了解Struts2的数据转换机制。当用户提交表单数据时,Struts2会通过ActionContext获取到这些数据,并尝试将其转换为...

    Struts自定义类型转换器

    #### 二、Struts1中的自定义类型转换器 在Struts1中,自定义类型转换器主要是通过继承`com.sun.org.apache.commons.beanutils.Converter`接口并实现其中的方法来完成的。具体实现过程如下: 1. **创建转换器类**:...

    struts2自定义类型转换器

    这就是"struts2自定义类型转换器"的主题。 首先,理解Struts2的类型转换机制。当Struts2接收到HTTP请求时,它会尝试将请求参数与Action类的属性进行绑定。这个过程涉及到了类型转换,Struts2内置了一套转换器机制,...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括MVC设计模式的实现、类型转换、国际化、拦截器等。在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理...

    Struts2 自定类型转换器(三十四)

    在Struts2框架中,自定义类型转换器是开发者为了满足特定需求,对框架默认的类型转换机制进行扩展的一种方式。Struts2允许我们创建自己的转换器类来处理输入数据,确保模型对象的属性能够正确地被转换为预期的数据...

    struts2类型转换深入总结

    这篇博文深入探讨了Struts2类型转换的细节,以下是对这一主题的详细解读。 1. **Struts2类型转换的原理** 在Struts2中,类型转换是通过`ValueStack`和`TypeConverter`接口实现的。`ValueStack`负责管理Action对象...

Global site tag (gtag.js) - Google Analytics