2016年6月16日 星期四

Hello DWR (DWR 一)

※下載

DWR首頁


下載jar包,而demo要不要下看個人喜好,裡面是範例
也可以用下面maven的方式,但其實啟動伺服器時,還會報缺common jar包的錯,還得再下載(也可以複製官網WAR裡的jar)
我將我沒出錯的pom貼在下面

<dependency>
    <groupId>org.directwebremoting</groupId>
    <artifactId>dwr</artifactId>
    <version>3.0.1-RELEASE</version>
</dependency>
    
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>




選擇左邊的Documentation-->Index
下面一點會看到web.xml和dwr.xml,還有dwr內容的教學



※設定

將上面的web.xml和dwr.xml複製到專案裡,dwr主要是要上面的DTD
然後寫一支interface和實作
我將程式碼貼在下面

※Idao和DaoImpl

package dao;
public interface Idao {
    public String helloDWR(String name);
}
    
    
    
package dao.impl;
import dao.Idao;
public class DaoImpl implements Idao {
    public String helloDWR(String name) {
        return new StringBuffer().append("Hello ").append(name).toString();
    }
}



※web.xml

<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <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>



※dwr.xml

<dwr>
    <allow>
        <create creator="new" javascript="xxx">
            <param name="class" value="dao.impl.DaoImpl" />
        </create>
    </allow>
</dwr>

※new和class不能亂打

※雖然有定interface,但是只能打impl,否則會報錯



※啟動伺服器

web.xml有設定debug是true
所以啟動伺服器後
網址如下http://localhost:8080/dwrTest/
dwrTest是我的專案名稱(你不一定是取這個名稱)
再後面加個dwr,會自動變成http://localhost:8080/dwrTest/dwr/index.html
就會出現如下的畫面,debug一定要true,不然會404


dwr.xml裡的javascript="xxx"會出現,點進去後




我標紅色的地方會出現剛剛寫的方法名稱,裡面就是要寫的參數,右邊還有Execute按鈕可看結果


※使用dwr.xml裡的xxx

※index.jsp

<%
    String path = new StringBuffer()
        .append(request.getScheme())
        .append("://")
        .append(request.getServerName())
        .append(":")
        .append(request.getServerPort())
        .append(request.getContextPath())
        .toString();
%>
    
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type='text/javascript' src='<%=path%>/dwr/engine.js'></script>
    <script type='text/javascript' src='<%=path%>/dwr/interface/xxx.js'></script>
    <script type="text/javascript">
        xxx.helloDWR("DWR", helloDWRCallBack);
        function helloDWRCallBack(rtn){
            document.getElementById('sp').innerHTML = rtn;
        }
    </script>
</head>
<body>
    <h1 id="sp"></h1>
</body>

※<script>那兩行是從debug=true裡面複製的,但我給它絕對路徑(第二張圖的getting started裡面有寫)
p.s 也可以完全不改,直接貼上也是可以run,此時就可以不用最上面的scriptlet了

※在javascript裡可以直接使用xxx,因為已經在dwr.xml裡已經new過了,第二個參數是回傳值,回傳值要寫一個function,名稱可以隨便取,對應好即可

這兩個誰在上面或下面都可以,但也可以合在一起,如下:
xxx.helloDWR("DWR", {
    callback : function helloDWRCallBack(rtn){
        document.getElementById('sp').innerHTML = rtn;
    }
});

※也就是第二個參數變成「{callback : function}」

※因為helloDWRCallBack沒有被其他地方使用,還可以不取名,也就是變成匿名函數

※除了callback外,還有很多,請參考官網

沒有留言:

張貼留言