通过前面的学习,我现在已经学会了在Struts2中使用OGNL了,现在就写一个表单注册的功能作为练习
对于本实例,我们假设我们需要用户提交披萨订购信息. 我们的业务规则强调用户必须提供他/她 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页面.
在下一个教程我们学习如何验证用户在表单中的输入.