8.Struts2类型转换器

类型转换器
1、引入
在Struts2中,请求参数类型不仅可以是String,还可以是其它类型。
如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,
则birthday接收到的不是字符串“1949-10-1”,而是日期类型。
但,需注意的是,对于基本数据类型,需将其定义为包装类型。
实例:请求参数值的类型-- typeconverter
Step1:编写index.jsp与show.jsp
Step2:编写Birthday_Action
Step3:编写web.xml与struts.xml

新建web项目工程源码文档目录如下:

Birthday_Action.java源码如下:

package actions;

import java.util.Date;

public class Birthday_Action {
    private Date birthday;

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String execute(){
        System.out.println("--------birthday------"+birthday);
        return "success";
    }
}

index.jsp源码如下:

<%@ page pageEncoding="utf-8"%>

<html>
  <head>

    <title>login.jsp</title>

  </head>

  <body>
  <form action="birthday.action">

           中华人名共和国的建国日期是:
             <input type="text" name="birthday"/><br/>
             <input type="submit" value="提交"/>
   </form>
  </body>
</html>

show.jsp源码如下:

<%@ page pageEncoding="utf-8" isELIgnored="false"%>

<html>
  <head>

    <title>show page</title>

  </head>

  <body>
      中国人民共和国的建国日期是:${birthday}

  </body>
</html>

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

        <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>

        <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

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

        <action name="birthday" class="actions.Birthday_Action">
            <result>/show.jsp</result>
        </action>

    </package>
</struts>

部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/





当在表单中填入1949-10-1时,提交,便可看到Sat Oct 01 00:00:00 CST 1949的显示结果。
说明,Struts2将1949-10-1作为Date类型接收了。

若在表单中填入的是19491001时,发现也可看到相应的结果,但,控制台报错:

java.lang.NoSuchMethodException: actions.BirthdayAction.setBirthday([Ljava.lang.String;)

错误信息指,没有发现形参为String类型的setBirthday方法。即,将19491001当作了String,而非Date。

输入地址:

http://127.0.0.1:8080/typeconverter/





 那么,如何能够让Struts2将19491001当作Date类型?

更一般化地讲,如何将某种非基本类型的请求参数值,让Struts2直接当作该非基本类型,而非当作String类型?

此时就需要使用类型转换器。

类型转换器

自定义类型转换器类,是继承自com.opensymphony.

xwork2.conversion.impl.DefaultTypeConverter类的。在使用时,一般需要覆盖其父类的方法

public Object convertValue(
          Map<String, Object> context,   //OGNL表达式上下文
          Object value,   //待转换的值
          Class toType    //要转换为的类型
)

 注意:定义convertValue方法时需要注意,其转换一般是定义为双向的。

实例步骤:

在上例中定义类型转换器类:

typeconverters.Date_String_Converter

需要注意第二个参数value,若转换方向为从请求到action,则value为字符串数组。因为请求中是允许携带多个同名参数的,而这时的这个同名参数,其实就是数组。

Struts2为了兼顾到这种多个同名参数的情况,就将从请求到action方向的转换的value指定为了String[],而非String。

在定义好类型转换器后,需要注册该转换器,用于通知Struts2框架在遇到指定类型变量时,需调用类型转换器。

具体解决方法:

在原有代码基础上新建继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类的String_Date_Converter.java。

String_Date_Converter.java完成源码如下:

package typeconverters;

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

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class String_Date_Converter extends DefaultTypeConverter {

    @Override
    public Object convertValue(Map<String, Object> context, Object value,Class toType) {
        //MM代表两位数的月,不可以小写,小写mm就成了两位数的分
        SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
        try {
            if(toType==Date.class){
                String[] params=(String[]) value;
                //将字符串解析为日期类型
                return sf.parseObject(params[0]);
            }else if(toType==String.class){

                //注意这里导入import java.util.Date;
                Date date=(Date)value;

                //将日期类型格式化为指定格式的字符串
                return sf.format(date);
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

根据注册方式的不同及其应用范围的不同,可以将类型转换器分为两类:

1.局部类型转换器

2.全局类型转换器

局部类型转换器

局部类型转换器,仅仅对指定Action的指定属性起作用。

注册方式:

在Action类所在的包下放置名称为如下格式的属性文件:

ActionClassName-conversion.properties文件。

其中ActionClassName是Action类名,-conversion.properties是固定写法。

就本例而言,该注册文件的名称应为BirthdayAction-conversion.properties 。

此文件的内容也遵循一种格式:

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

对于本例而言,文件中的内容为:

birthday=typeconverters.Date_String_Converter

注册方式:

在actions包中新建属性文件BirthdayAction-conversion.properties。

全局类型转换器

全局类型转换器,会对所有Action的指定类型的属性生效。

注册方式:

在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。

该文件的内容格式为:待转换的类型=类型转换器的全类名。

局部类型转换器

具体方法:

在actions包中新建属性文件BirthdayAction-conversion.properties。

局部类型转换器注册成功!

重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/



注意:这时候1949-10-01提交就会错误,要想实现19491001和1949-10-01都可用,只需多定义几个转换器即可。

 全局类型转换器:

注册方式:

在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。

该文件的内容格式为:待转换的类型=类型转换器的全类名。



重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/

时间: 2024-08-23 23:00:18

8.Struts2类型转换器的相关文章

自定义struts2类型转换器

一.自定义类型转换器 1.编写一个类,继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter 2.覆盖掉其中的public Object convertValue(Map<String, Object> context, Object value,Class toType) context:OGNL表达式的上下文 value:实际的值.用户输入的都是字符串,但他是一个String数组. toType:目标类型 public 

struts2类型转换器、 类型转换错误 以及INPUT view

1.1.1    Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 Long float 和 Float double 和 Double Date 可以接收 yyyy-MM-dd格式字符串 数组  可以将多个同名参数,转换到数组中 集合  支持将数据保存到 List 或者 Map 集合 1.1.2    Struts2中类型转换的错误: 1.NoSuchMetho

struts2类型转换器

类型转换器分为全局类型转换器和局部类型转换器.全局类型转换针对所有Action都起作用,而局部类型转换器针对某个Action 一.全局类型转换器.将字符串x,y转换成Point Login.jsp页面 <s:form method="post" action="test"> <s:textfield name="username" label="账号"></s:textfield> <

JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置

Action接受请求参数 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中 Struts2提供了非常强大的类型转换机制用于请求数据 到 model对象的封装 Struts2和MVC定义关系 StrutsPrepareAndExecuteFilter:控制器 在Struts2中action是什么?(Struts2是一个MVC框架) V:jsp M:action C:action StrutsPrepareAndExecuteFilter Struts2提供了三种数据封装

Struts2基础学习(四)&mdash;类型转换器

一.自定义转换器 1.概述      Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器.Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定义类型转换器必须实现 ongl.TypeConverter.        2.编写类型转换器 (1)实现TypeConverter接口,实现一个方法 public Object convertValue(Map<String, O

struts2基础----&gt;自定义类型转换器

这一章,我们开始struts2中自定义类型转换器的学习. 自定义类型转换器 一.定义一个继承于StrutsTypeConverter的转换类: package com.huhx.converter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import o

Struts2之类型转换器

一.类型转换器的应用场景 类型转换是OGNL的一部分,默认的八种基本类型.String.Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在很多领域,但是在web领域,因为在客户端到服务器端传输的只是字符串,所以这里就有一个需求收缩,我们的需求就变为完成String和复杂对象之间的互相转换.在Struts2中的类型转换则是在客户端的请求参数往Action的成员属性中设置的时候会被调用. 二.如何使用? 1.理论部分 所有的类型转换器都要

struts2自定义类型转换器

首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机制即可满足大部分类型转换需求.如: 类User.java package models; public class User { private String username; private String password; public String getUsername() { retur

Struts2 自定义类型转换器

Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性 用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一 种类型转换器供我们使用. 以下为局部类型转换器的开发步骤a.首先要写一个类来继承DefaultTypeConverterb.然后覆盖convertValue