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为例子
@Controller
@RequestMapping("/simulate")
public class SimulateController {
@Autowired
WebSimulate webSimulate;
@RequestMapping("/**/*.html")
public void simluateView(HttpServletRequest request,HttpServletResponse response){
webSimulate.execute(request, response);
}
@RequestMapping("/api/**")
public void simluateJson(HttpServletRequest request,HttpServletResponse response){
webSimulate.execute(request, response);
}
}
如上,所有以/smulate 开头的请求,都会使用模拟数据来支持分离开发,其中simluateView来模拟视图渲染,simluateJson来模拟REST请求的数据
WebSimulate 初始化代码如下
@Bean
public WebSimulate getWebSmulate(BeetlSpringViewResolver resolver){
WebSimulate webSimulate = new WebSimulate(resolver.getConfig().getGroupTemplate()){
public String getValuePath(HttpServletRequest request){
return this.removePreffix( request.getServletPath());
}
protected String getRenderPath(HttpServletRequest request)
{
return this.removePreffix( request.getServletPath());
}
private String removePreffix(String path){
return path.replaceFirst("/simulate", "");
}
};
return webSimulate;
}
WebSimulate 通常可以直接使用,但本例子中,为了完全模拟,需要去掉/simulate",这样不必要创建一个/values/simulate
如上配置完毕,如果普通模板请求
/simulate/user/userlist.html
将会执行/values/user/userlist.html.var 的脚本,比如,模拟users数据
var users = [{"name":"xiandafu"},{"name":"lucy"}];
如果一个REST请求
/simulate/api/user/1
可以创建如下文件/values/api/user/$$.get.var,内容直接返回一个json字符串
var json = "{'success':true}";
WebSimulate 构造的时候需要一个实现JsonUtil的类(Beetl并不自带json序列化工具),这样,对于要返回的json数据,可以不必向上面的例子那样,返回json字符串,可以返回一个对象,如Map,然后交给jsonUtil来序列化返回客户端
脚本本身可以获取模拟请求的参数,如session,parameter等,从而灵活的模拟数据,具体请参考WebSimulate源码
直接访问模板前提是使用了伪模型,这与实际的项目采用的模型并不一致,因此当模板采用伪模型验证后,需要重启web应用,才能使用真正的模型去测试,否则,模板引擎会报错,这是因为beetl默认的FastRuntimeEngine会根据模型优化模板,对同一个模板不同的模型会报错,除非采用DefaultTemplateEngine 或者页面申明类型变量是动态的。