参考: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. day19 django继续

    上节回顾 django - 路由系统:url.py - 视图函数:views.py - 模板引擎渲染 - HttpResonse(字符串) - render(request,'index.html') ...

  2. .net 数据表格显示控件

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/chenjinge7/article/details/30470609 1. GridView 控件 ...

  3. SpringCloud Zuul 路由映射规则配置

    阅读目录 前言 快速入门 路由详解 Cookie与头信息 本地跳转 Hystrix和Ribbon支持 过滤器解释 动态加载 后记 回到目录 前言 本文起笔于2018-06-26周二,接了一个这周要完成 ...

  4. python 不定长参数*args

  5. 基于opencv的RandomForest随机森林

    2.OpenCV函数使用 OpenCV提供了随机森林的相关类和函数.具体使用方法如下: (1)首先利用CvRTParams定义自己的参数,其格式如下 CvRTParams::CvRTParams(in ...

  6. Arthas用法

    简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的? 为什么会报各种类相关的 ...

  7. Maven command

    mvn eclispe:clean mvn eclispe:eclispe mvn clean package mvn clean package -Dmaven.test.skip=true mvn ...

  8. C# 从零开始写 SharpDx 应用 画三角

    原文:C# 从零开始写 SharpDx 应用 画三角 版权声明:博客已迁移到 https://blog.lindexi.com 欢迎访问.如果当前博客图片看不到,请到 https://blog.lin ...

  9. python 布尔型(bool)

  10. Laravel的请求声明周期

    声明周期概述# 开始# public/index.php 文件是所有对Laravel应用程序的请求的入口点.而所有的请求都是经由你的Web服务器(Apache/Nginx) 通过配置引导到这个文件.i ...