dynamicLists.html

本文介绍了一个使用Ajax技术动态更新下拉列表的示例。通过监听用户选择的汽车年份和品牌,向服务器发送请求获取对应的车型列表,并更新第三个下拉列表。此示例展示了如何结合JavaScript与Servlet实现异步数据加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例子来源:《Ajax 基础教程》 金灵 等译 这本书非常不错

dynamicLists.html


<html>
<head>
<title>Dynamically Filling Lists</title>
<script type="text/javascript">
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}

function refreshModelList() {
var make = document.getElementById("make").value;
var modelYear = document.getElementById("modelYear").value;

if (make == "" || modelYear == "") {
clearModelsList();
return;
}

var url = "RefreshModelList?"
+ createQueryString(make, modelYear) + "&ts=" + new Date().getTime();

createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}

function createQueryString(make, modelYear) {
var queryString = "make=" + make + "&modelYear=" + modelYear;
return queryString;
}

function handleStateChange() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
updateModelsList();
}
}
}

function updateModelsList() {
clearModelsList();

var models = document.getElementById("models");
var results = xmlHttp.responseXML.getElementsByTagName("model");
var option = null;
for (var i = 0; i < results.length; i++) {
option = document.createElement("option");
option.appendChild(document.createTextNode(results[i].firstChild.nodeValue));
models.appendChild(option);
}
}

function clearModelsList() {
var models = document.getElementById("models");
while (models.childNodes.length > 0) {
models.removeChild(models.childNodes[0]);
}
}
</script>
</head>
<body>
<h1>Select Model Year and Make</h1>

<form action="#">
<span style="font-weight:bold;">Model Year:</span>
<select id="modelYear" onchange="refreshModelList();">
<option value="">Select One</option>
<option value="2006">2006</option>
<option value="1995">1995</option>
<option value="1985">1985</option>
<option value="1970">1970</option>
</select>
<br/><br/>
<span style="font-weight:bold;">Make:</span>
<select id="make" onchange="refreshModelList();">
<option value="">Select One</option>
<option value="Chevrolet">Chevrolet</option>
<option value="Dodge">Dodge</option>
<option value="Pontiac">Pontiac</option>
</select>

<br/><br/>
<span style="font-weight:bold;">Models:</span>
<br/>
<select id="models" size="6" style="width:300px;">

</select>

</form>
</body>
</html>



RefreshModelListServlet.java


package ajaxbook.chap4;

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

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

public class RefreshModelListServlet extends HttpServlet {

private static List availableModels = new ArrayList();

protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");

int modelYear = Integer.parseInt(request.getParameter("modelYear"));
String make = request.getParameter("make");

StringBuffer results = new StringBuffer("<models>");
MakeModelYear availableModel = null;
for (Iterator it = availableModels.iterator(); it.hasNext();) {
availableModel = (MakeModelYear) it.next();
if (availableModel.modelYear == modelYear) {
if (availableModel.make.equals(make)) {
results.append("<model>");
results.append(availableModel.model);
results.append("</model>");
}
}
}
results.append("</models>");

response.setContentType("text/xml");
response.getWriter().write(results.toString());
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}

public void init() throws ServletException {
availableModels.add(new MakeModelYear(2006, "Dodge", "Charger1"));
availableModels.add(new MakeModelYear(1995, "Dodge", "Charger2"));
availableModels.add(new MakeModelYear(1985, "Dodge", "Charger3"));
availableModels.add(new MakeModelYear(1970, "Dodge", "Charger4"));
availableModels.add(new MakeModelYear(2006, "Dodge", "Charger5"));
availableModels.add(new MakeModelYear(2006, "Dodge", "Charger6"));
availableModels.add(new MakeModelYear(2006, "Dodge", "Charger7"));
availableModels.add(new MakeModelYear(2006, "Dodge", "Charger8"));
}

private static class MakeModelYear {

private int modelYear;
private String make;
private String model;

public MakeModelYear(int modelYear, String make, String model) {
this.modelYear = modelYear;
this.make = make;
this.model = model;
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值