该帖已经被评为隐藏帖
|
|||
---|---|---|---|
作者 | 正文 | ||
发表时间:2007-05-03
在我已往的Struts 1.x项目经验中,有个问题不时的出现——在创建FormBean时,对于某个属性到底应该用String还是其它类型? 开 发Web应用程序与开发传统桌面应用程序不同,Web应用程序实际上是分布个不同的主机(当然也可以同一个主机,不过比较少见)上的两个进程之间互交。这 种互交建立在HTTP之上,它们互相传递是都是字符串。换句话说, 服务器可以的接收到的来自用户的数据只能是字符串或字符数组,而在服务器上的对象中,这些数据往往有多种不同的类型,如日期(Date),整数 (int),浮点数(float)或自定义类型(UDT)等,如图1所示。因此,我们需要服务器端将字符串转换为适合的类型。 图1 UI与服务器对象关系 同样的问题也发生在使用UI展示服务器数据的情况。HTML的Form控件不同于桌面应用程序可以表示对象,其值只能为字符串类型,所以我们需要通过某种方式将特定对象转换成字符串。 要实现上述转换,Struts 2.0中有位魔术师可以帮到你——Converter。有了它,你不用一遍又一遍的重复编写诸如此类代码: Date birthday = DateFormat.getInstance(DateFormat.SHORT).parse(strDate); 好了,现在让我们来看一个例子。 转换器——Hello World在我的上一篇文章《在Struts 2.0中国际化(i18n)您的应用程序》的最后我举了一个可以让用户方便地切换语言的例子,下面例子与其相似,但实现方法不同。 首先,如《在Struts 2.0中国际化(i18n)您的应用程序》的第一个例子一样,创建和配置默认的资源文件; 接着,新建源代码文件夹下的tutorial包创建HelloWorld.java文件,代码如下: package tutorial;
import java.util.Locale; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.LocalizedTextUtil; public class HelloWorld extends ActionSupport { private String msg; private Locale loc = Locale.US; public String getMsg() { return msg; } public Locale getLoc() { return loc; } public void setLoc(Locale loc) { this .loc = loc; } @Override public String execute() { // LocalizedTextUtil是Struts 2.0中国际化的工具类,<s:text>标志就是通过调用它实现国际化的 msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc); return SUCCESS; } } 然后,在源代码文件夹下的struts.xml加入如下代码新建Action: < package name ="ConverterDemo" extends ="struts-default" >
< action name ="HelloWorld" class ="tutorial.HelloWorld" > < result > /HelloWorld.jsp </ result > </ action > </ package > 再在Web文件夹下,新建 HelloWorld.jsp,代码如下: < %@ page contentType ="text/html; charset=UTF-8" % >
< %@taglib prefix ="s" uri ="/struts-tags" % > < html > < head > < title > Hello World </ title > </ head > < body > < s:form action ="HelloWorld" theme ="simple" > Locale: < s:textfield name ="loc" /> < s:submit /> </ s:form > < h2 >< s:property value ="msg" /></ h2 > </ body > </ html > 接下来,在源代码文件夹的tutorial包中新建LocaleConverter.java文件,代码如下: package tutorial;
import java.util.Locale; import java.util.Map; public class LocaleConverter extends ognl.DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if (toType == Locale. class ) { String locale = ((String[]) value)[ 0 ]; return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 )); } else if (toType == String. class ) { Locale locale = (Locale) value; return locale.toString(); } return null ; } } 再接下来,在源代码文件夹下新建xwork-conversion.properties,并在其中添加如下代码: java.util.Locale = tutorial.LocaleConverter
发布运行应用程序,在浏览器中键入http://localhost:8080/Struts2_Converter/HelloWorld.action,输出页面如图2所示: 在Locale输入框中输入“zh_CN”,按“Submit”提交,出现如图3所示页面: 上述例子中,Locale文本输入框对应是Action中的类型为java.util.Locale的属性loc,所以需要创建一个自定义转变器实现两者间的转换。所有的Struts 2.0中的转换器都必须实现ognl.TypeConverter接口。 为了简单起见,OGNL包也为你提供了ognl.DefaultTypeConverter类去帮助您实现转换器。在例子中,LocaleConverter继承了ognl.DefaultTypeConverter,重载了其方法原型为“public Object convertValue(Map context, Object value, Class toType)”的方法。下面简单地介绍一下函数的参数:
已有的转换器对于一此经常用到的转换器,如日期、整数或浮点数等类型,Struts 2.0已经为您实现了。下面列出已经实现的转换器。
批量封装对象(Bean)不知道大家是否遇过这种情况,在一个页面里同时提交几个对象。例如,在发布产品的页面,同时发布几个产品。我在之前一个项目就遇到过这种需求,当时用的是 Struts 1.x。那是一个痛苦的经历,我在Google搜了很久都没有理想的结果。幸运的是,在Struts 2.0中这种痛苦将一去不复返。下面我就演示一下如何实现这个需求。 首先,在源代码文件夹下的tutorial包中新建Product.java文件,内容如下: package tutorial;
import java.util.Date; publicclass Product { private String name; privatedouble price; private Date dateOfProduction; public Date getDateOfProduction() { return dateOfProduction; } publicvoid setDateOfProduction(Date dateOfProduction) { this.dateOfProduction = dateOfProduction; } public String getName() { return name; } publicvoid setName(String name) { this.name = name; } publicdouble getPrice() { return price; } publicvoid setPrice(double price) { this.price = price; } } 然后,在同上的包下添加ProductConfirm.java类,代码如下: package tutorial;
import java.util.List; import com.opensymphony.xwork2.ActionSupport; publicclass ProductConfirm extends ActionSupport { public List<Product> products; public List<Product> getProducts() { return products; } publicvoid setProducts(List<Product> products) { this.products = products; } @Override 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||
返回顶楼 | |||
发表时间:2007-05-16
批量封装对象(Bean)
代码还没有结束吧,jsp中怎么表示阿 |
|||
返回顶楼 | |||
发表时间:2007-05-29
很好的资料
|
|||
返回顶楼 | |||
浏览 2570 次