`

velocity对set 类型的支持 map get输出问题分析

 
阅读更多

今天使用velocity在java后台渲染一个map<Long,String>对象到vm模板上,通过get(111)获取不到map的对象的值分析。

 

这是velocity1.6.4的处理,以后版本是不是解决了这个问题可以再查,个人认为在vm文件支持跟java一样加个L表示long之类的处理应该不难。

 

具体代码如下:

 

后台java生成设置代码

 

Map<Long,String> map = new HashMap<Long,String>();
         map.put(101L,"aaa");
         map.put(102L,"bbb");
         context.put("longMap",map);
         
         Map<Integer,String> intMap = new HashMap<Integer,String>();
         intMap.put(101,"aaa");
         intMap.put(102,"bbb");
         context.put("intMap",intMap);

 

 

vm文件输出代码:

 

#foreach($item in $longMap.entrySet())
   $item.key $item.value
#end


$longMap.get(101)



#foreach($item in $intMap.entrySet())
   $item.key $item.value
#end

$intMap.get(101)
 

 

 

打印输出如下:

 

 

102 bbb 101 aaa $longMap.get(101) 102 bbb 101 aaa aaa 

 

 

可以看到使用Map<Long,String>的map类型,通过$longMap.get(101)获取不到值,而使用Map<Integer,String>类型的map,通过$intMap.get(101)能够正常取到值aaa,而通过entrySet来遍历都没有问题,为什么会这样呢?

 

 

那就查看velocity的源码,查看这块的处理了,

 

最终是在velocity中通过#set($a=101)或者直接使用$intMap.get(101)是,会把101生成存储到一个变量中,而变量的类型当然根据这个值来了,不过101当然处理成整数型,而'aaa'则处理成字符串,101.1处理成浮点型。

 

但是整数型有short,int,long,BigInteger,浮点型有float,double,BigDecimal等,那么怎么处理值的类型了。

 

请看velocity的下面两个类就知道了:

 

ASTIntegerLiteral.java处理整数型的转换的:

 

 

public class ASTIntegerLiteral extends SimpleNode
{

    // This may be of type Integer, Long or BigInteger
    private Number value = null;

    /**
     * @param id
     */
    public ASTIntegerLiteral(int id)
    {
        super(id);
    }

    /**
     * @param p
     * @param id
     */
    public ASTIntegerLiteral(Parser p, int id)
    {
        super(p, id);
    }


    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object)
     */
    public Object jjtAccept(ParserVisitor visitor, Object data)
    {
        return visitor.visit(this, data);
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)
     */
    public Object init( InternalContextAdapter context, Object data)
        throws TemplateInitException
    {
        /*
         *  init the tree correctly
         */

        super.init( context, data );

        /**
         * Determine the size of the item and make it an Integer, Long, or BigInteger as appropriate.
         */
         String str = getFirstToken().image;
         try
         {
             value = new Integer( str );
         }
         catch ( NumberFormatException E1 )
         {
            try
            {

                value = new Long( str );

            }
            catch ( NumberFormatException E2 )
            {

                // if there's still an Exception it will propogate out
                value = new BigInteger( str );
            }
        }

        return data;
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#value(org.apache.velocity.context.InternalContextAdapter)
     */
    public Object value( InternalContextAdapter context)
    {
        return value;
    }

}

 

 

请看init方法,会尝试先把整数转换成Integer类型,转换失败再尝试转换成Long,再转换失败再转换成BigInteger,所以101肯定先转换成Integer成功了。

 

而且velocity没有语法直接直接设置类型为Long型。

 

同样对于浮点型也一样:

ASTFloatingPointLiteral.java类

 

 

public class ASTFloatingPointLiteral extends SimpleNode
{

    // This may be of type Double or BigDecimal
    private Number value = null;

    /**
     * @param id
     */
    public ASTFloatingPointLiteral(int id)
    {
        super(id);
    }

    /**
     * @param p
     * @param id
     */
    public ASTFloatingPointLiteral(Parser p, int id)
    {
        super(p, id);
    }


    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object)
     */
    public Object jjtAccept(ParserVisitor visitor, Object data)
    {
        return visitor.visit(this, data);
    }

    /**
     *  Initialization method - doesn't do much but do the object
     *  creation.  We only need to do it once.
     * @param context
     * @param data
     * @return The data object.
     * @throws TemplateInitException
     */
    public Object init( InternalContextAdapter context, Object data)
        throws TemplateInitException
    {
        /*
         *  init the tree correctly
         */

        super.init( context, data );

        /**
         * Determine the size of the item and make it a Double or BigDecimal as appropriate.
         */
         String str = getFirstToken().image;
         try
         {
             value = new Double( str );

         } catch ( NumberFormatException E1 )
         {

            // if there's still an Exception it will propogate out
            value = new BigDecimal( str );

        }

        return data;
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#value(org.apache.velocity.context.InternalContextAdapter)
     */
    public Object value( InternalContextAdapter context)
    {
        return value;
    }


}

 先尝试转换成Float,失败再转换成Double,再失败再转换成BigDecimal。

velocity语法也没有设置为double型的设置。

 

所以就会出现上面那个case了,$map.get(101) map存的是long跟string的键值对,用int型取肯定取不到,因为long跟int的hashcode不一样,这个可以查看map的处理。

0
0
分享到:
评论

相关推荐

    给公司内部人员培训资料 velocity

    4. **页面设置变量**:使用 `#set` 指令可以设置变量,如 `#set( $a = "Velocity" )` 将创建一个名为 `a` 的变量并赋值为 "Velocity"。 5. **注释**:Velocity 提供两种注释方式,单行注释用 `##`,多行注释用 `#* ...

    SpringMVC第8讲:多视图支持

    除了JSP,SpringMVC还支持其他视图技术,如FreeMarker、Velocity、Thymeleaf等。只需引入相应库,配置视图解析器,就能实现这些模板引擎的视图支持。例如,对于FreeMarker,我们需要配置FreeMarkerViewResolver: `...

    苏宁B7开发转正考题(JAVA)-消费者研发中心2018

    6. **Redis数据类型**:Redis支持的数据类型包括String、Hash、List、Set和Sorted Set,不包括Map。 7. **JavaScript**:在JavaScript中,如果两个对象指向同一个引用,修改其中一个对象的属性会影响到另一个,所以...

    玩转模板--自动代码生成工程

    可以自由用户自定义工具,丰富模板参数的处理,如在日期输出时对其进行格式化输出 例如: VelocityContext context = new VelocityContext(map); context.put("dateTool", new DateTool()); //添加日期工具类 模板...

    大数据入门资源.doc

    通过对大数据进行分析和挖掘,可以揭示隐藏在数据中的信息和价值,为企业的发展提供有力的支持。同时,大数据的应用还促进了业务流程的变革,提高了企业的运营效率和创新能力。可以说,大数据已经成为当今时代不可或...

    ExcelUtils-2.00.zip

    6、${map(key)} get the value from the map by the key name. 7、${list[${index}].name} [] can be a variable. 8、${map(${key})} () can be a vriable. 9、#sum qty on ${list} where name like/=str sum ...

    电话面试题(华为/中兴/腾讯)

    2. **集合框架**:包括List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等,理解它们的特点和应用场景。 3. **IO框架**:涉及输入输出流、缓冲流、字符流与字节流,以及NIO(非阻塞I/O)的...

    Migrating From Struts1 To Struts2

    标签库支持Freemarker或Velocity等模板引擎,定制化程度高;拦截器机制(Interceptors)非常实用,可以轻松实现诸如验证、事务管理等功能;支持基于控制器的导航或页面导航。 - **缺点**:相较于Struts1,WebWork/...

    java 引用 pdf模板

    form.setField(key, data.get(key)); } stamper.close(); reader.close(); } catch (Exception e) { e.printStackTrace(); } ``` 这个例子展示了如何读取名为"template.pdf"的模板文件,然后使用`PdfStamper`...

    大数据资源宝典

    因此,在设计高性能的分布式系统时,通常会采取一系列优化措施来缓解这一问题,如使用缓存技术或异步写入机制等。 #### 四、SecondaryNameNode的作用 SecondaryNameNode并不是集群中的一个必须组件,但它可以显著...

    大数据开发教程、案例及相关项目

    - 大数据是指无法用传统的数据处理工具有效处理的海量数据集合,具有四个核心特征:Volume(大量)、Velocity(高速)、Variety(多样)、Value(价值密度低)。 - **Hadoop概述**: - Hadoop是一个开源的分布式...

    单点登录源码

    - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统、系统监控。 ![统一扫码支付](project-bootstrap/zheng-pay.png) &gt; zheng-ucenter 通用用户管理系统, 实现...

    雷达技术知识

    This paper examines the capability ofLiDAR data to accurately map river water surface slopes in three reaches of the Sandy River, Oregon, USA. LiDAR data were compared with field measurements to ...

    外文翻译 stus MVC

    Even if you never implement a system with Struts, you may get some ideas for your future servlets and JSP page implementation. Introduction Kids in grade school put ...

Global site tag (gtag.js) - Google Analytics