关于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>
分享到:
相关推荐
错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...
错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...
错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...
错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...
作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...
关于struts的转化器,数组属性的类型转换器,集合属性的类型转换器,直接封装成Object,直接封装成Map,类型转换的错误处理,全局类型转换器
7.2 类型转换错误消息的定制 121 7.3 类型转换器的定制 125 7.3.1 对自定义的类型转换器进行配置 126 7.3.2 自定义的类型转换器示例 127 7.4 扩展StrutsTypeConverter类 130 7.5 与复杂对象配合使用 134 7.6 与...
2 Action 研究.........................................................................................................................8 2.1 访问Servlet API................................................
6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3输入校验 123 6.3.1输入校验的必要性 123 6.3.2编程方式实现输入校验 125 6.3.3...
3.3 使用转换器完成类型转换 143 3.3.1 转换器概述、用途 144 3.3.2 JSF内建转换器 144 3.3.3 使用转换器 145 3.3.4 转换失败后的错误消息 149 3.4 自定义转换器 154 3.4.1 实现转换器类 154 3.4.2 注册转换器 156 ...
文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...
Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 Hibernate工作原理,Hibernate数据持久化? 答:Hibernate工作原理: 1:读取并解析映射信息,创建SessionFactory 2:打开...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...
53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,...
53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...