struts2中的数据类型自动转换

参考:https://blog.csdn.net/qq_35326718/article/details/72453042

  https://www.cnblogs.com/aigeileshei/p/5889562.html

  struts2控制层Action可以通过使用拦截器可以自动赋值,但多个属性的数据类型有时会出现不一样的情况,struts2可以将常用的数据类型进行自动转换。有关知识参考上述blog。

  本文建立web项目,实现String转换自定义类和String转换成Date类型。

首先建立index.jsp文件

<%--
  Created by IntelliJ IDEA.
  User: hyp
  Date: 2018/7/14
  Time: 21:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
<s:form action="register" method="POST">
    <s:textfield name="username" label="username"/>
    <s:textfield name="age" label="age"/>
    <s:textfield label="insertDate" name="insertDate"/>
    <s:textfield name="point" label="point"/>
    <s:submit value="提交"/>
</s:form>
</body>
</html>

然后创建实体类Point

package com.hyp.model;

/**
 * @author hyp
 * Project name is LearnStruts
 * Include in com.hyp.model
 * hyp create at 2018/7/14
 **/
public class Point {
    private String x;
    private String y;

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }

    public String getY() {
        return y;
    }

    public void setY(String y) {
        this.y = y;
    }

    @Override
    public String toString() {
        return  x+" "+y;
    }
}

在控制层创建Register.java类

package com.hyp.controller;

import com.hyp.Converter.PointConverter;
import com.hyp.model.Point;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.util.StrutsTypeConverter;

import java.util.Date;

/**
 * @author hyp
 * Project name is LearnStruts
 * Include in com.hyp.controller
 * hyp create at 2018/7/14
 **/
public class Register extends ActionSupport {

    private String username;
    private int age;
    private Date insertDate;
    private Point point;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getInsertDate() {
        return insertDate;
    }

    public void setInsertDate(Date insertDate) {
        this.insertDate = insertDate;
    }

    public Point getPoint() {
        return point;
    }

    public void setPoint(Point point) {
        this.point = point;
    }

    @Override
    public String execute() throws Exception {
        try {
            StrutsTypeConverter converter;
            System.out.println(username);
            System.out.println(age);
            System.out.println(insertDate);
            System.out.println(point);

        } catch (Exception e) {
            return INPUT;
        }
        return SUCCESS;
    }
}

在struts.xml文件中插入如下

<package name="test0" extends="struts-default">
        <action name="register" class="com.hyp.controller.Register">
            <result name="success">ok.jsp</result>
            <result name="input">no.jsp</result>
        </action>
    </package>

再在ok.jsp中显示输入数据

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: hyp
  Date: 2018/7/14
  Time: 17:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>OK</title>
</head>
<body>
<s:property value="username"/>
<s:property value="age"/>
<s:property value="insertDate"/>
<s:property value="point"/>

</body>
</html>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: hyp
  Date: 2018/7/14
  Time: 17:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>OK</title>
</head>
<body>
<s:property value="username"/><br/>
<s:property value="age"/><br/>
<s:property value="insertDate"/><br/>
<s:property value="point"/><br/>

</body>
</html>

此次运行后我们就会发现,输入的Point格式不明确,所以说,无论输入什么,Point的值为null。

因此我们定义Point输入格式为  x,y  .

然后定义一个继承与StrutsTypeConverter的类型转换类,

 1 /**
 2  * @author hyp
 3  * Project name is LearnStruts
 4  * Include in com.hyp.Converter
 5  * hyp create at 2018/7/14
 6  **/
 7 public class PointConverter extends StrutsTypeConverter {
 8     @Override
 9     public Object convertFromString(Map map, String[] strings, Class aClass) {
10         System.out.println("执行了convertFromString");
11         String[] pointarray=strings[0].split("\\,");
12         Point point=new Point();
13         point.setX(pointarray[0]);
14         point.setY(pointarray[1]);
15         return point;
16     }
17
18     @Override
19     public String convertToString(Map map, Object o) {
20         System.out.println("执行了convertToString");
21
22         return ((Point)o).toString();
23     }
24 }

同时在WEB-INF/classes下定义属性文件xwork-conversion.properties

指定转换类型com.hyp.model.Point=com.hyp.Converter.PointConverter

运行后输入表单数据。

按提交后显示,

然后换一种日期输入格式,会发现日期又出错了,struts2默认的日期格式就是yyyy-MM-dd,所以,如果想要使用另一种格式,就需要定义一个DateConverter,格式类似下面:

 1 package com.hyp.Converter;
 2
 3 import org.apache.struts2.util.StrutsTypeConverter;
 4
 5 import javax.xml.bind.TypeConstraintException;
 6 import java.text.SimpleDateFormat;
 7 import java.util.Map;
 8
 9 /**
10  * @author hyp
11  * Project name is LearnStruts
12  * Include in com.hyp.Converter
13  * hyp create at 2018/7/15
14  **/
15 public class DateConverter extends StrutsTypeConverter {
16     private static SimpleDateFormat[] formats={
17             new SimpleDateFormat("yyyy-MM-dd"),
18             new SimpleDateFormat("yyyy年MM月dd日"),
19             new SimpleDateFormat("yyyy/MM/dd")
20     };
21     @Override
22     public Object convertFromString(Map map, String[] strings, Class aClass) {
23         String date=strings[0];
24         for (int i=0;i<formats.length;i++)
25         {
26             try {
27                 return formats[i].parse(date);
28             }catch (Exception e)
29             {
30                 //e.printStackTrace();
31                 continue;
32             }
33         }
34         throw new TypeConstraintException("日期转换失败");
35     }
36
37     @Override
38     public String convertToString(Map map, Object o) {
39         return new SimpleDateFormat("yyyy-MM-dd").format(o);
40     }
41 }

然后运行

简单来说 
执行继承StrutsTypeConverter的类型转换时, 
页面向后台传数据执行convertFromString(), 
后台向前台传数据执行convertToString()

类型转换的详细流程 
1、用户进行请求,根据请求名在struts.xml中寻找Action 
2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好了类型转换,则会去检查在Action同一目录下的action文件名-conversion.properties文件(局部)和src下xwork-conversion.properties文件(全局)(同时存在后者优先)。 
3、从文件中找到要转换的属性及其转换类。 
4、然后进入转换类中,在此类中判断转换的方向。我们是先从用户请求开始的,所以这时先进入从字符串到类的转换。返回转换后的对象。流程返回Action。 
5、将返回的对象赋值给Action中的属性,执行Action中的execute() 
6、执行完execute()方法,根据struts.xml的配置转向页面 
7、在jsp中显示内容时,根据页面中的属性名去调用相应的get方法,以便输出 
8、在调用get方法之前,会检查有没有此属性的自定义类型转换。如果有,再次跳转到转换类当中。 
9、在转换类中再次判断转换方向,进入由类到字符串的转换,完成转换后返回字符串。 
10、将返回的值直接带出到要展示的页面当中去展示。

原文地址:https://www.cnblogs.com/pingxin/p/p00006.html

时间: 2024-08-06 13:04:10

struts2中的数据类型自动转换的相关文章

php之数据类型自动转换

原文:php之数据类型自动转换 1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的false: A.布尔类型的false; B.空字符串'' C.正数0或浮点数0.0或字符串'0'(不包括字符串'0.0') D.没有成员的数组----array() E.null 除此之外其它值都转换成true. 1.2转换成数值型的原则 A.如果字符串为合法的数字字符串,同时不包含./e/E,而且没有超过整型的存数

JAVA数据类型自动转换,与强制转换

一.数据类型自动转换 public class Test{ public static void main(String[] args){ int a = 1; double b = 1.5; double a_b_count = a+b; //整型与双精度型相加时,结果会自动转换为双精度型 String c = "凌"; char d = '晨'; char e = '好'; String c_d_e_content = c+d+e; //字符型与字符串型相加时,结果会自动转换为字符

IIS中实现http自动转换到https

IIS中实现http自动转换到https修改以下文件:C:\WINDOWS\Help\iisHelp\common\403-4.htm 为以下内容<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><HTML><HEAD><TITLE>该页必须通过安全通道查看</TITLE><

JS中的数据类型和转换

一.JS中的数据类型 js中的数据类型可以分为五种:number .string .boolean. underfine .null. number:数字类型 ,整型浮点型都包括. string:字符串类型,右数字字母字符串以及标点符号组成,必须放在单引号或者双引号中. boolean:布尔类型,只有true和false两种值. underfine:未定义,一般指的是已经声明,但是没有赋值的变量,如var a; null:空对象类型,var a = null,和var a=""有区别;

struts2中Double类型的转换

今天做项目,ssh + Extjs,页面js中定义了几个NumberField,对应的value都是double类型的,其中有个NumberField的name为 name,结果执行的时候报错了,说找不到setName(String name)方法,可我分明写了get和set方法:setName(double name),奇怪,为什么是setName(String name)?原来问题出在struts上,struts自带的类型转换机制将double类型的数值用string转换了,当然出问题了.

js中的数据类型及其转换

Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型,也可以是浮点数.如 var a=12,b=12.5; 二,string 字符串由零个或多个字符构成,字符包括字母,数字,标点符号和空格;需要注意的是 字符串必须放在引号里(单引号或双引号); 如 var bob=”man”; alert(“bob”); alert(bob); 浏览器首先会弹出包含有

数据类型自动转换(Java)

public class Test{ public static void main(String[]args) { int a=3;//穷人 double b=1.5;//富人 double c=a+b;//相加就成了富人,如果把c定义成int类型,就会报错 System.out.println(c); char man='男': String women='女': String str=man+women; System.out.println(str); }} int类型等级比double

php中数据类型自动转换

1.1 转为布尔型(即返回值为0) 空字符串''或"" 数字0或0.0 字符'0'或"0" 空值NULL 没有成员的数组    其余都转换成布尔型true,包含资源 1.2 转为整数或浮点型 如果字符串为合法的数字字符串,则直接转换成整型/浮点型 如果字符串中包含.或e或E,则转换成浮点型:否则转换成整型 非法的数字字符串转换成数值0 布尔型true转换成数字1,false转换成数字0 空值null将转换成数字0 1.3  转为字符串型 数值将直接转换成数字字符串

js中关于数据类型的转换

* 一.转化为数字*/console.log(‘123123’*1.0); /* 二.从一个值中提取另一中类型的值,并完成转化工作 */console.log(parseInt(‘1233zxhag’)); //1233console.log(parseFloat(‘1.123aef’)); //1.123console.log(eval(1+123)); //124console.log(toString(123)); //[object Window] ‘123’ /* 将整个值从一种类型转