DWR一個(gè)外國人實(shí)現(xiàn)的很有前途的AJAX框架。
多余的話就不說了,請(qǐng)看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);//該方法對(duì)所有request路徑/dwr/*有效,在引用JS的時(shí)候,使用這個(gè)路徑執(zhí)行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?

. 這一部分經(jīng)過了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方法內(nèi)processor.handle(req, resp)這個(gè)方法如下:
?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);//這個(gè)方法是我們要關(guān)注的
???????????? }
?????。。。。。。。
?????}
?iface.handle(req,?resp);//這個(gè)方法是我們要關(guān)注的,來自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自動(dòng)生成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?+?"\',?");?//實(shí)現(xiàn)javascript調(diào)用java內(nèi)的方法
?????????????????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.tkk7.com/Files/javajohn/dwr.rar
(待續(xù))