您的位置:首页 > 编程语言 > Java开发

Struts2类型转换

2014-02-03 13:52 363 查看

/*
* 自定义转换器:
* 	* 作用:就是把页面中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)放在同一个目录下,

   ActionClassName是Action的类名,后面的-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:fielderrorfieldName=“
”/>
 打印所有转化的异常错误信息

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

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



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



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: