目录(?)[+]

运行环境:myeclipse8.6+jboss5.1+jvm1.6

先看最后目录结构:

直接上源码:

complexFormTag.jsp:

  1. <%@ page language="java" contentType="text/html; charset=gb2312"pageEncoding="gb2312"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <title>复杂表单标签使用范例</title>
  6. <s:head />
  7. </head>
  8. <body>
  9. <h3 align="left">doubleselect标签使用范例</h3>
  10. <p>
  11. <s:form name="doubleselectExample">
  12. <s:doubleselect label="材料" headerValue="" headerKey="0"
  13. list="itemList" listKey="itemId" listValue="item"
  14. doubleName="abc" doubleList="materialMap.get(top.itemId)"
  15. doubleListKey="materialId" doubleListValue="material" />
  16. </s:form>
  17. </p>
  18. </body>
  19. </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:

  1. package action;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import com.opensymphony.xwork2.ActionSupport;
  7. import model.*;
  8. public class ComplexFormTagAction extends ActionSupport {
  9. //级联第一个下拉框数据
  10. private List<Item> itemList;
  11. //级联第二个下拉框数据
  12. private Map<Integer, List<Material>> materialMap;
  13. public String execute() throws Exception {
  14. itemList = new ArrayList<Item>();
  15. //循环新建10个类别
  16. for (int j = 0; j < 10; j++) {
  17. Item item = new Item();
  18. item.setItemId(j + 1);
  19. item.setItem("类别" + (j + 1));
  20. itemList.add(item);
  21. }
  22. materialMap = new HashMap<Integer, List<Material>>();
  23. //循环新建每个类别中的10个材料
  24. for (int j = 0; j < 10; j++) {
  25. List<Material> materialList = new ArrayList<Material>();
  26. for (int i = 0; i < 10; i++) {
  27. Material material = new Material();
  28. material.setMaterialId(i);
  29. material.setMaterial("类别" + (j + 1)+"-->"+"材料"+(i + 1));
  30. materialList.add(material);
  31. }
  32. materialMap.put((j + 1), materialList);
  33. }
  34. return SUCCESS;
  35. }
  36. public Map<Integer, List<Material>> getMaterialMap() {
  37. return materialMap;
  38. }
  39. public void setMaterialMap(Map<Integer, List<Material>> materialMap) {
  40. this.materialMap = materialMap;
  41. }
  42. public List<Item> getItemList() {
  43. return itemList;
  44. }
  45. public void setItemList(List<Item> itemList) {
  46. this.itemList = itemList;
  47. }
  48. }

Material.java:

  1. package model;
  2. public class Material implements java.io.Serializable {
  3. // Fields
  4. private int materialId;
  5. private String material;
  6. public Material() {}
  7. public int getMaterialId() {
  8. return this.materialId;
  9. }
  10. public void setMaterialId(int materialId) {
  11. this.materialId = materialId;
  12. }
  13. public String getMaterial() {
  14. return this.material;
  15. }
  16. public void setMaterial(String material) {
  17. this.material = material;
  18. }
  19. }

Item.java:

  1. package model;
  2. public class Item implements java.io.Serializable {
  3. private int itemId;
  4. private String item;
  5. public Item() {}
  6. public int getItemId() {
  7. return itemId;
  8. }
  9. public void setItemId(int itemId) {
  10. this.itemId = itemId;
  11. }
  12. public String getItem() {
  13. return this.item;
  14. }
  15. public void setItem(String item) {
  16. this.item = item;
  17. }
  18. }

struts.xml:

  1. <?xml version="1.0" encoding="gb2312"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
  4. <struts>
  5. <constant name="struts.i18n.encoding" value="gb2312"/>
  6. <package name="OGNLTAG" extends="struts-default">
  7. <action name="complexFormTag" class="action.ComplexFormTagAction">
  8. <result name="success">/jsp/complexFormTag.jsp</result>
  9. </action>
  10. </package>
  11. </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 . . .。

  1. list="itemList" listKey="itemId" listValue="item"
  2. doubleName="abc" doubleList="materialMap.get(top.itemId)"

top.itemId:top代表的就是list即"itemList"当前选中的对象, 所以top.itemId对应的就是当前选中的对象Item的ID,
materialMap.get(top.itemId)即根据当前选中的对象Item中的ID来取出第二级下拉框的数据集合。

Struts2 级联下拉框 详解析的更多相关文章

  1. struts-hibernate-ajax完成区县和街道级联下拉框功能(二补充使用json解析list结果集,ajax循环json层级处理)

    针对<struts-hibernate-ajax完成区县和街道级联下拉框功能>进行补充,上一篇中,要在action中拼接JSON格式字符串,很容易手抖.直接用json处理一下转成json格 ...

  2. jQuery无限级联下拉框插件

    自己编写jQuery插件 之 无限级联下拉框   因为是级联,所以数据必须是树型结构的,我这里的测试数据如下: 看下效果图: 1.>图一: 2.>图二: 3.>图三: 由图可知,下拉 ...

  3. EXCEL(1)级联下拉框

    EXCEL级联下拉框 http://jingyan.baidu.com/article/3c343ff756e0cf0d377963f9.html 在输入一些多级项目时,如果输入前一级内容后,能够自动 ...

  4. JQuery和ASP.NET分别实现级联下拉框效果

    在学习JQuery之前知道下拉框的级联效果可以通过asp.net控件实现,现在学习了JQuery,知道了JQuery和select也能实现.我分别举两个小例子说明这两种方法如何实现. 1.用JQuer ...

  5. js基于json的级联下拉框

    级联下拉列表是项目中常用到的.比如省市县,比如企业性质等,做成一个js通用组件, 在静态页出来后可以直接插入,将数据和html静态页做一个解耦. 贴出来抛砖引玉吧. /** * @author sun ...

  6. JS级联下拉框

    //Ajax级联获取SDKfunction GetDropDownList(parent_ddlID, fill_dllID, url, param) {    this.pId = parent_d ...

  7. 自动补齐flexselect+级联下拉框案例

    在开发web应用时,经常遇到类似省市区级联下拉框操作,即选中省份自动级联加载该省份所有的市,选中市自动级联加载该市所有的区:假设省市区的数据量很大,此时用户想选中某市,因而要从上往下查找,可能半天都找 ...

  8. C# ,数据导出到带有级联下拉框的模板(一,模板的级联功能)

    一.首先解决如何做模板中增加级联功能 1,首先打开一个新的Excel文件,新增sheet,把分类保存在里面,如下图所示 2.回到sheet1,选中要增加下拉框的行(注意:请排除首行,首行是标题) 3. ...

  9. JavaScript实现级联下拉框

    <!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku ...

随机推荐

  1. 【c++习题】【17/5/8】重载运算符

    1.设计一个Complex(复数)类,完成如下要求: 该类具有实部(Real_Part)和虚部(Image_Part)通过重载运算符“+”实现两个复数的相加通过重载运算符“+”实现一个复数与一个数值的 ...

  2. zabbix监控php-fpm的性能

    zabbix监控php-fpm主要是通过nginx配置php-fpm的状态输出页面,在正则取值 要nginx能输出php-fpm的状态必须要先修改php-fpm的配置,这个配置没有开启nginx 就没 ...

  3. const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改

    大家都知道如下代码中,被const限定的a是不可以被直接修改的 void main() { const int a = 3; a=1; } 在C++中const修饰的常量,不能被直接修改,但是可以通过 ...

  4. 利用SSH协议在Windows下使用PuTTY连接Ubuntu

    利用SSH协议在Windows下使用PuTTY连接Ubuntu Ubuntu部分 首先我们要为Ubuntu配置一下环境,让它支持ssh服务,我们要做的其实也很简单,就一下两步: 安装OpenSSH软件 ...

  5. 实验四Android开发

    实验四Java Android简易开发 实验准备 Android Studio 的下载: Android Studio 安装教程 在安装过程中的问题: 在下载了官网上的说明包含sdk的安装包之后找不到 ...

  6. git提交出现remote rejected master -> XX changes closed

    问题现象: 提交git的时候出现 ! [remote rejected] master -> refs/for/master (change http://XXXX.com/myreview/c ...

  7. 【纯代码】Swift相册照片选择-支持单选或多选

    // // NAPublishAlbumTableViewController.swift //// // Created by on 2019/3/23. // Copyright © 2019年 ...

  8. netbeans等宽字体却不支持中文

    一直用netbeans,各方面都很满意,就是这字体十分不爽,如用等宽字体却不支持中文,百度了一下,找到了解决办法,贴出来,给需要的朋友. 01.找到自己java字体目录.我的目录是[C:\Progra ...

  9. IE10下阿里旺旺无法快速登录解决办法

    一直都是用Chrome浏览器的,如果已经登录了旺旺,打开淘宝登录的时候都是会有快速登录的,免得手工输入用户名密码了.不经意间用IE10打开淘宝,登录时发现无法使用快速登录,一番研究后发现,IE做了保护 ...

  10. Maven到底是个啥玩意

    Maven,是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 上面是百度百科对Maven的正式介绍,如果你是Maven初学者,我估计你看完之后心中肯 ...