EasyJWeb中預設URL對映轉換器揭密
在EasyJWeb對Ajax的支援中,通過引用類似<script type='text/javascript' src='ejf/easyajax/UserService.js'></script>的url可以動態得到呼叫伺服器端業務元件的javascript指令碼。另外,在基於EasyJWeb的CRUD應用中,也可以使用類似http://localhost:8080/user/edit/3的URL來編輯資料表中的某一條記錄。究竟EasyJWeb中是如何處理這些URL的呢?本文將作簡單的分析!
在EasyJWeb中,有一個URL對映處理器,通過配置這個對映處理器可以非常簡單地實現Web應用中類似URLRewrite的需求。對映處理器了程式碼如下所示:
//對請求路徑的解析;
public String getModuleName();//得到模板的名稱
public Map getParams(); //得到模板預設引數
public String getCommand();//得到模板命令
}
該介面的預設實現是com.easyjf.web.core.PathMappingRulerImpl,在基於EasyJWeb的應用中,每一個交由EasyJWeb框架處理的請求url,都會通過這個對映處理器進行轉換。通過使用EasyJWeb預設URL對映轉換器,客戶端請求路徑/module/command/params將按以下請求規則,作如下的對映處理.
對映處理前的URL:
1、 /module/command/name=xxx
2、 /module
3、 /module/command
4、 /module/command/12345
5、/module/edit/12345/title=1111
6、/moduel/title=測試
對映處理的URL:
1~ /module.ejf?easyjwebCommand=command&name=xxx
2~ /module.ejf
3~ /module.ejf?easyjwebCommand=command
4~ /module.ejf?easyjwebCommand=command&cid=1234
5、/module.ejf?easyJWebCommand=edit&cid=123455&title=111
6、/module.ejf?title=測試
這個url表示執行user.ejf這個模組,傳送的命令為edit,標準key值為3。
URL對映轉換器的一個最典型的應用示例,就是EasyJWeb-0.8版本開始增加的遠端Web指令碼處理支援引擎,也即Ajax的部分功能。遠端JS指令碼呼叫支援只是EasyJWeb中的一個小小外掛,EasyJWeb的Ajax實現只是一個普通的EasyJWeb Module(Action)。這個Action即com.easyjf.web.ajax.AjaxEngineAction。
看過本人《在EasyJWeb中輕鬆開發Ajax運用》一文的朋友都知道,遠端Web指令碼呼叫涉及到一個如何生成呼叫伺服器端方法的Javascript Stub問題。在EasyJWeb對Ajax的支援中,可以直接通過下面的URL來生成遠端javascript呼叫指令碼。
<script type='text/javascript' src="ejf/easyajax/prototype.js"></script><script type='text/javascript' src='ejf/easyajax/engine.js'></script>
<script type='text/javascript' src='ejf/easyajax/UserService.js'></script>
第一句返回prototype.js指令碼,第二句返回EasyJWeb的Ajax支援引擎engine.js指令碼,第三句返回生成伺服器UserService元件的遠端呼叫指令碼。
上面的URL,改成通過原生的EasyJWeb URL來引用,可以寫成下面的形式:
<script type='text/javascript' src='easyajax.ejf?engine.js'></script>
<script type='text/javascript' src='easyajax.ejf?easyJWebCommand=UserService'></script>
AjaxEngineAction中處理這幾個呼叫程式碼如下:
public Page doEngine(WebForm form, Module module) throws Exception {return module.findPage("engine-js");
}
public Page doPrototype(WebForm form, Module module) throws Exception {
return module.findPage("prototype");
}
public Page doAjaxHome(WebForm form, Module module) throws Exception {
String command = CommUtil.null2String(form.get("easyJWebCommand"));
if (command.endsWith(".js"))
{
command = command.substring(0, command.length() -3);
}
Object bean=AjaxUtil.getServiceContainer().getService(command);
//System.out.println(command);
form.addResult("scriptName", command);
form.addResult("methodList", AjaxUtil.getAjaxStub(bean));
return module.findPage("stub");
}
小結:
一個簡單適用的Web MVC框架,不僅僅是實現單純的頁面及程式碼分離功能,還應該提供更多的與Web應用相關的實用工具及解決通用應用需求抽象功能。在EasyJWeb中,除擁有了很多MVC框架的基本特性以外,還內建了很多解決應用Web應用程式中一些通過需求的工具,比如URL對映處理、自動程式碼生成、許可權系統支援等,因此會使得我們開發Web應用程式開發變得更加簡單、高效。作為一個完全由國內Java開源愛好者發起及實現的Web MCX框架,雖然在EasyJWeb-0.8版本中還存在著很多問題,但只要有更多的開源愛好者參與到其中來,相信在以後的版本中會不斷得到完善。