2017-08-07 64 views
0

我已到处寻找解决方案,但似乎技术不再那么受欢迎,所以似乎也没有任何答案。更改基于用户代理的速度模板

看来我对抗服务基于用户代理不同的Apache Velocity模板(.vm文件)看似不可能完成的任务。

由于需要为移动用户提供稍微不同的服务,传统Web项目出现问题。 velocity的版本是1.6.2,velocity-tools 2.0的版本。

我有很多关于如何做到这一点的自由,除了我想在渲染Velocity文件之前在服务器端进行User-Agent检查。

TL;博士

如何基于一些算法标准(即用户代理)呈现不同.vm文件?

回答

0

什么终于摸索中创造web.xml中附加VelocityLayoutServlet设有独立<param-name>org.apache.velocity.properties</param-name>,并用添加你的逻辑用于速度文件的不同<url-pattern>

要完成溶液,

request.getRequestDispatcher( getPath(request.getHeader("User-Agent")) ).forward(request, response);

其中(用于该Mobile ESP librarygetPath(String userAgent)返回基于用户代理正确* .vm路径。

警告: 不幸的是,<url-pattern>不同时支持文件夹路径表达式和文件扩展名的表达,但前者做的工作,因此<url-pattern>*.vm</url-pattern>成为<url-pattern>velocity/*</url-pattern>

0

添加用户代理模板

String userAgent = request.getHeader("User-Agent"); 
    mapForTemplate.put("userAgent", userAgent); 

然后在模板

#if ($userAgent == "....") 
    #include("chrome.vm") 
#else 
    #include("firefox.vm") 
#end 
+0

是否有可能在服务器端完全做到这一点?以某种方式指定为User-Agent * x *我服务'vm1/*。vm'并为User-Agent * y *我服务'vm2/*。vm'? – azatris

+0

为什么不呢?添加如果“...”。equals(userAgent)template =“vm1/.... vm”else template =“vm2/.... vm” – user7294900

+0

不幸的是,传统项目的设置方式是* VelocityLayoutServlet *是web.xml中定义的servlet,其中包含包含* .vm *文件路径的相应* velocity.properties *。我看不到任何方式在设置中的任何点指定模板。 – azatris