先看项目截图:





看看要加入的jar包

除了struts核心的那个几个之外,我们还需要这两个





OK先看struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
    <constant name="struts.devMode" value="true"></constant>
    <package name="test" namespace="/" extends="struts-default">
         <action name="getProvince" class="cdm.module.file.action.SearchFileAction" method="getProvince">
        <result>/testSelect.jsp</result>
        </action>
    </package>

    <package name="searchFileJSON" namespace="/" extends="json-default">
        <action name="getMunicipality" class="cdm.module.file.action.SearchFileAction" method="getMunicipality">
            <result type="json">
                <param name="root">municipalities</param>
            </result>
        </action>
    </package>
</struts>

我们看看用于处理请求的类。

package cdm.module.file.action;

import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;

public class SearchFileAction extends ActionSupport {

    /**
     *
     */
    private static final long serialVersionUID = -6756954284459457436L;

    public int provinceId;

    public List<Municipality> municipalities;

    public List<Province> provinces=new ArrayList<Province>();

    public String getProvince(){
        //下面的为模拟数据库操作
        Province p1=new Province();
        p1.setId(1);
        p1.setName("陕西省");

        Province p2=new Province();
        p2.setId(2);
        p2.setName("山西省");

        provinces.add(p1);
        provinces.add(p2);
        return SUCCESS;
    }

    public String getMunicipality(){
        municipalities=new ArrayList<Municipality>();
        //下面的为模拟数据库操作
        if (provinceId==1) {
            Municipality municipality=new Municipality();
            municipality.setId(1);
            municipality.setName("咸阳市");
            municipality.setProvinceId(1);
            municipalities.add(municipality);
            municipality=new Municipality();
            municipality.setId(2);
            municipality.setName("西安市");
            municipality.setProvinceId(1);
            municipalities.add(municipality);
        }

        if (provinceId==2) {
            Municipality municipality=new Municipality();
            municipality.setId(1);
            municipality.setName("运城市");
            municipality.setProvinceId(2);
            municipalities.add(municipality);
            municipality=new Municipality();
            municipality.setId(2);
            municipality.setName("太原市");
            municipality.setProvinceId(2);
            municipalities.add(municipality);
        }
        System.out.println(municipalities.get(0).getName()+"sdfs");

        return SUCCESS;
    }

    //省略三个实例变量的getset方法
}

至于Municipality,与Province,省里面有个一id和name,市除了id和name外还有一个provinceId,来指示它位于哪个省。







testSelect.jsp也很简单就是下面代码示例。

<%@ page contentType="text/html; charset=GB2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title></title>

        <script type="text/javascript" src="js/json2.js"></script>
        <script type="text/javascript" src="js/prototype.js"></script>
        <script type="text/javascript" src="js/findInf.js"></script>
</head>
<body>
    <br>

    <table class="tab_frm" >
                    <tr>
                        <td class="left" width="5%">
                            省级别
                        </td>
                        <td class="left" width="18%">
                            市级别
                        </td>

                    </tr>
                    <tr>

                        <td class="center" width="5%">
                            <s:select  id="categoryId0" list="provinces"
                                listKey="id" listValue="name" headerKey="-1"
                                headerValue="-请选择省-" theme="simple"
                                onchange="getProvince(this)" />
                        </td>
                        <td class="center" width="18%">
                            <s:select  id="conditionId0" list="#{'-1':'-请先选择省-'}"
                                theme="simple" disabled="true" />
                        </td>
                    </tr>
    </table>

</body>
</html>

核心在引入的findInf.js,代码如下:

function getProvince(obj) {

    var provinceId = obj.options[obj.selectedIndex].value;
    var select = document.getElementById("conditionId0");

    if (provinceId < 0) {
        select.innerHTML = "";
        select1.innerHTML = "";
        var con = new Option();
        con.text = "-请先选择省-";
        con.value = "-1";
        var mat = new Option();
        mat.text = "-请先选择省-";
        mat.value = "-1";
        select.options.add(con);

        select.disabled=true;

        return;
    }
    var url = "getMunicipality.action?provinceId=" + provinceId;
    new Ajax.Request(url, {method:"post", onComplete:function (request) {
        select.innerHTML = "";
        var o = new Option();
        o.text = "-请选择市-";
        o.value = "-1";
        select.options.add(o);
        var tableList = JSON.parse(request.responseText);
        for (var i = 0; i < tableList.length; i++) {
            var _o = new Option();
            _o.text = tableList[i].name;
            _o.value = tableList[i].id;
            select.options.add(_o);
        }
        select.disabled=false;
    }, asynchronous:true});
}

完工!



遇到的几个问题

        <script type="text/javascript" src="js/json2.js"></script>
        <script type="text/javascript" src="js/prototype.js"></script>
        <script type="text/javascript" src="js/findInf.js"></script>

findInf要等上面两个引入后才能引用。

当时复制的时候没有注意这一点。

启用firefox的调试功能,看到Ajax is not define 才想到这个问题。

其他资料:

http://www.jb51.net/article/37316.htm

http://www.wzsky.net/html/Website/Javascript/126012.html

http://www.w3school.com.cn/jquery/ajax_ajax.asp

struts ajax多级下拉菜单的更多相关文章

  1. jquery实现多级下拉菜单

    支持多种浏览器,体验效果:http://keleyi.com/keleyi/phtml/jqmenu/4.htm 多级菜单,理论上支持无限多的层级,文件结构非常简单的,以下是完整代码: <!DO ...

  2. 基于jQuery带图标的多级下拉菜单

    之前为大家分享了很多导航菜单.今天我们要来分享一款很不错的jQuery左侧带小图标的多级下拉菜单,菜单是垂直的,每一个菜单项带有一个小图标,看起来非常专业.并且菜单支持无限极下拉,所以对各位Web开发 ...

  3. 一款多浏览器兼容的javascript多级下拉菜单

    这个多级下拉菜单的脚本大小不到2K,带有动画效果,可以方便地支持多个实例,并且能良好兼容WordPress系统wp_list_cats和wp_list_pages生成的多级列表.要初始化一个菜单,只需 ...

  4. 小程序多级下拉菜单demo

    小程序多级下拉菜单demo - CSDN博客 https://blog.csdn.net/github_39371177/article/details/80251211

  5. bootstrap多级下拉菜单

    只需为下拉菜单的任意 <li> 元素添加 .dropdown-submenu 的类,并在该 <li> 元素下添加 .dropdown-menu 类的列表,就可以为该菜单项添加一 ...

  6. jQuery制作水平多级下拉菜单

    本篇体验使用jQuery制作水平的.多级的.下拉菜单. 下拉菜单的html部分如下. <body> <nav class="main-nav"> <u ...

  7. AJAX多级下拉联动【JSON】

    前言 前面我们已经使用过了XML作为数据载体在AJAX中与服务器进行交互.当时候我们的案例是二级联动,使用Servlet进行控制 这次我们使用JSON作为数据载体在AJAX与服务器交互,使用三级联动, ...

  8. ajax实现下拉菜单无刷新加载更多

    $(function() { var page = 1; var discount = $('#discount'); var innerHeight = window.innerHeight; va ...

  9. android 多级下拉菜单实现教程

    原创,如转载请标明链接:http://blog.csdn.net/q610098308/article/details/50333387 很多App,都有二级菜单出现,但android 本身实现的菜单 ...

随机推荐

  1. android Spinner控件详解

    Spinner提供了从一个数据集合中快速选择一项值的办法.默认情况下Spinner显示的是当前选择的值,点击Spinner会弹出一个包含所有可选值的dropdown菜单,从该菜单中可以为Spinner ...

  2. Android艺术开发探索第三章————View的事件体系(下)

    Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动 ...

  3. 在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。

    //重叠区间数 #define N 2 typedef struct arrange { int x; int y; } Arrange; //先按左边界排序,若相等再按右边界排序(升序) int c ...

  4. named let 递归和闭包的利器

    named let和递归,闭包联系十分密切.而且还是提高性能的重要手段.先来看一个make-list函数的模拟,最原始的写法大概是: (define (imake-list n member) ( n ...

  5. SQLite 运算符(http://www.w3cschool.cc/sqlite/sqlite-operators.html)

    SQLite 运算符 SQLite 运算符是什么? 运算符是一个保留字或字符,主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算. 运算符用于指定 SQLite 语句中的条件 ...

  6. 20 ViewPager demo5,6:FragmentAdapter 导航数据

    Demo5 文件结构: MainActivity.java package com.qf.day20_viewpager_demo5; import java.util.ArrayList; impo ...

  7. 20ViewPager demo1,2:接收ViewPager展示View的使用

    Demo1 MainActivity .JAVA package com.qf.day20_viewpager_demo1; import java.util.ArrayList; import ja ...

  8. VIM编辑器操作命令积累

    开始学习VIM编辑器了,计划着每周学习几个新命令,记录在本篇博客中. 1.第一次接触 vi demo.txt 进入Normal模式查看文本 i 进入Insert模式插入内容,编辑文本 nG n代表行号 ...

  9. Spring之Core模块

    Core模块主要的功能是实现了控制反转与依赖注入.Bean配置以及加载.Core模块中有Beans.BeanFactory.BeanDefinitions.ApplicationContext等概念 ...

  10. MySQL 存储过程探秘

    关于存储过程的优点,本文不再阐述.这里只是对创建存储过程时可能遇到的问题做一下简单的分析. 必备基础 这里说的基础,是相关于如何创建一个存储过程的. DELIMITER:分隔符,定界符. 作用就是:作 ...