struts2提供了简单基本类型的自动转换,如
java
八种基本数据类型,以及
String
,
Date
等简单数据类型。
我们将上个例子修改一下:
index
.jsp中添加:
年龄:
<
input
type
=
"text"
name
=
"age"
/><
br
/>
生日:
<
input
type
=
"text"
name
=
"birthday"
/><
br
/>
result
.jsp中添加:
你的年龄:${requestScope.age}
<
br
/>
你的生日是:${requestScope.birthday}
UserAction中添加两个属性:
private int age
;
private Date birthday
;并添加
get/set
方法。运行后输入相应信息结果页面显示:
你的用户名:lisi
你的年龄:20
你的生日是:Sat Sep 08 00:00:00 CDT 1990
我们可以看到struts2已经将页面传过来的string类型经行了转换。
但是如果我们传入一个User类型的对象,struts2会不会帮我们转换的,肯定不会了,struts2怎么会知道User是个什么东西呢?当我们需要对复杂对象类型经行转换时就需要我们自己动手了。Struts2只会帮我做简单的事,复杂的事还是需要我们自己来做。
下面来看看一个复杂对象类型的转换该怎么做?(实例二)
index.jsp:
<
body
>
<
h2
>
请用逗号分隔用户名和年龄
</
h2
>
<
form
action
=
"userAction"
>
用户:
<
input
type
=
"text"
name
=
"user"
/>
<
input
type
=
"submit"
value
=
"提交
"
/>
</
form
>
</
body
>
result
.jsp:
<
body
>
<
s:property
value
=
"user"
/>
</
body
>
struts
.xml:
<
struts
>
<
package
name
=
"struts2_2"
extends
=
"struts-default"
>
<
action
name
=
"userAction"
class
=
"com.gufengxiachen.struts2_2.action.UserAction"
>
<
result
name
=
"success"
>
/result.jsp
</
result
>
</
action
>
</
package
>
</
struts
>
UserAction.java:
package com.gufengxiachen.struts2_2.action;
import com.gufengxiachen.struts2_2.model.User;
import com.opensymphony.xwork2.ActionSupport;
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 {
return "success";
}
}
User.java:
package
com.gufengxiachen.struts2_2.model;
public
class
User {
private
String
username
;
private
int
age
;
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;
}
}
UserConversion.java(转换器类
):
package com.gufengxiachen.struts2_2.conversion;
import java.util.Map;
import java.util.StringTokenizer;
import com.gufengxiachen.struts2_2.model.User;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class UserConversion extends DefaultTypeConverter{
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
//从页面到后台转换
if(User.class==toType){
String[] str=(String[])value;
String firstValue=str[0];
StringTokenizer st=new StringTokenizer(firstValue,";");
String username=st.nextToken();
int age=Integer.parseInt(st.nextToken());
User user=new User();
user.setUsername(username);
user.setAge(age);
return user;
}else if(String.class==toType) //从后台向页面转换
{
User user=(User)value;
String username=user.getUsername();
int age=user.getAge();
String userInfo="你的用户名:
"+username+"
你的年龄:
"+age;
return userInfo;
}
return null;
}
}
UserAction-conversion.properties(配置转换器属性文件
):
user=com.gufengxiachen.struts2_2.conversion.UserConversion
web.xml和实例一样。
我们可以看到result.jsp
页面显示:
你的用户名:zhangsan你的年龄:15
这个很好理解,当struts2接受参数时发现Action中没有属性与之匹配,当它发现UserAction-conversion.perproties文件时,发现有个转换器,然后转向相应的转换器,转换后返回结果。
我们可以看到转换器实现了一个类:DefaultTypeConverter,并且重写了
c
onvertValue这个方法,这个方法就是执行转换的方法。在这个方法里,我们可以进行双向转换,即可以从页面传过来的String
转换为我们需要的对象,也可以经行反向转换,其实我们还可以继承
StrutsTypeConverter
类,这个类是
struts2
对类型转换的一个简单封装,它里面有两个方法一个是从
String
转换到对象,
convertFromString(Map<String,Object> context,String[],values,Class toClass),
另一个是从对象转换到
String
类型为:
converterToString
(
Map<String ,Object> context,Object o,
)
推荐继承StrutsTypeConverter
类,因为它方便,清晰。
下面来总结一下复杂类型转换:
对于自定义类型转换器来说需要提供三个信息:Action
的名字,
Action
中待转换的属性名以及该属性对应的类型转换器。其中
Action
的名字是通过属性文件
(
和
Action
同包
)
来获得的,
Action
中待转换的属性名是通过属性文件中的
key
值获得的,该属性对应的类型转换器是通过
key
值所对应的
value
值获得的。
可使用struts2
框架自带的类型转换器
StrutsTypeConverter
简化类型转换。
StrutsTypeConverter
继承于
DefaultTypeConverter
。提供两个抽象方法,分别为
convertFromString
和
converToString
,分别实现从页面向后台对象转换和从后台对象转换成字符串
还有个全局类型转换,就是不特定哪个Action
,对所有
Action
中相同的对象进行转换,和上面的类型转换唯一的区别就是转换的配置文件,文件名特定为:
xwork-conversion.perproties
。位置为
src
根目录下,内容为:待转换的类的全名(包括包名)
=
转换器的名字。
类型转换就介绍这么多,其实在实际应用中,用的不是特别多,想了解更多,可以参考struts2
的
API
文档。
分享到:
相关推荐
- Struts2的OGNL负责类型转换,并提供了内置的转换器,支持多种基本类型和自定义类型。 6. **验证机制**: - Struts1的验证可以通过ActionForm的validate方法或Validator扩展来实现。 - Struts2支持validate方法...
下面,我将根据标题“JavaWeb自学的心得和笔记”以及提供的文件名称,详细阐述一些关键的知识点。 首先,JavaWeb是基于Java语言进行Web应用开发的框架和技术集合。它包括了Servlet、JSP、JSTL、EL表达式、过滤器、...
【狂神说 JavaWeb 笔记】 在JavaWeb开发领域,狂神说系列教程深受许多初学者和进阶者的喜爱。这些笔记详细介绍了如何利用Java技术进行...无论是自学还是系统学习,这些笔记都将为你的JavaWeb开发之路提供宝贵的指导。
web基础笔记 Web 基础知识 Web 应用通过浏览器访问,运行在远程的服务器上,访问网站。浏览器是通用的客户端,B/S 结构的客户端。服务器端内容更新客户端不要更新,更新对用户影响不大。 客户端和服务器端 ...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!