struts2中的数据类型自动转换

Posted 平心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、将返回的值直接带出到要展示的页面当中去展示。

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

Struts2请求数据自动封装和数据类型转换

struts2 表单参数自动封装和参数类型自动转换

Struts2学习———— 表单参数自动封装和参数类型自动转换

struts2_struts类型转换

Struts2 类型转换(易百教程)

struts2---自定义类型转换器