Ajax+struts实现级联菜单~学习笔记

1,数据库表

sheng(省份):id, uname; shi(市):id,uname,shengId; xian(县):id,uname,xianId;

2,新建项目:menuDemo,并添加struts和hibernate引用。

3,创建各个表的dao层方法,返回为List集合,该部分省略。

4,创建MenuAction,继承DispatchAction;

package web.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import dao.ShengDao;
import dao.ShiDao;
import dao.XianDao;
import entity.Shi;
import entity.Xian;

public class MenuAction extends DispatchAction {


public ActionForward searchCity(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
int id = Integer.parseInt(request.getParameter("id"));
System.out.println(id);
String searchType = request.getParameter("searchType");
[b]//必须有这句话,负责页面不能解析xml文件
StringBuffer responseXML = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");[/b]
responseXML.append("<domains>");
if(searchType.equals("shi")){
ShiDao shiDao = new ShiDao();
List list = shiDao.getShi(id);
Iterator it = list.iterator();
while(it.hasNext()){
Shi shi = (Shi)it.next();
[b]responseXML.append("<domain");
responseXML.append(" id='" + shi.getId());
responseXML.append("'>");
responseXML.append(shi.getUname());
responseXML.append("</domain>");[/b]
}
}
if(searchType.equals("xian")){
XianDao xianDao = new XianDao();
List list = xianDao.getXian(id);
Iterator it = list.iterator();
while(it.hasNext()){
Xian xian = (Xian)it.next();
responseXML.append("<domain");
responseXML.append(" id='" + xian.getId());
responseXML.append("'>");
responseXML.append(xian.getUname());
responseXML.append("</domain>");
}
}
responseXML.append("</domains>");

[b]response.setContentType("text/xml; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");[/b]
try {
[b] PrintWriter out = (PrintWriter) response.getWriter();
out.write(responseXML.toString());[/b]
System.out.println(responseXML.toString());
// out.flush();
} catch (IOException e) {
// do nothing
e.printStackTrace();
}
[b] //返回空值,忽略struts-config.xml配置中的结果页
return null;[/b]
}
public ActionForward showSheng(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ShengDao shengDao = new ShengDao();
List list = shengDao.getSheng();
System.out.println(list.size());
request.setAttribute("shengs", list);
return mapping.findForward("showSheng");
}
}

1,struts-config.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<form-beans>
<form-bean name="shengForm" type="web.form.ShengForm"></form-bean>
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
[b]<action path="/searchCity" type="web.action.MenuAction" scope="request" parameter="doType"></action>[/b]
<action path="/showSheng" type="web.action.MenuAction" scope="request" parameter="doType">
<forward name="showSheng" path="/index.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="web.ApplicationResources" />
</struts-config>


2,html代码如下:

<body>
<form action="addPersonal.do" method="post">

省:<select id="sheng" name="sheng" [b]οnchange="srarchCity('sheng')">[/b] <%
List list = (List)request.getAttribute("shengs");
for(int i=0; i < list.size(); i++){
Sheng sheng =(Sheng)list.get(i);
%>
<option value="<%=sheng.getId() %>"><%=sheng.getUname() %></option>
<%
}
%>
</select><br>
市:<select id="shi" name="shi" οnchange="srarchCity('shi')"></select><br>
县:<select id="xian" name="xian"></select>
</form>

</body>


1,html页面的javascript代码如下:

<script type="text/javascript">
var xmlHttpRequest;
var type;
function createXmlHttpRequest(){
if(window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
}
function srarchCity(obj){
var id;
type = obj;
var url;
if(obj=="sheng"){
id=document.getElementById("sheng").value;
url = "searchCity.do?doType=searchCity&searchType=shi&id="+id;
}
if(obj=="shi"){
id=document.getElementById("shi").value;
url = "searchCity.do?doType=searchCity&searchType=xian&id="+id;
}

xmlHttpRequest = createXmlHttpRequest();
xmlHttpRequest.onreadystatechange = xianshipass;
xmlHttpRequest.open("GET",url,true);
xmlHttpRequest.send(null);
}
function xianshipass(){
if(xmlHttpRequest.readyState==4 && xmlHttpRequest.status == 200){
updateMenu();
}
}
function updateMenu(){
var select;
if(type=="sheng"){
select = document.getElementById("shi");
}
if(type=="shi"){
select = document.getElementById("xian");
}
select.options.length=0;
var options = xmlHttpRequest.responseXML.getElementsByTagName("domain");
alert(options.length);
var option;
for (var i = 0, n = options.length; i < n; i++) {
select.appendChild(createElementWithValue(options[i]));
}

}
function createElementWithValue(text) {
var element = document.createElement("option");
element.setAttribute("value", text.getAttribute("id"));
var text = document.createTextNode(text.firstChild.nodeValue);
element.appendChild(text);
return element;
}
</script>


关于select添加<option>元素时,出现[Exception... "Not enough arguments [nsIDOMHTMLSelectElement.add]" nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)" lo错误
opt=document.createElement("OPTION");
opt.value=subArray[1];
opt.text=subArray[2];
document.getElementByIdx("xxx").add(opt);

这样写不符合w3c标准。
所以
document.getElementByIdx("xxx").options.add(opt);
这样写,就正常了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三级级联下拉菜单可以通过Jquery+Ajax实现,以下是一个简单的示例代码: HTML代码: ```html <select id="province"> <option value="">请选择省份</option> <option value="北京">北京</option> <option value="上海">上海</option> <option value="广东">广东</option> </select> <select id="city"> <option value="">请选择城市</option> </select> <select id="district"> <option value="">请选择区县</option> </select> ``` Jquery+Ajax代码: ```javascript $(document).ready(function() { // 加载省份列表 $.ajax({ type: "GET", url: "province.php", success: function(data) { $("#province").append(data); } }); // 省份选项改变时,加载城市列表 $("#province").change(function() { var province = $(this).val(); $("#city").html("<option value=''>请选择城市</option>"); $("#district").html("<option value=''>请选择区县</option>"); if (province != "") { $.ajax({ type: "GET", url: "city.php", data: {"province": province}, success: function(data) { $("#city").append(data); } }); } }); // 城市选项改变时,加载区县列表 $("#city").change(function() { var province = $("#province").val(); var city = $(this).val(); $("#district").html("<option value=''>请选择区县</option>"); if (city != "") { $.ajax({ type: "GET", url: "district.php", data: {"province": province, "city": city}, success: function(data) { $("#district").append(data); } }); } }); }); ``` 在省份、城市、区县列表对应的php文件中,需要根据传入的参数返回对应的选项列表。例如,city.php文件可能如下所示: ```php $province = $_GET["province"]; echo "<option value=''>请选择城市</option>"; if ($province == "北京") { echo "<option value='北京市'>北京市</option>"; } else if ($province == "上海") { echo "<option value='上海市'>上海市</option>"; } else if ($province == "广东") { echo "<option value='广州市'>广州市</option>"; echo "<option value='深圳市'>深圳市</option>"; echo "<option value='珠海市'>珠海市</option>"; } ``` 类似地,district.php文件也需要根据传入的参数返回对应的选项列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值