3.2 Struts 2内建的类型转换器
Sturts 2为常用的数据类型提供了内建的类型转换器,所以根本不用自定义转换器。对于内建的转换器,Struts在遇到这些类型时,会自动去调用相应的转换器进行类型转换。下面来介绍Struts 2提供了哪些内建的类型转换器,以及如何使用这些内建类型转换器。
3.2.1 内建转换器介绍
从上例可以看出,Sturts 2为常用的数据类型提供了内建的类型转换器,所以根本不用自定义转换器。对于内建的转换器,Struts在遇到这些类型时,会自动去调用相应的转换器。
下面列举了全部的内建转换器,具体如下。
❑ 基本数据类型以及其封装类。包括boolean和Boolean、char和Character、int和Integer、long和Integer、float和Float、double和Double。完成字符串和基本数据类型或其封装类之间的转换。
❑ 日期类型。使用当前区域的短格式转换,即DateFormat.getInstance(DateFormat.SHORT)。完成字符串和日期类型之间的转换。
❑ 集合(Collection)类型。将request.getParameterValues(String arg)返回的字符串数据与java.util.Collection转换。集合元素为String类型。
❑ 集合(Set)类型。与Collection的转换相似,只是去掉了相同的值。集合元素为String类型。
❑ 数组类型。将request.getParameterValues(String arg)返回的字符串数组中的每个字符串值取出组成一个数组。数组元素为String类型。
3.2.2 基本数据类型转换器
下面再来看下Struts 2提供的内建类型转换器,是如何完成字符串和基本数据类型之间的转换的。
(1)新建用户输入页input.jsp。该页面包括6个单行文本框,分别用来输入boolean类型、char类型、int类型、long类型、float类型以及double类型的值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>input</title> </head> <body> <! -- 输入表单 --> <s:form action="input"> <! -- 单行文本框,用来输入boolean类型值 --> <s:textfield name="booleanVal" label="boolean"></s:textfield> <! -- 单行文本框,用来输入char类型值 --> <s:textfield name="charVal" label="char"></s:textfield> <! -- 单行文本框,用来输入int类型值 --> <s:textfield name="intVal" label="int"></s:textfield> <! -- 单行文本框,用来输入long类型值 --> <s:textfield name="longVal" label="long"></s:textfield> <! -- 单行文本框,用来输入float类型值 --> <s:textfield name="floatVal" label="float"></s:textfield> <! -- 单行文本框,用来输入double类型值 --> <s:textfield name="doubleVal" label="double"></s:textfield> <! -- 提交按钮--> <s:submit value="input"></s:submit> </s:form> </body> </html>
(2)新建业务控制器InputAction。为该Action添加相应类型的属性用来封装用户的请求参数,并为属性添加setter和getter方法。添加execute方法,直接返回一个“success”字符串,代码如下所示。
package net.hncu.action; import com.opensymphony.xwork2.ActionSupport; public class InputAction extends ActionSupport { private boolean booleanVal; private char charVal; private int intVal; private long longVal; private float floatVal; private double doubleVal; //取得booleanVal属性值 public boolean isBooleanVal() { return booleanVal; } //设置booleanVal属性值 public void setBooleanVal(boolean booleanVal) { this.booleanVal = booleanVal; } //取得charVal属性值 public char getCharVal() { return charVal; } //设置charVal属性值 public void setCharVal(char charVal) { this.charVal = charVal; } //取得intVal属性值 public int getIntVal() { return intVal; } //设置intVal属性值 public void setIntVal(int intVal) { this.intVal = intVal; } //取得longVal属性值 public long getLongVal() { return longVal; } //设置longVal属性值 public void setLongVal(long longVal) { this.longVal = longVal; } //取得floatVal属性值 public float getFloatVal() { return floatVal; } //设置floatVal属性值 public void setFloatVal(float floatVal) { this.floatVal = floatVal; } //取得doubleVal属性值 public double getDoubleVal() { return doubleVal; } //设置doubleVal属性值 public void setDoubleVal(double doubleVal) { this.doubleVal = doubleVal; } // execute方法 public String execute() throws Exception{ return "success"; } }
(3)在“struts.xml”文件中配置LoginAction,并定义处理结果与视图资源之间的关系。如果LoginAction处理后返回“success”则跳转到“output.jsp”页面,如果类型转换失败,系统会自动跳转到“input”对应的视图资源也就是“input.jsp”页面,代码如下所示。
<struts> <package name="struts2" extends="struts-default"> <! -- 定义input的Actin,其实现类为net.hncu.action.InputAction--> <action name="input" class="net.hncu.action.InputAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/output.jsp</result> <result name="input">/input.jsp</result> </action> </package> </struts>
(4)新建输出页“output.jsp”,在该页面中通过<s:property>标签输出指定的属性值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>output</title> </head> <body> <! -- 输出booleanVal属性的值 --> boolean:<s:property value="booleanVal"/><br> <! -- 输出charVal属性的值 --> char:<s:property value="charVal"/><br> <! -- 输出intVal属性的值 --> int:<s:property value="intVal"/><br> <! -- 输出longVal属性的值 --> long:<s:property value="longVal"/><br> <! -- 输出floatVal属性的值 --> float:<s:property value="floatVal"/><br> <! -- 输出doubleVal属性的值 --> double:<s:property value="doubleVal"/><br> </body> </html>
(5)浏览用户输入页“input.jsp”,如图3.6所示。
(6)不输入任何数据,直接单击“input”按钮提交。页面将跳转到输出页,并输出属性值,如图3.7所示。可以看出LoginAction中的属性都被赋了初始值,如boolean类型的属性初始值为false, int类型的属性初始值为0等。
(7)输入合法的数据,这里所说的合法的数据是指输入对应该数据类型的数据。如在“boolean”文本框中输入“true”,在“int”文本框中输入“23”等,如图3.8所示。
(8)输入完数据后,单击“input”按钮进行提交。页面跳转到显示页,输出结果如图3.9所示。
(9)当输入非法数据时,这里所指的非法数据是指输入的字符串和该类型的数无法完成数据类型转换。如在“int”文本框中输入字符串“a”,在“long”文本框中输入字符串“a”。数据类型转换失败后,将会跳到“input”对应的视图资源也就是该输入页,并显示错误提示,如图3.10所示。
图3.6 用户输入页
图3.7 数据显示页
图3.8 输入合法数据
图3.9 数据显示页
图3.10 类型转换错误提示
3.2.3 基本数据类型的封装类转换器
Struts 2不但提供了基本数据类型转换器,同时也提供了基本数据类型封装类的转换器。其用法和基本数据类型基本一样,只需将业务控制器中的属性修改为对应的封装类就可以了。
(1)修改业务控制器InputAction。将属性的类型换成该类型对应的封装类,并重新设置其setter和getter方法,代码如下所示。
package net.hncu.action; import com.opensymphony.xwork2.ActionSupport; public class InputAction extends ActionSupport { private Boolean booleanVal; private Character charVal; private Integer intVal; private Long longVal; private Float floatVal; private Double doubleVal; //取得booleanVal属性值 public Boolean getBooleanVal() { return booleanVal; } //设置booleanVal属性值 public void setBooleanVal(Boolean booleanVal) { this.booleanVal = booleanVal; } //取得charVal属性值 public Character getCharVal() { return charVal; } //设置charVal属性值 public void setCharVal(Character charVal) { this.charVal = charVal; } //取得intVal属性值 public Integer getIntVal() { return intVal; } //设置intVal属性值 public void setIntVal(Integer intVal) { this.intVal = intVal; } //取得longVal属性值 public Long getLongVal() { return longVal; } //设置longVal属性值 public void setLongVal(Long longVal) { this.longVal = longVal; } //取得floatVal属性值 public Float getFloatVal() { return floatVal; } //设置floatVal属性值 public void setFloatVal(Float floatVal) { this.floatVal = floatVal; } //取得doubleVal属性值 public Double getDoubleVal() { return doubleVal; } //设置doubleVal属性值 public void setDoubleVal(Double doubleVal) { this.doubleVal = doubleVal; } // execute方法 public String execute() throws Exception{ return "success"; } }
(2)浏览用户输入页。输入合法的数据,如在“boolean”文本框中输入“true”在“int”文本框中输入“12”等,如图3.11所示。
(3)输入完数据后,单击“input”按钮进行提交。页面跳转到显示页,输出结果如图3.12所示。
(4)当输入非法数据时,如在“float”文本框中输入字符串“fsd”,在“double”文本框中输入字符串“fds”。数据类型转换失败后,会跳将到“input”对应的视图资源也就是该输入页,并显示错误提示,如图3.13所示。
图3.11 输入合法数据
图3.12 数据显示页
图3.13 类型转换错误提示
3.2.4 数组类型转换器
Struts 2还提供了一个数组类型的转换器。这个转换器非常有用,比如多个表单元素的name属性相同,那么提交的参数就不再是字符串,而是一个字符串数组。通过Sturts 2提供的数组类型的转换器就能很方便地将多个相同name属性表单元素的值封装到Action中的一个数组中。
(1)新建用户输入页。该页面中包含4个单行文本框,其name属性相同都为names,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>input</title> </head> <body> <! -- 输入表单 --> <s:form action="input"> <! -- 单行文本框,name属性为names --> <s:textfield name="names" label="name1"></s:textfield> <! -- 单行文本框,name属性为names --> <s:textfield name="names" label="name2"></s:textfield> <! -- 单行文本框,name属性为names --> <s:textfield name="names" label="name3"></s:textfield> <! -- 单行文本框,name属性为names --> <s:textfield name="names" label="name4"></s:textfield> <! -- 提交按钮--> <s:submit value="input"></s:submit> </s:form> </body> </html>
(2)修改业务控制器InputAction。为该Action添加相应类型的属性,用来封装用户的请求参数,其中names属性为String类型的数组。给names属性添加setter和getter方法。添加execute方法,直接返回一个“success”字符串,代码如下所示。
package net.hncu.action; import com.opensymphony.xwork2.ActionSupport; public class InputAction extends ActionSupport { //names属性,类型为String数组 private String[] names; //取得names属性值 public String[] getNames() { return names; } //设置names属性值 public void setNames(String[] names) { this.names = names; } //execute方法 public String execute() throws Exception { return SUCCESS; } }
(3)新建输出页“output.jsp”,在该页面中通过<s:property>标签输出指定的属性值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>output</title> </head> <body> <! -- 输出names属性的值 --> names:<s:property value="names"/><br> </body> </html>
(4)浏览用户输入页“input.jsp”,如图3.14所示。
(5)在表单中输入name值,如图3.15所示。
图3.14 用户输入页
图3.15 输入数据
(6)单击“input”按钮。页面提交到显示页,在显示页中显示输入的数据,如图3.16所示。
图3.16 数据显示页
Struts 2提供的内建转换器是双向的,也就是说从用户输入页到服务器端时会将字符串类型转换为相应的数据类型。在显示输入时,又会将相应的数据类型转换成字符串类型来显示。name值中间都会自动加上逗号这也是由数组转换成字符串时内建的转换器自动实现的。
3.2.5 集合类型转换器
上面介绍的是通过字符串数组来接受参数值,同样也可以通过集合类型来接受参数值。Struts 2提供的集合类型转换器,会将参数值自动赋值到集合类型属性中。
(1)修改业务控制器InputAction。将names属性的类型换成ArrayList类型,并指定该ArrayList中存放String类型的值。重新设置names属性的setter和getter方法,代码如下所示。
package net.hncu.action; import java.util.ArrayList; import com.opensymphony.xwork2.ActionSupport; public class InputAction extends ActionSupport { //属性names,其类型为ArrayList private ArrayList<String> names = new ArrayList<String>(); //返回names属性值 public ArrayList<String> getNames() { return names; } //设置names属性值 public void setNames(ArrayList<String> names) { this.names = names; } //execute方法 public String execute() throws Exception { return SUCCESS; } }
(2)同上一示例一样,输入name值,提交后页面跳转到显示页,如图3.17所示。
图3.17 数据显示页