最近在项目中使用了ajax来实现一个三级下拉菜单,同时在用户登录时也用到了ajax,在看同事写的ajax代码时发现他用到了dwr,所以今天抽空学习了一下dwr,写了两个小例子。
1、点击“getToday”按钮,在文本框中显示今天的日期;点击“getYesterday”按钮,在文本框中显示昨天的日期。
然后在web.xml文件中加入以下代码:
<servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>false</param-value> </init-param> </servlet> </servlet-mapping> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
|
接着,在于web.xml同级目录下新建dwr.xml文件,并加入下面的代码:
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr//dwr20.dtd">
<dwr> <allow> <create creator="new" javascript="Demo"> <param name="class" value="com.dwrtest.java.GetDate"/> </create> </allow> </dwr> |
新建页面,我这里使用的是freemarker,换做html和jsp也一样效果,代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src='dwr/interface/Demo.js'></script> <script src='dwr/engine.js'></script> <script language="javascript"> function gettoday() { Demo.getToday(setMytext); } function getYesterday() { Demo.getYesterday(setMytext); } function setMytext(str) { document.getElementById('mytext').value = str; } </script> <title></title> </head> <body> <input type="button" value="getToday" onclick="gettoday();"/> <input type="button" value="getYesterday" onclick="getYesterday();"/> <input type="text" value="" name="mytext" id="mytext"/> </body> </html>
|
java文件GetData.java代码如下:
package com.dwrtest.java;
import java.text.SimpleDateFormat; import java.util.Date;
public class GetDate {
public String getToday() { SimpleDateFormat bartDateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy"); Date date = new Date(); return bartDateFormat.format(date); }
public String getYesterday() { SimpleDateFormat bartDateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy"); Date date = new Date(); return bartDateFormat.format(new Date(date.getTime() - 86400000)); } }
|
这样编译以后,启动tomcat就可以看到效果了。
这里的java文件和dwr基本没有什么联系,它的两个方法也不是专门为dwr而写的,显而易见,这两个方法的目的是格式化当天和前一天的时间,并返回他们的String形式。
而在dwr.xml中,我们这样引入了他们,
<create creator="new" javascript="Demo">
<param name="class" value="com.dwrtest.java.GetDate"/>
</create>
这样在javascript中直接使用“Demo”了。
我们可以看到,在页面的js中这样引入了Demo,
<script src='dwr/interface/Demo.js'></script>
在gettoday()和getYesterday()中,调用了Demo.getToday(setMytext),意思是将return的值作为setMytext的参数传到setMytext()中。
2、二级的联动菜单,三级、四级都也可以这样做
页面代码:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src='dwr/interface/ListTest.js'></script> <script src='dwr/engine.js'></script> <script src="dwr/util.js"></script> <script language="javascript"> function updateClass() { ListTest.getClassList(createClass); } function createClass(data) { DWRUtil.removeAllOptions("classid"); DWRUtil.addOptions("classid", data); } function updateUser() { ListTest.getUserList(DWRUtil.getValue("classid"),createUser); } function createUser(data) { DWRUtil.removeAllOptions("userid"); DWRUtil.addOptions("userid", data); } </script> <title></title> </head> <body onload="updateClass()"> Class:<select name="classid" id="classid" onchange="javascript:updateUser();"></select><br> User:<select name="userid" id="userid"></select> </body> </html>
|
可以看到,引入了<script src="dwr/util.js"></script> 。
java文件ListTest.java的代码:
package com.dwrtest.java;
import java.util.LinkedHashMap; import java.util.Map;
public class ListTest {
public Map getClassList() { Map map = new LinkedHashMap(); map.put("0", "请选择"); map.put("1", "班级一"); map.put("2", "班级二"); map.put("3", "班级三"); return map; }
public Map getUserList(String id) { Map map = new LinkedHashMap(); if(id.equals("1")) { map.put("1", "同学一"); map.put("2", "同学二"); map.put("3", "同学三"); } else if(id.equals("2")) { map.put("4", "同学四"); map.put("5", "同学五"); map.put("6", "同学六"); } else if(id.equals("3")) { map.put("7", "同学七"); map.put("8", "同学八"); map.put("9", "同学九"); } else { map.put("", "请选择"); } return map; } }
|
最后在dwr.xml中添加下面代码:
<create creator="new" javascript="ListTest"> <param name="class" value="com.dwrtest.java.ListTest"/> </create> |
这样,二级的联动就做好了。