天天看點

傅老師課堂:Ajax進階應用之DWR原了解析(一)

開篇一笑:一男女朋友正卿卿我我,男想進一步。男:“你是處女嗎?”女:“嗯,你是處男嗎?”男:“當然了!”女:“這是第一次,我怕疼,還是不要了吧。”男:“我會很小心的,不會疼。”女:“你們每個男人每次都這樣說,結果我每次都很疼…”男:“那是因為他們都是新手~”

注:此篇文章适合于有一定DWR基礎的開發人員

上課啦,上課啦,後面那位男同學别睡覺啦,哈喇子都流出來了,女同學都往前面坐,讓老師看的更清楚點,哦,不對,是讓你們看的更清楚點,因為這節課的内容非常重要。老師從娘胎裡出來的時候就一直強調萬變不離其中,隻要掌握了原理,那麼一切的一切就盡在你的掌握中,這位漂亮的女同學,你說是與不是呢?!

好了,言歸正傳,大家在學習DWR的過程中,肯定都會有兩個疑問:自定義的js檔案到底哪來的?javascript中怎麼能夠調用Java方法呢?

别着急,老師今天來講課就是為了給大家解答這兩個問題的。這位女同學不要這麼崇拜的看着老師。

我們都知道要在前台頁面中使用DWR,至少需要引入三個js檔案:

<script type='text/javascript' src='../dwr/engine.js'></script>
<script type='text/javascript' src='../dwr/util.js'></script>
<script type='text/javascript' src='../dwr/interface/demo.js'></script>
           

前面兩個都是DWR自帶的js檔案,儲存在dwr.jar中,其中engine.js是引擎檔案必須加載,util.js是工具檔案可以選擇加載。demo.js“檔案”實際上并不能稱得上是一個真正的實體檔案,因為它根本不存在,它隻是在配置檔案dwr.xml中進行了配置且與某個Java類關聯。那麼這個js檔案在頁面加載的時候是怎麼來的?而我們又是怎麼能夠使用它裡面的方法呢?

先看看DWR在web.xml中的配置:

<servlet>
     <servlet-name>dwr-invoker</servlet-name>
     <servlet-class>
         org.directwebremoting.servlet.DwrServlet
     </servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name>dwr-invoker</servlet-name>
     <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
           

隻要是路徑為/dwr/*的請求,必然都會經過DwrServlet類,那麼我們可以推測demo.js是DwrServlet給的,怎麼給?隻能是通過檔案流的方式往前台輸出,大家也可以在位址欄裡直接通路../dwr/interface/demo.js檢視檔案内容。

那麼DwrServlet是如何輸出檔案流的呢?接下來我們可以做一個簡單的例子測試一下。

建立Servlet類DwrServlet.java

package com.dwr;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DwrServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            byte[] b = "function test(){alert('OK')}".getBytes();
            out.write(b);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
           

在web.xml中配置DwrServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 
  <servlet>
      <servlet-name>dwr-invoker</servlet-name>
        <servlet-class>
            com.dwr.DwrServlet
        </servlet-class>
  </servlet>
  <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
   </servlet-mapping>
</web-app>
           

前台頁面index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>" target="_blank" rel="external nofollow" >
    <title>My DWR</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <script type="text/javascript" src="dwr/interface/demo.js"></script>
  </head>
  <body>
    <input type="button" value="測試" οnclick="test()"><br>
  </body>
</html>
           

通路上面的index.jsp頁面,點選按鈕“測試”,可以看到彈出alert對話框“OK”。你和你的小夥伴是不是都驚呆了?!

第一個問題算是解決完了,這節課就到這裡,下節課老師繼續給同學們解答第二個問題(javascript中怎麼能夠調用Java方法呢?),另外,女同學要是還有疑惑,下課後老師給你們單獨進行輔導,男同學就自個琢磨吧。下課。

注意:本文主要是通過最簡單的方式去解釋DWR的原理,是以在代碼實作上跟DWR有很大的不同,請大家不要誤解。

繼續閱讀