DWR一个外国人实现的很有前途的AJAX框架。
多余的话就不说了,请看DWR的例子程序:
web.xml
1
<?
xml version="1.0" encoding="ISO-8859-1"
?>
2
<!
DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"
>
3

4
<
web-app
id
="dwr"
>
5

6
<
display-name
>
DWR (Direct Web Remoting)
</
display-name
>
7
<
description
>
A demo of how to call Java on the server directly from Javascript on the client
</
description
>
8

9
<
servlet
>
10
<
servlet-name
>
dwr-invoker
</
servlet-name
>
11
<
display-name
>
DWR Servlet
</
display-name
>
12
<
description
>
Direct Web Remoter Servlet
</
description
>
13
<
servlet-class
>
uk.ltd.getahead.dwr.DWRServlet
</
servlet-class
>
14
<!--
15
<init-param>
16
<param-name>config</param-name>
17
<param-value>WEB-INF/dwr.xml</param-value>
18
</init-param>
19
-->
20
<
init-param
>
21
<
param-name
>
debug
</
param-name
>
22
<
param-value
>
true
</
param-value
>
23
</
init-param
>
24
<
init-param
>
25
<
param-name
>
scriptCompressed
</
param-name
>
26
<
param-value
>
false
</
param-value
>
27
</
init-param
>
28
<
load-on-startup
>
1
</
load-on-startup
>
29
</
servlet
>
30

31
<
servlet-mapping
>
32
<
servlet-name
>
dwr-invoker
</
servlet-name
>
33
<
url-pattern
>
/dwr/*
</
url-pattern
>
34
</
servlet-mapping
>
35

36
</
web-app
>
servlet(uk.ltd.getahead.dwr.DWRServlet)里:
1
protected
void
doPost(HttpServletRequest req, HttpServletResponse resp)
throws
IOException, ServletException
2
{
3
try
4
{
5
builder.set(req, resp, getServletConfig(), getServletContext(), container);
6
ServletLoggingOutput.setExecutionContext(
this
);
7
8
processor.handle(req, resp);//该方法对所有request路径/dwr/*有效,在引用JS的时候,使用这个路径执行dwr生成的javascript代码
finally
11
{
12
builder.unset();
13
ServletLoggingOutput.unsetExecutionContext();
14
}
15
}
index.html
1
<?
xml version="1.0" encoding="ISO-8859-1"
?>
2
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
>
3
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
4
<
head
>
5
<
title
>
DWR - Test Home
</
title
>
6
<
script
type
='text/javascript'
src
='dwr/interface/Test.js'
></
script
>
7
<
script
type
='text/javascript'
src
='dwr/engine.js'
></
script
>
8
<
script
type
='text/javascript'
src
='dwr/util.js'
></
script
>
9
<
script
>
10
function
init() {
11
//
This turns off the no-javascript message
12
document.getElementById(
"
start
"
).style.display
=
"
none
"
;
13
//
This checks for file: URLs and loading problems
14
if
(window.DWREngine
==
null
||
window.DWRUtil
==
null
) {
15
document.getElementById(
"
file
"
).style.display
=
"
block
"
;
16
return
;
17
}
18
//
DWR setup
19
DWREngine.setErrorHandler(
function
(message) { alert(message); });
20
DWREngine.setWarningHandler(
function
(message) { alert(message); });
21
DWRUtil.useLoadingMessage();
22
//
Turn on the generic error div
23
$(
"
error
"
).style.display
=
"
block
"
;
24
//
Load a message from the server
25
Test.getInsert(load);
26
}
27
28
function
load(data) {
29
$(
"
error
"
).style.display
=
"
none
"
;
30
DWRUtil.setValue(
"
reply
"
, data);
31
$(
"
reply
"
).style.display
=
"
block
"
;
32
}
33
</
script
>
34
</
head
>
35
36
<
body
onload
="init()"
>
37

.
这一部分经过了SERVLET处理:
<
script
type
='text/javascript'
src
='dwr/interface/Test.js'
></
script
>
<
script
type
='text/javascript'
src
='dwr/engine.js'
></
script
>
<
script
type
='text/javascript'
src
='dwr/util.js'
></
script
>
dwrservlet.doPost方法内processor.handle(req, resp)这个方法如下:
1
public
void
handle(HttpServletRequest req, HttpServletResponse resp)
throws
IOException, ServletException
2
{
3
String pathInfo
=
req.getPathInfo();
4
String servletPath
=
req.getServletPath();
5
6
if
(nullPathInfoWorkaround
&&
pathInfo
==
null
)
7
{
8
pathInfo
=
req.getServletPath();
9
servletPath
=
HtmlConstants.PATH_ROOT;
10
log.debug(
"
Default servlet suspected. pathInfo=
"
+
pathInfo
+
"
; contextPath=
"
+
req.getContextPath()
+
"
; servletPath=
"
+
servletPath);
//
$NON-NLS-1$
//
$NON-NLS-2$
//
$NON-NLS-3$
11
}
12
13
if
(pathInfo
==
null
||
14
pathInfo.length()
==
0
||
15
pathInfo.equals(HtmlConstants.PATH_ROOT))
16
{
17
resp.sendRedirect(req.getContextPath()
+
servletPath
+
HtmlConstants.FILE_INDEX);
18
}
19
else
if
(pathInfo.startsWith(HtmlConstants.FILE_INDEX))
20
{
21
index.handle(req, resp);
22
}
23
else
if
(pathInfo.startsWith(HtmlConstants.PATH_TEST))
24
{
25
test.handle(req, resp);
26
}
27
else
if
(pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))
28
{
29
iface.handle(req, resp);//这个方法是我们要关注的
}
。。。。。。。
}
iface.handle(req, resp);//这个方法是我们要关注的,来自DefaultInterfaceProcessor
1
public
void
handle(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException
2
{
3
String pathinfo
=
req.getPathInfo();
4
String servletpath
=
req.getServletPath();
5
if
(pathinfo
==
null
)
6
{
7
pathinfo
=
req.getServletPath();
8
servletpath
=
HtmlConstants.PATH_ROOT;
9
}
10
String scriptname
=
pathinfo;
11
scriptname
=
LocalUtil.replace(scriptname, HtmlConstants.PATH_INTERFACE, HtmlConstants.BLANK);
12
scriptname
=
LocalUtil.replace(scriptname, HtmlConstants.EXTENSION_JS, HtmlConstants.BLANK);
13
Creator creator
=
creatorManager.getCreator(scriptname);
14
15
//
resp.setContentType("text/javascript");
16
PrintWriter out
=
resp.getWriter();
17
out.println();
18
19
out.println(
"
function
"
+
scriptname
+
"
() { }
"
);
//
从这里开始DWR自动生成javascript
String path
=
overridePath;
22
if
(path
==
null
)
23
{
24
path
=
req.getContextPath(