天天看點

DWR架構的簡單介紹

概念:

DWR是一種AJAX的JAVA實作,它提供了一種能在web浏覽器端采用JavaScript語言直接調用背景業務商業元件的解決方案。DWR通過JavaScript直接調用遠端元件可以減少Web開發的時間,特别對于那些具有和使用者頻繁互動的Web應用程式。DWR使得浏覽器不用重新整理頁面就可以從遠端Web伺服器取得使用者需的資料,這種無重新整理頁面的互動方式大大提高Web頁面的響應時間。至少使用者不會感覺到重新整理頁面帶來的等待響應心理感覺,帶來更好的使用者體驗。

優點:

[b]徹底分離表現和業務邏輯,讓糟糕的Scriptlets代碼從此從Web頁面上消失;

頁面隻需加載一次節省網絡帶寬、提高使用者響應響應時間。實際應用中HTML頁面标記資料量遠遠大于真正使用的資料量,資源重複浪費不容忽視;

由于JavaScript可以操作頁面中的元素和樣式,開發人員可以友善的為使用者帶來更好的操作體驗;

Web伺服器的Servlet容器可以節省管理成千萬個Servlet生命周期的資源開銷。[/b]

DWR的配置步驟:

[b]1.在WEB工程的WEB-INF/lib目錄中導入dwr、log4j類庫包(所有jar檔案),在src目錄下建立log4j的配置檔案log4j.properties;

2.在web.xml中配置DWRServlet,映射位址為/dwr/*;

3.建立DWR調用的Java檔案,實作需調用的方法;

4.建立一個dwr.xml配置檔案,配置Java類以及其它參數;

5.在jsp頁面中加入dwr.xml中“JavaScript屬性值.js、engine.js和util.js”三個js檔案;

6.在jsp頁面中建立兩JavaScript個函數,一個是我們要觸發的事件,一個是回調函數(回調函數中的data參數是調用Java方法的傳回值)。[/b]

上述已經說了怎麼去配置了,直接給出一個例子吧。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type='text/javascript' src='dwr/interface/myService.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type="text/javascript">
	function demo() {
		myService.sayHello("張三", function(data) {
			alert(data);
		});
	}
</script>
</head>
<body>
	<button onclick="demo();">按鈕</button>
	<%=System.currentTimeMillis() %>
</body>
</html>
           

dwr要調用的背景Java類

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>DWR</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>dwr-invoker</servlet-name>
		<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>

		<!-- This should NEVER be present in live -->
		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>

		<!-- Remove this unless you want to use active reverse ajax -->
		<init-param>
			<param-name>activeReverseAjaxEnabled</param-name>
			<param-value>true</param-value>
		</init-param>

		<!-- By default DWR creates application scope objects when they are first 
			used. This creates them when the app-server is started -->
		<init-param>
			<param-name>initApplicationScopeCreatorsAtStartup</param-name>
			<param-value>true</param-value>
		</init-param>

		<!-- This enables full streaming mode. It's probably better to leave this 
			out if you are running across the internet -->
		<init-param>
			<param-name>maxWaitAfterWrite</param-name>
			<param-value>-1</param-value>
		</init-param>

		<!-- For more information on these parameters, see: - http://getahead.org/dwr/server/servlet 
			- http://getahead.org/dwr/reverse-ajax/configuration -->

		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>dwr-invoker</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>
</web-app>
           

dwr.xml

部署好項目,啟動tomcat,通路http://localhost:8080/DWR/index.jsp即可看到如下畫面

[img]http://dl2.iteye.com/upload/attachment/0093/0788/bb9f6d38-9386-3dc9-b1e8-ab389cd87639.jpg[/img]

點選按鈕即可看到想要效果,并且觀察頁面的毫秒數,并沒有重新整理,但是實際上已經和背景的Java類已經互動一次了,說明進行一次Ajax請求。

回顧:

dwr環境的搭建的時候,按照上述步驟配置好了以後,你的eclipse的項目結構應該如下圖:

[img]http://dl2.iteye.com/upload/attachment/0093/0784/14ef9162-a0f3-352d-9795-c77fd323b92c.jpg[/img]

啟動tomcat,輸入如下位址,如下圖:

[img]http://dl2.iteye.com/upload/attachment/0093/0786/37eb5c2f-f620-3e69-9bdc-983647264854.jpg[/img]

如果得到的是上圖的資訊,說明你的dwr環境搭建成功了,否則就是沒有搭建好。

當然上述的通路位址依賴你的項目名稱已經在xml配置的dwr的映射。我的在xml檔案中就是dwr。

其實dwr的搭建非常的簡單,有人會問了,你怎麼知道dwr中怎麼配置的呢?我的回答:很簡單,去官網上下載下傳dwr的包,裡面有一個例子,好像是以war包的方式釋出的,解壓war裡面的WEB-INF目錄下的web.xml和dwr.xml檔案,删删改改就得到了我上述的配置了。

注意這裡有個問題,我用的dwr2.0.6版本的包中的xml檔案的配置有點問題,我不知道是不是dwr釋出的時候忽略了還是怎麼的,在拷貝到xml檔案中下列代碼行會報錯的。

如下:

正确的順序應該是這樣子的:

<servlet>
    <description>Direct Web Remoter Servlet</description>
    <display-name>DWR Servlet</display-name>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
           

dwr運作時需要的jar包哪裡擷取?我的回答:隻要你下載下傳了dwr的包就可以看到裡面有個lib目錄,裡面就是dwr運作時需要的包,如果你不知道要哪幾個包,可以像我一樣把所有的都拷貝過去,這樣就不會用再去考慮少包的問題了。

[b]擴充:[/b]

dwr檔案的配置說明:

Allow部分主要有以下兩個子節點組成:

一、create元素:這個元素是配置背景業務元件的建立規則群組件方法的通路規則。

二、convert元素:這個元素是配置Java對象和資料類型對應的轉換器。DWR内置了所有java基本資料類型的轉換器。基本資料類型的對象形式也采用統一的轉換器轉換。

[b]Create元素屬性詳細說明:[/b]

creator:配置業務元件的建立類型。主要有四種:new、none、scripts、spring。

javascript:前台頁面JavaScript引用此元件的名稱。名稱需要唯一。

scope:元件的作用範圍或則叫做生命周期。這個和Servlet的生命周期的作用是一樣的。共page、request、session、application四個可選項。

param:配置業務元件的建立參數。Name屬性設定名稱,value屬性設定業務元件的具體路徑(類全名稱)。

include:授權方式保護業務元件方法的可見性,屬性method可以通路的方法名稱,如果沒有配置則預設為所有方法都可以通路。

exclude:排除方式保護業務元件方法的可見性,屬性method設定不可以通路的方法名稱,除此之外的都可以通路,如果有需要控制業務元件方法的通路權限時建議采用這種方式。

[b]Convert元素屬性詳細說明:[/b]

converter:配置資料類型的轉換器。一般是設定bean轉換器,因為基本類型的轉換器DWR預設設定。

match:設定要使用此轉換器的java實體對象。如:

dwr開發的注意事項:

[b]

1.要注意DWR異步請求、相應機制帶來的資料可能不同步問題;

2.每次請求傳回結果隻能是一個值,是以要詳細設計傳回結果類型;

3.要注意Java引用傳遞和JavaScript值傳遞的差異;

4.盡量避免連續多次的背景請求。[/b]

好了,上述就是搭建簡單的dwr環境相關内容,自己寫的目的呢,就是回顧下,别讓自己辛辛苦苦的學到的東西時間長不用了忘記。 :D