Struts2 级联下拉框 详解析
运行环境:myeclipse8.6+jboss5.1+jvm1.6
先看最后目录结构:
直接上源码:
complexFormTag.jsp:
- <%@ page language="java" contentType="text/html; charset=gb2312"pageEncoding="gb2312"%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <html>
- <head>
- <title>复杂表单标签使用范例</title>
- <s:head />
- </head>
- <body>
- <h3 align="left">doubleselect标签使用范例</h3>
- <p>
- <s:form name="doubleselectExample">
- <s:doubleselect label="材料" headerValue="" headerKey="0"
- list="itemList" listKey="itemId" listValue="item"
- doubleName="abc" doubleList="materialMap.get(top.itemId)"
- doubleListKey="materialId" doubleListValue="material" />
- </s:form>
- </p>
- </body>
- </html>
解析:
若不使用Struts2,则需要结合JavaScript和HTML标签共同开发完成此功能。
doubleselect标签的功能是提供两个有级联关系的下拉框。用户选中第一个下拉框中的某选项,则第二个下拉框中的选项根据第一个下拉框被选中的某选项内容来决定它自己的下拉框选项内容,产生联动效果。
对于代码"materialMap.get(top.itemId)",其中的top返回的是材料类别map集合的value即材料list集合中的材料类对象实例。
最后面会对top更进一步解释。
注意:<s:doubleselect/>标签必须放在<s:form>中,放在普通<form>中会出错,而且s:form必须指定name属性。
另外,希望页面美观的话,希望s:doubleselect标签和左边的字对齐,则指定s:doubleselect属性theme="simple"
希望两个select排成一行(默认是上下行的),则在<s:form></s:form>间加入css样式:
<style>
.nobr br{display:none}
</style>
然后在用<div class="nobr"></div>把<s:doubleselect .. />包起来就可以了!
下面是doubleselect标签的属性列表:
下面通过一张图形象的表示联动关系:
对应的组件:
最后,两个下拉框要联动起来,靠的是“ItemId”与下面"Integer类型变量"的一一对应关系。
<s:doubleselect ...
list="itemList" listKey="itemId" listValue="item"
doubleList="materialMap.get(top.itemId)"doubleListKey="materialId"doubleListValue="material"
/>
注意,上面的两相同的itemId,这里应该必须一致。
complexFormTagAction.java:
- package action;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.opensymphony.xwork2.ActionSupport;
- import model.*;
- public class ComplexFormTagAction extends ActionSupport {
- //级联第一个下拉框数据
- private List<Item> itemList;
- //级联第二个下拉框数据
- private Map<Integer, List<Material>> materialMap;
- public String execute() throws Exception {
- itemList = new ArrayList<Item>();
- //循环新建10个类别
- for (int j = 0; j < 10; j++) {
- Item item = new Item();
- item.setItemId(j + 1);
- item.setItem("类别" + (j + 1));
- itemList.add(item);
- }
- materialMap = new HashMap<Integer, List<Material>>();
- //循环新建每个类别中的10个材料
- for (int j = 0; j < 10; j++) {
- List<Material> materialList = new ArrayList<Material>();
- for (int i = 0; i < 10; i++) {
- Material material = new Material();
- material.setMaterialId(i);
- material.setMaterial("类别" + (j + 1)+"-->"+"材料"+(i + 1));
- materialList.add(material);
- }
- materialMap.put((j + 1), materialList);
- }
- return SUCCESS;
- }
- public Map<Integer, List<Material>> getMaterialMap() {
- return materialMap;
- }
- public void setMaterialMap(Map<Integer, List<Material>> materialMap) {
- this.materialMap = materialMap;
- }
- public List<Item> getItemList() {
- return itemList;
- }
- public void setItemList(List<Item> itemList) {
- this.itemList = itemList;
- }
- }
Material.java:
- package model;
- public class Material implements java.io.Serializable {
- // Fields
- private int materialId;
- private String material;
- public Material() {}
- public int getMaterialId() {
- return this.materialId;
- }
- public void setMaterialId(int materialId) {
- this.materialId = materialId;
- }
- public String getMaterial() {
- return this.material;
- }
- public void setMaterial(String material) {
- this.material = material;
- }
- }
Item.java:
- package model;
- public class Item implements java.io.Serializable {
- private int itemId;
- private String item;
- public Item() {}
- public int getItemId() {
- return itemId;
- }
- public void setItemId(int itemId) {
- this.itemId = itemId;
- }
- public String getItem() {
- return this.item;
- }
- public void setItem(String item) {
- this.item = item;
- }
- }
struts.xml:
- <?xml version="1.0" encoding="gb2312"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.i18n.encoding" value="gb2312"/>
- <package name="OGNLTAG" extends="struts-default">
- <action name="complexFormTag" class="action.ComplexFormTagAction">
- <result name="success">/jsp/complexFormTag.jsp</result>
- </action>
- </package>
- </struts>
运行http://localhost:8080/OGNLTAG/jsp/complexFormTag.action
注:后缀是.action而非.jsp,否则异常:
The requested list key 'itemList' could not be resolved as a collection/array/map/enumeration/iterator type.
因为直接访问jsp页面的话,要先经过struts.xml导航,然后才转到调用Action类处理;这样的话"itemList"就没有完成初始化,故而出现上述异常。若直接“.action”去访问Action类的话,就完成初始化操作了,故而" 'itemList' can be resolved as a collection"。
输出结果:
------------------------------------------------------------------------------
最后通过<s:debug />看一下调试结果中的“值栈”:
Struts ValueStack Debug
Value Stack Contents
注意上图中materialMap和itemList这两个Action类中有且仅有的两实例属性。从上面的图片可以理解doubleList="materialMap.get(top.itemId)"中的top,它的意思是:the
value at the top of the stack 。
用语句<s:property value="top" />,会输出:action.ComplexFormTagAction@ 1db6a20
<s:property value="materialMap" />,会输出:{1=[model.Material@.....],2=[...],...,10=[...] }
(不用"#",也就是直接从“值栈”中取值,此处等效于value="top.materialMap")
<s:property value="itemList" />,会输出:[model.Item@......,model.Item@...,.......]
测试<s:property value="top.itemId" />输出为空,是因为itemId这个值是要根据listKey才能确定出来的。
可以上面语句看出:top就是指上面图片中的“Object列”的对象,它有些“Property”,如 texts、materialMap、actionErrors . . .。
- list="itemList" listKey="itemId" listValue="item"
- doubleName="abc" doubleList="materialMap.get(top.itemId)"
top.itemId:top代表的就是list即"itemList"当前选中的对象, 所以top.itemId对应的就是当前选中的对象Item的ID,
materialMap.get(top.itemId)即根据当前选中的对象Item中的ID来取出第二级下拉框的数据集合。
Struts2 级联下拉框 详解析的更多相关文章
- struts-hibernate-ajax完成区县和街道级联下拉框功能(二补充使用json解析list结果集,ajax循环json层级处理)
针对<struts-hibernate-ajax完成区县和街道级联下拉框功能>进行补充,上一篇中,要在action中拼接JSON格式字符串,很容易手抖.直接用json处理一下转成json格 ...
- jQuery无限级联下拉框插件
自己编写jQuery插件 之 无限级联下拉框 因为是级联,所以数据必须是树型结构的,我这里的测试数据如下: 看下效果图: 1.>图一: 2.>图二: 3.>图三: 由图可知,下拉 ...
- EXCEL(1)级联下拉框
EXCEL级联下拉框 http://jingyan.baidu.com/article/3c343ff756e0cf0d377963f9.html 在输入一些多级项目时,如果输入前一级内容后,能够自动 ...
- JQuery和ASP.NET分别实现级联下拉框效果
在学习JQuery之前知道下拉框的级联效果可以通过asp.net控件实现,现在学习了JQuery,知道了JQuery和select也能实现.我分别举两个小例子说明这两种方法如何实现. 1.用JQuer ...
- js基于json的级联下拉框
级联下拉列表是项目中常用到的.比如省市县,比如企业性质等,做成一个js通用组件, 在静态页出来后可以直接插入,将数据和html静态页做一个解耦. 贴出来抛砖引玉吧. /** * @author sun ...
- JS级联下拉框
//Ajax级联获取SDKfunction GetDropDownList(parent_ddlID, fill_dllID, url, param) { this.pId = parent_d ...
- 自动补齐flexselect+级联下拉框案例
在开发web应用时,经常遇到类似省市区级联下拉框操作,即选中省份自动级联加载该省份所有的市,选中市自动级联加载该市所有的区:假设省市区的数据量很大,此时用户想选中某市,因而要从上往下查找,可能半天都找 ...
- C# ,数据导出到带有级联下拉框的模板(一,模板的级联功能)
一.首先解决如何做模板中增加级联功能 1,首先打开一个新的Excel文件,新增sheet,把分类保存在里面,如下图所示 2.回到sheet1,选中要增加下拉框的行(注意:请排除首行,首行是标题) 3. ...
- JavaScript实现级联下拉框
<!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku ...
随机推荐
- [转]hadoop2.x常用端口及定义方法
端口 Hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问.而随着Hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集 ...
- 如何修改Django中的日期和时间格式 DateTimeField
html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2017-06-03 13:00:00,但是页面显示的却是Apr. 03, 2 ...
- Docker在渗透中的应用
起因 环境因素影响,我他么路由器映射端口 msf就是反弹不回来session,在跟大牛交流后,大牛说服务器装个kali就行了,我以为是叫idc那边直接安装,但是因为这个系统特殊,很多 idc不允许安装 ...
- What's the difference between UTF-8 and UTF-8 without BOM?
https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom ...
- autofac.webapi2
quick start https://autofaccn.readthedocs.io/en/latest/integration/webapi.html#quick-start To get Au ...
- Effective C++ 条款02:尽量以const,enum,inline替换 #define
换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于 ...
- Python基础笔记系列二:分支和循环
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 分支:即是if-else和if-elif-else语句 循环:即是whil ...
- crontab 参数详解
crontab 参数 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute ...
- CSS打造固定表头
html代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...
- Android 必须知道2018年流行的框架库及开发语言,看这一篇就够了!
导语 2017 已经悄悄的走了,2018 也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来,来规划一下今年要学哪些新技术.这几年优秀Android的开源库不断推出,新技术层出不穷,需要我们不断 ...