Es gibt eine andere Option here vorgeschlagen
Jedoch habe ich beschlossen Erweiterung a ContentNegotiatingViewResolver und überschreiben die resolveViewName Methode, rief ich meine ViewResolver HttpHeaderParamViewResolver. Die erweiterte Methode sieht wie folgt aus:
@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);
}
Wo headerParam = "User-Agent" (oder eine andere HTTP-Header-Parameter Sie so wollen, ist dies in der Bean-xml definiert), nach, dass Sie bewerten und Bestimmen Sie den viewName. In meinem Fall kann der HttpHeaderParamViewResolver mit einer Map konfiguriert werden, wobei der Schlüssel ein Präfix ist, das an den tatsächlichen viewName angehängt wird, und der Wert ist eine RegExp, die verwendet wird, um den Wert des Header-Parameters zu bewerten.Es sieht so etwas wie dies in der App XML Kontext:
<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>
auf diese Weise das, wenn mein Controller ruft eine Ansicht Userdetails genannt und ist die Anwendung mit einem IPhone Zugriff auf das erste Muster Fängen einhergehen sie und fügt die Mobile- webkit suffix so die ansicht ist jetzt mobile-webkit-userDetails und seine dann an die tilesViewResolver übergeben, die die tatsächliche Ansicht generiert.
Ich habe viele Möglichkeiten erforscht und ich denke, das ist die einfachste und flexibelste, die ich mir ausgedacht habe. In diesem Fall war die Möglichkeit, eine ganz andere Ansicht auszuwählen, von entscheidender Bedeutung, da wir eine Vielzahl von Benutzeragenten unterstützen, von WAP- bis zu IPhone 4- und WebKit-fähigen Mobiltelefonen, sodass sich Ansichten vom Benutzeragenten zum Benutzeragenten dramatisch ändern. Ein weiterer Vorteil ist, dass Sie dieses Problem nicht mehr in der Ansicht behandeln müssen, da Sie Ansichten so spezialisiert haben können, wie Sie möchten. Eine andere gute Seite ist, dass Sie dies ganz einfach implementieren können, ohne die bereits vorhandenen Ansichtsresolver entfernen oder ändern zu müssen. ContentNegoatingViewResolver hat die Möglichkeit, den Aufruf der Ansicht an andere View Resolver in der von Ihnen definierten Reihenfolge zu delegieren.
Der Nachteil ist, dass Sie versucht werden, die Ansichten zu spezialisieren und am Ende mit einer Menge von View-Dateien enden, die die App zu einem wartbaren Alptraum machen.
Ich hoffe, es ist hilfreich.
Eine benutzerdefinierte Ansicht Resolver wäre ziemlich einfach, ich glaube nicht, dass Sie einfacher als das bekommen. – skaffman
Ja, ich stellte nur sicher, dass ich etwas Offensichtliches nicht übersah. –