2017-08-07 2 views
0

J'ai cherché partout des solutions, mais il semble que la technologie ne soit plus aussi populaire, donc il ne semble pas y avoir de réponses non plus.Modifier les modèles de vélocité en fonction de l'agent utilisateur

Il semble que je suis contre la tâche apparemment impossible de servir différents modèles Velocity Apache (.vm fichiers) sur la base User-Agent.

Le problème est survenu sur un projet Web hérité du besoin de servir les utilisateurs mobiles un peu différemment. La version pour la vélocité est 1.6.2 et pour velocity-tools 2.0. J'ai beaucoup de liberté quant à la façon de le faire, sauf que je voudrais que l'utilisateur-agent de vérification soit sur le côté serveur avant de rendre les fichiers Velocity.

tl; dr

Comment rendre différents .vm fichiers en fonction de certains critères algorithmiques (à savoir User-Agent)?

Répondre

0

Ce qui a finalement travaillé a été la création en web.xml un VelocityLayoutServlet supplémentaire avec une <param-name>org.apache.velocity.properties</param-name> séparée et d'une différent <url-pattern> pour les fichiers de vélocité.

Pour compléter la solution,

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

getPath(String userAgent) renvoie le chemin * .vm correct basé sur User-Agent (pour laquelle le Mobile ESP library a été utilisé).

caveat: Malheureusement, le <url-pattern> ne supporte pas en même temps une expression de chemin de dossier et une expression d'extension de fichier, mais l'ancien a fait le travail et en tant que tel est devenu <url-pattern>*.vm</url-pattern><url-pattern>velocity/*</url-pattern>.

0

agent Ajouter un utilisateur à la matrice

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

Ajoutez ensuite votre logique dans le modèle

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

Est-il possible de le faire complètement côté serveur? D'une manière ou d'une autre, en spécifiant que pour User-Agent * x * je sers 'vm1/*. Vm' et pour User-Agent * y * je sers' vm2/*. Vm'? – azatris

+0

Pourquoi pas? Ajouter si "...". Equals (userAgent) template = "vm1/.... vm" else template = "vm2/.... vm" – user7294900

+0

Malheureusement, le projet hérité est configuré de telle sorte que * VelocityLayoutServlet * est le servlet défini dans le fichier web.xml avec le fichier * velocity.properties * correspondant où sont inclus les chemins de fichier * .vm * inclus. Je ne vois aucun moyen de spécifier des modèles à n'importe quel point de la configuration. – azatris