免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
DWR學(xué)習(xí)

http://getahead.ltd.uk/dwr/
這段時(shí)間較閑,研究了一番dwr.發(fā)現(xiàn)dwr實(shí)現(xiàn)的AJAX有些地方確實(shí)很是先進(jìn).比如動(dòng)態(tài)生成javascript代碼;隱藏的http協(xié)議;javascript于java代碼交互的是javascript對象(或字符串)等.
以下是我臨時(shí)譯的一些東西.本來想全譯,發(fā)現(xiàn)dwr實(shí)在是簡單,就隨便寫了.英文居差,現(xiàn)一把.

1、DWR: Easy AJAX for JAVA

作為一個(gè)java open source library,DWR可以幫助開發(fā)人員完成應(yīng)用AJAX技術(shù)的web程序。它可以讓瀏覽器上的javascript方法調(diào)用運(yùn)行在web服務(wù)器上java方法。

DWR主要由兩部門組成。javascript與web服務(wù)器通信并更新web頁;運(yùn)行在web服務(wù)器的Servlet處理請求并把響應(yīng)發(fā)回瀏覽器。

DWR采用新穎的方法實(shí)現(xiàn)了AJAX(本來也沒有確切的定義),在java代碼基礎(chǔ)上動(dòng)態(tài)的生成javascript代碼。web開發(fā)者可以直接調(diào)用這些javascript代碼,然而真正的代碼是運(yùn)行在web服務(wù)器上的java code。出與安全考慮,開發(fā)者必須配置哪些java class暴露給DWR.(dwr.xml)

這種從(java到j(luò)avascript)調(diào)用機(jī)制給用戶一種感覺,好象常規(guī)的RPC機(jī)制,或RMI or SOAP.但是它運(yùn)行在web上,不需要任何瀏覽器插件。

DWR不認(rèn)為瀏覽器和web服務(wù)器之間協(xié)議重要,把系統(tǒng)界面放在首位。最大挑戰(zhàn)是java method call的同步特征與ajax異步特性之間的矛盾。在異步模型里,結(jié)果只有在方法結(jié)束后才有效。DWR解決了這個(gè)問題,把回調(diào)函數(shù)當(dāng)成參數(shù)傳給方法,處理完成后,自動(dòng)調(diào)用回調(diào)方法。

這個(gè)圖表顯示了,通過javascript事件,DWR能改變select的內(nèi)容,當(dāng)然這些內(nèi)容由java代碼返回。 javascript函數(shù)Data.getOptions(populateList)由DWR動(dòng)態(tài)生成,這個(gè)函數(shù)會(huì)調(diào)用java class Data類的方法。DWR處理如何遠(yuǎn)程調(diào)用,包括轉(zhuǎn)換所有的參數(shù)和返回的結(jié)果(javascript\java)。java方法執(zhí)行完后,執(zhí)行回調(diào)方法populateList。在整個(gè)過程中我們就想在用本地的方法一樣。

2、Getting Started

廢話少說,試試就ok了。
web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app id="dwr">
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>

dwr.xml 與web.xml同目錄
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
</allow>
</dwr>

index.html
<html>
<head>
<title>DWR - Test Home</title>
<script type=‘text/javascript‘ src=‘dwr/interface/JDate.js‘></script>
<script type=‘text/javascript‘ src=‘dwr/engine.js‘></script>
<script>
function init(){
JDate.getYear(load);
}
function load(data){
alert(data+1900+‘年‘)
}
</script>
</head>
<body onload="init()">
</body>
</html>

dwr.jar 下載放lib下

完了,什么,夠了,就這些。訪問ok!
3、Examples
http://www.aboutmyhealth.org/ 這不是Google Suggest嗎!ok.
4、源碼淺析
dwr的設(shè)計(jì)很象webwork2的設(shè)計(jì),隱藏http協(xié)議,擴(kuò)展性,兼容性及強(qiáng)。

通過研究uk.ltd.getahead.dwr.DWRServlet這個(gè)servlet來研究下dwr到底是如何工作滴。

代碼
 web.xml配置            
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

這樣所有的/dwr/*所有請求都由這個(gè)servlet來處理,它到底處理了些什么能。我們還以上面最簡單的例子來看。
1、 web服務(wù)器啟動(dòng),DWRServlet init()方法調(diào)用,init主要做了以下工作。
設(shè)置日志級別、實(shí)例化DWR用到的單例類(這些類在jvm中只有一個(gè)實(shí)例對象)、讀去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。
2、請求處理
DWRServlet.doGet, doPost方法都調(diào)用processor.handle(req, resp)方法處理。Processor對象在init()方法中已經(jīng)初始化了。
代碼
 public void handle(HttpServletRequest req, HttpServletResponse resp)            
throws IOException
{
String pathinfo = req.getPathInfo();
if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))
{
resp.sendRedirect(req.getContextPath() + req.getServletPath() + ‘/‘ + "index.html");
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/index.html"))
{
doIndex(req, resp);
} else
if(pathinfo != null && pathinfo.startsWith("/test/"))
{
doTest(req, resp);
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/engine.js"))
{
doFile(resp, "engine.js", "text/javascript");
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/util.js"))
{
doFile(resp, "util.js", "text/javascript");
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/deprecated.js"))
{
doFile(resp, "deprecated.js", "text/javascript");
} else
if(pathinfo != null && pathinfo.startsWith("/interface/"))
{
doInterface(req, resp);
} else
if(pathinfo != null && pathinfo.startsWith("/exec"))
{
doExec(req, resp);
} else
{
log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");
resp.sendError(404);
}
}

哦。這些恍然大悟。dwr/*處理的請求也就這幾種。
(1)dwr/index.html,dwr/test/這種只能在debug模式下使用,調(diào)試用。
dwr/engine.js,dwr/util.js,dwr/deprecated.js當(dāng)這個(gè)請求到達(dá),從dwr.jar包中讀取文件流,響應(yīng)回去。(重復(fù)請求有緩存)
(2)當(dāng)dwr/interface/這種請求到來,(例如我們在index.html中的 <script type=‘text/javascript‘ src=‘dwr/interface/JDate.js‘></script>)DWR做一件偉大的事。把我們在WEB-INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date轉(zhuǎn)化為javascript函數(shù)。
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。
細(xì)節(jié)也比較簡單,通過java反射,把方法都寫成javascript特定的方法。(我覺得這些轉(zhuǎn)換可以放到緩存里,下次調(diào)用沒必要再生成一遍,不知道作者為什么沒這樣做)。
(3)dwr/exec
javascript調(diào)用方法時(shí)發(fā)送這種請求,可能是XMLHttpRequest或IFrame發(fā)送。
當(dāng)然,javascript調(diào)用的方法簽名與java代碼一致,包括參數(shù),還有javascript的回調(diào)方法也傳到了服務(wù)器端,在服務(wù)器端很容易實(shí)現(xiàn)。回調(diào)方法的java的執(zhí)行結(jié)果 返回類似 <script>callMethod(結(jié)果)<script>的javascript字符串,在瀏覽器執(zhí)行。哈,一切就這么簡單,巧妙。

dwr的設(shè)計(jì)構(gòu)思很是巧妙。
第一、把java類轉(zhuǎn)化為javascript類由dwr自動(dòng)完成,只需簡單的配置。
第二、應(yīng)用起來極其簡單。開發(fā)者不要該服務(wù)器代碼就可以集成。
第三、容易測試。和webwork一樣,隱藏的http協(xié)議。
第四、及強(qiáng)擴(kuò)展性。例如與spring集成,只需修改一點(diǎn)代碼。
第五、性能。就我與jason,等簡單比較,dwr性能可能是最好的。
第六、自動(dòng)把java對象轉(zhuǎn)化為javascript對象,并且及易擴(kuò)展。[/code]

simpledwr.rar
 描述:  最簡單的一個(gè)例子.

下載
 文件名:  simpledwr.rar
 文件大小:  137 KB
 下載過的:  文件被下載或查看 479 次
howitworks.png
 描述:
 
 文件大小:
 31 KB
 看過的:
 文件被下載或查看 422 次
不斷補(bǔ)存中,以后可能會(huì)寫點(diǎn).
1 dwr支持的java類型于javascript類型如何轉(zhuǎn)化.
2 dwr配置說明.
3 于spring,struts,webwork的集成.
4 dwr是如何解決我的那些疑問的.
http://forum.javaeye.com/viewtopic.php?t=14083
5 見 http://forum.javaeye.com/viewtopic.php?t=13995.現(xiàn)在我自己傾向于用javascript代替xml.畢竟瀏覽器消費(fèi)最好是javascript對象.

1、最小配置

代碼
 <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

2、當(dāng)我們想看DWR自動(dòng)生成的測試頁(Using debug/test mode)時(shí),可在
代碼
 servlet中加
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
這個(gè)參數(shù)DWR默認(rèn)是false.如果選擇true.我們可以通過url http://localhost:port/app/dwr ,你就可以看到你部署的每個(gè)DWR class。并且可以測試java代碼的每個(gè)方法是否運(yùn)行正常。為了安全考慮,在正式環(huán)境下你一定把這個(gè)參數(shù)設(shè)為false.
3、logging信息配置。
在無java.util.logging的jdk1.3下運(yùn)行DWR,我們不希望強(qiáng)制用戶加一個(gè)logging包,而是用HttpServlet.log()方法來輸出日志。如果classpath中包括logging jar包,DWR自動(dòng)切換用logging輸出日志。
如果用HttpServlet.log()方法,以下配置是有效的。
代碼
 <init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
有效的值是 FATAL, ERROR, WARN (the default), INFO and DEBUG

我是喜歡用log4j輸出日志,那么在log4j.properties下加,log4j.logger.uk.ltd.getahead.dwr = debug。這樣可以看DWR的調(diào)試日志。
4、多dwr.xml文件的配置
可能有幾種情況,我們一一列舉。 一個(gè)servlet,多個(gè)dwr.xml配置文件;多個(gè)servlet,每個(gè)servlet對應(yīng)一個(gè)或多個(gè)dwr.xml.
一個(gè)servlet,多個(gè)dwr.xml配置文件;

代碼
 <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>
在這種配置下,param-name的值必須以config開頭。param-name可以有>=0個(gè)。如果沒有param-name,那么將會(huì)讀取WEB-INF/dwr.xml。如果有大于零個(gè)param-name,那么WEB-INF/dwr.xml文件將不會(huì)被讀取。

多個(gè)servlet,每個(gè)servlet對應(yīng)一個(gè)或多個(gè)dwr.xml

代碼
 <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<!--用classes/dwr.xml-->
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>
在這種情況下,我們可以根據(jù)J2EE security來控制權(quán)限,針對不同url,加不同的角色。
5、dwr的幾個(gè)擴(kuò)展點(diǎn)(Plug-ins)
DWR對以下接口提供的默認(rèn)的實(shí)現(xiàn),用戶可以繼承DWR的默認(rèn)實(shí)現(xiàn)類來達(dá)到我們想要的效果。但這至少需要我們讀了DWR源碼才能做這些工作(dwr源碼很是清晰,有興趣可以學(xué)習(xí)一下),以后可能補(bǔ)存這部分。
代碼
uk.ltd.getahead.dwr.AccessControl   

uk.ltd.getahead.dwr.Configuration

uk.ltd.getahead.dwr.ConverterManager

uk.ltd.getahead.dwr.CreatorManager

uk.ltd.getahead.dwr.Processor

uk.ltd.getahead.dwr.ExecutionContext


1、java的方法避免用 java 和 javascript的關(guān)鍵字。 如 try()方法 或 delete()方法。
2、在你的java類中不要出現(xiàn)重載 avoid overloaded methods.
3、在生產(chǎn)環(huán)境下,你可以把deprecated.js engine.js util.js 合并成一個(gè),并放到web容器內(nèi),直接在htm,jsp中引用。 (對于java代碼轉(zhuǎn)換成的javascript代碼也可以這么做,免得每次生成javascript代碼浪費(fèi)時(shí)間)
4、研究一下Bean Converters。POJOjava對象必須嚴(yán)格按照 getProperty() setProperty()定義。Bean Converters是按照 java對象的 get set方法工作的。DWR1.1加了Object Converters,是按private int property;這類屬性工作的。
<convert converter="bean" match="example.Fred"/>
<param name="exclude" value="property1, property2"/>
</convert>
當(dāng)你這樣配置時(shí),java對象轉(zhuǎn)化成的javascript對象不包括property1和property2。
<convert converter="bean" match="example.Fred"/>
<param name="include" value="property1, property2"/>
</convert>
反過來java對象轉(zhuǎn)化成的javascript對象直包括property1和property2。
5、<convert converter="collection" match="java.util.Collection"/>
<convert converter="map" match="java.util.Map"/>
這也是容易出問題的地方.

package example;
public class Person{
private String name;
get ... set
private List relationPerson;
public List setRelationPerson(List relationPerson){
this.relationPerson=relationPerson;
}
} <convert converter="bean" match="example.Person"/>
</convert>
<signatures>
<![CDATA[
import java.util.Set;
import example.Person;

Person.setRelationPerson(List<Person>);
]]>
</signatures>

在jdk1.5泛型中有寫法區(qū)別

6、另外在Set,List等做為方法參數(shù)時(shí)也會(huì)出現(xiàn)混淆。返回集合類型不會(huì)出現(xiàn)問題,想想就知道了。
如 在Test類中有 public Set testBeanSetParam(Set test) 這個(gè)方法,客戶端得到的javascript方法可能是Test.testBeanSetParam(p0,callback);當(dāng)我們javascript調(diào)用這個(gè)方法時(shí),鬼才知道怎么確定p0的類型,也不可能知道Set集合中該放什么類型的java對象,所以dwr的 special signatures syntax 確定這些集合和內(nèi)容的類型
<signatures>
<![CDATA[
import java.util.Set;
import example.Test;

Test.testBeanSetParam(Set<TestBean>);
<!--Test.stringStringMapParam(Map<String, String>);-->
]]>
</signatures>
7、Creators
<allow>
<create creator="..." javascript="..." scope="...">
<param name="..." value="..."/>
<auth method="..." role="..."/>
<exclude method="..."/>
<include method="..."/>
</create>
...
</allow>
為了更少的暴露業(yè)務(wù)方法,最好配置include屬性。
dwr支持new ,script,struts....幾種集成方法,也支持static方法的調(diào)用,我覺得最好的是spring,其他感覺是處理遺留問題處理。
8、engine_js 作為dwr框架客戶端核心,主要完成xmlHttp或iframe的構(gòu)造,我們沒必要關(guān)心它如何實(shí)現(xiàn)。有幾點(diǎn)創(chuàng)新的我們可以學(xué)習(xí)下。
Call Batching 我們可以把幾個(gè)客戶端請求一起放送到服務(wù)器端,減少了網(wǎng)絡(luò)交互,但要注意依存關(guān)系和他們處理的順序。
Call Ordering 同步異步調(diào)整。一般用默認(rèn)的就好了。注意依存關(guān)系。
Remoting Hooks 鉤子,"small AOP"
依存關(guān)系解釋。 如果 request1() request2()兩個(gè)業(yè)務(wù)邏輯方法,request2方法需要用到request1方法從服務(wù)器端返回的結(jié)果。如果調(diào)用request2時(shí),request1還沒處理或還沒請求。 下拉框連動(dòng)可能有這個(gè)問題。
9、util.js propotype.js有些重復(fù),這讓我很難受。只能改代碼了,可別壞了開元協(xié)議。
10、如果你的回調(diào)方法想加其他參數(shù)
var dataFromBrowser = ...;
var callbackProxy = function(dataFromServer) {
callbackFunc(dataFromServer, dataFromBrowser);
};
var callMetaData = { callback:callbackProxy };
Remote.method(params, callMetaData);
11、dwr1.1
1.1只能算一個(gè)bug消除版本,沒有什么大的功能調(diào)整。源代碼結(jié)構(gòu)做了些調(diào)整。2.0有新的特征加入。

It has a far broader scope; the major new features are accessibility enhancements, and what now appears to
be called ‘Comet‘. 在文檔中提到了“Comet”,估計(jì)與DWR2.0作者想法類似。


Chinese

Yenwen Feng spoke at JavaTwo in Taiwan in Chinese. He has provided his Powerpoint slides and the
examples that go with them as downloads:

Fran?ais / French

Julien Dubois vient d‘écrire un livre en Fran?ais sur Spring, lequel inclut un chapitre sur DWR.
La bonne nouvelle est que ce chapitre fait partie de ceux téléchargeables gratuitement.
Téléchargez le PDF. Spring par la pratique est disponible maintenant.

Laurent Bois a écrit un article intitulé des "DWR sait rendre Ajax simple". Il commence
"Aujourd’hui les technologies de base fournies par les navigateurs web, c’est à dire afficher
le contenu de documents, ont été poussées jusqu’aux limites."

Julien Dubois has recently written a French book primarily about Spring - it includes a section
on DWR. The great news is that this chapter is one of the free download chapters.
Get the PDF. Spring par la Practique is available now.

Laurent Bois has written an article entitled "DWR makes Ajax simple". It begins: "Today the
basic technologies provided by web browsers were pushed until the limits".

Italiano / Italian

Federico Paparoni ha tradotto la lezione privata di Java.net in Italiano. è disponibile qui:
"Sviluppare Applicazioni AJAX in Java".

Federico Paparoni translated the Java.net tutorial into Italian. It is available here:
"Sviluppare Applicazioni AJAX in Java".

Português / Portuguese

Pedro Pimentel escreveu um tutorial PDF em português de como iniciar no DWR. Come?a assim:
"Este tutorial assume que você tenha um conhecimento básico de aplica??es web em java. Entretanto,
conhecimento em C garante um bom entendimento dos códigos".

Pedro Pimentel has written a PDF tutorial on how to get started with DWR in Portuguese. It begins:
"This tutorial assumes you have basic knowledge of web applications in Java. However some ‘C‘
knowledge will get you started."








本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ajax之旅--dwr探密
DWR3實(shí)現(xiàn)服務(wù)器端向客戶端精確推送消息
DWR學(xué)習(xí)心得
DWR的學(xué)習(xí)文檔(Hello World,類型轉(zhuǎn)換,Spring,Annotation)
Spring+DWR 全注解版
Java視線論壇--DWR學(xué)習(xí)--讀了遍1.1官方文檔,提取的些東西。
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服