项目终于做完了。今天抽点时间对项目中遇到的问题进行下总结,我的模块中在页面要实现一个下拉框联动的功能。例如:你选“中国”时,联动的下拉框显示“北京,上海”;你选美国时,联动的下拉框显示“纽约,华盛顿”。实现这个功能,我采用的是AJAX的一个框架DWR.它是通过动态把java类生成javascript。感觉好像是在客户端调用一样。要使用DWR还需要一些准备工作。1.从网上下载dwr.jar放在项目的lib目录下。注意,还需要commons-logging.jar包,否则会报错说是日志包找不到。3,需要在web.xml中添加
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
另外还需要dwr.xml的文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr//dwr20.dtd"><dwr>
<allow>
<create javascript="test" creator="new" scope="request">
<param name="class" value="com.huan.tv.web.JiLian"></param>
</create>
</allow>
</dwr>
具体的参数意思,等我把项目跑起来在说啊,呵呵。到目前为止准备工作已告一段落,现在我就对实现联动功能做具体是代码实现。我写了一个JiLian.java来实现具体功能。
package com.huan.tv.web;
import java.util.TreeMap;
import java.util.Map;
/**
* 本类是用DWR实现的一个联动类
* @author guohusong
*
*/
public class JiLian {
static Map countryMap = null;//countryMap封装了获取的国家列表
static Map cityMap = null;//cityMap封装了获取的国家下的城市列表
/**
* 此方法在页面加载时候,把国家数据加载到选择国家的下拉框
* 在实际开发中这些数据都是从数据库的静态表里读出来的,现在
* 为了省时间,所以就把数据给写死了。
* @return map
*/
public static Map getCountryList(){
countryMap = new TreeMap();
countryMap.put("0", "--请选择--");
countryMap.put("1", "中国");
countryMap.put("2", "美国");
return countryMap;
}
/**
* 此方法是根据选择的国家ID号来联动国家包括的城市列表
* @param countryKey
* @return Map
*/
public static Map getCityList(String countryKey){
cityMap = new TreeMap();
if("1".equals(countryKey.trim())){//如果选择的是中国
cityMap.put("0", "--请选择--");
cityMap.put("3", "北京");
cityMap.put("4", "上海");
}
if("2".equals(countryKey.trim())){//如果选择的是美国
cityMap.put("0", "--请选择--");
cityMap.put("5", "纽约");
cityMap.put("6", "华盛顿");
}else{
cityMap.put("0", "--请选择--");
}
return cityMap;
}
}
可以看出JiLian.java就是一个普通的java类。那么DWR框架怎么识别它了?这就需要在dwr.xml中给她指定 <param name="class" value="com.huan.tv.web.JiLian"></param>
现在我们就可以对我们写的dwr进行测试了。在地址栏输http://localhost:8080/LianDong/dwr/ (LianDong是我的项目名)你会发现会 出现
Classes known to DWR:
- test (com.huan.tv.web.JiLian)
test是我在dwr.xml中配置的javascript的值是用来与javascript交互的名称.点击进入你会发现里面有JiLian.java里的getCountryList()和getCityList(String countryKey)方法。现在就可以对联动的方法进行测试了,点击getCountryList()javascript就会把方法里面的值取出来。点击getCityList(“”)在“”里输入1,javascript就会把中国里的城市列出来。输入2,会把美国的城市显示出来。
方法测试通过后,下面就要在页面中调用JiLian.java里的方法。index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.huan.tv.web.JiLian" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>下拉框联动实例</title>
<!--引入DWR的JS-->
<script type='text/javascript' src='/LianDong/dwr/interface/test.js'></script>
<script type='text/javascript' src='/LianDong/dwr/engine.js'></script>
<script type='text/javascript' src='/LianDong/dwr/util.js'></script>
</head>
<script type="text/javascript">
function init(){//页面打开时加载国家列表
test.getCountryList(callback);
}
//Java从根本上讲是同步机制,然而AJAX却是异步的。所以你调用远程方法时,当数据已经从网络上返回的时候,你要提供有反调 (callback) 功能的DWR
function callback(data)
{
//将从后台获取的国家列表添加到下拉框
DWRUtil.removeAllOptions("country");
DWRUtil.addOptions("country", data);
changeCity();
}
function changeCity()//联动城市下拉框
{
test.getCityList(DWRUtil.getValue("country"),cityback)
}
function cityback(data)
{
DWRUtil.removeAllOptions("city");
DWRUtil.addOptions("city", data);
}
</script>
<body onload="init()">
<form name="form1" method="post">
<select id="country" onchange="changeCity()">
</select>
<select id="city">
</select>
</form>
</body>
</html>