基于 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>.