关于struts2的类型转换器和类型转换错误处理机制
一、为什么要是用struts2的类型转换器和错误处理机制?
:上一次,已经讲了我们为什么要使用struts2的类型转换器,但是那个只是局部的。这里我们要介绍全局的
类型转换器的配置。之后便是介绍sturts2错误处理机制,利用struts2的错误处理机制,我们可以对客户端
提交的数据信息进行更加规范的验证,并且可以多方面的向客户端显示错误信息.
二、如何使用struts2的类型转换器,和类型转换错误处理机制了?
:这里我们主要介绍strus2的错误处理机制.
首先接着上一次的介绍:struts2的全局类型转换器,其实struts2的局部类型转换器与全局类型的转换器
不同的地方就是在配置文件的路径、名称和配置信息
-------------------------------------------------------------------------------------------------------------------------------
|类型 | 名称(后缀.properties)| 路径 | 配置信息
|------------------------------------------------------------------------------------------------------------------------------
|全局 | xwork-conversion | src的根目录下 |需要转换的对象的限定名=对该对象进行转换的转换器的限定名 |
|-----------------------------------------------------------------------------------------------------------------------------
|局部 | action对象名+(-conversion)| action类的同目录下 |action对象中需要进行转换的成员变量名=(如上)
|------------------------------------------------------------------------------------------------------------------------------
//全局的类型转换器:就是指明在项目的任何地方使用(此对象的时候)都会调用(对该对象进行转换的转换器)进行类型转换
三、具体介绍struts2的类型转换错误处理机制以及数据校验。
:全局
当我们希望对客户端提交过来的数据信息进行验证的时候,我们可以在提交中指定的action 对象中调用
ActionSupport类的validate()方法进行数据的校验。
通过this.addFieldError(String fieldName,String errorMessage)方法将错误信息保存,并返回到客户端
addFieldError(String fieldName,String errorMessage)方法有两个参数
:String fieldName 指定是那一个成员变量出错了。
:String errorMessage 填写显示在客户端的错误信息。
如果客户端提交的某些信息类型不符合action对象中成员变量的类型,那么struts2会自动将该错误信息
添加在addFieldError中并返回到客户端进行显示,但是显示的信息非常的格式化,而且全部都是英文。
如果我们想对这些错误信息进行自定义,该怎么办了?这个问题就牵扯到struts2的错误处理机制上了,
(struts2的错误处理机制是用配置文件管理的)我们如何将struts2的错误处理机制的配置信息进行自定义了?
首先:我们要在struts.xml文件中配置如下信息:
<struts>
<constant name="struts.custom.i18n.resources" value="message"></constant>
/*
<constant name="struts.custom.i18n.resources" value="message"></constant> 配置这段信息,是为了指定我们自定义的配置文件
name:关于contant标签中的属性的值是固定写法不要写错 "struts.custom.i18n.resources" 是在Strut2-core.jar default.properties中定义的,这里相当于重写
value:说明我们配置的xml文件的名称 (只用写名称不需要 .properties)
*/
//这里是struts2的action对象配置
<package name="struts2" extends="struts-default">
<action name="login" class="org.viancent.action.UserLoginAction">
<result name="success">/show.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
其次创建message.properties文件
:对于全局的配置文件 必须在src的根目录下创建
:填写的内容如下
key:xwork.default.invalid.fieldvalue //key的值是一个固定的写法
value:{0} error //{0}相当于一个占位符,给定struts2填写内容位置,在这里填写的内容便是jsp页面出错的表单元素的name值
局部:
局部类型错误处理的方法与全局的不同之处也是在于路径,名称,和内容
-------------------------------------------------------------------------------------------------------------------------------
|类型 | 名称(后缀.properties) | 路径 | 配置信息
|------------------------------------------------------------------------------------------------------------------------------
|全局 | 在struts.xml<constant>的value值| src的根目录下 |xwork.default.invalid.fieldvalue={0} error
|-----------------------------------------------------------------------------------------------------------------------------
|局部 | action对象名+后缀| action类的同目录下|invalid.fieldvalue.+(action对象的成员变量名称)=(填写错误信息)
|------------------------------------------------------------------------------------------------------------------------------
//这里概述一下struts2类型转换和输入校验的流程
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误
信息放到addFieldError里面.
类型转换与输入校验的流程
1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)
具体实例如下://使用的是类型转换错误处理机制的局部配置 和struts2的全局类型转换器的配置
struts.xml:配置信息如上
web.xml: 配置信息不变
action对象信息:package org.viancent.action;
注意:如果类型转换不成功,也同样要进行输入校验
import java.util.Calendar;
import java.util.Date;
import org.viancent.domain.UserInfo;
import com.opensymphony.xwork2.ActionSupport;
public class UserLoginAction extends ActionSupport {
private UserInfo userinfo;
private Date birthday;
private int age;
public int getAge() {
return age;
}
public UserInfo getUserinfo() {
return userinfo;
}
public void setUserinfo(UserInfo userinfo) {
this.userinfo = userinfo;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String execute() throws Exception {return SUCCESS;
}
@Override
/*输入校验 程序运行到这里就已经通过了类型转换的过程 如果某个数据信息转换失败,struts2则会对
该数据对应的action对象成员变量进行初始化变量
*/
public void validate() {
if (this.getAge() < 0 || this.getAge() >= 150) {
this.addFieldError("age", "年龄必须在0-150之间!"); //添加错误信息
}
System.out.println(this.getBirthday());
if (null == this.getBirthday() || "".equals(this.getBirthday())) {
this.addFieldError("birthday", "日期不能为空");
return;
}
Calendar ca = Calendar.getInstance(); //Claendar 的before()方法 判断是否在某时段之前
ca.setTime(new Date("3/13/2011"));
Calendar cs = Calendar.getInstance();
cs.setTime(this.getBirthday());
if (!cs.before(ca)) {
this.addFieldError("birthday", "birthday is error");
}
}
}
domain类:
package org.viancent.domain;
public class UserInfo {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
//局部类型转换错误的配置文件 action对象+.properties
UserLoginAction.properties;
invalid.fieldvalue.age/*age action对象的成员变量*/ =\u5E74\u9F84\u4E0D\u6B63\u786E
invalid.fieldvalue.birthday=\u65E5\u671F\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01
//全局类型转换器的配置文件
xwork-conversion.properties:
/*需要转换的对象*/
org.viancent.domain.UserInfo=org.viancent.converter.UserConverter
/*类型转换器的对象*/
//类型转换器的信息 这里使用的是Struts2提供的
package org.viancent.converter;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import org.viancent.domain.UserInfo;
public class UserConverter extends StrutsTypeConverter {
@Override //从客户端到服务器的转换
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
String str = arg1[0];
StringTokenizer token = new StringTokenizer(str, ";");
UserInfo userinfo = new UserInfo();
userinfo.setUsername(token.nextToken());
userinfo.setPassword(token.nextToken());
return userinfo;
}
@Override//从服务器到客户端的转换
public String convertToString(Map arg0, Object arg1) {
UserInfo info = (UserInfo) arg1;
String str = "usernmae:" + info.getUsername() + ",
password:"+ info.getPassword();
return str;
}
}
view 界面:
login.jsp:
<s:form action="login">
<s:textfield name="userinfo" label="userinfo"></s:textfield>
<s:textfield name="age" label="age" ></s:textfield>
<s:textfield name="birthday" label="birthday"></s:textfield>
<s:submit></s:submit>
</s:form>
show.jsp:
<body>
<s:property value="userinfo"/>
<s:property value="birthday"/>
<s:property value="age"/>
</body>
分享到:
相关推荐
默认情况下,Struts2提供了一些内置的转换器,例如`StringTypeConverter`、`BooleanTypeConverter`等,可以处理基本类型和常用类型的转换。 但是,有时候我们可能需要自定义转换器以满足特定需求,例如处理自定义...
本篇文章将深入探讨Struts2中的类型转换机制,包括常规类型转换、自定义类型转换以及错误处理。 首先,我们来看**常规类型转换**。Struts2框架内建了一套完整的类型转换器,能够自动处理常见数据类型,如String、...
在处理用户输入和业务逻辑交互时,Struts2提供了强大的类型转换和校验机制,以确保数据的有效性和安全性。以下是对给定内容的详细解释: **类型转换** 在Struts2中,当用户通过表单提交数据时,所有参数默认都以...
通过以上步骤,你可以在Struts2应用中有效地处理类型转换错误,尤其是时间转换错误,提高用户体验,并防止因为这类错误导致的程序崩溃。这需要对Struts2的配置、拦截器机制以及异常处理有深入理解。
在默认情况下,Struts2能够自动处理基本类型和简单类型的转换,但当我们需要对复杂的数据类型或者自定义类型的转换时,就需要自定义类型转换器。本文将深入探讨如何在Struts2中实现自定义类型转换器,以便将用户输入...
在Struts2框架中,自定义类型转换器是开发者为了满足特定需求,对框架默认的类型转换机制进行扩展的一种方式。Struts2允许我们创建自己的转换器类来处理输入数据,确保模型对象的属性能够正确地被转换为预期的数据...
Struts2内置了一些常见的类型转换器,如StringConverter、IntegerConverter、LongConverter等,可以处理基本类型的转换。如果这些内置转换器无法满足需求,开发者可以通过实现Converter接口自定义转换器。自定义转换...
当这三个文件一起导入到项目中时,它们可以协同工作,解决因Struts2和JSON插件版本不匹配导致的问题。在实际操作中,为了保持项目的整洁和避免版本冲突,您需要先删除原有的JSON相关库,再导入这些更新版本的文件。...
本授课教案和例子源码将深入探讨这一主题,帮助你更好地理解和应用Struts2的类型转换器。 在第一课时中,我们将首先了解Struts2类型转换的基本概念。Struts2框架默认提供了一些预定义的转换器,如将字符串转换为...
这个压缩包“struts2 全局类型转换器.rar”可能包含了一个示例或教程,教你如何在Struts2中实现全局类型转换器,以统一处理不同类型的字段转换。在Struts2中,类型转换器扮演着重要的角色,它允许你将用户输入的数据...
Struts2框架提供了内置的转换器,可以处理基本类型和某些复杂类型的转换。然而,对于自定义格式或特殊需求,我们需要自定义转换器。转换器的实现基于`Converter`接口,该接口包含一个`convert`方法,用于执行实际的...
7. **异常处理(Exception Handling)**:在`struts2-core-2.1.8.1`中,异常处理机制允许开发者自定义错误页面和错误处理策略。`com.opensymphony.xwork2.exception`包下包含了各种异常类,而`...
在这个案例中,我们将深入探讨Struts2中的ConverterType,以及如何实现一个自定义的类型转换器来处理坐标(x,y)的数据。 首先,了解Struts2的类型转换机制。默认情况下,Struts2会根据Action类中属性的数据类型...
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括类型转换、拦截器和校验机制。本文将深入探讨这些关键知识点,并通过实际例子来帮助你理解它们的工作原理和应用。 首先,我们来看看**类型转换...
9. **类型转换(Type Conversion)**:Struts2提供了一套强大的类型转换机制,位于`org.apache.struts2.convention.converters`包下,可以自动将请求参数转换为Action属性的期望类型。 10. **注解支持(Annotations...
7. **验证框架**:内置的验证框架可以方便地对用户输入进行验证,提供了一套灵活的验证规则和错误处理机制。 8. **国际化与本地化**:Struts2支持多语言环境,通过资源文件可以轻松实现内容的国际化。 9. **...
Struts2框架内置了一套完善的数据类型转换机制,同时也提供了扩展机制供开发者根据需求定制类型转换器。 #### 二、Struts2数据类型转换的意义 在Struts2中,数据类型转换的意义主要体现在以下几个方面: 1. **...
8. **异常处理**:Struts2提供了一套全面的异常处理机制,能够优雅地处理运行时异常并生成相应的错误页面。 在使用struts-2.3.31-all.zip压缩包时,通常会包含以下组件: - `struts2-core.jar`:框架核心库,包含...
总之,Struts2的类型转换机制提高了开发效率,通过自定义转换器,我们可以灵活地处理各种数据类型,确保用户输入能够正确地转换为应用程序可处理的形式。`MyTypeConverter`这个文件可能就是你为特定需求创建的一个...
Struts2的转换器机制就是解决这个问题的关键,它允许我们自定义数据类型的转换过程,确保数据的准确性和一致性。 Struts2框架基于MVC设计模式,其中模型(Model)层处理业务逻辑,视图(View)层负责展示,控制器...