DWRçæ³¨é(annotations)使ç¨åååè°ç¨(Reverse Ajax)
æè¿ä¹ä¸æ¯å¾å¿è±äºç¹æ¶é´åä»ç»ç ç©¶äºä¸ä¸DWRï¼å ¶å®ä¸¤ä¸å¹´å就已ç»å¼å§ä½¿ç¨å®äºãä¸è¿ä¸ç´ç¨ç乿¯è¾ç®åDWRï¼æ²¡è±è¿å¤ªå¤çå¿æå¨ä¸é¢ï¼åµåµï¼ä¸»è¦è¿æ¯é¡¹ç®æ²¡éæ±åï¼ãä¸ç¨åå¤è¯´äºï¼ç¸ä¿¡å¤§å®¶é½ç¥éï¼é ç½®å使ç¨é½é常ç®åãä»å¤©è¦è¯´çæ¯DWRçä¸äºé«çº§ä¸ç¹ç¨æ³ãå½ç¶ä¹ä¸é¾ãåªæ¯ä¸ºäºé²æ¢èªå·±å¿è®°ï¼åæ¶ä¹åå ¶ä»äººå享ä¸ä¸ã è¨å½æ£ä¼ å¼å§å§ã
å
说说注éè¯æ³ï¼çædwr.xmlãï¼èªä»ç¨äºjava 5 ä¹åï¼ç°å¨è¶çä¸å å çé
ç½®æä»¶è¶ç¦ï¼è¶æ¥è¶åæ¬¢æ³¨éæ¹å¼æ¥çç´æ¥ç®åäºï¼
é¦å
ä¸è½½ææ°ç稳å®çæ¬çdwr.jaræä»¶æ¾å°ä½ çå·¥ç¨ä¸ãï¼è¿æéè¦å
¶å®çåï¼ä¸éè¦äºï¼dwrå°±æ¯è¿ä¹ç®åï¼
ç¶åå¨web.xml䏿·»å å¦ä¸ä¸æ®µ
<!-- DWRServlet -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<!-- é»è®¤ä¸ºfalseï¼è°è¯ç¨ï¼å¯ä»¥è®¿é®http://å°å:端å£/ä¸ä¸æ/dwr æ¥è¿è¡æµè¯ -->
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!--è¿å°±æ¯ä¼ 说ä¸çDWRå转è°ç¨çå¼å
³äºï¼é»è®¤ä¹æ¯false -->
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<!--æ¥å¿çº§å«ä¸å¤è¯´äº-->
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
<!--è¿å注æäºï¼å
³é®æ¥äºï¼æä½¿ç¨DWR注éçç±»é½è¦å å¨è¿éï¼2.0çDWR好åè¿ä¸æ¯æå
æ«æï¼å¸æä»¥åè½æä¾è¿ä¸ªåè½ï¼3.0æè¿æ²¡æ³¨æææ²¡æè¿ä¸ªåè½ï¼ç°å¨è¿æ²¡åºæ£å¼ç-->
<init-param>
<param-name>classes</param-name>
<param-value>
org.relax.service.SectionManager,
org.relax.service..entity.Section
</param-value>
</init-param>
</servlet>
<!--è¿åä¸ç¨å¤è¯´äºå§ï¼å¦æç䏿ï¼åªåå¿«åªåçå»å§-->
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
å¨è¿éå说æä¸ä¸æçæç« ç¨çæ¯uk.ltd.getahead.dwr.DWRServletï¼å
¶å®ä»åªæ¯ç»§æ¿äºä¸ä¸org.directwebremoting.servlet.DwrServletèªå·±ä»ä¹ä¹æ²¡åï¼æä»¥è¿ä¸¤ä¸ªç±»ç¨åªä¸ªé½è¡ï¼è¿ä¹ååºè¯¥æ¯ä¸ºäºå
¼å®¹ä»¥åççæ¬ï¼ççï¼1.0ææ²¡ç¨è¿ï¼ã
ä¸é¢çå
·ä½çç±»å§ã
@Service
@RemoteProxy(creator = SpringCreator.class, name = "sectionManager", creatorParams = @Param(name = "beanName", value = "sectionManager"))
public class SectionManager extends DefaultEntityManager<Section, Integer> {
@Autowired
OriginCollectDataManager originCollectDataManager;
@RemoteMethod
public Section get(Integer id) {
return super.get(id);
}
@RemoteMethod
public List<Section> getAll() {
return super.getAll();
}
}
æçæµè¯ç¯å¢éè¿ç¨å°äºspringåhibernateï¼æä»¥éé¢è¿æºæäºä¸äºspringçæ³¨éæ è®°ï¼å½ç¶å¦æä½ 没ç¨ä¹æ æè°ã
è¿é主è¦è§£éä¸ä¸DWRçå 个Annotations
@RemoteProxyæ å¨ç±»ä¸çå°±æ¯ä½¿ç±»å¯ä»¥è¿ç¨è®¿é®
@RemoteProxy(creator = SpringCreator.class, name = "sectionManager", creatorParams = @Param(name = "beanName", value = "sectionManager"))ï¼
ä¸é¢å 为使ç¨äºspringæä»¥åçæ¯springCreator.class, å
¶å®è¿æBeanCreator, Ejb3Creator, JsfCreator, NewCreator, NullCreator, PageFlowCreator, ScriptedCreator, SingletonCreator, SpringCreator, StrutsCreatorãçèªå·±çå
·ä½éæ±ãæå¸¸ç¨çå°±æ¯newCreatoräºå§ã
@RemoteMethodæ 卿¹æ³ä¸ï¼ä¸ç¨å¤è¯´å¯ä»¥ä½¿æ¹æ³è½è¿ç¨è®¿é®
@DataTransferObjectæ å¨ç±»ä¸ï¼æ³¨æéè¦è½¬æ¢çVOç±»äº
@RemotePropertyæ å¨ç±»ç屿§ä¸ï¼æ æåªäºå¯ä»¥è®¿é®ï¼æè¯äºè¯ä¸æ ï¼å¥½åå
¨é½å¯ä»¥è®¿é®äºï¼
常ç¨çå°±è¿ä¹å¤äºï¼å
¶å®å 个ä¸å¤ªå¸¸ç¨ï¼å¦æç¨å°çæ¶ååç ç©¶å§ã
è¿æä»ä¹è¦åçåï¼å¥½åå°±è¿ä¹å¤äºãDWRå°±æ¯ç®åã妿æ 好äºå¯ä»¥è¯è¯è®¿é®ä¸ä¸æè·¯å¾å ä¸/dwræ¥è®¿é®è¯è¯äºã好å好ç¨äºåãå¦ä¸å¾
ç¹è¿å»çç齿ä»ä¹æ¹æ³
çä¸å»æ¹æ³å¥½åæºå¤ï¼å
¶å®çæ£è½è®¿é®ç¨çåªæç¨@RemoteMethodæ æ³¨è¿çã
æµè¯å·²ç»å¥½ç¨äºä¸é¢å°±æ¯å å°é¡µé¢äºãé£ä¸å°±æ´ç®åäºåãæçä¸å¾æ¶å°JSPæä»¶ä¸ãç¶ååè°ç¨æ®éjavascriptå¯¹è±¡ä¸æ ·å°±å¯ä»¥äºãå±ä¸æ¯åæ®åçï¼ä»å¤©ä¸»è¦è®²æ³¨éçç¨æ³ãè¿é¨åå°±å°è¿å§ã
ä¸é¢è¯´ååè°ç¨äºï¼è¿ä¸ªè¿æ¯æºå¤æçï¼é¦å
è§£éå 个æ¦å¿µã
dwrçéåajaxå ¶å®ä¸»è¦å æ¬ä¸¤ç§æ¨¡å¼ï¼ä¸»å¨æ¨¡å¼åè¢«å¨æ¨¡å¼ãå ¶ä¸ä¸»å¨æ¨¡å¼å æ¬PollingåComet两ç§ï¼è¢«å¨æ¨¡å¼åªæPiggybackè¿ä¸ç§ã
æè°çPiggybackæçæ¯å¦æåå°æä»ä¹å 容éè¦æ¨éå°åå°ï¼å³è°ç¨é¡µé¢çjsæ¹æ³ï¼ï¼æ¯è¦çå°é£ä¸ªé¡µé¢è¿è¡ä¸ä¸æ¬¡ajax请æ±çæ¶åï¼å°éè¦æ¨éçå 容éå å¨è¯¥æ¬¡è¯·æ±ä¹åï¼ä¼ åå°é¡µé¢ã
pollingæçæ¯ç±æµè§å¨å®æ¶åæå¡ç«¯åéajax请æ±ï¼è¯¢é®åå°æ¯å¦æä»ä¹å 容éè¦æ¨éï¼æçè¯å°±ä¼ç±æå¡ç«¯è¿åæ¨éå 容ãè¿ç§æ¹å¼åæä»¬ç´æ¥å¨é¡µé¢éè¿å®æ¶å¨åéajax请æ±ï¼ç¶åæ¥è¯¢åå°æ¯å¦æååå 容çå®ç°æ¯ç±»ä¼¼çãåªä¸è¿ç¨äºdwrä¹åè¿é¨åå·¥ä½ç±æ¡æ¶å¸®æä»¬å®æäºã
cometæ¨¡å¼æçç彿å¡ç«¯å»ºç«åæµè§å¨çè¿æ¥ï¼å°é¡µé¢å 容åéå°æµè§å¨ä¹åï¼å¯¹åºçè¿æ¥å¹¶ä¸å ³éï¼åªæ¯ææ¶æèµ·ã妿å颿ä»ä¹æ°çå 容éè¦æ¨éå°å®¢æ·ç«¯çæ¶åç´æ¥éè¿åé¢æèµ·çè¿æ¥åæ¬¡ä¼ éæ°æ®ã
éè¿ä¸é¢çè§£éæä»¬å¯ä»¥çå°ï¼è¿ä¸ç§æ¨¡å¼é½æåèªçä¼ç¼ºç¹ãä»å®¢æ·ç«¯è¯·æ±æ¬¡æ°çè§åº¦æ¥è¯´ï¼å½ç¶æ¯piggybackçæ¨¡å¼æå¥½ãè¿ä¸ªéé¢å®å ¨æ²¡æé¢å¤çç½ç»è¯·æ±ï¼åªæçå°ä¸æ¬¡è¯·æ±é¡µé¢ä¸»å¨åèµ·äºï¼ä¸é´çååå 容æä¼ éå页é¢ã使¯è¿ä¹å¯¼è´äºè¿æ¨éå 容çå»¶æ¶ï¼å ä¸ºä½ å®å ¨æ²¡åæ³ç¥é页é¢çä¸ä¸æ¬¡è¯·æ±å°å¨ä»ä¹æ¶ååèµ·ï¼ä¹è®¸é¡µé¢æ°¸è¿é½æ²¡æä¸ä¸æ¬¡è¯·æ±ãpolling模å¼çç½ç»è¯·æ±æä¸ºé¢ç¹äºï¼å ä¸ºè¿æ¶å页é¢ä¸ç®¡åå°ææ²¡ææ´æ°çå 容ï¼é½éè¦åé请æ±è¯¢é®ãè½ç¶è¿ç§æ¨¡å¼å¯ä»¥éè¿å¢å 请æ±é´éçæ¶é´æ¥åå°å使¶é´å çè¯·æ±æ¬¡æ°ï¼ä½æ¯è¿æ ·åæ ·ä¼å¯¼è´é¡µé¢ååºåå°å 容ååçé´éæ¶é´å¢é¿ï¼è¿ä¸é´å°±äº§çäºçç¾ï¼å ·ä½ç请æ±é´éæ¶é´è¿æ¯è¦æ ¹æ®å ·ä½é¡¹ç®çéæ±æ¥é ç½®ãæ¯å¦æå¡å¨è½æ¿åç请æ±é´éå页é¢å 容æéè¦çå·æ°é¢çãcometæ¹å¼çååºé度åºè¯¥æ¯æå¿«çï¼åå°ä¸æ¦æå 容éè¦æ¨éå¯ä»¥éè¿å颿²¡æå ³éçè¿æ¥é©¬ä¸æ¨éå°åå°ã使¯æå¡å¨æè½æä¾çè¿æ¥æ°ç®æ¯ä¸å®çï¼å¨å¤§éçæèµ·çè¿æ¥æ²¡æå ³éçæ åµä¸ï¼å¯è½é ææ°çè¿æ¥è¯·æ±ä¸è½æ¥å ¥ï¼ä»èå½±åå°æå¡è´¨éã
æ¦å¿µè¯´æ¸
æ¥äºï¼ä¸é¢åä¸å§ã
åé¢å·²ç»è¯´å®äºæ³¨éæ¹å¼äºï¼ä»¥ä¸è¿ç¨æ³¨éçæ¹å¼ï¼æ¹ä¾¿ç´è§åã
@RemoteMethod
public synchronized void start() {
WebContext wctx = WebContextFactory.get();
String currentPage = wctx.getCurrentPage();
running=true;
for (int i = 0; i < 1000; i++) {
if (!running) {
break;
}
ScriptBuffer script = new ScriptBuffer();
script.appendScript("receiveMessages(").appendData(i).appendScript(");");//è°ç¨é¡µé¢çjavascriptæ¹æ³æå¼æ·»å°é¡µé¢ä¸ã
// Loop over all the users on the current page
Collection pages = wctx.getScriptSessionsByPage(currentPage);//循ç¯åºææçä¼è¯é¡µé¢å¹¶æ§è¡
for (Iterator it = pages.iterator(); it.hasNext();) {
System.err.println(i);
ScriptSession otherSession = (ScriptSession) it.next();
otherSession.addScript(script);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@RemoteMethod
public void stop() {
running=false;
}
è¿æ¯ä¸ªç®åçç¨åºè¿è¡ä¹åå°±æ¯ç¨ä¸ªå¾ªç¯æ¥æ´æ°é¡µé¢çæ°åã
ä¸é¢ä¹è´´ä¸ä¸JSPç代ç å§ãä¹ç®è¡¥å
ä¸ç¬¬ä¸é¨åäºã
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type='text/javascript' src='/dymc-web/dwr/interface/sectionManager.js'></script>
<script type='text/javascript' src='/dymc-web/dwr/engine.js'></script>
<script type="text/javascript">
function receiveMessages(msg) {
//alert(msg);
document.getElementById("content").innerHTML=msg;
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body onload="dwr.engine.setActiveReverseAjax(true)">
<button onclick="sectionManager.start()">start</button>
<button onclick="sectionManager.stop()">stop</button>
<div id="content"></div>
</body>
</html>
页é¢å
æ¬ä¸¤ä¸ªé®ä¸ä¸ªå¼å§ä¸ä¸ªåæ¢ã大家æ¥è¯è¯å§ãè¿é䏿·»å¾äºå¤ªæµªè´¹ç©ºé´
è¿è¡èµ·æ¥åç¹startæé®ï¼çç页é¢ä¸æ¯ä¸æ¯èªå·±å¼å§åäºãæ°æå¼ä¸ªIEï¼ç¨å¦å¤çæºå¨è®¿é®æ¤é¢ï¼çï¼æä¹é½ææ°åå¨åæ¢ï¼è¿å°±æ¯DWR Reverse Ajaxçå害æå¨äºãåç¹ä¸ä¸stopï¼åï¼æææä¸ªIEéæ°åé½ä¸åäºå§ã
注æï¼ä»£ç ç¨çæ¯ä¸»å¨çæ¹å¼ï¼æä»¥æ³¨æé¡µé¢onloadä¸ç<body onload="dwr.engine.setActiveReverseAjax(true)">没æè¿å¥å¯å°±ä¸å¥½ç¨äºãå½ç¶ web.xmlä¸ä¹ä¸è½å°äº
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
该说çé½è¯´äºå°±å°è¿å§ãè¿ç¯æç« 䏿¯ç»åå¦è
ççãæä»¥ä¸æ¯ç¹å«ç宿´ãå¦æä½ æ¯åå¦è
ï¼å°±å
å»ççåºç¡å§ãå¯è½æç¹ä¸éåä½ ã