参考: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的类型转换类,

 /**
* @author hyp
* Project name is LearnStruts
* Include in com.hyp.Converter
* hyp create at 2018/7/14
**/
public class PointConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
System.out.println("执行了convertFromString");
String[] pointarray=strings[0].split("\\,");
Point point=new Point();
point.setX(pointarray[0]);
point.setY(pointarray[1]);
return point;
} @Override
public String convertToString(Map map, Object o) {
System.out.println("执行了convertToString"); return ((Point)o).toString();
}
}

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

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

运行后输入表单数据。

按提交后显示,

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

 package com.hyp.Converter;

 import org.apache.struts2.util.StrutsTypeConverter;

 import javax.xml.bind.TypeConstraintException;
import java.text.SimpleDateFormat;
import java.util.Map; /**
* @author hyp
* Project name is LearnStruts
* Include in com.hyp.Converter
* hyp create at 2018/7/15
**/
public class DateConverter extends StrutsTypeConverter {
private static SimpleDateFormat[] formats={
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy/MM/dd")
};
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
String date=strings[0];
for (int i=0;i<formats.length;i++)
{
try {
return formats[i].parse(date);
}catch (Exception e)
{
//e.printStackTrace();
continue;
}
}
throw new TypeConstraintException("日期转换失败");
} @Override
public String convertToString(Map map, Object o) {
return new SimpleDateFormat("yyyy-MM-dd").format(o);
}
}

然后运行

简单来说 
执行继承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中的数据类型自动转换的更多相关文章

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

    一.数据类型自动转换 public class Test{ public static void main(String[] args){ int a = 1; double b = 1.5; dou ...

  2. IIS中实现http自动转换到https

    IIS中实现http自动转换到https修改以下文件:C:\WINDOWS\Help\iisHelp\common\403-4.htm 为以下内容<!DOCTYPE HTML PUBLIC &q ...

  3. struts2中Double类型的转换

    今天做项目,ssh + Extjs,页面js中定义了几个NumberField,对应的value都是double类型的,其中有个NumberField的name为 name,结果执行的时候报错了,说找 ...

  4. php之数据类型自动转换

    1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的false: A.布尔类型的false; B.空字符 ...

  5. JS中的数据类型和转换

    一.JS中的数据类型 js中的数据类型可以分为五种:number .string .boolean. underfine .null. number:数字类型 ,整型浮点型都包括. string:字符 ...

  6. JavaScript 那些不经意间发生的数据类型自动转换

    JavaScript可以自由的进行数据类型转换,也提供了多种显式转换的方式.但是更多的情况下,是由JavaScript自动转换的,当然这些转换遵循着一定的规则,了解数据类型自由转换的规则是非常必要的. ...

  7. js中的数据类型及其转换

    Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...

  8. SpringBoot中mybatis配置自动转换驼峰标识没有生效

    mybatis提供了一个配置: #开启驼峰命名转换 mybatis.configuration.map-underscore-to-camel-case=true 使用该配置可以让mybatis自动将 ...

  9. js中的数据类型以及转换

    Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...

随机推荐

  1. Python学习之路10☞面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  2. @codeforces - 718E@ Matvey's Birthday

    目录 @description@ @solution@ @accepted code@ @detail@ @description@ 给定一个长度为 n 的字符串 s,保证只包含前 8 个小写字母 ' ...

  3. 【Linux】gnuplot命令大全

    gnuplot命令大全 在linux命令提示符下运行gnuplot命令启动,输入quit或q或exit退出. plot命令 gnuplot> plot sin(x) with line line ...

  4. 2016 Asia Jakarta Regional Contest L - Tale of a Happy Man UVALive - 7722

    UVALive - 7722 一定要自己做出来!

  5. 因为对 Docker 不熟悉建了 N 多个 Nginx

    因为对 Docker 不熟悉建了 N 多个 Nginx 一直不停的 docker run nginx 结果出现无数个 nginx. 然后最原来的 nginx 启动不了了. 使用 docker ps - ...

  6. Android Http实现文件的上传和下载

    最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂.直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了 ...

  7. java future模式 所线程实现异步调用(转载

    java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场 ...

  8. Oracle中组合索引的使用详解(转)

    在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.在组合索引的使用方面,Oracle有以下特点: 1. 当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的w ...

  9. Python基础:常用函数

    1:enumerate enumerate(sequence, start=0) 该函数返回一个enumerate对象(一个迭代器).其中的sequence参数可以是序列.迭代器或者支持迭代的其他对象 ...

  10. oracle 用TRUNCATE替代DELETE

    当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务, ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到 ...