MVC分离开发

对于web应用来说,必须通过controller才能渲染模板,beetl也可以写完模板后,在未完成controller情况下,直接渲染模板 此方法既可以作为通常的全栈式开发人员使用,也可以用于前端人员单独开发模板用。 Beetl使用WebSimulate来模拟模板渲染或者REST请求返回json数据,WebSimulate 会取出请求路径,然后执行values目录下同一个请求路径的脚本,脚本的顶级变量都将作为全局变量,并渲染请求路径同名的的模板文件。 比如请求路径是http://127.0.0.1:8080/user/userlist.html, 则WebSimulate会执行/values/user/userlist.html.var 脚本,获取到所有顶级变量,并渲染/user/userlist.html 页面 如果脚本定义了名为json的变量,则WebSimulate 返回的是json数据,否则,则是模板渲染 如果脚本里还定义了ajax变量,则认为是局部渲染,ajax变量因为字符串,就是代表ajaxId WebSimulate允许使用path变量,且在values目录下,用代替,比如对于REST请求 /user/1,如果在values目录下有/values/users/.var, 则能匹配上此模拟脚本 WebSimulate对应到脚本的时候,允许根据HTTP METHOD对应,比如一个REST的GET请求 /user/1,可以对应/values/user/.get.var 对应的关系,总是精确匹配优先,对于/user/1,优先精确匹配/user/1.var,其次是/user/.get.var, 最后才是/user/$$.var 则WebSimulate 在执行脚本的时候,总是先读取/values/common.var, 以获得需要的公共变量

安装WebSimulate较为简单,以springboot为例子

  1. @Controller
  2. @RequestMapping("/simulate")
  3. public class SimulateController {
  4. @Autowired
  5. WebSimulate webSimulate;
  6. @RequestMapping("/**/*.html")
  7. public void simluateView(HttpServletRequest request,HttpServletResponse response){
  8. webSimulate.execute(request, response);
  9. }
  10. @RequestMapping("/api/**")
  11. public void simluateJson(HttpServletRequest request,HttpServletResponse response){
  12. webSimulate.execute(request, response);
  13. }
  14. }

如上,所有以/smulate 开头的请求,都会使用模拟数据来支持分离开发,其中simluateView来模拟视图渲染,simluateJson来模拟REST请求的数据

WebSimulate 初始化代码如下

  1. @Bean
  2. public WebSimulate getWebSmulate(BeetlSpringViewResolver resolver){
  3. WebSimulate webSimulate = new WebSimulate(resolver.getConfig().getGroupTemplate()){
  4. public String getValuePath(HttpServletRequest request){
  5. return this.removePreffix( request.getServletPath());
  6. }
  7. protected String getRenderPath(HttpServletRequest request)
  8. {
  9. return this.removePreffix( request.getServletPath());
  10. }
  11. private String removePreffix(String path){
  12. return path.replaceFirst("/simulate", "");
  13. }
  14. };
  15. return webSimulate;
  16. }

WebSimulate 通常可以直接使用,但本例子中,为了完全模拟,需要去掉/simulate",这样不必要创建一个/values/simulate

如上配置完毕,如果普通模板请求

  1. /simulate/user/userlist.html

将会执行/values/user/userlist.html.var 的脚本,比如,模拟users数据

  1. var users = [{"name":"xiandafu"},{"name":"lucy"}];

如果一个REST请求

  1. /simulate/api/user/1

可以创建如下文件/values/api/user/$$.get.var,内容直接返回一个json字符串

  1. var json = "{'success':true}";

WebSimulate 构造的时候需要一个实现JsonUtil的类(Beetl并不自带json序列化工具),这样,对于要返回的json数据,可以不必向上面的例子那样,返回json字符串,可以返回一个对象,如Map,然后交给jsonUtil来序列化返回客户端

脚本本身可以获取模拟请求的参数,如session,parameter等,从而灵活的模拟数据,具体请参考WebSimulate源码

直接访问模板前提是使用了伪模型,这与实际的项目采用的模型并不一致,因此当模板采用伪模型验证后,需要重启web应用,才能使用真正的模型去测试,否则,模板引擎会报错,这是因为beetl默认的FastRuntimeEngine会根据模型优化模板,对同一个模板不同的模型会报错,除非采用DefaultTemplateEngine 或者页面申明类型变量是动态的。