Struts2类型转换

/*
 * 自定义转换器:
 * 	* 作用:就是把页面中createTime元素的字符串内容转换成java.util.Date
 */
public class DateConverter extends DefaultTypeConverter {

	@Override
	public Object convertValue(Object value, Class toType) {
		
		//要转换的值:[Ljava.lang.String;@3da850
		System.out.println("value = "+value);
		
		//要转换的类型:class java.util.Date
		System.out.println("toType = "+toType);
		
		if(value==null){
			return false;
		}
		
		if(toType==null){
			return false;
		}
		
		if(toType!=java.util.Date.class){
			return false;
		}
		
		if(value instanceof java.lang.String[]){
			String [] str = (String[])value;
			
			if(str[0]!=null&&str[0].length()>0){
				
				try {
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
					
					return sdf.parse(str[0]);
					
				} catch (ParseException e) {
					/*
					 *  在struts2框架里,自定义的类型转换器,
					 *  如果我们不手动抛出异常,struts2框架只捕获异常,但是并不抛出。
					 *  所以框架就会认为类型转换器转换成功,转向成功页面。
					 */
					throw new RuntimeException(e);
					
				}
			}
		}
		
		return new Date();
	}
	
}

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags"   prefix="s"%>
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    </head>
  <body>
        失败!!!! <br>
        <s:fielderror fieldName="createTime"/>
  </body>
</html>



概述

l 从一个 HTML 表单到一个 Action 对象 , 类型转换是从字符串到非字符串 .
HTTP 没有 “类型” 的概念 . 每一项表单输入只可能是一个字符串或一个字符串数组 . 在服务器端 , 必须把 String 转换为特定的数据类型
l struts2 , 把请求参数映射到 action 属性的工作由 Parameters 拦截器负责 , 它是默认的 defaultStack 拦截器中的一员 .Parameters 拦截器可以自动完成字符串和基本数据类型之间转换 .

接收请求参数

利用之前学过的知识,接收请求参数

HttpServletRequestreq = ServletActionContext.getRequest();

String userName = req.getParameter("userName");

采用基本类型接收请求参数

Action类中定义与请求参数同名的属性,struts2便能通过反射技术自动接收请求参数并赋予给同名属性。

publicclass UserActionextendsActionSupport {

      privateInteger id;

      privateString userName

      //struts2通过反射技术调用与请求参数同名的属性的setter方法来获取请求参数值

      public void setId(Integerid) {

             this.id = id;

      }

      public Integer getId(){return id;}

}


转化失败时,应该转向错误页面

转向错误页面,应该在struts配置文件中,增加如下代码:

<action name="userAction_*" class="cn.itcast.converter.UserAction" method="(1)">

  <result name="success">/converter/success.jsp</result>

  <!-- input:当类型转化失败时,要转到input所指向的页面 -->

  <result name="input">/converter/error.jsp</result>

</action>


定制类型转换器说明


定制类型转换器说明—底层代码


定制类型转换器1

publicclassDateConverterextendsDefaultTypeConverter {

 

  publicObject convertValue(Map<String, Object> context,Object value, Class toType) {

         

  System.out.println("value = "+value);

          System.out.println("toType = "+toType);

  returnnew Date();

  }

}

配置自定义的类型转换器

在应用程序里使用一个自定义的类型转换器之前, 必须先对它进行配置.

这种配置既可以基于字段, 也可以基于类

基于字段配置(局部): 可以为某个动作的各个属性分别制定一个自定义的转换器.

1. 创建一个属性文件 : ActionClassName-conversion.properties , 该文

  件需和相对应的动作类(Action)放在同一个目录下,

   ActionClassNameAction的类名,后面的-conversion.properties

   是固定写法.

           properties文件中的内容为:

                     属性名称=类型转换器的全类名

   对于本例而言,文件的名称应为UserAction-conversion.properties

2. 编辑属性文件:

         createTime=cn.itcast.converter.DateConverter

定制类型转换器2

* context:

* value:要转换的值,是一个数组,因为struts2底层接

            收值都用request.getParameterValues("createTime")--String[]

* toType:要转换的数据类型

public Object convertValue(Map<String, Object> context,Object value, ClasstoType) {

        System.out.println("value = "+value);

        System.out.println("toType = "+toType);

        returnnew Date();

}

定制类型转换器3

该转换器完成的功能

     * 将一个字符串类型的数据转换java.util.Date.class

        类型

     * 例如yyyymmdd格式的字符串转换为

                java.util.Date类型

publicclassDateConverterextendsDefaultTypeConverter {

  ……

}

配置自定义的类型转换器

定制类型转换器—处理异常1


error.jsp 页面中引入

   <%@ tagliburi="/struts-tags"   prefix="s"%>

error.jsp 页面中使用 < s:fielderror fieldName = “ ” />

 打印所有转化的异常错误信息

name :指定 Action 属性的名称
打印某个属性转化的异常错误信息

定制类型转换器—处理异常2


定制类型转换器—处理异常3

定制类型转换器—处理异常4















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值