【4858.com】Struts二之类型转变器,jsp页面的多寡传到action

By admin in 4858.com on 2019年5月26日

   大家驾驭数据库中的时间一般为Date类型,而前台传递过来的为字符串,BeanUtils在封装数据的时候,未有将类型调换,导致报非凡…

 

struts自动封装数据。

struts第22中学,使用Jsp提交表单数据时,struts二会自行将表单中的数据封装,并复制给对应Action中的属性.

   大家只必要在封装数据以前,使用自定义调换器就能够:

时间:2017-1-11 11:11

一、传到action类中的属性(一定给set方法,get给不给都行)

struts贰会活动转变只支持宗旨数据类型和 “yyyy-MM-dd”方式的日期类型.

代码如下:

 

2、传到action类引进封装的类(set和get都不能够不给)

假定用户输入的日子类型.不是struts二可甄其余格式,就能够报错.

package com.itheima.myconverter;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.Converter;

/**
 * 自定义 java.util.Date日期转换器
 * 
 * 
 */
public class MyConverter implements Converter {

    @Override
    // 将value 转换 c 对应类型
    // 存在Class参数目的编写通用转换器,如果转换目标类型是确定的,可以不使用c 参数
    public Object convert(Class c, Object value) {
        String strVal = (String) value;
        if(strVal != ""){
            // 将String转换为Date --- 需要使用日期格式化
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            try {
                Date date = dateFormat.parse(strVal);
                return date;
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

——Struts第22中学提供的类型转变

三、日期类型调换难题

在档案的次序中,通常会要求用户输入各类别型的时间.这种意况下大家就必要使用”自定义类型调换器”.

封装数据在此以前,记得使用自定义转变器

在此前的Web项目中,能够选用BeanUtils直接将表单封装到JavaBean中(使用BeanUtils.populate()方法,将三个Map中的数据封装到指标中),用到了类型转变。

  从jsp分界面struts获得的都是string类型的数码,能自行调换为Int,date(格式必须是yyyy-MM-dd)。当日期的格式不是所支持的那体系型,就必要自定义日期类型调换器。

Struts贰 类型转变接口

4858.com 1

接口完成关系

TypeConverter接口定义了方法.DefaultTypeConverter是该接口的私下认可完结.StrutsTypeConverter承继了DefaultTypeConverter类.

自定义类型转换分为 : 局地类型转变 和 全局类型转变

// 1.1注册自定义转化器
    ConvertUtils.register(new MyConverter(), Date.class);
   // 1.2封装
    BeanUtils.populate(user, request.getParameterMap());

在Struts第22中学Action收获请求参数,也可以直接封装到JavaBean中。

 

Action实例
public class UserAction extends ActionSupport {

    private User user;

    private Date birth;

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String register() {
        System.out.println(user.getName());
        System.out.println(user.getPwd());
        System.out.println(user.getAge());
        System.out.println(user.getBirth());
        return "success";
    }
}

 

Struts二里面提供大量种类调换器,用来成功数据类型转换难题:
    boolean 和 Boolean
    char 和 Character
    int 和 Integer
    long 和 Long
    float 和 Float
    double 和 Double
    Date:能够接收yyyy-MM-dd格式的字符串
    数组:能够将多个同名参数转变来数组中
    集结:辅助将数据保存到List大概Map

  struts转换器API

【4858.com】Struts二之类型转变器,jsp页面的多寡传到action。一部分类型转变

  1. 我们在自定义类型转变器时,须要后续StrutsTypeConverter类.重写converterFromString
    和 convertToString方法

public class MyConverter extends StrutsTypeConverter{

    /**
     * 把String转换为指定对象
     * @param context 当前上下文环境
     * @param values jsp表单提交的字符串的值
     * @param toClass 要转换的目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {

        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

            return sdf.parse(values[0]);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 将指定类型转换String
     */
    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return null;
    }

}2. 注册转换器

在须求张开类型转变的Action目录(包)下,创设三个新的properties文件.
文本名遵照钦赐规则钦命.

文本的命名规则为 : ActionClassName-conversion.properties

举例 :
假诺是UserAction中有字段须要开始展览项目调换.
安排文件命名字为:UserAtion-conversion.properties

  1. 声称配置文件内容

对品质成员实行类型转换时 :

birth=com.se7en.struts0二.util.MyConverter(自定义调换器类的全路线)

对品质成员内部变量进行类型变换时 :

user.birth=com.se7en.struts0二.util.MyConverter(自定义转变器类的全路线)

   
但是临时还须要自定义类型调换器:例如传递yyyy-MM-dd、yyyy年MM月dd日都得以,可是只借使yyyy/MM/dd就能够冒出难点。

  |–  TypeConverter        转变器接口

大局类型转换

大局类型转变器的定义方法和有个别类型转变器一样.
同样是继续StrutsTypeConverter类.达成converterFromString 和
converterToString方法

分裂点是安顿文件,全局类型转变器的配备文件的命名和地点都与一些类型转变器差异.

布局文件名称 : xwork-conversion.properties

大局类型转变器的配备文件必须放在 src 目录下!!!
全局类型调换器的布局文件必须放在 src 目录下!!!
大局类型转变器的配置文件必须放在 src 目录下!!!

内容 :

java.util.Date=com.se7en.struts02.util.MyConverter

关于Struts2中的类型转变器:
    Struts贰类型转变器实际上都以依照OGNL实现的。
    Struts第22中学的类型转变器根接口是:
        com.opensymphony.xwork2.conversion.TypeConverter(选中类名按F4足以查阅种类布局)

    |–  DefaultTypeConverter   默许类型转变器类

总体的类型转换
public class MyConverter extends StrutsTypeConverter{

    /**
     * 把String转换为指定对象
     * @param context 当前上下文环境
     * @param values jsp表单提交的字符串的值
     * @param toClass 要转换的目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {

        // 内容不能为空
        if (values == null || values.length == 0) {
            return null;
        }

        // 判断类型必须为Date
        if (Date.class != toClass) {
            return null;
        }

        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

            return sdf.parse(values[0]);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 将指定类型转换String
     */
    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return null;
    }

}

        4858.com 2

      |–  StrutsTypeConverter  用户自定义的转变器类,承袭此类就可以。

自定义类型转换器:

一部分类型调换器

转变器开垦步骤:

  一、写调换器类

  二、配置调换器类(告诉struts应用自身的改变器类)

    –》在同包的action目录下,新建一个properties文件。

    –》命名规则:ActionClassName-conversion.properties

    例如:user.birth=转变器的路子

4858.com,    1、步骤:
        一)创设三个类实现TypeConverter接口
        二)重写方法:convertValue(Map<String, Object> context,
Object target, Member member, String propertyName, Object value, Class
toType)
        三)注册类型转变器:使用XML文件

大局类型转变器

  全局和局地类型转变器的不平等在于配备转变器。

    1、在src目录下,新建xwork-conversion.properties文件

    2、内容:要转移的品种=转变器的路线

        java.util.Date=cn.itcast.d_type.MyConvert

 

    2、详细表明:
        1)成立多少个自定义类型调换器
            *   达成TypeConverter需求重写:
                convertValue(Map<String, Object> context, Object
target, Member member, String propertyName, Object value, Class
toType)

            *  
不过参数太多,能够利用TypeConverter的子类:DefaultTypeConverter
                该类重写了父类的章程,参数减少了:
                    public Object convertValue(Map<String, Object>
context, Object value, Class toType) {

                        return convertValue(value, toType);

                    }

            *  
然而DefaultTypeConverter类只提供了“从页面获得字符串”的方法,并从未提供“向页面输出字符串”的法子,要求手动实现
                能够动用Type类的子类:StrutsTypeConverter
               
优点:在这一个类准将从页面收取的参数的包装以及从Action传递给页面包车型客车数据的卷入实行了分手。
                   
将DefaultTypeConverter类的:convertValue()方法分成了以下五个法子:
                        *   public abstract Object
convertFromString(Map context, String[] values, Class toClass);
                            从页面获得到的数量。 

                        *   public abstract String convertToString(Map
context, Object o);
                            传递给页面包车型客车数额。 

        二)怎么样注册1个自定义类型转变器
            有二种注册情势,两种局地的,壹种全局的。
            *   局部:针对Action
                >   将Action作为JavaBean,提供属性与get / set方法
                >  
配置文件所在地方以及名称:在Action类所在包中,创立Action类名-conversion.properties
                >   配置文件书写格式:属性名称=类型调换器的完整类名
                >   birthday=com.wyc.utils.MyTypeConverter

            *   局部:针对JavaBean
                >  
配置文件所在地方以及名称:在JavaBean类所在包中,创造JavaBean类名-conversion.properties
                >   配置文件书写格式:属性名称=类型调换器完整类名
                >   birhday=com.wyc.utils.MyTypeConverter

            *   全局:
                >  
配置文件所在地点及称谓:在src下创办2个xwork-conversion.properties
                >  
配置文件书写格式:要转变的完全类型名称=类型转变器完整类名
                >   java.util.Date=com.wyc.utils.MyTypeConverter

注意:
    对于Struts第22中学的类型变换器,假如提交表单数据,向JavaBean中封装时出现难点,会报错:
        No result defined for action com.wyc.action.RegistAction and
result input
    在result中从未定义input结果视图。

   
借使布置了input视图,出现类型转变难题就能跳转到input内定的视图,不然抛出40四不当。

    难点:为何会跳转到input视图?
        因为Struts2中有如下几个拦截器(interceptor):
            *   <interceptor name=”conversionError”
class=”org.apache.struts2.interceptor.StrutsConversionErrorInterceptor”/>
               
若是Struts贰的档期的顺序转换器推行类型调换时现身错误,该拦截器担负将对应错误消息封装成FieldError对象,并将这么些错误音信放入ActionContext中。

            *   <interceptor name=”workflow”
class=”com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor”/>
                用于获取错误难点新闻,向input视图跳转。

         假诺是自定义类型转变器出现类型转换难题供给跳转到input视图,那么必须在类型转变器中抛出相当才得以,唯有抛出卓殊,错误消息才会被StrutsConversionErrorInterceptor所抓获,用于拍卖。

       
使用项目转变器中的错误管理,用户定义的Action必须承接ActionSupport。

        4858.com 3

    关于错误新闻呈现:
        要求运用Struts二框架提供的标签来显示。
        在页面中程导弹入Struts2标签库然后利用:<s:田野同志error
/>就能够。

示范代码:自定义类型调换器

在src目录下开创布局文件:xwork-conversion.properties文件,在布局文件中丰硕:
    java.util.Date=com.wyc.utils.MyTypeConverter

public class MyTypeConverter extends StrutsTypeConverter {

 

    /*

     * 接收页面传递的数码,封装到JavaBean中

     */

    @Override

    public Object convertFromString(Map context, String[] values,
Class toClass) {

        // System.out.println(context); // ognl.OgnlContext@faae24ad

        // System.out.println(values[0]); //
[Ljava.lang.String;@29d90021

        // System.out.println(toClass); // class java.util.Date

 

        // 从表单获取到的多少是3个数组

        String value = values[0]; // 2016/10/10

        Date date = null;

        try {

            date = new SimpleDateFormat(“yyyy/MM/dd”).parse(value);

            return date;

        } catch (ParseException e) {

            throw new RuntimeException(e);

        }

        return date;

    }

 

    @Override

    public String convertToString(Map context, Object o) {

        return null;

    }

}

——总结

1、Struts第22中学类型转变
    *   Struts第22中学项目调换器的根接口是TypeConerter
    *   Struts第22中学私下认可提供的类型转换
    *   自定义类型调换器
        >   如何创立自定义类型转变器
           
创立二个Action落成TypeConverter接口(大概接续DefaultTypeConverter、StrutsTypeConverter)
        >   怎么样注册项目调换器
           
局部:针对Action,文件名:ActionClassName-conversion.properties
                属性名=类型调换器全名
            全局:src下创办一个xwork-conversion.properties
                要转变类型的人名=类型转变器全名
        >   自定义类型调换器的标题 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有