- 浏览: 755203 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
a offset: 26b offset: 24c offse ...
java jvm字节占用空间分析 -
ls0609:
语音实现在线听书http://blog.csdn.net/ls ...
Android 语音输入API使用 -
wangli61289:
http://viralpatel-net-tutorials ...
Android 语音输入API使用 -
zxjlwt:
学习了素人派http://surenpi.com
velocity宏加载顺序 -
tt5753:
谢啦........
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
今天使用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的处理。
发表评论
-
对字符串进行验证之前先进行规范化
2013-09-17 23:18 13957对字符串进行验证之前先进行规范化 应用系统中经常对字 ... -
使用telnet连接到基于spring的应用上执行容器中的bean的任意方法
2013-08-08 09:17 1482使用telnet连接到基于spring的应用上执行容器中 ... -
jdk7和8的一些新特性介绍
2013-07-06 16:07 10114更多ppt内容请查看:htt ... -
java对于接口和抽象类的代理实现,不需要有具体实现类
2013-06-12 09:50 2957原文链接:http://www.javaarch.net/j ... -
Excel2007格式分析和XML解析
2013-06-07 09:56 10746在物料清单采购中,用到excel上传文件解析功能,不 ... -
Java EE 7中对WebSocket 1.0的支持
2013-06-05 09:27 3846原文链接:http://www.javaarch.n ... -
java QRCode生成示例
2013-06-05 09:26 1516原文链接:http://www.javaarch.n ... -
Java Web使用swfobject调用flex图表
2013-05-28 19:05 1128Java Web使用swfobject调用 ... -
spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置
2013-05-21 15:57 3344spring使用PropertyPlaceholderCon ... -
java国际化
2013-05-20 20:57 4478java国际化 本文来自:http://www.j ... -
RSS feeds with Java
2013-05-20 20:52 1226RSS feeds with Java 原文来自:htt ... -
使用ibatis将数据库从oracle迁移到mysql的几个修改点
2013-04-29 10:40 1679我们项目在公司的大战略下需要从oracle ... -
线上机器jvm dump分析脚本
2013-04-19 10:48 2911#!/bin/sh DUMP_PIDS=`p ... -
eclipse远程部署,静态文件实时同步插件
2013-04-06 20:18 5469eclipse 远程文件实时同步,eclipse远程 ... -
java价格处理的一个问题
2013-03-26 21:21 1841我们经常会处理一些价格,比如从运营上传的文件中将某 ... -
java 服务降级开关设计思路
2013-03-23 16:35 3772java 服务屏蔽开关系统,可以手工降级服务,关闭服 ... -
poi解析excel内存溢出
2013-03-20 22:21 6406真是悲剧啊,一个破内部使用系统20多个人使用的后 ... -
简单web安全框架
2013-03-16 11:56 1551web安全框架,主要用servlet filter方 ... -
基于servlet的简单的页面缓存框架
2013-03-11 19:27 1222基于servlet的页面级缓存框架的基本用法: 代码参考: ... -
Eclipse使用过程中出现java.lang.NoClassDefFoundError的解决方案
2013-02-01 17:22 1578如果jdk,classpath设置正确,突然在eclipse ...
相关推荐
4. **页面设置变量**:使用 `#set` 指令可以设置变量,如 `#set( $a = "Velocity" )` 将创建一个名为 `a` 的变量并赋值为 "Velocity"。 5. **注释**:Velocity 提供两种注释方式,单行注释用 `##`,多行注释用 `#* ...
除了JSP,SpringMVC还支持其他视图技术,如FreeMarker、Velocity、Thymeleaf等。只需引入相应库,配置视图解析器,就能实现这些模板引擎的视图支持。例如,对于FreeMarker,我们需要配置FreeMarkerViewResolver: `...
6. **Redis数据类型**:Redis支持的数据类型包括String、Hash、List、Set和Sorted Set,不包括Map。 7. **JavaScript**:在JavaScript中,如果两个对象指向同一个引用,修改其中一个对象的属性会影响到另一个,所以...
可以自由用户自定义工具,丰富模板参数的处理,如在日期输出时对其进行格式化输出 例如: VelocityContext context = new VelocityContext(map); context.put("dateTool", new DateTool()); //添加日期工具类 模板...
通过对大数据进行分析和挖掘,可以揭示隐藏在数据中的信息和价值,为企业的发展提供有力的支持。同时,大数据的应用还促进了业务流程的变革,提高了企业的运营效率和创新能力。可以说,大数据已经成为当今时代不可或...
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)的...
标签库支持Freemarker或Velocity等模板引擎,定制化程度高;拦截器机制(Interceptors)非常实用,可以轻松实现诸如验证、事务管理等功能;支持基于控制器的导航或页面导航。 - **缺点**:相较于Struts1,WebWork/...
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) > 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 ...
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 ...