客戶端調用服務器端方法的簡單例子 – JAVA編程語言程序開發技術文章

 昨天網友問瞭下DWR的問題,DWR是一個用於改善web頁面與Java類交互的遠程服務器端Ajax開源框架,不過自己並未在項目中用過,隻是之前在網上看過它的一些介紹,大概的瞭解它的調用原理。
如果要在客戶端調用服務器端的java方法,一種是基於TCP協議,如RMI;另一種是基於HTTP協議,如web service、ajax。DWR就是基於ajax方式調用WEB服務器上的JAVA方法的一種。
如果是基於HTTP協議來調用,按個人理解,隻需把3步做好就行瞭,
1、定義好訪問規則,如怎樣把需要調用的類名、方法名、參數提交到服務器端。
2、服務器端怎樣按收客戶端傳類名、方法名、參數;接收到數據後,怎樣實例化該類和執行指定的方法。
3、服務器把處理結果以什麼形式返回給客戶端。


和網友說著來瞭興趣,回傢順便寫瞭個實現嘗試下。


下面開始按上面的原理步驟寫一個簡單的實現例子
1、類名、方法名、參數通過ajax方式pose到服務器端RemoteServlet,本文直接使用jquery的ajax
ScriptEngine.js,


function getRootPath(){
    var strFullPath=window.document.location.href;
    var strPath=window.document.location.pathname;
    var pos=strFullPath.indexOf(strPath);
    var prePath=strFullPath.substring(0,pos);
    var postPath=strPath.substring(0,strPath.substr(1).indexOf(/)+1);
    return(prePath+postPath);
    }
function ScriptEngine(){
    this.name = “”;
    this.method = “”;
    this.setClass = function(n){
        name = “class=” + n;
    }
    this.setMethod = function(m){
        method = “method=” + m;
    }
    this.invoke = function(){
        var result;
        var parames = “”;
        if(arguments.length > 0){
            for(i = 0; i < arguments.length; i++){
                parames=arguments[i];
            }
        }
        $.ajax( {
            type : “POST”,
            url : getRootPath() + “/RemoteServlet”,
            cache : false,
            async : false,
            data : name + “&” + method + “&args=” + parames,
            success : function(data) {
                result = data;
            },
            error :function(data){
                result= data;
            }
        });
        return result;
    }
}
2、服務器端RemoteServlet接收客戶端傳來類名、方法名、參數,並通過反射的方式,實例化該類和執行相應的方法。
RemoteServlet.java
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RemoteServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    public RemoteServlet() {
        super();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        remote(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        remote(request, response);
    }
    protected void remote(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter(“class”);
        String method = request.getParameter(“method”);
        String args = request.getParameter(“args”);
        if(name != null && method != null){
            try{
                Class cls = Class.forName(name);
                Object[] parames = !args.equals(“”) ? args.split(“;”) : null;
                Object obj = cls.newInstance();
                Method[] methods = cls.getMethods();
               
                for(Method m:methods){
                    System.out.println(m.getName());
                    if(m.getName().equals(method)){
                        Object result = parames != null ? m.invoke(obj,parames) : m.invoke(obj);
                        response.setCharacterEncoding(“UTF-8”);
                        response.getWriter().println(result.toString());
                        break;
                    }
                }   
            }
            catch(Exception e){
                e.printStackTrace();
            }
           
        }
    }
}
在web.xml中配置該servlet



  <servlet>
    <description></description>
    <display-name>RemoteServlet</display-name>
    <servlet-name>R

發佈留言