JsonGateway是一個java遠程服務調用的ajax的接口,它使用Json數據格式在頁面上的javascript和後臺的 java服務之間進行數據交換。目前它可以調用spring的service,當然也可以調用普通的java類方法。jsonGateway可以自動生成 所配置的java類的javascript包裝類,這將使你能夠輕鬆進行ajax遠程調用。jsonGateway使用了JQuery來進行遠程調用,同 時在服務端使用了jsontools進行json數據格式的轉換。
你可以在Sorceforge上下載 http://sourceforge.net/project/showfiles.php?group_id=188794
使用方法:
如果後臺我們使用了Spring,那麼調用Spring中配置的Service Bean的方法的方式爲
:
配置JsonGateway的Servlet: 在web.xml中, 增加
<servlet>
<description>json gateway</description>
<display-name>json gateway servlet</display-name>
<servlet-name>json-gateway</servlet-name>
<servlet-class>org.svilo.spring.json.JsonGatewayServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>json-gateway</servlet-name>
<url-pattern>/json/*</url-pattern>
</servlet-mapping>
在html、jsp頁面中,引入如下的javascript:
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/json.js"></script>
<script type="text/javascript" src="/js/moo.js"></script>
<script type="text/javascript" src="/js/jsonGateway.js"></script>
同時也需要引入自動生成的服務代理Javascript:
如果你有一個Spring的服務bean叫做'CustomerMgrService',那麼在你的html中,增加如下幾行代碼:
<script type="text/javascript"src="/json/CustomerMgrService.js"></script> //the CustomerMgrService.js is generated by the JsonGateway
具體在javascript中的使用方法如下:
function testService(){
var callerResponder = new CallerResponder(); //這是ajax的響應回調的封裝類
callerResponder.success = function(jsonObj) { //當調用後臺方法成功時的回調函數
var customer = jsonObj;
alert(customer.brandName);
alert(this.context.name); //this will display 'wuyu' //我們在調用某個後臺服務方法前,設置到CallerResponder上下文中的一些變量,在成功回調函數中,可以通過上下文取出來使用
alert(this.context.age); //this will display '30'
var str = jQuery.toJSON(customer);
var msg = "ajax success: " + str;
alert(msg);
}
callerResponder.error = function(request,settings,e) { //failure callback function, you may not implement it
//調用後臺方法出錯的回調函數
if (request.status == 500) {
var jsonError = jQuery.parseJSON(request.responseText);
}
if (this.debug ) {
alert("ajax error: " + request.responseText);
alert(e);
}
}
callerResponder.context.name = "wuyu"; //set the data which you will access in callback function 向callerResponder的上下文中設置一些需要在回調函數中訪問的數據
callerResponder.context.age = "30";
var customerMgrService = new CustomerMgrService(); //新創建一個遠程服務包裝的javascript對象
var tagMgrService = new TagMgrService();
var strCustomerId = jQuery("#customerId").val();
//調用後臺服務方法
customerMgrService.findByCustomerId(strCustomerId,callerResponder); // 後臺的spring配置中名字叫 CustomerMgrService的Bean有一個'public Customer findByCustomerId(String customerId)'方法,所以我們在這裏可以調用它,它在後臺方法中只有customerId這個參數,在這裏,我們在調用時方法參數的最後面增加 了一個callerResponder的參數。
}
下載包中的代碼缺省只能是調用Spring中配置的服務bean的方法,但是在沒有使用spring的程序中,我們也要使用的話,可以修改JsonGatewayServlet.java
public class JsonGatewayServlet extends HttpServlet {
private static Properties services;
public void init() throws ServletException {
super.init();
services = new Properties();
InputStream in =JsonGatewayServlet.class.getClassLoader().getResourceAsStream("services.properties");
try{
services.load(in);
}catch( Exception e){
e.printStackTrace();
}
}
增加一個名字叫做services.properties的服務配置文件,該文件中寫上服務名稱和對應java類的映射關係,比如:
BranchByArea=com.keygate.adbidplatform.common.service.BranchByArea
最後再修改一下JsonGatewayServlet的getService方法,直接從我們的配置文件中讀取服務的配置即可。
private Object getService(HttpServletRequest request,String serviceName) throws Exception {
// WebApplicationContext webappCtx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
// Object service = webappCtx.getBean(serviceName);
Object service = Class.forName((String)services.get(serviceName)).newInstance();
if (service == null)
{
Exception e = new Exception("can not find the service: " + serviceName);
throw e;
}
return service;
}