2017-08-07 32 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