码迷,mamicode.com
首页 > 其他好文 > 详细

struts2之如何使用复杂的UI标签

时间:2015-07-22 22:43:37      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

转载请注明http://blog.csdn.net/uniquewonderq


问题:

练习使用复杂的UI标签,并给框体福默认值,标签包括:

7.单选框标签

8.多选框标签

9.下拉框标签

在上一节案例的基础上,继续模拟,使用这3类标签。

步骤一:单选框标签

单选框有两种用法, 根据其初始化radio方式的不同,可以好分为静态和动态2种方式。首先我们使用静态方式来初始化客户性别选项,并根据客户数据勾选客户性别,需要在update_customer.jsp上使用单选框标签来实现 。代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  </head>
  
  <body>
    <h1>模拟修改客户</h1>
    
    <%--1.表单标签 --%>
    <s:form action="#" method="post">
    
    <!-- 
    	2.文本框标签
    		1>生成文本框
    		2>根据OGNL(customer.name)取值给文本框赋值
     -->
    	 <s:textfield name="customer.name" label="姓名">
    	 </s:textfield>
    	 
    <!-- 
    	3.密码框标签
    		1>生成密码框
    		2>根据OGNL(customer.password)取值给密码框赋值
    -->
    	 <s:password name="customer.password" label="密码" showPassword="true"/>
    	 
     <!-- 
    	4.文本域标签
    		1>生成文本域
    		2>根据OGNL(customer.desc)取值给文本域赋值
     -->
    	 <s:textarea name="customer.desc" label="简介" cols="30" rows="5">
    	 </s:textarea>
    	 
    <!-- 
    	5.布尔框标签
    		1>生成布尔框
    		2>根据OGNL(customer.marry)取值给布尔框赋值
     -->
    	 <s:checkbox name="customer.marry" label="是否已婚" labelposition="left">
    	 </s:checkbox>
    	 
    <!-- 
    	6.1单选框标签
    		1>生成单选框
    		2>根据OGNL(list属性值)创建的Map生成一组radio,其中Map的可以生成radio的value值,
    		Map的value生成radio的label值
    		3>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="#{'M':'男','F':'女'} " label="性别"/>
    	</s:form> 
  </body>
</html>

刷新浏览器:

技术分享



静态方式初始化radio时是通过静态代码创建Map来实现的,很多时候这些选项不是固定的,是需要查询数据库得到的,即需要通过动态的方式来进行初始化选项,那么需要采用动态的方式来实现。

要实现动态初始化选项,先要创建选项实体类,来封装选项信息,因此我们要创建性别的实体类sex,当然这个场景而言并不合理。但是就当是联系说明问题罢了。

package entity;

public class Sex {
		private String code;
		private String name;
		public String getCode() {
			return code;
		}
		public void setCode(String code) {
			this.code = code;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		
}

然后在customerDAO中追加查询全部性别的方法,代码如下:

package DAO;

import java.util.ArrayList;
import java.util.List;

import entity.Customer;
import entity.Sex;

public class CustomerDAO {
	//模拟根据id查询客户
	public Customer findById(){
		Customer c=new Customer();
		//设置一些默认值
		c.setName("wonder");
		c.setPassword("123");
		c.setDesc("长安大学");
		c.setSex("M");
		c.setMarry(false);
		
		List<String> list=new ArrayList<String>();
		list.add("beijing");
		list.add("shanghai");
		c.setTravelCities(list);
		c.setHome("xi'an");
		return c;
	}
	public List<Sex> findALLSex(){
		List<Sex> list=new ArrayList<Sex>();
		Sex s1=new Sex();
		s1.setCode("M");
		s1.setName("男");
		list.add(s1);
		
		Sex s2=new Sex();
		s2.setCode("F");
		s2.setName("女");
		list.add(s2);
		
		Sex s3=new Sex();
		s3.setCode("0");
		s3.setName("其他");
		list.add(s3);
		
		return list;
	}
}

然后在ToupdatecustomerACTION中模拟插叙浓缩铀的性别,代码如下:

package action;

import java.util.List;

import DAO.CustomerDAO;
import entity.Customer;
import entity.Sex;

public class ToUpdateCustomerAction {
	//output
	private Customer customer;//客户
	
	private List<Sex> sexes;//性别
	
	public String execute(){
		CustomerDAO dao=new CustomerDAO();
		//模拟客户查询
		customer=dao.findById();
		
		//模拟查询全部的性别
		sexes=dao.findALLSex();
		return "success";
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public List<Sex> getSexes() {
		return sexes;
	}

	public void setSexes(List<Sex> sexes) {
		this.sexes = sexes;
	}
	
}

最后,在update_customer.jsp上, 使用动态的单选框便签,根据action中返回所有性别生成性别并根据客户信息设置默认勾选,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  </head>
  
  <body>
    <h1>模拟修改客户</h1>
    
    <%--1.表单标签 --%>
    <s:form action="#" method="post">
    
    <!-- 
    	2.文本框标签
    		1>生成文本框
    		2>根据OGNL(customer.name)取值给文本框赋值
     -->
    	 <s:textfield name="customer.name" label="姓名">
    	 </s:textfield>
    	 
    <!-- 
    	3.密码框标签
    		1>生成密码框
    		2>根据OGNL(customer.password)取值给密码框赋值
    -->
    	 <s:password name="customer.password" label="密码" showPassword="true"/>
    	 
     <!-- 
    	4.文本域标签
    		1>生成文本域
    		2>根据OGNL(customer.desc)取值给文本域赋值
     -->
    	 <s:textarea name="customer.desc" label="简介" cols="30" rows="5">
    	 </s:textarea>
    	 
    <!-- 
    	5.布尔框标签
    		1>生成布尔框
    		2>根据OGNL(customer.marry)取值给布尔框赋值
     -->
    	 <s:checkbox name="customer.marry" label="是否已婚" labelposition="left">
    	 </s:checkbox>
    	 
    <!-- 
    	6.1单选框标签(静态)
    		1>生成单选框
    		2>根据OGNL(list属性值)创建的Map生成一组radio,其中Map的可以生成radio的value值,
    		Map的value生成radio的label值
    		3>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="#{'M':'男','F':'女'} " label="性别"/>
    	 
    <!-- 
    	6.2单选框标签(动态)
    		
    		1>根据OGNL(list属性值)的取值初始化一组radio,并根据listKey指定的实体类中的属性
    		来生成radio的value值。根据listValue指定的实体类中的属性来生成radio的label值。
    		2>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="sexes" listKey="code" listValue="name" label="性别"/>
    	</s:form> 
  </body>
</html>

重新部署项目并启动tomcat,效果如下:

技术分享

步骤二:

多选框标签

多选框的用法与单选框用法类似,也分为静态初始化和动态初始化2种,区别在于对checkbox初始化方式不同。

首先,我们通过静态初始化的方法生成一组城市的复选框,然后根据客户去过的城市来勾选这些城市。代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  </head>
  
  <body>
    <h1>模拟修改客户</h1>
    
    <%--1.表单标签 --%>
    <s:form action="#" method="post">
    
    <!-- 
    	2.文本框标签
    		1>生成文本框
    		2>根据OGNL(customer.name)取值给文本框赋值
     -->
    	 <s:textfield name="customer.name" label="姓名">
    	 </s:textfield>
    	 
    <!-- 
    	3.密码框标签
    		1>生成密码框
    		2>根据OGNL(customer.password)取值给密码框赋值
    -->
    	 <s:password name="customer.password" label="密码" showPassword="true"/>
    	 
     <!-- 
    	4.文本域标签
    		1>生成文本域
    		2>根据OGNL(customer.desc)取值给文本域赋值
     -->
    	 <s:textarea name="customer.desc" label="简介" cols="30" rows="5">
    	 </s:textarea>
    	 
    <!-- 
    	5.布尔框标签
    		1>生成布尔框
    		2>根据OGNL(customer.marry)取值给布尔框赋值
     -->
    	 <s:checkbox name="customer.marry" label="是否已婚" labelposition="left">
    	 </s:checkbox>
    	 
    <!-- 
    	6.1单选框标签(静态)
    		1>生成单选框
    		2>根据OGNL(list属性值)创建的Map生成一组radio,其中Map的可以生成radio的value值,
    		Map的value生成radio的label值
    		3>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="#{'M':'男','F':'女'} " label="性别"/>
    	 
    <!-- 
    	6.2单选框标签(动态)
    		
    		1>根据OGNL(list属性值)的取值初始化一组radio,并根据listKey指定的实体类中的属性
    		来生成radio的value值。根据listValue指定的实体类中的属性来生成radio的label值。
    		2>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="sexes" listKey="code" listValue="name" label="性别"/>

    	
    	<!-- 
    	7.1多选框标签(静态)
    		1>生成多选框
    		2>根据OGNL(list属性值)创建的Map生成一组checkbox,其中Map的可以生成checkbox的value值,
    		Map的value生成chexkbox的label值
    		3>根据OGNL(customer.travelCitys)取值来与生成chexkbox 的value比较 ,若与哪个chexkbox的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.travelCitys" list="#{'beijing':'北京','shanghai':'上海','guangzhou':'广州','shenzhen':'深圳','chongqing':'重庆','diaoyudao':'钓鱼岛'} " label="旅游过的城市"/>
    	 
    </s:form>
  </body>
</html>

刷新浏览器:技术分享




接下来,我们再看看如何动态的初始化多选框的选项。先创建城市的实体类city,用于封装所有的城市数据,代码如下:

package entity;

public class City {
		private String code;
		private String name;
		public City(String code,String name){
			super();
			this.code=code;
			this.name=name;
		}
		public String getCode() {
			return code;
		}
		public void setCode(String code) {
			this.code = code;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		
}

然后在customerDAO中模拟查询全部的城市,代码如下:

package DAO;

import java.util.ArrayList;
import java.util.List;

import entity.City;
import entity.Customer;
import entity.Sex;

public class CustomerDAO {
	//模拟根据id查询客户
	public Customer findById(){
		Customer c=new Customer();
		//设置一些默认值
		c.setName("wonder");
		c.setPassword("123");
		c.setDesc("长安大学");
		c.setSex("M");
		c.setMarry(false);
		
		List<String> list=new ArrayList<String>();
		list.add("beijing");
		list.add("shanghai");
		c.setTravelCities(list);
		c.setHome("xi'an");
		return c;
	}
	public List<Sex> findALLSex(){
		List<Sex> list=new ArrayList<Sex>();
		Sex s1=new Sex();
		s1.setCode("M");
		s1.setName("男");
		list.add(s1);
		
		Sex s2=new Sex();
		s2.setCode("F");
		s2.setName("女");
		list.add(s2);
		
		Sex s3=new Sex();
		s3.setCode("o");
		s3.setName("其他");
		list.add(s3);
		
		return list;
	}
	//模拟查询所有的城市
	public List<City> findAllCities(){
		List<City> cities=new ArrayList<City>();
		City c1=new City("beijing", "北京");
		City c2=new City("shanghai", "上海");
		City c3=new City("guangzhou", "广州");
		City c4=new City("shenzhen", "深圳");
		City c5=new City("chongqing", "重庆");
		City c6=new City("diaoyudao", "钓鱼岛");
		cities.add(c1);
		cities.add(c2);
		cities.add(c3);
		cities.add(c4);
		cities.add(c5);
		cities.add(c6);
		return cities;
	}
}


然后在ToUpdatecustomerAction中查询出全部的城市,代码如下:

package action;

import java.util.List;

import DAO.CustomerDAO;
import entity.City;
import entity.Customer;
import entity.Sex;

public class ToUpdateCustomerAction {
	//output
	private Customer customer;//客户
	
	private List<Sex> sexes;//性别
	
	private List<City> cities;//城市
	
	public String execute(){
		CustomerDAO dao=new CustomerDAO();
		//模拟客户查询
		customer=dao.findById();
		
		//模拟查询全部的性别
		sexes=dao.findALLSex();
		
		//模拟查询全部的城市
		cities=dao.findAllCities();
		return "success";
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public List<Sex> getSexes() {
		return sexes;
	}

	public void setSexes(List<Sex> sexes) {
		this.sexes = sexes;
	}

	public List<City> getCities() {
		return cities;
	}

	public void setCities(List<City> cities) {
		this.cities = cities;
	}
	
}

最后在update_customer.jsp上,使用动态的多选框标签,根据Action中返回的所有城市生成城市选项,并根据客户信息设置默认勾选,代码如下:

<%@ page  pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  </head>
  
  <body>
    <h1>模拟修改客户</h1>
    
    <%--1.表单标签 --%>
    <s:form action="#" method="post">
    
    <!-- 
    <span style="white-space:pre">	</span>2.文本框标签
    <span style="white-space:pre">		</span>1>生成文本框
    <span style="white-space:pre">		</span>2>根据OGNL(customer.name)取值给文本框赋值
     -->
    <span style="white-space:pre">	</span> <s:textfield name="customer.name" label="姓名">
    <span style="white-space:pre">	</span> </s:textfield>
    <span style="white-space:pre">	</span> 
    <!-- 
    <span style="white-space:pre">	</span>3.密码框标签
    <span style="white-space:pre">		</span>1>生成密码框
    <span style="white-space:pre">		</span>2>根据OGNL(customer.password)取值给密码框赋值
    -->
    <span style="white-space:pre">	</span> <s:password name="customer.password" label="密码" showPassword="true"/>
    <span style="white-space:pre">	</span> 
     <!-- 
    <span style="white-space:pre">	</span>4.文本域标签
    <span style="white-space:pre">		</span>1>生成文本域
    <span style="white-space:pre">		</span>2>根据OGNL(customer.desc)取值给文本域赋值
     -->
    <span style="white-space:pre">	</span> <s:textarea name="customer.desc" label="简介" cols="30" rows="5">
    <span style="white-space:pre">	</span> </s:textarea>
    <span style="white-space:pre">	</span> 
    <!-- 
    <span style="white-space:pre">	</span>5.布尔框标签
    <span style="white-space:pre">		</span>1>生成布尔框
    <span style="white-space:pre">		</span>2>根据OGNL(customer.marry)取值给布尔框赋值
     -->
    <span style="white-space:pre">	</span> <s:checkbox name="customer.marry" label="是否已婚" labelposition="left">
    <span style="white-space:pre">	</span> </s:checkbox>
    <span style="white-space:pre">	</span> 
    <!-- 
    <span style="white-space:pre">	</span>6.1单选框标签(静态)
    <span style="white-space:pre">		</span>1>生成单选框
    <span style="white-space:pre">		</span>2>根据OGNL(list属性值)创建的Map生成一组radio,其中Map的可以生成radio的value值,
    <span style="white-space:pre">		</span>Map的value生成radio的label值
    <span style="white-space:pre">		</span>3>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    <span style="white-space:pre">		</span>一直,则将其勾选
     -->
    <span style="white-space:pre">	</span> <s:radio name="customer.sex" list="#{'M':'男','F':'女'} " label="性别"/>
    <span style="white-space:pre">	</span> 
    <!-- 
    <span style="white-space:pre">	</span>6.2单选框标签(动态)
    <span style="white-space:pre">		</span>
    <span style="white-space:pre">		</span>1>根据OGNL(list属性值)的取值初始化一组radio,并根据listKey指定的实体类中的属性
    <span style="white-space:pre">		</span>来生成radio的value值。根据listValue指定的实体类中的属性来生成radio的label值。
    <span style="white-space:pre">		</span>2>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    <span style="white-space:pre">		</span>一直,则将其勾选
     -->
    <span style="white-space:pre">	</span> <s:radio name="customer.sex" list="sexes" listKey="code" listValue="name" label="性别"/>


    <span style="white-space:pre">	</span>
    <span style="white-space:pre">	</span><!-- 
    <span style="white-space:pre">	</span>7.1多选框标签(静态)
    <span style="white-space:pre">		</span>1>生成多选框
    <span style="white-space:pre">		</span>2>根据OGNL(list属性值)创建的Map生成一组checkbox,其中Map的可以生成checkbox的value值,
    <span style="white-space:pre">		</span>Map的value生成chexkbox的label值
    <span style="white-space:pre">		</span>3>根据OGNL(customer.travelCitys)取值来与生成chexkbox 的value比较 ,若与哪个chexkbox的value值
    <span style="white-space:pre">		</span>一直,则将其勾选
     -->
    <span style="white-space:pre">	</span> <s:checkboxlist name="customer.travelCitys" list="#{'beijing':'北京','shanghai':'上海','guangzhou':'广州','shenzhen':'深圳','chongqing':'重庆','diaoyudao':'钓鱼岛'}"  label="旅游过的城市"/>
    <span style="white-space:pre">	</span> 
    <span style="white-space:pre">	</span> <!-- 
    <span style="white-space:pre">	</span>7.2单选框标签(动态)
    <span style="white-space:pre">		</span>1>根据OGNL(list属性值)的取值初始化一组checkbox,并根据listKey指定的实体类中的属性
    <span style="white-space:pre">		</span>来生成checkbox的value值。根据listValue指定的实体类中的属性来生成checkbox的label值。
    <span style="white-space:pre">		</span>2>根据OGNL(customer.travelCitys)取值来与生成checkbox 的value比较 ,若与哪个check的value值
    <span style="white-space:pre">		</span>一直,则将其勾选
     -->
    <span style="white-space:pre">	</span> <s:checkboxlist name="customer.travelCitys" list="cities" listKey="code" listValue="name" label="旅游过的城市"/>
     <span style="white-space:pre">	</span> 
    </s:form>
  </body>
</html>


刷新浏览器:

技术分享



步骤三:下拉选标签

下拉选标签的用法类似,先使用静态方式。代码如下:

 <s:select name="customer.home" list="#{'beijing':'北京','shanghai':'上海','guangzhou':'广州','shenzhen':'深圳','chongqing':'重庆','diaoyudao':'钓鱼岛'}" label="家乡" headerKey="-1" headerValue="请选择"></s:select>

刷新浏览器:

技术分享



动态初始化代码:

<%@ page  pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  </head>
  
  <body>
    <h1>模拟修改客户</h1>
    
    <%--1.表单标签 --%>
    <s:form action="#" method="post">
    
    <!-- 
    	2.文本框标签
    		1>生成文本框
    		2>根据OGNL(customer.name)取值给文本框赋值
     -->
    	 <s:textfield name="customer.name" label="姓名">
    	 </s:textfield>
    	 
    <!-- 
    	3.密码框标签
    		1>生成密码框
    		2>根据OGNL(customer.password)取值给密码框赋值
    -->
    	 <s:password name="customer.password" label="密码" showPassword="true"/>
    	 
     <!-- 
    	4.文本域标签
    		1>生成文本域
    		2>根据OGNL(customer.desc)取值给文本域赋值
     -->
    	 <s:textarea name="customer.desc" label="简介" cols="30" rows="5">
    	 </s:textarea>
    	 
    <!-- 
    	5.布尔框标签
    		1>生成布尔框
    		2>根据OGNL(customer.marry)取值给布尔框赋值
     -->
    	 <s:checkbox name="customer.marry" label="是否已婚" labelposition="left">
    	 </s:checkbox>
    	 
    <!-- 
    	6.1单选框标签(静态)
    		1>生成单选框
    		2>根据OGNL(list属性值)创建的Map生成一组radio,其中Map的可以生成radio的value值,
    		Map的value生成radio的label值
    		3>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="#{'M':'男','F':'女'} " label="性别"/>
    	 
    <!-- 
    	6.2单选框标签(动态)
    		
    		1>根据OGNL(list属性值)的取值初始化一组radio,并根据listKey指定的实体类中的属性
    		来生成radio的value值。根据listValue指定的实体类中的属性来生成radio的label值。
    		2>根据OGNL(customer.sex)取值来与生成radio 的value比较 ,若与哪个radio的value值
    		一直,则将其勾选
     -->
    	 <s:radio name="customer.sex" list="sexes" listKey="code" listValue="name" label="性别"/>

    	
    	<!-- 
    	7.1多选框标签(静态)
    		1>生成多选框
    		2>根据OGNL(list属性值)创建的Map生成一组checkbox,其中Map的可以生成checkbox的value值,
    		Map的value生成chexkbox的label值
    		3>根据OGNL(customer.travelCitys)取值来与生成chexkbox 的value比较 ,若与哪个chexkbox的value值
    		一直,则将其勾选
     -->
    	 <s:checkboxlist name="customer.travelCitys" list="#{'beijing':'北京','shanghai':'上海','guangzhou':'广州','shenzhen':'深圳','chongqing':'重庆','diaoyudao':'钓鱼岛'}"  label="旅游过的城市"/>
    	 
    	 <!-- 
    	7.2单选框标签(动态)
    		1>根据OGNL(list属性值)的取值初始化一组checkbox,并根据listKey指定的实体类中的属性
    		来生成checkbox的value值。根据listValue指定的实体类中的属性来生成checkbox的label值。
    		2>根据OGNL(customer.travelCitys)取值来与生成checkbox 的value比较 ,若与哪个check的value值
    		一直,则将其勾选
     -->
    	 <s:checkboxlist name="customer.travelCitys" list="cities" listKey="code" listValue="name" label="旅游过的城市"/>
     	 
     	 <s:select name="customer.home" list="#{'beijing':'北京','shanghai':'上海','guangzhou':'广州','shenzhen':'深圳','chongqing':'重庆','diaoyudao':'钓鱼岛'}" label="家乡" headerKey="-1" headerValue="请选择"></s:select>
     	 
     	 <s:select name="customer.home" list="cities" listKey="code" listValue="name" label="家乡" headerKey="" headerValue="请选择"></s:select>
    </s:form>
  </body>
</html>


刷新浏览器:

技术分享














版权声明:本文为博主原创文章,未经博主允许不得转载。

struts2之如何使用复杂的UI标签

标签:

原文地址:http://blog.csdn.net/uniquewonderq/article/details/46959109

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!