`

struts2 自学笔记(3)之类型转换

阅读更多

 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 文档。

0
1
分享到:
评论

相关推荐

    struts自学笔记

    - Struts2的OGNL负责类型转换,并提供了内置的转换器,支持多种基本类型和自定义类型。 6. **验证机制**: - Struts1的验证可以通过ActionForm的validate方法或Validator扩展来实现。 - Struts2支持validate方法...

    JavaWeb自学的心得和笔记

    下面,我将根据标题“JavaWeb自学的心得和笔记”以及提供的文件名称,详细阐述一些关键的知识点。 首先,JavaWeb是基于Java语言进行Web应用开发的框架和技术集合。它包括了Servlet、JSP、JSTL、EL表达式、过滤器、...

    狂神说 JavaWeb 笔记

    【狂神说 JavaWeb 笔记】 在JavaWeb开发领域,狂神说系列教程深受许多初学者和进阶者的喜爱。这些笔记详细介绍了如何利用Java技术进行...无论是自学还是系统学习,这些笔记都将为你的JavaWeb开发之路提供宝贵的指导。

    web基础笔记

    web基础笔记 Web 基础知识 Web 应用通过浏览器访问,运行在远程的服务器上,访问网站。浏览器是通用的客户端,B/S 结构的客户端。服务器端内容更新客户端不要更新,更新对用户影响不大。 客户端和服务器端 ...

    避开10大常见坑:DeepSeekAPI集成中的错误处理与调试指南.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    前端分析-2023071100789

    前端分析-2023071100789

    基于kinect的3D人体建模C++完整代码.cpp

    基于kinect的3D人体建模C++完整代码.cpp

    搞机工具箱10.1.0.7z

    搞机工具箱10.1.0.7z

    GRU+informer时间序列预测(Python完整源码和数据)

    GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。

    性价比革命:DeepSeekAPI成本仅为GPT-4的3%的技术揭秘.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水

    基于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

    auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    复件 复件 建设工程可行性研究合同[示范文本].doc

    复件 复件 建设工程可行性研究合同[示范文本].doc

    13考试真题最近的t64.txt

    13考试真题最近的t64.txt

    Microsoft Visual C++ 2005 SP1 Redistributable PackageX86

    好用我已经解决报错问题

    嵌入式开发入门:用C语言点亮LED灯的全栈开发指南.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    auto_gptq-0.4.2-cp38-cp38-win_amd64.whl

    auto_gptq-0.4.2-cp38-cp38-win_amd64.whl

    自动立体库设计方案.pptx

    自动立体库设计方案.pptx

    手把手教你用C语言实现贪吃蛇游戏:从算法设计到图形渲染.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    性能对决:DeepSeek-V3与ChatGPTAPI在数学推理场景的基准测试.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

Global site tag (gtag.js) - Google Analytics