天天看点

struts2表单标签

最近几天学习了struts2中的表单标签,表单标签属于struts2标签库中的一个重要组成部分,也属于struts2中的UI标签。

1.什么是struts2中的表单标签?

①表单标签将在html文档里表现为一个表单元素。

②使用表单标签可以方便表单的回显。因为页面的数据自动到值栈中找与name对应的属性名显示为表单标签的内容。

③struts2中的表单标签会自动对表单元素进行布局。

④标签的属性可以被赋予一个静态的值或者ognl表达式。

2.接下来简单说一说几个简单的表单标签,案例在最后做展示。

①form标签

struts2表单标签
struts2表单标签

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标签

struts2表单标签

③submit标签

struts2表单标签

④checkbox标签

struts2表单标签

对于checkbox有一点值得注意的。

struts2表单标签
struts2表单标签

⑤这里说几个比较重要的属性list,listKey,listValue

struts2表单标签

之前在写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标签:

struts2表单标签

select标签:

struts2表单标签

select标签中可以包含optgroup标签,optgroup是对select标签进行分组的

struts2表单标签

那么接下来直接看看具体的代码实例

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>
           

运行结果截图:

运行界面:

struts2表单标签

输入数据:

struts2表单标签

提交数据回显数据:

struts2表单标签

后台打印action对象的值:

struts2表单标签