参考: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 异常处理与流程控制

  2. Libevent:11使用Libevent的DNS上层和底层功能

    Libevent提供了一些API用来进行DNS域名解析,并且提供了实现简单DNS服务器的能力. 本章首先描述域名解析的上层功能,然后介绍底层功能及服务器功能. 注意:Libevent的当前DNS客户端 ...

  3. H5页面在iOS网页中的数字被识别为电话号码,字体颜色变黑色,且颜色不可改变

    解决办法:在html中添加代码: <meta name="format-detection" content="telephone=no" />

  4. oracle函数 INSTR(C1,C2[,I[,J]])

    [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] C1    被搜索的字符串 C2    希望搜索的字符串 I     搜 ...

  5. vue filter使用方法

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化. 过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持). 过滤器应该被添加在 JavaScr ...

  6. IntelliJ IDEA和Eclipse设置JVM运行参数

    打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions 文件,需针对不同的JDK进行配置: 32 位:idea.exe.vmoptions64 位:idea64.exe.v ...

  7. React事件用法

    一.事件处理函数的使用 1.1 绑定事件处理函数 1.2 使用 <HelloWorld onClick={this.handleClick}/> 大括号中指定的是this对象即当前组件引用 ...

  8. lrj word

    www.tup.tsinghua.edu.cn/upload/books/yz/055687-01.doc bing搜索UVa437 搜到这个word版本的电子书第9章

  9. 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射

    机器学习降维方法概括   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...

  10. Java Integer类的缓存

    首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...