C'è un altra opzione suggerita here
Tuttavia ho deciso Estendendo a ContentNegotiatingViewResolver e sovrascrivendo il metodo resolveViewName, ho chiamato il mio ViewResolver HttpHeaderParamViewResolver. Il metodo esteso simile a questa:
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
//Get the HTTP Header param "User-Agent"
String headerParamValue = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getHeader(headerParam);
viewName = setViewName(viewName, headerParamValue);
return super.resolveViewName(viewName, locale);
}
Dove headerParam = "User-Agent" (o qualsiasi altro parametro HTTP Header vi piace, questo è definito nel xml di fagioli), dopo di che si valuta e determinare il viewName. Nel mio caso, il HttpHeaderParamViewResolver può essere configurato con una mappa in cui la chiave è un prefisso da aggiungere all'effettivo viewName e il valore è un RegExp che verrà utilizzato per valutare il valore dell'intestazione param.Sembra qualcosa di simile nel contesto XML App:
<bean id="HttpHeaderViewResolver" class="com.application.viewresolver.HttpHeaderParamViewResolver">
<property name="viewResolvers">
<list>
<ref bean="tilesViewResolver"/>
</list>
</property>
<property name="headerParam" value="User-Agent"/>
<property name="viewPrefixPattern">
<map>
<entry>
<key>
<value>mobile-webkit</value>
</key>
<value>iPhone.*Apple.*Mobile.*Safari</value>
</entry>
<entry>
<key>
<value>mobile-bb</value>
</key>
<value>BlackBerry([0-9]{0,4})([a-zA-Z])?</value>
</entry>
</map>
</property>
</bean>
In questo modo il mio controller se chiama una vista chiamato UserDetails e accede l'applicazione con un iPhone il primo modello cattura i essa e aggiunge il Mobile- webkit suffisso quindi la vista è ora mobile-webkit-userDettagli e passa quindi a tilesViewResolver che genera la vista effettiva.
Ho esplorato molte possibilità e penso che questo sia il modo più semplice e flessibile che sono riuscito a trovare. In questo caso, la possibilità di scegliere una visione completamente diversa è stata fondamentale perché supportiamo un'ampia varietà di agenti utente, da WAP a IPhone 4 e dispositivi mobili compatibili con WebKit, pertanto le visualizzazioni cambiano notevolmente da user-agent a user-agent. Un altro vantaggio è che non è più necessario gestire questo problema sulla vista poiché è possibile avere visualizzazioni specializzate a piacere. Un altro lato positivo è che è possibile implementarlo abbastanza facilmente senza dover rimuovere o modificare i risolutori di visualizzazione che si potrebbero avere dal ContentNegotiatingViewResolver ha la capacità di delegare la chiamata di visualizzazione ad altri resolver di vista nella sequenza specifica definita.
Il lato negativo è che potresti essere tentato di specializzarti troppo nelle viste e finire con un sacco di file di visualizzazione che rendono l'app un incubo sostenibile.
spero che sia utile.
Un risolutore di viste personalizzato sarebbe abbastanza semplice, non credo che diventerai più semplice di così. – skaffman
Sì, solo per assicurarmi che non stia trascurando qualcosa di ovvio. –