javajohn

          金色年華

          DWR源碼學習(一)

          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()?+?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.aygfsteel.com/Files/javajohn/dwr.rar
          (待續)

          posted on 2006-05-27 19:23 javajohn 閱讀(5548) 評論(13)  編輯  收藏 所屬分類: AJAX

          Feedback

          # 求助 2006-06-11 16:21 Aivon

          近來才開始接觸AJAX
          想在一個大作業中使用DWR
          在網上找了很多配置教程
          但我在自己機上老是測試不成功
          郁悶中……
          近來趕大作業,就要考試了,還請大哥能幫幫忙,給點提示
          小弟的QQ是:4034947  回復  更多評論   

          # re: DWR源碼學習(一) 2006-06-12 08:51 javajohn

          mail to me
          DWR的配置例子在下載的代碼里有demo  回復  更多評論   

          # re: DWR源碼學習(一) 2006-06-13 01:05 Aivon

          找不到你的email阿...

          我在官方網站下在的demo運行時顯示:
          Missing DWR Javascript Functions

          自己按照網上的教程進行配置
          也顯示js文件錯誤

          能否給我一份你使用正常的代碼?
          我的email是:aivon@163.com
          謝謝了  回復  更多評論   

          # re: DWR源碼學習(一) 2006-06-13 09:20 javajohn

          我的mail:thesecondbull@yahoo.com.cn
          DWR代碼下載地址http://www.aygfsteel.com/Files/javajohn/dwr.rar
          下載的文件后綴更名為.war  回復  更多評論   

          # re: DWR源碼學習(一) 2006-06-13 10:30 Aivon

          還是出現以下問題:
          Missing DWR Javascript Functions
          This is a fairly advanced page that tests DWR to check that everything is setup properly for you.

          It appears that you may be attempting to run DWR outside a servlet container (possibly using a file: URL). We think this because this page has missing Javascript functions that should have been produced by DWR. To fix the problem please use DWR from within a servlet container.

          If this is not the cause of the problem, please report it to the DWR mailing list, including your browser, server, OS configuration and any error messages that appeared either in the browser (including the Javascript console if one exists) and the server console log.

          DWR is testing installation ...
          This is a fairly advanced page that tests DWR. If you can see this message for a prolonged period of time then you should check the following:

          Can you see the test pages?
          If not it is likely that DWR has not deployed in your web server properly; Check the web server console and log files for error messages.
          If you can see the test pages then DWR is loaded but is something is preventing DWR working. Check your browser Javascript console for error messages, or see the main DWR website for more information.
          If none of these steps fixes the error, please report it to the DWR mailing list, including your browser, server, OS configuration and any error messages that appeared either in the browser (including the Javascript console if one exists) and the server console log.

          For general information about DWR see:

          不解~~~  回復  更多評論   

          # re: DWR源碼學習(一) 2006-06-13 10:59 javajohn

          @Aivon
          說一下你的JDK和TOMCAT的版本,JDK如果為1.5以上TOMCAT需要5.5以上的版本  回復  更多評論   

          # re: DWR源碼學習(一) 2006-06-13 12:27 Aivon

          哈,原來是tomcat的版本問題
          換了5.5的就OK了

          謝謝了~~~  回復  更多評論   

          # re: DWR源碼學習(一) 2006-07-10 09:43 snackok

          下載了,提示Test對象不存在,發現dwr/interface/目錄下缺少test.js  回復  更多評論   

          # re: DWR源碼學習(一) 2006-07-10 15:11 javajohn

          test.js是由DWR自動生成的,不再是我們以前開發時的那種概念上的js文件了.如果不清楚請再詳細閱讀我BLOG里的另一篇《dwr源碼學習函數調用篇》  回復  更多評論   

          # re: DWR源碼學習(一) 2006-07-25 14:46 Sandy


          可以跟我講下DWR2.0中JAVA調用JS嗎?  回復  更多評論   

          # re: DWR源碼學習(一) 2006-08-20 09:31 東北小白

          不錯哈哈,謝謝摟住  回復  更多評論   

          # re: DWR源碼學習(一) 2006-09-14 14:42 vircomagice

          摟主有沒有DWR的源碼和發行包啊,我這里下載不了https的連接,很郁悶。。。
          如果有的話,能不能發我一封啊
          vircomagice@yahoo.com.cn  回復  更多評論   

          # re: DWR源碼學習(一) 2006-09-14 19:05

          @vircomagice
          發行包到處都有啊,你到www.springside.org.cn下載不就行了  回復  更多評論   



          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(7)

          隨筆分類(36)

          隨筆檔案(39)

          classmate

          good blog

          企業管理網站

          好友

          站點收藏

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 淮北市| 牟定县| 南投县| 和平区| 南安市| 乐业县| 民丰县| 库尔勒市| 张北县| 宣化县| 隆子县| 涪陵区| 安阳市| 临海市| 苏尼特右旗| 新巴尔虎左旗| 吕梁市| 恩施市| 长宁区| 共和县| 宣恩县| 陈巴尔虎旗| 黑河市| 罗平县| 左云县| 双桥区| 葫芦岛市| 华蓥市| 仲巴县| 黎城县| 邳州市| 兴业县| 青神县| 班戈县| 腾冲县| 德昌县| 濮阳县| 黑龙江省| 顺义区| 晋宁县| 康定县|