Velocity学习(二)绝对路径 ContextPath
程序员文章站
2022-06-12 09:55:31
...
Velocity学习(一)文章中,使用Velocity简单在页面中输出了一句话,接下来想在template文件中引用图片、CSS文件或者JS文件,也就是要处理一些与路径相关问题。要在模板中引入一张图片,摆在面前一个首要问题就是图片的路径问题。这时候想到在JSP中如何引入图片,JSP中通过Request.getContextPath()可以获得项目根目录,也就是说在Velocity中如果拿到了项目的根目录也就解决了上面的路径问题。很幸运的是Velocity的开发者已经预料到这个问题。
创建toolbox配置文件,通常使用XML文件,将tool.xml配置文件的路径配置到web.xml文件中。
<?xml version="1.0" encoding="UTF-8"?> <tools> <toolbox scope="request"> <tool key="link" class="org.apache.velocity.tools.view.LinkTool" forceRelative="true" includeRequestParams="true"/> </toolbox> </tools>
配置web.xml文件
<context-param> <param-name>org.apache.velocity.toolbox</param-name> <param-value>/WEB-INF/tools.xml</param-value> </context-param>
在模板中使用$link.contextPath就可以获得项目根目录
<body> <div style="margin:20px;"></div> <div style="width:50%"> <table width="50%"> <tr><th>姓名</th><th>头像</th></tr> <tr> <td>$userName</td> <td><img src="$link.contextPath/resources/images/head.jpg" width="60" heigth="60"/></td> </tr> </table> </div> </body>
效果如下:
Context有多个构造器,在构造Contex对象时可以传递Map对象或者InnerContext对象构造方法如下
在Servlet中要灵活使用Context对象,可以采用下面一种解决方案
@SuppressWarnings("serial") public class UserServlet extends VelocityViewServlet { @Override protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) { Template template = getTemplate("user.html"); return template; } @Override protected void fillContext(Context context, HttpServletRequest request) { // TODO Auto-generated method stub context.put("userName", "薛之谦"); } @Override protected void mergeTemplate(Template template, Context context, HttpServletResponse response) throws IOException { // context 进行了一些参数初始化 // TODO Auto-generated method stub Map<String, Object> values = new HashMap<String, Object>(); values.put("userName", "薛之谦"); // 组织复杂的数据可以这样 Context context2 = new VelocityContext(values, context); super.mergeTemplate(template, context2, response); } }