Struts2学习(四)—表单处理

通过前面的学习,我现在已经学会了在Struts2中使用OGNL了,现在就写一个表单注册的功能作为练习

表单和 Java 模型类

对于本实例,我们假设我们需要用户提交披萨订购信息. 我们的业务规则强调用户必须提供他/她 first name, last name, email address和age.

要封装这些数据, 我们使用遵守Java Bean规范 (public set/get 方法对每个实例字段)的一个简单Java类 . 遵守规则并添加到包 com.lgh.struts2maven.model
Person.java

package com.lgh.struts2maven.model;

import java.io.Serializable;

public class Person implements Serializable {

        private String firstName;
        private String lastName;
        private String email;
        private int age;
    public Person() {

    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + ", age=" + age + "]";
    }


}

注意上面类的一些方面. 对每个实例字段提供的 public set/get 方法. age 属性类型是 integer. 我们重新定义一个public toString方法返回一个String表示对象的状态
表单结构
要收集 Struts 2表单中的输入数据. 当创建该表单,核心概念是我们需要对每个表单字段在Person类中指定关联的实例字段.让我们首先讨论表单接着讨论其他关键点 . 创建一个视图页面名称为register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Register for a prize by completing this form.</title>
</head>
<body>

<s:form>
<s:textfield name="personBean.firstName" label="First name" />
      <s:textfield  name="personBean.lastName" label="Last name" />
      <s:textfield name="personBean.email"  label ="Email"/>  
      <s:textfield name="personBean.age"  label="Age"  />
       <s:submit/>
</s:form>
</body>
</html>

由于我们使用Struts 2标签,在页面的顶部我们添加 Struts 标签库指令.

Struts 2 表单将提交给名字为register的action. 我们需要在struts.xml文件定义该action.

注意四个Struts 2 textfield 标签. 每个标签有一个name值表明Person 类的属性(例如 firstName). name属性值被名称为personBean对象引用 . 该对象的类型为Person. 当我们创建一个 Action 类处理该表单提交,我们必须指定该对象在该Action 类 .

全部 name属性例如 personBean.firstName指导 Struts 2 使用该 textfield输入值作为 personBean 对象的 setFirstName 方法的参数.因而如果用户输入 “Bruce” 在标签名为 “First name”字段, personBean的 firstName实例字段值将为 “Bruce”.

注意 Struts 2 textfield对应 Person的实例字段. 记住 Person类 age 属性类型为 integer. 所有表单字段输入值为 String. 当用户在age表单字段输入将调用personBean对象的 setAge 方法,Struts 2 将自动转换 String值 (“25”)为25 .
创建 Action类来处理表单提交
当用户单击上面表单的submit 按钮,action “register” 且表单数据将发送到Struts 2框架.我们需要一个 Action 类来处理该表单 . 如果你想起在教程 编写 Struts 2 Action我们的Action类应该继承 Struts 2 ActionSupport 类.

这里是该实例的Action类. 放置在 com.lgh.struts2maven.action包中

package com.lgh.struts2maven.action;

import com.lgh.struts2maven.model.Person;
import com.opensymphony.xwork2.ActionSupport;

public class Register extends ActionSupport {


private static final long serialVersionUID = 1L;

    private Person personBean;

    public Register() {

    }

    @Override
    public String execute() throws Exception {

        return SUCCESS;

    }

    public Person getPersonBean() {

        return personBean;

    }

    public void setPersonBean(Person person) {

        personBean = person;

    }

}

在Register类注意到我们声明了一个类型为 Person属性 personBean并提供 public get 和 set 方法.

Register类也覆盖了execute方法. execute 方法是我们在 struts.xml 指定的来响应register action. 在本实例, execute方法仅返回一个 String 常量 SUCCESS (继承自 ActionSupport类). 但在真实的应用, 在 execute 方法将调用其它类 (Service 对象) 来执行表单业务处理,例如保存用户输入到持久容器 .

Register Action类中声明的类型为Person的personBean匹配表单字段中name值 personBean. 当表单被提交, Struts 2 框架将 探测 Action类并查找一个名称为personBean的对象. 它将使用 Person类的默认构造函数来创建该实例. 接着对每个name值为 personBean.someAttribute (例如 personBean.firstName)表单字段它将调用 personBean的public set 方法并把表单字段值(用户输入)传递给该方法 .这些在execute方法执行前发生.

当 Struts 2 运行Register 的execute方法 , Register类的personBean已经有了用户在表单输入的数据.

通过使用Java 模型类来封装表单提供的数据,我们在 Action类 (Register) 对每个表单字段不需要一个分离的属性 (和关联的public set/get 方法) .
处理 Execute方法返回的SUCCESS
当 execute 方法返回SUCCESS,我们想显示一个简单的感谢页面来显示用户注册.添加下面的thankyou.jsp 到 WebContent (Ant) 或 src/main/webapp (Maven).
thankyou.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>Thank you for registering for a prize.</h3>

<p>Your registration information: <s:property value="personBean" /> </p>

<p><a href="<s:url action='index' />" >Return to home page</a>.</p>
</body>
</html>

在 struts.xml中创建一个action节点

<action name="register" class="com.lgh.struts2maven.action.Register" method="execute">
        <result name="success">/thankyou.jsp</result>
        </action>

上面的 action告诉Struts 2 当我们 register action讲调用Register的 execute 方法.如果方法返回结果 “success” 将返回到 thankyou.jsp.

注意我们不需要告诉 Struts 2 如何处理表单. 表单中的字段值自动转移到 personBean对象的实例字段 ,根据匹配的表单字段名 personBean.attributeName (例如 personBean.lastName).
创建一个到register.jsp的链接
为了用户可以找到注册页面 ,添加链接在 index.jsp
链接到 register.jsp

<p><a href="register.jsp">Please register</a> for our prize drawing.</p>

运行实例
并在浏览器输入:http://localhost:8080/Struts2MavenDemo/index.jsp
在该页面应该是一个链接到 register. 单击该链接你应该看到register.jsp页
这里写图片描述
填充表单并单击submit 按钮.你应该看到thankyou.jsp页面.
这里写图片描述
在下一个教程我们学习如何验证用户在表单中的输入.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值