Struts2提供表单标签来在HTML文档中显示表单元素,其具有表单回显、页面自动排版与布局等优势,标签的属性可以被赋值为静态值或OGNL表达式……
表单标签的共同属性:
注意:label与required属性只在没有使用simple主题时才可使用。
1. form 标签
作用:用于呈现HTML语言中的表单元素。
测试示例代码:
<s:debug></s:debug>
<br><br>
<%
List<City> cities = new ArrayList<City>();
cities.add(new City(1001, "北京"));
cities.add(new City(1002, "上海"));
cities.add(new City(1003, "广州"));
cities.add(new City(1004, "深圳"));
request.setAttribute("cities", cities);
%>
<!-- 表单标签: -->
<!-- 1). 与HTML的form标签功能相似 -->
<!-- 2). Struts2的form标签会自动生成一个table,以进行自动排版 -->
<!-- 3). Struts2的表单标签可以对表单提交的值进行回显 -->
<!-- 回显:从栈顶对象开始依次往下匹配属性,并将匹配到的属性值赋给对应标签的value属性中 -->
<s:form action="save" method="post">
<s:hidden name="userId"></s:hidden>
<s:textfield name="userName" label="userName"></s:textfield>
<s:password name="password" label="password" showPassword="true"></s:password>
<s:textarea name="desc" label="desc"></s:textarea>
<s:checkbox name="married" label="Married"></s:checkbox>
<s:radio name="gender" list="#{'1':'Male', '2':'Female' }" label="Gender"></s:radio>
<!-- 服务端需要使用集合类型(非数组类型),以保证能够被正常的回显 -->
<s:checkboxlist name="city" list="#request.cities" listKey="cityId" listValue="cityName" label="City"></s:checkboxlist>
<s:select list="{11, 12, 13, 14, 15, 16 }"
headerKey="" headerValue="请选择"
name="age" label="Age">
<!-- s:optgroup: 可以用作s:select的子标签,用于显示更多的下拉项 -->
<!-- 注意:必须有键值对,而不能使用集合(其值既作为键又作为值) -->
<s:optgroup label="21-30" list="#{21:21, 22:22, 23:23 }"></s:optgroup>
<s:optgroup label="31-40" list="#{31:31, 32:32, 33:33 }"></s:optgroup>
</s:select>
<s:submit value="Submit"></s:submit>
</s:form>
<br><br>
2. textfield、password 与 hidden 标签
作用:textfield标签用于呈现输入文本字段,password标签用于呈现口令字段,hidden标签用于呈现不可见字段。
注意:password标签的showPassword属性(默认值为 false)决定在表单回显时是否显示输入的密码。
3. submit 标签
作用:用于呈现HTML语言中的提交按钮。
4. textarea 标签
作用:用于呈现HTML语言中的文本域元素(多行文本输入框)。
5. checkbox 标签
作用:用于呈现HTML语言中的复选框元素,通常用于提交一个布尔值。
- 在HTML语言中,若复选框未被选中,则请求中就不会包含该复选框对应的请求参数;
- Struts2提供checkbox标签来解决该局限性,即为单个复选框元素创建一个配对的不可见字段来实现;
- checkbox标签的fieldValue属性指定的值将在用户提交表单时作为被选中的单选框的实际值发送到服务器(单选框的默认值为true或false)。
6. radio 标签
作用:用于呈现HTML语言中的一组单选框元素。
7. select 标签
作用:用于呈现HTML语言中的下拉框元素。
8. optgroup 标签
作用:用于对select元素所提供的选项进行分组呈现。
9. checkboxlist 标签
作用:用于呈现HTML语言中的一组多选框。
注意:checkbox标签被映射到一个字符串数组或基本类型数组,若未选中则相应的属性将被赋值为一个空数组而不是空值。
总结:list、listKey与listValue属性对radio、select和checkboxlist标签极为重要;可以将一个数组、Enumeration、Iterator、Map或Collection赋值为list属性,将用来提供选项值的对象属性赋给listKey属性,将用来提供选项行标的对象属性赋给listValue属性。
10. 主题
默认情况下,表单标签将呈现为一个HTML的表单元素和一个表格元素;每一种输入标签都将呈现为一个带标号的输入元素,其将被包含在表格元素的一个tr元素和td元素的内部。
Struts2提供的主题有:
- simple:把UI标签翻译成最简单的HTML语言对应的元素,且会忽视行标属性;
- xhtml:默认主题,采用表单元素+表格元素来提供一种自动化的排版机制;
- css_xhtm:与xhtml主题模板相似,但其使用css来进行布局和排版。
如何修改UI标签的主题属性?
- 直接通过UI标签的theme属性来修改;
- 若未给出某UI标签的theme属性,则使用其所在的表单的主题;
- 向page、request、session或application中添加一个theme属性来修改;
- 修改struts.properties文件中的struts.ui.theme常量属性来修改应用程序的全局主题。
实例:利用Struts实现用户注册模块
需求说明示意图与示例代码目录结构如下所示:
Employee.java:
package com.qiaobc.register.action;
import java.util.List;
import java.util.Map;
import org.apache.struts2.interceptor.RequestAware;
import com.qiaobc.register.dao.Dao;
public class Employee implements RequestAware {
private Integer id;
private String name;
private String password;
private String gender;
private String department;
private List<String> roles;
private String remarks;
/**
* action方法:init()
* @return
*/
private Dao dao = new Dao();
public String init() {
// 1. 获取部门信息,并保存到request中
requestMap.put("departments", dao.getDepartments());
// 2. 获取角色信息,并保存到request中
requestMap.put("roles", dao.getRoles());
return "success";
}
/**
* action方法:register()
* @return
*/
public String register() {
System.out.println(this);
return "success";
}
private Map<String, Object> requestMap;
@Override
public void setRequest(Map<String, Object> arg0) {
this.requestMap = arg0;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}
Dao.java:
package com.qiaobc.register.dao;
import java.util.ArrayList;
import java.util.List;
import com.qiaobc.register.domain.Department;
import com.qiaobc.register.domain.Role;
public class Dao {
public List<Department> getDepartments() {
List<Department> departments = new ArrayList<>();
departments.add(new Department(1001, "研发部"));
departments.add(new Department(1002, "市场部"));
departments.add(new Department(1003, "人力部"));
departments.add(new Department(1004, "运营部"));
departments.add(new Department(1005, "采购部"));
departments.add(new Department(1006, "服务部"));
return departments;
}
public List<Role> getRoles() {
List<Role> roles = new ArrayList<>();
roles.add(new Role(2001, "工 人"));
roles.add(new Role(2002, "主 管"));
roles.add(new Role(2003, "教 师"));
return roles;
}
}
Department.java:
package com.qiaobc.register.domain;
public class Department {
private Integer departmentId;
private String departmentName;
public Integer getDepartmentId() {
return departmentId;
}
public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public Department() {
super();
}
public Department(Integer departmentId, String departmentName) {
super();
this.departmentId = departmentId;
this.departmentName = departmentName;
}
@Override
public String toString() {
return "Department [departmentId=" + departmentId + ", departmentName="
+ departmentName + "]";
}
}
Role.java:
package com.qiaobc.register.domain;
public class Role {
private Integer roleId;
private String roleName;
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public Role() {
super();
}
public Role(Integer roleId, String roleName) {
super();
this.roleId = roleId;
this.roleName = roleName;
}
@Override
public String toString() {
return "Role [roleId=" + roleId + ", roleName=" + roleName + "]";
}
}
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="User-Register" extends="struts-default">
<action name="emp-input-ui" class="com.qiaobc.register.action.Employee" method="init">
<result>/emp-input-ui.jsp</result>
</action>
<action name="emp-input" class="com.qiaobc.register.action.Employee" method="register">
<result>/emp-details.jsp</result>
</action>
</package>
</struts>
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<a href="emp-input-ui.action">--> 用户注册……</a>
</body>
</html>
emp-input-ui.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>
<s:debug></s:debug> <br><br>
用户注册模块: <br><br>
<s:form action="emp-input.action" method="post">
<s:textfield name="name" label="姓 名" style="width:230px;"></s:textfield>
<s:password name="password" label="密 码" style="width:230px;"></s:password>
<s:radio name="gender" label="性 别" list="#{'男':'男', '女':'女' }"></s:radio>
<s:select name="department" label="部 门" list="#request.departments"
listKey="departmentId" listValue="departmentName"
style="width:100px;"></s:select>
<s:checkboxlist name="roles" label="角 色" list="#request.roles"
listKey="roleId" listValue="roleName"></s:checkboxlist>
<s:textarea name="remarks" label="备 注" style="width:230px;"></s:textarea>
<s:submit label="提 交"></s:submit>
</s:form>
</body>
</html>
empty-details.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>
<s:debug></s:debug> <br><br>
姓 名:<s:property value="name"/> <br>
密 码:<s:property value="password"/> <br>
性 别:<s:property value="gender"/> <br>
部 门:<s:property value="department"/> <br>
角 色:<s:property value="roles"/> <br>
备注:<s:property value="remarks"/> <br>
</body>
</html>