Struts2类型转换

Posted zhouyeqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2类型转换相关的知识,希望对你有一定的参考价值。

一、传统的数据类型转换方法

  1. 手工编写代码

//第一步:只能在request数据区中获得字符串类型的数据

String name = request.getParameter("name");

String password  = request.getParameter("password");

String iAge = request.getParameter("age");

String sBirthday = request.getParameter("birthday");

//第二步:将字符串类型的数据转换为User对象所需的类型

int age = Integer.parseInt(iAge);

DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);

Date  birthday = null;

birthday = df.parse(sBirthday);

//第三步:根据新数据构建User对象

User user = new User(name,password,age,birthday);

缺点:手工编写大量代码;代码复用性差

 

二、Struts中数据类型转换

 

  1. 在 struts2 中, 把请求参数映射到 action 属性的工作由 Parameters 拦截器负责, 它是默认的 defaultStack 拦截器中的一员. Parameters 拦截器可以自动完成字符串和基本数据类型之间转换.
  2. Struts提供的内建类型转换器

转换类型

说明

boolean/Boolean

将字符串转换成布尔值

char和Character

字符串和字符之间的转换

int和Integer

字符串和整型值之间的转换

long和Long

字符串和长整型值之间的转换

float和Float

字符串和单精度浮点值之间的转换

double和Double

字符串和双精度浮点值之间的转换

Date

字符串和日期类型之间的转换

数组

字符串首先转换成数组元素的类型,然后再存放到新的数组中

集合

在默认情况下集合元素的数据类型是字符串,并创建一个新的ArrayList存放所有的字符串

 

  1. 案例:在这个案例过程中,我们本身并没有干预页面到Action和Action到页面的数据类型转换,但是数据正确实现了数据类型的转换,这就是struts的类型转换功能。

Login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP ‘login.jsp‘ starting page</title>

  </head>

  <body>

     <form action="userAction">

         <table>

             <tr><td>编号:<input type="text" name="id" value="1"></td></tr>

             <tr><td>姓名:<input type="text" name="userName" value="ross"></td></tr>

             <tr><td>创建日期:<input type="text" name="createTime" value="1986-09-09 12:12:12"></td></tr>

             <tr><td><input type="submit" value="submit"></td></tr>

         </table>

     </form>

  </body>

</html>

Struts.xml

<package name="struts2" extends="struts-default">

        <action name="userAction" class="com.silvan.action.UserAction">

            <result>/show.jsp</result>

        </action>

    </package>

UserAction.java

package com.silvan.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    private Integer id;

    private String userName;

    private Date createTime;

    public String execute(){

        System.out.println("id:"+id);

        System.out.println("userName:" +userName);

        System.out.println("createTime" + createTime);

        return SUCCESS;

    }

Get/set……

}

show.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP ‘login.jsp‘ starting page</title>

  </head>

  <body>

     <form action="">

     <table>

          <tr><td>编号:<s:property value="id" /></td></tr>

          <tr><td>姓名:<s:property value="userName" /></td></tr>

          <tr><td>创建日期:<s:property value="createTime" /></td></tr>

     </table>

     </form>

  </body>

</html>

 

三、自定义类型转换器

众所周知,java有八大基本的类型,struts2能对这八大基本类型以及String、Date等常用类型提供自动转换。但是,仅仅这些远远不能满足我们的需要。

原因:因为页面中的类型都是属于字符串类型的,而java是一种强类型语言,这时候我们需要把输入的字符串转型成为相应的类型。

在类型转换器的定义中也分为两种:

局部类型转换器:对某个action转换类型起作用。

全局类型转换器:对所有action转换类型起作用。

 

自定义类型转换器步骤:

  1. 首先通过实现TypeCoverter接口或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口)来实现自己的类型转换器(重写convertValue方法即可)。

package com.silvan.convert;

 

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Map;

 

import ognl.DefaultTypeConverter;

 

/**

 * 继承DefaultTypeConverter

 * @author Administrator

 *

 */

public class DateConverter extends DefaultTypeConverter {

    //再重写convertValue方法

    //其中,context是类型转换环境的上下文,value是需要转换的参数,toType 是转换后的目标类型。

    @Override

    public Object convertValue(Map context, Object value, Class toType) {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

        // 当字符串向Date类型转换时

        // 这时value的来源是从url或者表单提交

        try {

            if (toType == Date.class) {

                // Request.getParameterValues() ,

                // 转换为string数组是因为像复选框之类的组件可以提交的值是一个数组

                String[] params = (String[]) value;

                // 解析成日期格式(注意:这里的日期一定要是util包下的日期)

                return dateFormat.parse(params[0]);

                // 当Date转换成字符串时,这时value的来源是

                // action类,因此value不要强转为数组形式

//(注意:使用EL表达式向页面输出是该if不会被

                // 执行,只有使用OGNL表达式向页面输出时才会进入此if语句)

            } else if (toType == String.class) {

                Date date = (Date) value;

                return dateFormat.format(date);// 转换为字符串

            }

        } catch (ParseException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return null;

    }

}

  1. 其他页面代码和Action代码与上面案例一样 
  2. 配置

 将该转换器注册在WEB应用中,这样 Struts 2 框架才能使用该类型的转换器。

  类型转换器的注册有两种:

  • 注册局部类型转换器:仅仅对某个Action的属性起作用。
  • 注册全局类型的转换器:对所有Action 都有效。

局部类型转换器:

    在需要生效的Action类的包下新建ActionName-conversion.properties该文件,其中 ActionName是需要转换生效的Action的类名,后面的-conversion固定。

   内容:  待转换的action中的属性名=类型转换器的全类名。 注意:类型转换器是需要加包名,而且最后不能加标点符号

     如:

文件名:UserAction-conversion.properties

注册内容:createTime=com.silvan.convert.DateConverter

全局类型转换器:

    在WEB-INF/classes或者src目录下新建xwork-conversion.properties文件。文件名是固定的。【注】xwork表示全局

    内容:待转换的类型 = 类型转换器的全类名

    xwork-conversion.properties:  java.util.Date= com.silvan.convert.DateConverter

 

以上是关于Struts2类型转换的主要内容,如果未能解决你的问题,请参考以下文章

struts2自定义类型转换器

java之struts2之类型转换

struts2学习笔记之十一:struts2的类型转换器

struts2_struts类型转换

struts2中的类型转换

Struts2的类型转换(上)