最近几天学习了struts2中的表单标签,表单标签属于struts2标签库中的一个重要组成部分,也属于struts2中的UI标签。
1.什么是struts2中的表单标签?
①表单标签将在html文档里表现为一个表单元素。
②使用表单标签可以方便表单的回显。因为页面的数据自动到值栈中找与name对应的属性名显示为表单标签的内容。
③struts2中的表单标签会自动对表单元素进行布局。
④标签的属性可以被赋予一个静态的值或者ognl表达式。
2.接下来简单说一说几个简单的表单标签,案例在最后做展示。
①form标签
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TP3pVd5ckWxwGWh9mTzI2M5cVWvxWbiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jNzMzMykDMxIjMyEDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1)这里值得注意的是,如果提交的action有属于的namespace一定要在namespace属性下面配置,而不能写成如下格式:action="/web应用/namespace/请求地址"。这是struts2表单标签和之前html表单标签的区别。
2)这里的method和class属性一个是设置请求方式一个是设置标签类选择器的,注意与配置action的method属性和class属性是有区别的不能混淆。
3)struts2的form表单会自动生成一个table表格对表单进行排版。
4)表单回显是从值栈的object stack对象的第一个对象开始寻找与表单标签的name值匹配的属性的值作为标签的value属性进行显示,如果栈顶对象没有该属性就从栈顶向下继续找。
②表单标签中的textfield,password,hidden标签
③submit标签
④checkbox标签
对于checkbox有一点值得注意的。
⑤这里说几个比较重要的属性list,listKey,listValue
之前在写html标签时radio,select,checkboxlist(html中为checkbox)都是有多个选项的标签。那么这多个选项其实是有共同处的都是一个显示值和提交值的存在,提交值就是value属性,显示值则是标签显示的内容。例如<radio value="提交值" name="name属性">显示值</radio>。那么list,listKey,listValue就很好的解决了这样重复写多个标签的问题。list就是代表提交和显示值数组。数组中的每一个对象都包含提交值和显示值。这两个值可以是数组中对象的两个属性,具体是哪两个属性就由listKey和listValue来指定。listKey指定提交值的属性名,listValue指定显示值的属性名。如果list是一个简单类型的数组或者map那么就无需指定listKey和listValue,如果是简单类型的数组,标签的value和显示值都是一样的,如果是map的话标签的value就是map的键显示值就是键对应的值。
接下来说说radio标签:
select标签:
select标签中可以包含optgroup标签,optgroup是对select标签进行分组的
那么接下来直接看看具体的代码实例
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="uitag" extends="struts-default" namespace="/tab">
<action name="test">
<result>/show.jsp</result>
</action>
<action name="register" class="com.yd.action.User" method="register">
<result name="success">/index.jsp</result>
</action>
<action name="employ" class="com.yd.action.Employ" method="register">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
Action类User:
package com.yd.action;
public class User {
private String userName;
private String password;
private Integer userId;
private boolean married=true;
private String sex;
private String city;
private String citys;
private String list;
private Integer[] hobbys;
public Integer[] getHobbys() {
return hobbys;
}
public void setHobbys(Integer[] hobbys) {
this.hobbys = hobbys;
}
public String getList() {
return list;
}
public void setList(String list) {
this.list = list;
}
public String getCitys() {
return citys;
}
public void setCitys(String citys) {
this.citys = citys;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
public User() {
}
public User(String userName, String password, Integer userId) {
super();
this.userName = userName;
this.password = password;
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String register(){
System.out.println("register");
System.out.println(this);
//往值栈中存入对象
return "success";
}
public String save(){
System.out.println("save");
return "success";
}
@Override
public String toString() {
return "User [userName=" + userName + ", password=" + password + ", userId=" + userId + ", married=" + married
+ ", sex=" + sex +", city="+ city+", citys="+ citys +", list="+ list+", hobbys="+ hobbys.length + "]";
}
}
City类:
package com.yd.action;
public class City {
private String id;
private String name;
public City(String id, String name) {
super();
this.id = id;
this.name = name;
}
public City() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "City [id=" + id + ", name=" + name + "]";
}
}
Hobby类:
package com.yd.action;
public class Hobby {
private Integer id;
private String name;
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 Hobby(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Hobby [id=" + id + ", name=" + name + "]";
}
}
index.jsp:
<%@page import="com.yd.action.Hobby"%>
<%@page import="com.yd.action.City"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ 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>
<h1>注册表格</h1>
<!-- 注意struts表单标签里面的method class 等属性都是前段设置标签的属性
而不是struts.xml中action配置的class和method
这个不能混淆
-->
<s:form action="register" namespace="/tab" method="post">
<s:hidden name='userId' value="1001"></s:hidden>
<s:textfield label="UserName" name="userName"
tooltip="Enter your userName"></s:textfield>
<s:password label="password" name="password"
tooltip="Enter your password" showPassword="false"></s:password>
<s:checkbox name="married" label="已婚" fieldValue="true"></s:checkbox>
<!-- radio name属性 单选 list赋值为一个string -->
<s:radio list="{'男','女'}" name="sex"></s:radio>
<!-- select 利用键值对的形式 键为value 值为行标 struts2定义一个map的形式 如下: -->
<s:select list="#{'1':'北京','2':'南京','3':'上海','4':'苏州' }" name="city"></s:select>
<%
//往值栈中的object stack对象中放入 一个map
Map<Integer, String> citys = new HashMap<Integer, String>();
citys.put(1, "中国");
citys.put(2, "美国");
citys.put(3, "英国");
citys.put(4, "德国");
pageContext.setAttribute("citys", citys);
//往当前页面存储一个对象数组
List list=new ArrayList<City>();
list.add(new City("1","AA"));
list.add(new City("2","BB"));
list.add(new City("3","CC"));
list.add(new City("4","DD"));
pageContext.setAttribute("list", list);
//optgroup分组对象的list
List opts=new ArrayList<City>();
opts.add(new City("1","AA"));
opts.add(new City("2","BB"));
pageContext.setAttribute("opts", opts);
//添加一个checkboxlist 的多选框的list
List<Hobby> hobbys=new ArrayList<Hobby>();
hobbys.add(new Hobby(1,"篮球"));
hobbys.add(new Hobby(2,"足球"));
hobbys.add(new Hobby(3,"台球"));
hobbys.add(new Hobby(4,"棒球"));
pageContext.setAttribute("hobbys", hobbys);
%>
<s:select list="#attr.citys" name="citys"></s:select>
<s:select headerKey="0" headerValue="Please choose a contry" list="#attr.list" listKey="id" listValue="name" name="list">
<s:optgroup label="other" list="#attr.opts" listKey="id" listValue="name"></s:optgroup>
<s:optgroup label="other" list="#attr.hobbys" listKey="id" listValue="name"></s:optgroup>
</s:select>
<s:checkboxlist label="爱好" list="#attr.hobbys" listKey="id" listValue="name" name="hobbys"></s:checkboxlist>
<s:submit value="Register"></s:submit>
</s:form>
<s:debug></s:debug>
</body>
</html>
运行结果截图:
运行界面:
输入数据:
提交数据回显数据:
后台打印action对象的值: