第 7 章 Struts2 类型转换技术
在 Web 项目开发中由于很多数据在页面上显示时候都是以字符串类型来显示。而在控制层或者 model 层中开发人员使用 Java 开发时候,对于这些从页面上传入或者需要传到页面上显示的数据开发的类型不一定都是字符串类型。因此常常需要在视图和非视图之间进行类型转换。最明显的例子就是显示当前日期。可是这些开发工作往往是无关紧要或者说是犹如“鸡肋”,而很多开发时间却都白白浪费在这上面。有感于此, Struts2 的设计者提供了类型转换的功能。其实读者如果是从本书第一章看到这里,应该也估计的出类型转换也是用拦截器来实现的。这里笔者使用 Struts2 类型转换功能,看看在 Struts2 中到底是如何实现或者说如何实现类型转换。
7.1 Struts2 类型转换使用介绍
Struts2 的类型转换几乎支持 Java 中各种数据类型的转换。甚至开发者还可以自定义自己的类型转换功能。不过在笔者看来,不推荐开发人员开发自定义的类型转换功能。原因有二。一是遵循 IT 界著名名言“不重复发明轮子”,不在前人的成果上再次浪费时间。二是类型转换本身在开发工作中就不应该占用大量时间和人力。况且自定义自己的类型转换,项目风险也有可能增加。从项目管理角度对时间、成本、风险的管理都存在负面效应。
因此在本节中笔者具体介绍 Struts2 本身所具有的类型转换功能。大致分为以下:
int 、 boolean 、 double 等 Java 基本类型转换。
Date 类型转换。
List 类型转换。
Set 类型转换。
数组类型转换。
除了数组的类型转换不大实用以外,其他几种类型转换都是比较常用的。而且笔者认为 Date 类型转换也是属于单个 Java 变量的转换。而 List 、 Set 可以算作集合类型的转换即多个 Java 变量封装成单个集合的类型转换。下面就依次介绍有关知识点和一些需要注意的细节问题。
7.1.1 基本数据类型转换功能
技术要点
本节代码具体介绍 Java 基本数据类型和 Date 类型转换的使用方式介绍。
基本类型转换 Action 中使用方式。
基本类型转换在视图界面的使用方式。
演示代码
使用的 Action 文件:
- <!------------------------文件名:AddMaterialAction.java---------------->
- 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;
- }
- }
<!------------------------文件名:AddMaterialAction.java----------------> 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; } }
配置文件中的导航定义:
- <!--------------------文件名:struts.xml--------------------->
- <!-- 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 >
<!--------------------文件名:struts.xml---------------------> <!-- 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>
类型转换的数据输入 JSP 文件:
- <!---------------------文件名:addMaterial.jsp------------->
- …………
- <!-- 材料输入表单 -->
- <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>
- …………
<!---------------------文件名:addMaterial.jsp-------------> ………… <!-- 材料输入表单 --> <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> …………
类型转换的显示数据 JSP 文件:
- <!----------------------文件名:showMaterial.jsp-------------->
- …………
- <!-- 材料数据显示 -->
- <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>
- …………
<!----------------------文件名:showMaterial.jsp--------------> ………… <!-- 材料数据显示 --> <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> …………
数据输入如图 7.1 。
图 7.1 各种基本类型数据输入
显示数据如图 7.2 。请注意各种 Java 类型数据在显示页面和输入页面的格式和显示不同之处。
图 7.2 各种基本类型数据显示
代码解释
( 1 ) 在本示例中,笔者在页面上输入一个 Material 对象的所有属性值,并将它的属性值显示在页面上。由于之前很多示例中已经有过 Material 这个 JavaBean 对象代码。这里就没有写出给读者参阅。由以显示的示例代码也可知, Material 对象由材料名、价格、库存量和材料过期日期四个属性组成。恰好这四个属性的数据类型分别是 String 、 double 、 int 、 date 四个 Java 类型,因此由该示例可以明白 Struts2 的类型转换是如何转换这些 Java 类型。由于 Struts2 也是使用拦截器来进行类型转换,因此对这些基本的 Java 类型转换根本不需要开发人员编写任何类型转换代码。
( 2 )在输入数据的页面,笔者使用 OGNL 和 Struts2 标签来建立一个数据输入的表单。使用的 material 对象在 Action 中已定义完成,并建立 getter 、 setter 方法。这样在 JSP 页面可以设置该对象。在页面中按“提交”按钮后,就相当于“ setMaterial () ”方法。在系统根据 struts.xml 配置文件执行 Action 之前, Struts2 自带的类型转换拦截器就已经将 Material 对象中几个属性变量的类型由页面上输入时候的 String 类型转换为 Material 对象属性变量被定义的数据类型。
( 3 )在数据显示页面上显示数据时候,实际上做的事情是上述操作的一个逆向操作。 Material 对象中每个属性变量的数据类型又都转换为页面上需要显示的 String 类型。
( 4 )实际上在开发工作中,除非有根据特殊需求需要类型转换之外。在 Struts2 中绝大部分类型转换都已经由 Struts2 自己完成。因此给开发者节省了大量开发时间。有时候根本没有意识到数据类型已经被转换。除了 Java 基本类型转换之外,有时候在页面上需要批量输入一些数据,如果这些数据也像本示例的 Material 对象一样,那么可以使用 Struts2 自带的对集合类型的转换功能来完成类型转换,下面先介绍 List 类型集合的类型转换。