`
段海波
  • 浏览: 317484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2+Json+JavaScript实现动态级联下拉列表框

    博客分类:
  • Java
阅读更多

做了这么久了还没弄过动态级联下拉列表框,所以决定也整一个。

例子为:学校、班级、学生,三级下拉列表框,具体代码随后贴出。

得出的结论是Action设置get和set方法的属性,在前台页面中都可以通过eval解析为JSON对象,这就好办多了,我们可以用eval解析通过ajax读取的数据,然后直接使用就OK了。

<script type="text/javascript">
	//创建XMLHttpRequest对象   
	function createXMLHttpRequest() {
		if (window.XMLHttpRequest) { //Mozilla 浏览器
			XMLHttpReq = new XMLHttpRequest();
		} else {
			if (window.ActiveXObject) { // IE浏览器			
				try {
					XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e) {
					}
				}
			}
		}
	}
	//发送请求
	function sendRequest(url, params, method) {
		if (method) {
			if (method.toLowerCase("post")) {
				sendRequestPost(url, params);
			} else {
				if (method.toLowerCase("get")) {
					sendRequestGet(url + "?" + params);
				} else {
					//
				}
			}
		} else {
			alert("\u63d0\u4ea4\u65b9\u5f0f\u4e0d\u80fd\u4e3a\u7a7a\uff01");
		}
	}
	//post发送请求函数
	function sendRequestPost(url, params) {
		createXMLHttpRequest();
		XMLHttpReq.open("POST", url, true);
		XMLHttpReq.onreadystatechange = processResponse;//指定响应函数
		XMLHttpReq.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded; charset=UTF-8");
		XMLHttpReq.send(params); // 发送请求
	}
	//get发送请求函数
	function sendRequestGet(url) {
		createXMLHttpRequest();
		XMLHttpReq.open("GET", url, true);
		XMLHttpReq.onreadystatechange = processResponse;//指定响应函数
		XMLHttpReq.send(null); // 发送请求
	}
	//post发送请求函数(无需传递参数时)
	function sendRequestPostwihtnoArgs(url) {
		createXMLHttpRequest();
		XMLHttpReq.open("POST", url, true);
		XMLHttpReq.onreadystatechange = processResponse;//指定回调函数
		XMLHttpReq.send(null); // 发送请求
	}
	// 更新列表框
	function update() { 
		var res = eval('('+XMLHttpReq.responseText+')');
		var option = null;
		var id_name_code = res.code.split("|");//拆分字符串,得到id与name(包括后缀字符串)的组合值
		var id_result = id_name_code[0];//得到id的组合值(所有的id,以_隔开)
		var name_result = id_name_code[1];//得到name的组合值(所有的name,以_隔开)
		var result = id_name_code[2]; //得到后缀名字符串
		//拆分以_隔开的字符串
		var id = id_result.split("_");
		var name = name_result.split("_");
		if ("student" == result) {
			clearStudent();
			var studentId = document.getElementById("studentId");
			for ( var i = 0; i < id.length; i++) {
				option = new Option(name[i], id[i]);
				studentId.options.add(option);
			}
		}
		if ("class" == result) {
			clearClass();
			var classesId = document.getElementById("classId");
			for ( var i = 0; i < id.length; i++) {
				option = new Option(name[i], id[i]);
				classesId.options.add(option);
			}
		}
		if ("school" == result) {
			clearSchool();
			var schoolId = document.getElementById("schoolId");
			for ( var i = 0; i < id.length; i++) {
				option = new Option(name[i], id[i]);
				schoolId.options.add(option);
			}
		}
	}
	// 清除列表框
	function clearSchool() {
		var schoolId = document.getElementById("schoolId");
		while (schoolId.childNodes.length > 0) {
			schoolId.removeChild(schoolId.childNodes[0]);
		}
	}
	function clearClass() {
		var classesId = document.getElementById("classId");
		while (classesId.childNodes.length > 0) {
			classesId.removeChild(classesId.childNodes[0]);
		}
	}
	function clearStudent() {
		var studentId = document.getElementById("studentId");
		while (studentId.childNodes.length > 0) {
			studentId.removeChild(studentId.childNodes[0]);
		}
	}
	// 处理返回信息函数
	function processResponse() {
		if (XMLHttpReq.readyState == 4) { // 判断对象状态
			if (XMLHttpReq.status == 200) { //信息已经成功返回,开始处理信息
				update();
			} else { //页面不正常
				window.alert("未找到页面");
			}
		}
	}
	function findStubyClasslId() {
		var classId = document.frmMenu.classId.value;
		var sURL = "allStu";
		var method = "post";
		var sParams = "classId=" + classId;
		sendRequest(sURL, sParams, method);

	}
	function findClassbySchoolId() {
		var schoolId = document.frmMenu.schoolId.value;
		var sURL = "allClass";
		var method = "post";
		var sParams = "schoolId=" + schoolId;
		sendRequest(sURL, sParams, method);

	}

	function findAllSchool() {
		var sURL = "allSchool";
		sendRequestPostwihtnoArgs(sURL);

	}
</script>
 

<body onload="findAllSchool()">
		<form name="frmMenu">
			<br>
			<hr>
			<div align="center">
				信息查询
				<br>
				<br>
				<select name="schoolId" id="schoolId"
					 onblur="findClassbySchoolId()">
					<option selected value="">
					请选择学校
					</option>

				</select>

				<select name="classId" id="classId" onblur="findStubyClasslId()">
					<option selected value="">
						请选择班级
					</option>

				</select>

				<select name="studentId" id="studentId">
					<option selected value="">
						请选择学生
					</option>
				</select>
			</div>

		</form>
	</body>
 <?xml version="1.0" encoding="UTF-8" ?>
<!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.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
	<package name="default1" namespace="/" extends="json-default">
		<action name="allSchool" class="ajax.demo.action.CasecadingMenuAction" method="queryAllSchool">
			<result name="success" type="json" />
		</action>
		   <action name="allClass" class="ajax.demo.action.CasecadingMenuAction" method="queryAllClass">
        	<result name="success" type="json"/>
        </action>
        <action name="allStu" class="ajax.demo.action.CasecadingMenuAction" method="queryAllStudent">
        	<result name="success" type="json"/>
        </action>
	</package>

</struts>

 package ajax.demo.action;

import java.util.List;

import net.sf.json.JSONObject;

import org.apache.struts2.json.annotations.JSON;


import ajax.demo.dao.CascadeMenuDAO;
import ajax.demo.model.Menu;

import com.opensymphony.xwork2.ActionSupport;

public class CasecadingMenuAction extends ActionSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String id="";
	private String schoolId;
	private String name="";
	private String classId;
	private String code;

	public String queryAllSchool() {
		List schoolList = new CascadeMenuDAO().findAllSchool();
		// 写入到被前台页面接收的字符串,id和name以_隔开 以"school"结尾
		for (int i = 0; i < schoolList.size(); i++) {
			Menu menu = (Menu) schoolList.get(i);
			id += menu.getId() + "_";
			name += menu.getName() + "_";
		}
		code = id + "|" + name + "|school";
		return ActionSupport.SUCCESS;
	}
	public String queryAllClass() {
		int sId = Integer.parseInt(schoolId);// 把从前台传来的参数转换成int类型的
		List schoolList = new CascadeMenuDAO().findClassbySchoolid(sId); // 写入到被前台页面接收的字符串,id和name以_隔开
																			// 以"class"结尾
		for (int i = 0; i < schoolList.size(); i++) {
			Menu menu = (Menu) schoolList.get(i);
			id += menu.getId() + "_";
			name += menu.getName() + "_";
		}
		code = id + "|" + name + "|class";
		return ActionSupport.SUCCESS;
	}

	public String queryAllStudent() {

		int cId = Integer.parseInt(classId);

		List schoolList = new CascadeMenuDAO().findStubyclassId(cId); // 写入到被前台页面接收的字符串,id和name以_隔开
																		// 以"student"结尾
		for (int i = 0; i < schoolList.size(); i++) {
			Menu menu = (Menu) schoolList.get(i);
			id += menu.getId() + "_";
			name += menu.getName() + "_";
		}
		code = id + "|" + name + "|student";
		return ActionSupport.SUCCESS;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getSchoolId() {
		return schoolId;
	}

	public void setSchoolId(String schoolId) {
		this.schoolId = schoolId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getClassId() {
		return classId;
	}

	public void setClassId(String classId) {
		this.classId = classId;
	}

	@JSON(name="code")
	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

}
 
分享到:
评论
3 楼 ahhmdwg 2014-11-20  
    function sendRequestPostwihtnoArgs(url) {  
       createXMLHttpRequest();  
        XMLHttpReq.open("POST", url, true);  
        XMLHttpReq.onreadystatechange = processResponse;//指定回调函数  
        XMLHttpReq.send(null); // 发送请求  
    }  

用的是post方法为什么没有xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
并且还是无参数的send?
2 楼 cceasy 2014-05-16  
为什么我的struts不能识别json-default???
我的那几个包都导进去了啊。。。
woyaokuaile_1314 写道
我用这个例子,为什么调用到 processResponse 方法返回的是未找到页面呢?我用的IE8浏览器

楼上可遇到这种情况了。。
1 楼 woyaokuaile_1314 2014-04-04  
我用这个例子,为什么调用到 processResponse 方法返回的是未找到页面呢?我用的IE8浏览器

相关推荐

    ajax+struts2.0+jsp下拉列表级联

    在这个“ajax+struts2.0+jsp下拉列表级联”的示例中,我们将探讨如何利用这三个技术实现这种功能。 首先,AJAX(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下与服务器交换数据并更新部分网页...

    jQuery实现的多级级联下拉列表

    **jQuery实现的多级级联下拉...总结,这个项目展示了如何利用jQuery与Struts1.2框架协同工作,实现动态的多级级联下拉列表。理解并熟练掌握这一技术,有助于提升Web应用的用户体验,使用户能够更方便地进行数据选择。

    一个基于Ext+Struts2+spring实现的级联分页示例程序源码例子

    "一个基于Ext+Struts2+Spring实现的级联分页示例程序源码例子"是一个很好的学习资源,它揭示了如何利用这三大框架来构建高效、灵活的Web应用。下面将详细解析这个项目的知识点。 首先,Ext是一个强大的JavaScript库...

    用Struts2+Spring+Hibernate三大框架完成的级联操作

    Spring MVC的ModelAndView或Struts2的结果类型可以返回JSON数据,前端JavaScript可以解析这些数据并更新DOM。 在这个项目中,级联省市县部分,可能涉及到多级联动的逻辑,需要在数据库中维护省、市、县之间的层级...

    struts2+json省市区级联显示

    在"struts2+json省市区级联显示"这个项目中,我们看到主要功能是通过Struts2框架与JSON数据配合,实现在用户选择省份时,无需刷新页面就能动态加载并显示对应的市、区级联列表。这种级联选择通常用于地址填写或者...

    spring+struts2+hibernate+json+dtree+mysql实现的无限级联树(全)

    本项目"spring+struts2+hibernate+json+dtree+mysql实现的无限级联树(全)"是一个典型的企业级应用示例,它综合了前端与后端的多种技术,实现了数据的动态展示和交互。下面将详细解析该项目中的主要技术及其应用。 1...

    struts2+ajax+json四级联动

    Struts2、Ajax和JSON是Web开发中的关键技术,它们共同作用可以实现动态、实时的数据交互,提高用户体验。这里我们将深入探讨这些技术以及如何在实际应用中实现四级联动的效果。 首先,Struts2是一个基于MVC(Model-...

    SSH+jQuery+json 实现的Ajax操作,绝对精华,代码简练清晰,绝对能看明白

    2. **解析与渲染**:jQuery的`$.parseJSON()`(现在已弃用,推荐使用`$.getJSON()`或`$.ajax()`的dataType设置为'json')方法用于解析JSON字符串为JavaScript对象,然后可以在前端动态更新DOM。 **Ajax级联操作** ...

    ajax+ssh实现省份城市级联查询

    Struts2还支持JSON插件,可以方便地将后台数据以JSON格式响应给Ajax请求,从而实现省份城市的数据交互。 在实际的项目中,开发者首先需要创建省份和城市的数据模型,并在Hibernate中配置对应的映射文件。接着,利用...

    SSH+Ajax+JSON省市级联效果Spring+Struts+Hibernate+Jquery

    jQuery在接收到这些数据后,可以轻松地解析JSON并动态地更新城市选择框的内容,从而实现级联效果。 具体实现步骤大致如下: 1. 用户在前端选择省份,触发jQuery的Ajax事件。 2. Ajax请求发送到后台,由Struts拦截...

    struts实现select级联

    以上就是使用Struts2实现select级联选择的基本流程。不连接数据库的情况,数据可以直接在Action中初始化。在实际项目中,数据通常从数据库中获取,因此级联Action需要根据用户选择的省份查询数据库并返回相应城市的...

    ssh+json+dtree+mysql实现N级动态树形菜单+增删改查

    本文将详细探讨如何使用SSH(Spring、Struts2、Hibernate)框架结合JSON和DTREE库,以及MySQL数据库来实现这样一个系统。首先,我们来看SSH框架的核心组成部分。 **Spring框架** 是一个全面的后端开发框架,提供了...

    Ajax实现的三级联动下拉菜单

    struts2+jsp+json+javascript实现的三级下拉菜单,没有service和dao层,数据是虚拟的。需要的欢迎下载。项目直接导入myeclipse就可以使用。访问路径localhost:8080/ajax_day02_hw/proviencecityarea.jsp

    JQuery级联下拉

    JQuery级联下拉 JQuery级联下拉是指使用...JQuery级联下拉技术可以帮助开发者快速实现级联下拉框的功能,而Struts2框架可以简化服务器端的开发工作。通过正确地应用这两种技术,开发者可以快速构建复杂的Web应用程序。

    js+jsp标签实现页面级联菜单

    在jsp中,我们可以使用自定义标签库(Tag Library)来简化代码,例如JSTL(JavaServer Pages Standard Tag Library)或者Struts2的标签库。这些标签库提供了便利的循环和条件判断功能,非常适合构建动态内容。 1. *...

    struts2 级联菜单

    在Struts2中实现级联菜单是一项常见的需求,通常用于构建复杂的下拉选择框,使得用户能够逐级选择相关选项。级联菜单在数据表关联或者层级结构的展示中非常实用,例如地区选择、部门分类等。 首先,我们需要理解...

    ajax_struts_jquery_json级联菜单

    综上所述,"ajax_struts_jquery_json级联菜单"的实现涉及了前端和后端的协同工作。前端利用jQuery的AJAX功能发送请求,处理JSON响应并更新DOM;后端则用Struts处理请求,查询数据库并返回JSON数据。这种组合提供了...

    三级联动的实例+struts2+hibernate3

    在IT行业中,"三级联动"通常指的是在一个应用中,三个或更多下拉列表框之间存在联动关系,即一个下拉框的选择会影响到下一个下拉框的数据加载。这种技术常见于地域选择、产品分类等场景,提供了良好的用户体验。在这...

    省市级联ssh1+jquery+json

    标题 "省市级联ssh1+jquery+json" 暗示了这个项目是关于构建一个中国省级和市级的联动选择功能,使用了SSH1(Spring、Struts1、Hibernate1)作为后端框架,jQuery作为前端JavaScript库,而JSON作为数据交换格式。...

Global site tag (gtag.js) - Google Analytics