• 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

  • 相关阅读:
    spring-boot集成1:起步
    策略模式实现多种支付方式
    自定义切面实现记录系统操作日志
    Spring Kafka
    使用Keepalived实现Nginx高可用
    Centos7桥接网络、DNS、时间同步配置
    jmeter随笔(1)-在csv中数据为json格式的数据不完整
    (续篇3):飞测独家のJmeter秘籍,限量发放
    紧张:飞测独家のJmeter秘籍,限量发放(续篇2)
    紧张:飞测独家のJmeter秘籍,限量发放
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/7172296.html
Copyright © 2020-2023  润新知