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   interface  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=测试


  因此,在一个EasyJWeb自动代码生成的CRUD应用中,http://localhost:8080/user.ejf?easyJWebCommand=edit&cid=3 这个URL表示编辑user对象中属性cid为3的信息。使用默认的映射处理规则,上面的url可以变成如下的形式:

  http://localhost:8080/user/edit/3

  这个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开源  大峡 欢迎转载,转载请保留作者声明,谢谢!)



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1507104


你可能感兴趣的:(Web)