`
PerfectPlan
  • 浏览: 121089 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

struts2-类型转换器和类型转换错误处理机制

阅读更多

 

关于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>
 

 

1
0
分享到:
评论

相关推荐

    struts2入门实例2 经典入门必备

    错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...

    struts2入门实例1

    错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...

    struts2入门实例4 经典入门必备

    错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...

    struts2入门实例3 经典入门必备

    错误信息提示------国际化处理-----properties 13.Struts2_05Core_include 14.Struts2_06tags struts标签 15.Struts2_07i18n 国际化 16.Struts2_08interceptor 拦截器 17.Struts2_09up&down 上传和...

    深入浅出Struts2(附源码)

    作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...

    struts转化器.rar

    关于struts的转化器,数组属性的类型转换器,集合属性的类型转换器,直接封装成Object,直接封装成Map,类型转换的错误处理,全局类型转换器

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    7.2 类型转换错误消息的定制 121 7.3 类型转换器的定制 125 7.3.1 对自定义的类型转换器进行配置 126 7.3.2 自定义的类型转换器示例 127 7.4 扩展StrutsTypeConverter类 130 7.5 与复杂对象配合使用 134 7.6 与...

    AnyFo - Struts 2_1爆胎易筋丸.pdf

    2 Action 研究.........................................................................................................................8 2.1 访问Servlet API................................................

    Java Web程序设计教程

    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...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    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 ...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    java面试题

    Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 Hibernate工作原理,Hibernate数据持久化? 答:Hibernate工作原理: 1:读取并解析映射信息,创建SessionFactory 2:打开...

    Java学习笔记-个人整理的

    \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}{...

    java开源包2

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    Spring in Action(第二版 中文高清版).part2

    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、写一个函数,要求输入一个字符串和一个字符长度,...

    java面试宝典

    53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,...

    java开源包1

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

Global site tag (gtag.js) - Google Analytics