DWR一个外国人实现的很有前途的AJAX框架。
多余的话就不说了,请看DWR的例子程序:
web.xml
index.html
<
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)这个方法如下:
多余的话就不说了,请看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)里:
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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 }
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处理:
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





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
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);//这个方法是我们要关注的
}
。。。。。。。
}
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() + servletpath;
25 }
26 out.println(scriptname + " ._path = ' " + path + " '; " ); // $NON-NLS-1$ // $NON-NLS-2$
27
28 Method[] methods = creator.getType().getMethods();
29 for ( int i = 0 ; i < methods.length; i ++ )
30 {
31 Method method = methods[i];
32 String methodName = method.getName();
33
34 // We don't need to check accessControl.getReasonToNotExecute()
35 // because the checks are made by the doExec method, but we do check
36 // if we can display it
37 String reason = accessControl.getReasonToNotDisplay(req, creator, scriptname, method);
38 if (reason != null && ! allowImpossibleTests)
39 {
40 continue ;
41 }
42
43 // Is it on the list of banned names
44 if (jsutil.isReservedWord(methodName))
45 {
46 continue ;
47 }
48
49 out.print( ' /n ' );
50 out.print(scriptname + ' . ' + methodName + " = function( " ); // $NON-NLS-1$
51 Class[] paramTypes = method.getParameterTypes();
52 for ( int j = 0 ; j < paramTypes.length; j ++ )
53 {
54 if ( ! LocalUtil.isServletClass(paramTypes[j]))
55 {
56 out.print( " p " + j + " , " ); // $NON-NLS-1$ // $NON-NLS-2$
57 }
58 }
59 out.println( " callback) { " ); // $NON-NLS-1$
60
61 out.print( " DWREngine._execute( " + scriptname + " ._path, ' " + scriptname + " ', ' " + methodName + " /', " ); //实现javascript调用java内的方法
for ( int j = 0 ; j < paramTypes.length; j ++ )
63 {
64 if (LocalUtil.isServletClass(paramTypes[j]))
65 {
66 out.print( " false, " ); // $NON-NLS-1$
67 }
68 else
69 {
70 out.print( " p " + j + " , " ); // $NON-NLS-1$ // $NON-NLS-2$
71 }
72 }
73 out.println( " callback); " ); // $NON-NLS-1$
74
75 out.println( ' } ' );
76 }
77
78 out.flush();
79 }
DWR例子程序下载地址:http://www.blogjava.net/Files/javajohn/dwr.rar
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() + servletpath;
25 }
26 out.println(scriptname + " ._path = ' " + path + " '; " ); // $NON-NLS-1$ // $NON-NLS-2$
27
28 Method[] methods = creator.getType().getMethods();
29 for ( int i = 0 ; i < methods.length; i ++ )
30 {
31 Method method = methods[i];
32 String methodName = method.getName();
33
34 // We don't need to check accessControl.getReasonToNotExecute()
35 // because the checks are made by the doExec method, but we do check
36 // if we can display it
37 String reason = accessControl.getReasonToNotDisplay(req, creator, scriptname, method);
38 if (reason != null && ! allowImpossibleTests)
39 {
40 continue ;
41 }
42
43 // Is it on the list of banned names
44 if (jsutil.isReservedWord(methodName))
45 {
46 continue ;
47 }
48
49 out.print( ' /n ' );
50 out.print(scriptname + ' . ' + methodName + " = function( " ); // $NON-NLS-1$
51 Class[] paramTypes = method.getParameterTypes();
52 for ( int j = 0 ; j < paramTypes.length; j ++ )
53 {
54 if ( ! LocalUtil.isServletClass(paramTypes[j]))
55 {
56 out.print( " p " + j + " , " ); // $NON-NLS-1$ // $NON-NLS-2$
57 }
58 }
59 out.println( " callback) { " ); // $NON-NLS-1$
60
61 out.print( " DWREngine._execute( " + scriptname + " ._path, ' " + scriptname + " ', ' " + methodName + " /', " ); //实现javascript调用java内的方法
for ( int j = 0 ; j < paramTypes.length; j ++ )
63 {
64 if (LocalUtil.isServletClass(paramTypes[j]))
65 {
66 out.print( " false, " ); // $NON-NLS-1$
67 }
68 else
69 {
70 out.print( " p " + j + " , " ); // $NON-NLS-1$ // $NON-NLS-2$
71 }
72 }
73 out.println( " callback); " ); // $NON-NLS-1$
74
75 out.println( ' } ' );
76 }
77
78 out.flush();
79 }