远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

  • Linux

  • Struts2

    • Struts2-3概述与MVC模式深度剖析
    • Struts2-3环境准备以及构建第一个Struts2-3的hello-word项目
    • 使用MyEclipse2022-1搭建Maven版本的Struts2-3项目
    • Struts2的类型转换
    • Struts2-3的独有特性与StrutsPrepareAndExecute过滤器源码分析
    • Struts2类型转换之单个对象深入研究
      • 重要特性总结
      • StrutsTypeConverter
      • 使用 StrutsTypeConverter 进行类型转换实例
        • 新建一个 test.jsp
        • 流程处理 Struts.xml
        • Action 处理类 UserAction
        • 类型转换器 UserConverter2.java
        • 类型转换配置 UserAction-conversion.properties
        • 结果展示 output.jsp
        • 实际效果
        • 总结
    • Struts2类型转换之批量类型转换
    • Struts2类型转换之全局类型转换
    • Struts2自定义方法最佳实践
    • Struts2输入校验剖析之编码方式校验
    • Struts2的Action中自定义方法的输入校验
  • Hibernate

  • Webservice

  • 分布式

  • 分布式框架

  • 后端开发
  • Struts2
terwer
2022-10-30
目录

Struts2类型转换之单个对象深入研究

# 重要特性总结

  1. Struts2 的类型转换,对于 8 个原生数据类型以及 Date,String 等常见类型,Struts2 可以使内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,需要我们自己指定类型转换的方式,即自定义类型转换器。

  2. 对于自定义类型的转换器来说,需要提供三个信息:Action 的名字、Action 中待转换的属性名以及该属性对应的类型转换器。

    其中 Action 的名字是通过属性文件的 文件名​​ 来获得的、 Action 中待转换的属性名是通过属性文件中的 key​​ 来获得的,该属性对应的类型转换器是通过该 key​​ 对应的 value​​ 来获得的。

# StrutsTypeConverter

Base class for type converters used in Struts. This class provides two abstract methods that are used to convert both to and from strings -- the critical functionality that is core to Struts's type coversion system.

Type converters do not have to use this class. It is merely a helper base class, although it is recommended that you use this class as it provides the common type conversion contract required for all web-based type conversion.

There's a hook (fall back method) called performFallbackConversion​ of which could be used to perform some fallback conversion if convertValue​ method of this failed. By default it just ask its super class (Ognl's DefaultTypeConverter) to do the conversion.

To allow the framework to recognize that a conversion error has occurred, throw an XWorkException or preferable a TypeConversionException.

# 使用 StrutsTypeConverter 进行类型转换实例

# 新建一个 test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 converter</title>
</head>
<body>

	

	<form action="userAction.action">

		user info: <input type="text" name="user"/><br/>
		<input type="submit" value="submit"/>

	</form>

</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 流程处理 Struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

	<package name="struts2" extends="struts-default">
		<action name="userAction" class="space.terwer.struts23.UserAction">
			<result name="success">/output.jsp</result>
		</action>
	</package>

</struts>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Action 处理类 UserAction

package space.terwer.struts23;

import com.opensymphony.xwork2.ActionSupport;

import space.terwer.bean.User;

public class UserAction extends ActionSupport {
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("username:" + this.getUser().getUsername());
		System.out.println("password:" + this.getUser().getPassword());

		return SUCCESS;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 类型转换器 UserConverter2.java

package space.terwer.converter;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import space.terwer.bean.User;

public class UserConverter2 extends StrutsTypeConverter {

	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		String firstValue = values[0];

		String[] st = firstValue.split(";");

		String uername = st[0];
		String password = st[1];

		User user = new User();
		user.setUsername(uername);
		user.setPassword(password);

		return user;
	}

	@Override
	public String convertToString(Map context, Object o) {
		User user = (User) o;

		String username = user.getUsername();
		String password = user.getPassword();

		String userInfo = "Use StrutsTypeConverter converted from UserConverter2=>username: " + username
				+ ", password: " + password;
		return userInfo;
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 类型转换配置 UserAction-conversion.properties

user=space.terwer.converter.UserConverter2
1

# 结果展示 output.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>  
  
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 converter result</title>
</head>
<body>
	<s:property value="user"/>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 实际效果

​

# 总结

可以使用 Struts2​ 框架自带的类型转换器 StrutsTypeConverter​ 简化类型转换代码的编写,StrutsTypeConverter​ 类继承于 DefaultTypeConverter​ 父类,并且提供了两个抽象方法: convertFromString​ 和 convertToString​ ,分别表示 从页面额字符串转换为后台对象 以及 从后台对象转换为页面字符串 ,我们 只需要实现这两个抽象方法即可实现类型转换 。

编辑 (opens new window)
#类型#转换器#类型转换#属性#转换#struts#struts2#type#type-converter#converter
上次更新: 2023/02/22, 13:47:25
Struts2-3的独有特性与StrutsPrepareAndExecute过滤器源码分析
Struts2类型转换之批量类型转换

← Struts2-3的独有特性与StrutsPrepareAndExecute过滤器源码分析 Struts2类型转换之批量类型转换→

最近更新
01
解决css部分border被圆角切掉之后圆角的边框消失问题
03-18
02
使用TypeScript开发一个自定义的Node-js前端开发脚手架
03-08
03
Github-Actions使用release-please实现自动发版
03-06
更多文章>
Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式