零基础学Struts
上QQ阅读APP看书,第一时间看更新

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">
                      <! -- 定义inputActin,其实现类为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 输入错误数据提交后的页面