1. 程式人生 > >EasyJWeb中預設URL對映轉換器揭密

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的需求。對映處理器了程式碼如下所示:

publicinterface IPathMappingRuler {
 
//對請求路徑的解析;
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?easyJWebCommand=prototype.js"></script>
<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版本中還存在著很多問題,但只要有更多的開源愛好者參與到其中來,相信在以後的版本中會不斷得到完善。

(本文作者:EasyJF開源  大峽 歡迎轉載,轉載請保留作者宣告,謝謝!)