beetl关于Map的处理

3322 发布于 2013/08/19 12:15
阅读 1K+
收藏 1

在使用Map对象的时候,beetl生成的java文件中,总是如下:

Map<String,String> map = null;//省略获得方式

out.write(map.get("key1"));// 导致总是使用out.write(String s)的方法

但是实际中,map的对象可以为任意的,而不仅仅是字符串,如果可以如下:

Map map = null;//不需要定义泛型类型

out.write(map.get("key1"));//使用out.write(Object obj) 就很好了



加载中
0
闲大赋
闲大赋
Map 对象的 key value可以是任何类型,并不总是:

Map<String,String> map = null;

Template t = this.gt.getFileTemplate("/objref/objMapref_template.html");
Map map = new HashMap();
map.put("user", new User());
t.set("map", map);
String str = t.getTextAsString();
Assert.assertEquals(this.getFileContent("/objref/objMapref_expected.html"), str);
对应生成的是:

public void service(ByteWriter writer,Context ctx) throws IOException,BeeException{
        ByteWriter out = writer ;
        ctx.set("__pw",out);
        final HashMap<String,User> map;
        try{
            map = (HashMap<String,User>)ctx.getVarWithoutException("map");
        }catch(ClassCastException ex){
            //转入解释模式执行
            ex.printStackTrace();
            throw new VaribaleCastException(ex);
        }
        try{
            out.write(map.get("user").getName());

你试试看,如果有什么问题,再讨论


0
3322
3322

final HashMap<String,User> map;

上面要求所有的元素类型都必须是User,

对于Map,因为value的类型不定,是否只需要生成

final Map map;

然后:${map["a"]} => 生成  map.get("a")


当然,如果修改为上面,就需要涉及到其他方面的修改了,如:

HashMap<String,User> map;

map.get("a").getName();//编译正确,因为map.get("a") 指定了返回类型为User

定义为Map就不能够了

生成的代码可能就需要修改为:

map["a"] => 生成:

map.get("a")


map["a"].name => 生成

invoke(map.get("a"),"name"); //因为map.get("a") 返回的是Object类型

//生成

map.get("a").getName()  ;// 编译就会失败


public Object invoke(Object obj,String prop){

 //使用反射性能并不差,而且可以缓存类和方法名的映射,加快速度

}


0
闲大赋
闲大赋
beetl能编译生成强类型的class而不需要像别的模板引擎那样需要申明对象类型,一个最重要的前提是放进模板里的变量是一样的。如template.set("a",1) template.set("a",5);

如果实在类型不定,则需要告诉beetl,使用template.setRawValue().这样 ,beetl一律把变量当Object,所以你说的情况也是存在的,这样beetl确实是把HashMap 当做HashMap<Object,Object> 来用,那么 map["a"].name 翻译成beetl代码就很不好看了:

evalueAttribute(map.get("a"),"name") 而不是 map.get("a").getName();

0
3322
3322
我在模板模板注册了一个函数(_get())来访问,可以解决我的需求,当然,就不能够通过${map["a"]},而是${_get(map,"a")}
返回顶部
顶部