论坛首页 Java企业应用论坛

struts2 类型转换

浏览 3217 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-25   最后修改:2010-07-25

      在Web项目开发中由于很多数据在页面上显示时候都是以字符串类型来显示。而在控制层或者model层中开发人员使用Java开发时候,对于这些从页面上传入或者需要传到页面上显示的数据开发的类型不一定都是字符串类型。因此常常需要在视图和非视图之间进行类型转换

     

Struts2本身所具有的类型转换功能。大致分为以下:

l         intbooleandoubleJava基本类型转换。

l         Date类型转换。

l         List类型转换。

l         Set类型转换。

l         数组类型转换

基本数据类型转换功能

public class AddMaterialAction extends ActionSupport { //属性类型需要类型转换的对象 private Material material; public Material getMaterial() { return material; } public void setMaterial(Material material) { this.material = material; } public String execute() throws Exception { return SUCCESS; } }

 

<!-- Action所在包定义 --> <package name="C07.1.1" extends="struts-default"> <action name="addMaterial" class="com.action.AddMaterialAction"> <result name="input">/jsp/addMaterial.jsp</result> <result name="success">/jsp/showMaterial.jsp</result> </action> </package>

 

<!-- 材料输入表单 --> <table> <s:form id="materialForm" action="addMaterial"> <s:textfield name="material.material" label="材料名"></s:textfield> <s:textfield name ="material.bid" label="价格"></s:textfield> <s:textfield name ="material.mount" label="库存量"></s:textfield> <s:datetimepicker name ="material.expireDate" label="过期日期"></s:datetimepicker> <s:submit value="提交"></s:submit> </s:form> </table

 

<!-- 材料数据显示 --> <table> 材料名: <s:property value="material.material" ></s:property> 价格: <s:property value="material.bid" ></s:property> 库存量: <s:property value="material.mount" ></s:property> 过期日期: <s:property value="material.expireDate" ></s:property> </table>

      在页面上输入一个Material对象的所有属性值,并将它的属性值显示在页面上。由于之前很多示例中已经有过Material这个JavaBean对象代码。这里就没有写出给读者参阅。由以显示的示例代码也可知,Material对象由材料名、价格、库存量和材料过期日期四个属性组成。恰好这四个属性的数据类型分别是Stringdoubleintdate四个Java类型,因此由该示例可以明白Struts2的类型转换是如何转换这些Java类型。由于Struts2也是使用拦截器来进行类型转换,因此对这些基本的Java类型转换根本不需要开发人员编写任何类型转换代码

      在输入数据的页面,笔者使用OGNLStruts2标签来建立一个数据输入的表单。使用的material对象在Action中已定义完成,并建立gettersetter方法。这样在JSP页面可以设置该对象。在页面中按“提交”按钮后,就相当于“setMaterial()”方法。在系统根据struts.xml配置文件执行Action之前,Struts2自带的类型转换拦截器就已经将Material对象中几个属性变量的类型由页面上输入时候的String类型转换为Material对象属性变量被定义的数据类型

     在数据显示页面上显示数据时候,实际上做的事情是上述操作的一个逆向操作。Material对象中每个属性变量的数据类型又都转换为页面上需要显示的String类型

   

 

     List集合类型数据类型转换功能

public class AddMaterialAction extends ActionSupport { private List<Material> materialList; public String execute() throws Exception { return SUCCESS; } public List<Material> getMaterialList() { return materialList; } public void setMaterialList(List<Material> materialList) { this.materialList = materialList; } }


 

 

<package name="C07.1.2" extends="struts-default" > <action name="addMaterial" class="com.action.AddMaterialAction"> <result name="input">/jsp/addMaterial.jsp</result> <result name="success">/jsp/showMaterial.jsp</result> </action> </package>

 

#集合属性-List类型 Element_materialList=com.model.Material

     该属性文件属于局部类型转换属性定义文件。文件名要以ActionName打头,然后以“--conversion.properties”结尾。这表示是对该Action中的List集合类型指定元素类型。而且该属性文件一定要和Action放在同一目录下。否则运行系统时候Struts2是不会知道该ActionList集合类型变量元素是何种类型对象

          试设想有一种情况,多个Action都需要将某一变量的类型进行转换。此时可以像之前所述使用属性文件来定义被转换类型的变量。但是1Action定义1个属性文件则太浪费时间。因此Struts2中还有个全局类型转换属性定义文件,这样所有需要类型转换的Action都可以调用该文件中定义的需要类型转换的变量。全局属性文件名字必须为“xwork-conversion.properties。文件中定义的内容其实和局部属性文件中大同小异,只是这些被定义的变量可以在所有Action中进行类型转换。全局属性文件没必要和具体Action代码文件放在一起,只需要放在源代码根目录下即可。也就是说全局属性文件直接放在“src”文件夹下即可

<table> <s:form id="materialForm" action="addMaterial" theme="simple"> <table> <tr> <td>材料名</td> <td>价格</td> <td>库存量</td> <td>过期日期</td> </tr> <s:iterator value="new int[4]" status="m"> <tr> <td><s:textfield name="%{'materialList['+#m.index+'].material'}" /></td> <td><s:textfield name="%{'materialList['+#m.index+'].bid'}" /></td> <td><s:textfield name="%{'materialList['+#m.index+'].mount'}" /></td> <td><s:datetimepicker name="%{'materialList['+#m.index+'].expireDate'}" /></td> </tr> </s:iterator> <tr> <td colspan="4"><s:submit value="提交"></s:submit> </tr> </table> </s:form> </table>

 

<table> <tr> <td>材料名</td> <td>价格</td> <td>库存量</td> <td>过期日期</td> </tr> <s:iterator value="materialList" status="m"> <tr> <td><s:property value="material" ></s:property></td> <td><s:property value="bid" ></s:property></td> <td><s:property value="mount" ></s:property></td> <td><s:property value="expireDate" ></s:property></td> </tr> </s:iterator> </table>

 

    Set集合类型数据类型转换功能

 

 

#集合属性-Set类型 Element_materialSet=com.model.Material #制定索引 KeyProperty_materialSet=material

 

 

<table> <s:form id="materialForm" action="addMaterial" theme="simple"> <table> <tr> <td>材料名</td> <td>价格</td> <td>库存量</td> <td>过期日期</td> </tr> <s:iterator value="new int[4]" status="m"> <tr> <td><s:textfield name="%{'materialSet.makeNew['+#m.index+'].material'}" /></td> <td><s:textfield name="%{'materialSet.makeNew['+#m.index+'].bid'}" /></td> <td><s:textfield name="%{'materialSet.makeNew['+#m.index+'].mount'}" /></td> <td><s:datetimepicker name="%{'materialSet.makeNew['+#m.index+'].expireDate'}" /></td> </tr> </s:iterator> <tr> <td colspan="4"><s:submit value="提交"></s:submit> </tr> </table> </s:form> </table>


 

 

 

 

 

 

 

 

<!-- 材料数据显示 --> <table> <tr> <td>材料名</td> <td>价格</td> <td>库存量</td> <td>过期日期</td> </tr> <s:iterator value="materialSet" status="m"> <tr> <td><s:property value="material" ></s:property></td> <td><s:property value="bid" ></s:property></td> <td><s:property value="mount" ></s:property></td> <td><s:property value="expireDate" ></s:property></td> </tr> </s:iterator> </table>


 

     像List集合类型示例一样笔者定义了一个Set集合类型变量materialSet。不过该变量必须显示定义它的类型。如代码中所示“new HashSet()”一样。这是必须的,否则Struts2不知道该变量是哪一种Set集合

      属性文件中除了继续定义元素对象类型之外,还需要定义该集合类型变量的索引即代码中所示的“KeyProperty_materialSet=material”。其实定义索引的通用格式为“KeyProperty_SetName=属性”。也许有的读者很难理解,其实也不很难。首先在Action中定义的Set集合类型变量名要写在“KeyProperty_”之后。然后“=”后面写的是元素对象中开发者想指定为索引的属性。比如示例中元素对象是Material对象。该对象有几个属性,其中有个属性为“material”是代表Material对象的材料名字,就把它定义为索引。这里笔者的定义想表明的意思就是materialSet这个Set集合类型变量的索引是组成它的元素Material对象中的material属性。如果属性文件中写成“KeyProperty_materialSet=bid”则表明把Material对象中表示材料价格的bid属性作为materialSet的索引

    在数据输入的JSP页面中,笔者使用了OGNL中的“makeNewAPI。由它来建立materialSet中的material对象。然后依次输入material对象各个属性数据

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics