3.1 类型转换的介绍
3.1.1 类型转换的意义
Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说,服务器接收到的来自用户的数据只能是字符串或者是字符数组,而在Web应用的对象中,往往使用了多种不同的类型,如整数(int)、浮点数(float)、日期(Date)或者是自定义数据类型等。因此在服务器端必须将字符串转换成合适的数据类型,如图3.1所示。
图3.1 类型转换
在设计表单时,经常会用到年龄(age)、价格(price)、日期(date)等,而form表单元素不同于桌面应用程序可以是不同的数据类型,其值只能是字符串,而服务器端接收这些值就要将字符串转换成不同的数据类型,在服务器端显示这些信息的时候又要将这些对象转换成字符串。
以一个简单的加法运算为例,用户提交两个int类型的数据,服务器端接收的只能是字符串或字符数组,因此必须先把字符串转换成int类型的数,然后再进行运算,运算完成以后服务器端返回结果,又必须把int类型的数转换成字符串,然后再进行输出。
Struts 2提供了强大的类型转换功能,对于常用的数据类型来说,则提供了内建的类型转换器。同样开发者也可以自行设计类型转换器来进行类型转换。首先来介绍一个简单的示例。
3.1.2 简单的类型转换示例
这个示例通过用户输入页来接受用户输入姓名、年龄和注册日期,然后将用户输入页提交到相应的Action进行处理,最后再通过输出页输出用户的输入信息。
步骤如下。
(1)新建项目。项目名为“Struts2Convert”,为项目添加Sturts 2支持并在“web.xml”文件中配置核心控制器。
(2)新建一个输入页面“input.jsp”,添加4个文本框分别用来输入姓、名、年龄和生日。name属性分别为firstName、lastName、age、birth。然后添加一个提交按钮。这里把firstName和lastName分别开来,为了和以后的例子做对比。在真正的开发中一般不会这样设计,这里只是为了例子说明的方便,代码如下所示。
<%@ 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"> <! -- 单行文本框,用来输入firstName --> <s:textfield name="firstName" label="firstName"></s:textfield> <! -- 单行文本框,用来输入lastName --> <s:textfield name="lastName" label="lastName"></s:textfield> <! -- 单行文本框,用来输入age --> <s:textfield name="age" label="age"></s:textfield> <! -- 单行文本框,用来输入birth --> <s:textfield name="birth" label="birth"></s:textfield> <! -- 提交按钮--> <s:submit value="input"></s:submit> </s:form> </body> </html>
(3)新建InputAction类继承ActionSuppprt。根据提交参数的信息添加4个属性,其中firstName、lastNames属性为String类型,age属性为int类型,birth属性为Date类型。然后分别添加属性的getter和setter方法。添加execute方法,返回一个“success”字符串,代码如下所示。
package net.hncu.action; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class InputAction extends ActionSupport { private String firstName; private String lastName; private int age; private Date birth; //返回age值 public int getAge() { return age; } //设置age值 public void setAge(int age) { this.age = age; } //返回birth值 public Date getBirth() { return birth; } //设置birth值 public void setBirth(Date birth) { this.birth = birth; } //返回firstName值 public String getFirstName() { return firstName; } //设置firstName值 public void setFirstName(String firstName) { this.firstName = firstName; } //返回lastName值 public String getLastName() { return lastName; } //设置lastName值 public void setLastName(String lastName) { this.lastName = lastName; } //execute方法 public String execute() { return "success"; } }
(4)新建“struts.xml”文件。配置InputAction,指定Action的实现类,以及Action处理结果(返回的字符串)与视图资源文件之间的映射。InputAction处理后如果返回的是“success”,页面将跳转到“output.jsp”页面。如果有错误将自动回到“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>
(5)新建输出页面“output.jsp”。用来显示用户提交的信息,代码如下所示。
<%@ 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> <! -- 输出firstName属性的值 --> firstName:<s:property value="firstName"/><br> <! -- 输出lastName属性的值 --> lastName:<s:property value="lastName"/><br> <! -- 输出age属性的值 --> age:<s:property value="age"/><br> <! -- 输出birth属性的值 --> birth:<s:property value="birth"/> </body> </html>
(6)部署代码。打开浏览器,浏览用户输入页“input.jsp”,如图3.2所示。
输入用户信息,这里必须按格式输入。比如在“firstName”文本框中输入“da”,在“lastName”文本框中输入“bu”,在“age”文本框中输入“20”,在“birth”文本框中输入“1988-04-25”,如图3.3所示。单击“input”按钮,页面跳转到输出页“output.jsp”,如图3.4所示。
图3.2 用户输入页“input.jsp”
注意
“1988-04-25”为中文日期格式,所以必须先设置浏览器的语言环境为中文,否则会提示转换错误。
如果输入错误的格式,比如在“age”文本框中输入“aaa”, “birth”文本框中输入“aaa”。页面会跳转到错误输出页,因为开始配置“struts.xml”时配置了错误输出页为“input.jsp”,所以页面会跳转到“input.jsp”,并且把转换错误信息打印出来,如图3.5所示。
图3.3 输入用户信息
图3.4 用户信息显示页
图3.5 输入错误数据提交后的页面