Spring MVC View resolver - Tuong-Nguyen/Spring GitHub Wiki
- Enable to render models in the browser without any implementation to specify view.
- Maps view names to actual views
- Built-in view resolvers:
- InternalResourceViewResolver
- XmlViewResolver
- ...
Allow use to set properties, such as prefix or sufix to the view name to generate the view page
Put JSP files as views under WEB-INF, to hide them from direct access (entered URL). Only controllers will be able to access them.
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}- Accepts a configuration file written in XML with the same DTD as Spring's XML bean factories
- XML file default location is
/WEB-INF/views.xml - Implement
Orderedinterface to allow for flexible participation in ViewResolver chaining
Some special views could be defined via XmlViewResolver (give it a order value) while all remaining views could be resolved by other view resolver
- Define a bean that return XmlViewResolver as ViewResolver in
WebConfig - Create a
views.xmlin/WEB-INF/views.xmlby default or inresources(pathsrc/main/resources)<bean id="home" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://www.google.com" /> </bean>
- If XmlViewResolver is applied, when
HomeControllerruns, the browser is redirected to Google website
- If XmlViewResolver is applied, when
- We can set location for dedicated XML file
- Set order
@Bean
public ViewResolver xmlViewResolver() {
XmlViewResolver resolver = new XmlViewResolver();
Resource resource = new ClassPathResource("/views.xml"); // src/main/resources/views.xml
resolver.setLocation(resource);
resolver.setOrder(1);
return resolver;
}- Delegates to other
ViewResolverto resolve a view based on the request file name or Accept header - Set
orderfor the view resolvers to help work properly. - View resolver uses request media type to select a suitable view for request.
Dishes out JSON, XML or other formatted data with the same components. For example: we have data of a user list. For each type of request user makes, our application returns corresponding formatted data.
-
/users.xmlreturn users list in XML format -
/users.jsonreturn users list in JSON format -
/usersreturn users list in HTML format
- Override
configureContentNegotiation, set default content ishtml, supportsxmlandjsononly.
- Creates a
ContentNegotiationManagerand configures it with one or moreContentNegotiationStrategyinstances.- The order in which strategies are configured is fixed
@Override
public void configureContentNegotiation
(ContentNegotiationConfigurer configurer) {
configurer
.defaultContentType(MediaType.TEXT_HTML)
.mediaType("xml", MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON);
}- Define a bean that return
ContentNegotiatingViewResolveras ViewResolver inWebConfig
@Bean
public ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager){
ContentNegotiatingViewResolver cnViewResolver = new ContentNegotiatingViewResolver();
cnViewResolver.setContentNegotiationManager(manager);
return cnViewResolver;
}- Add JsonViewResolver
Ref: https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc
- Import
com.fasterxml.jackson.corelibrary
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>-
Must do:
- Open Project Structure, go to Artifacts, add all
com.fasterxml.jackson.core:jackson-xxxxlibraries to output - Build Artifacts
- Open Project Structure, go to Artifacts, add all
- Define a custom view resolver, ex:
JsonViewResolver, that implementViewResolver
public class JsonViewResolver implements ViewResolver {
@Override
public View resolveViewName(String viewName, Locale locale)
throws Exception {
MappingJackson2JsonView view = new MappingJackson2JsonView();
view.setPrettyPrint(true);
return view;
}
}- Add
JsonViewResolverbean
@Bean
public ViewResolver jsonViewResolver(){
JsonViewResolver resolver = new JsonViewResolver();
return resolver;
}- Add
@XmlRootElement(name="user")before the class model we need to get XML formatted data