基于 User-Agent 的 Change Velocity 模板
Change Velocity templates based on User-Agent
我到处寻找解决方案,但似乎该技术不再那么流行,所以似乎也没有任何答案。
我似乎面临着一项看似不可能的任务,即基于 User-Agent[=26= 提供不同的 Apache Velocity 模板(.vm 文件) ].
问题出现在一个遗留的网络项目上,因为需要以不同的方式为移动用户提供服务。 velocity 的版本是 1.6.2,velocity-tools 的版本是 2.0.
除了我希望在呈现 Velocity 文件之前在服务器端进行用户代理检查外,我在如何操作方面有很大的自由度。
tl;dr
如何根据某些算法标准(即 User-Agent)呈现不同的 .vm 文件?
将用户代理添加到模板
String userAgent = request.getHeader("User-Agent");
mapForTemplate.put("userAgent", userAgent);
然后在模板中添加您的逻辑
#if ($userAgent == "....")
#include( "chrome.vm" )
#else
#include( "firefox.vm" )
#end
最终起作用的是在 web.xml 中创建了一个额外的 VelocityLayoutServlet
,其中包含一个单独的 <param-name>org.apache.velocity.properties</param-name>
和一个不同的 <url-pattern>
对于速度文件。
要完成解决方案,
request.getRequestDispatcher(
getPath(request.getHeader("User-Agent"))
).forward(request, response);
其中 getPath(String userAgent)
returns 基于 User-Agent 的正确 *.vm 路径(为此使用了 Mobile ESP library)。
警告:
不幸的是,<url-pattern>
不能同时支持文件夹路径表达式和文件扩展名表达式,但前者完成了工作,因此 <url-pattern>*.vm</url-pattern>
变成了 <url-pattern>velocity/*</url-pattern>
.
我到处寻找解决方案,但似乎该技术不再那么流行,所以似乎也没有任何答案。
我似乎面临着一项看似不可能的任务,即基于 User-Agent[=26= 提供不同的 Apache Velocity 模板(.vm 文件) ].
问题出现在一个遗留的网络项目上,因为需要以不同的方式为移动用户提供服务。 velocity 的版本是 1.6.2,velocity-tools 的版本是 2.0.
除了我希望在呈现 Velocity 文件之前在服务器端进行用户代理检查外,我在如何操作方面有很大的自由度。
tl;dr
如何根据某些算法标准(即 User-Agent)呈现不同的 .vm 文件?
将用户代理添加到模板
String userAgent = request.getHeader("User-Agent");
mapForTemplate.put("userAgent", userAgent);
然后在模板中添加您的逻辑
#if ($userAgent == "....")
#include( "chrome.vm" )
#else
#include( "firefox.vm" )
#end
最终起作用的是在 web.xml 中创建了一个额外的 VelocityLayoutServlet
,其中包含一个单独的 <param-name>org.apache.velocity.properties</param-name>
和一个不同的 <url-pattern>
对于速度文件。
要完成解决方案,
request.getRequestDispatcher(
getPath(request.getHeader("User-Agent"))
).forward(request, response);
其中 getPath(String userAgent)
returns 基于 User-Agent 的正确 *.vm 路径(为此使用了 Mobile ESP library)。
警告:
不幸的是,<url-pattern>
不能同时支持文件夹路径表达式和文件扩展名表达式,但前者完成了工作,因此 <url-pattern>*.vm</url-pattern>
变成了 <url-pattern>velocity/*</url-pattern>
.