功能:使用Velocity的tool功能,去格式化日期字段,
条件限制:非web环境,velocity1.4.jar + velocity-tool-view-1.1.jar
思路:模拟web环境下的ChainedContext,来定制一个context即可
View Code
public
class
VelocityUtil
{
public static final String ENCODING = " UTF-8 " ;
public static final String TOOLBOX_PATH = " velocity/template/toolbox.xml " ;
private VelocityUtil(){};
private static VelocityContext getContext(Map < String, Object > params) throws Exception
{
ToolboxContext toolboxContext = new ToolboxContext(params);
XMLToolboxManager xmlManager = new XMLToolboxManager();
String toolboxFile = VelocityUtil. class .getClassLoader().getResource(TOOLBOX_PATH).getPath();
xmlManager.load( new FileInputStream( new File(toolboxFile)));
ChainedContext context = new ChainedContext(toolboxContext);
context.setToolbox(xmlManager.getToolboxContext(context));
return context;
}
private static VelocityEngine init(String templatePath) throws Exception
{
VelocityEngine ve = new VelocityEngine();
Properties prop = new Properties();
prop.setProperty( " file.resource.loader.path " , VelocityUtil. class .getClassLoader().getResource(templatePath).getPath());
prop.setProperty( " input.encoding " , ENCODING);
prop.setProperty( " output.encoding " , ENCODING);
ve.init(prop);
return ve;
}
/**
* generate string from template
* @param templatePath : template files' directionary, example as : velocity/template/hp/execforum
* @param fileName : template file's name, suce as :
* @param params
* @return
* @throws Exception
*/
public static String generate(String templatePath, String fileName, Map < String, Object > params) throws Exception
{
VelocityEngine ve = init(templatePath);
Template template = ve.getTemplate(fileName, ENCODING);
VelocityContext context = getContext(params);
StringWriter writer = new StringWriter();
template.merge(context, writer);
// System.out.println("----------\n" + writer.toString());
return writer.toString();
}
private static class ChainedContext extends VelocityContext
{
private static final long serialVersionUID = 5729583723890287479L ;
private ToolboxContext toolboxContext = null ;
public ChainedContext(Context ctx)
{
super ( null , ctx );
}
public void setToolbox(ToolboxContext box)
{
toolboxContext = box;
}
public Object internalGet( String key )
{
Object o = null ;
if (toolboxContext != null )
{
o = toolboxContext.get(key);
if (o != null )
{
return o;
}
}
o = super .internalGet(key);
return o;
}
}
}
{
public static final String ENCODING = " UTF-8 " ;
public static final String TOOLBOX_PATH = " velocity/template/toolbox.xml " ;
private VelocityUtil(){};
private static VelocityContext getContext(Map < String, Object > params) throws Exception
{
ToolboxContext toolboxContext = new ToolboxContext(params);
XMLToolboxManager xmlManager = new XMLToolboxManager();
String toolboxFile = VelocityUtil. class .getClassLoader().getResource(TOOLBOX_PATH).getPath();
xmlManager.load( new FileInputStream( new File(toolboxFile)));
ChainedContext context = new ChainedContext(toolboxContext);
context.setToolbox(xmlManager.getToolboxContext(context));
return context;
}
private static VelocityEngine init(String templatePath) throws Exception
{
VelocityEngine ve = new VelocityEngine();
Properties prop = new Properties();
prop.setProperty( " file.resource.loader.path " , VelocityUtil. class .getClassLoader().getResource(templatePath).getPath());
prop.setProperty( " input.encoding " , ENCODING);
prop.setProperty( " output.encoding " , ENCODING);
ve.init(prop);
return ve;
}
/**
* generate string from template
* @param templatePath : template files' directionary, example as : velocity/template/hp/execforum
* @param fileName : template file's name, suce as :
* @param params
* @return
* @throws Exception
*/
public static String generate(String templatePath, String fileName, Map < String, Object > params) throws Exception
{
VelocityEngine ve = init(templatePath);
Template template = ve.getTemplate(fileName, ENCODING);
VelocityContext context = getContext(params);
StringWriter writer = new StringWriter();
template.merge(context, writer);
// System.out.println("----------\n" + writer.toString());
return writer.toString();
}
private static class ChainedContext extends VelocityContext
{
private static final long serialVersionUID = 5729583723890287479L ;
private ToolboxContext toolboxContext = null ;
public ChainedContext(Context ctx)
{
super ( null , ctx );
}
public void setToolbox(ToolboxContext box)
{
toolboxContext = box;
}
public Object internalGet( String key )
{
Object o = null ;
if (toolboxContext != null )
{
o = toolboxContext.get(key);
if (o != null )
{
return o;
}
}
o = super .internalGet(key);
return o;
}
}
}
然后在.vm模板中,使用下面的方式来格式化日期,
$date.format('h:mm a', $item.startDatetime)
输出:
10:10 下午
如果要指定日期的locale,可以继承DateTool,override父类的getLocale方法(例如返回:Locale.US),最后将该类注册到 toolbox.xml即可
输出:10:10 PM