Add initial support for MVC namespace view resolution config

<mvc:view-resolution /> now allows to configure easily
view resolvers.

Issue: SPR-7093
This commit is contained in:
Siva Prasad Valluru
2013-12-15 18:15:04 +05:30
committed by Rossen Stoyanchev
parent b318880661
commit 92402e7715
6 changed files with 260 additions and 1 deletions

View File

@@ -28,13 +28,14 @@ import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
*/
public class MvcNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser());
}
}

View File

@@ -0,0 +1,158 @@
package org.springframework.web.servlet.config;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.xml.DomUtils;
import org.springframework.web.servlet.view.BeanNameViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
import org.springframework.web.servlet.view.tiles2.TilesConfigurer;
import org.springframework.web.servlet.view.tiles2.TilesView;
import org.springframework.web.servlet.view.tiles2.TilesViewResolver;
import org.w3c.dom.Element;
public class ViewResolversBeanDefinitionParser implements BeanDefinitionParser {
private static final String INTERNAL_VIEW_RESOLVER_BEAN_NAME =
"org.springframework.web.servlet.view.InternalResourceViewResolver";
private static final String TILES2_VIEW_RESOLVER_BEAN_NAME =
"org.springframework.web.servlet.view.tiles2.TilesViewResolver";
private static final String TILES2_CONFIGURER_BEAN_NAME =
"org.springframework.web.servlet.view.tiles2.TilesConfigurer";
private static final String BEANNAME_VIEW_RESOLVER_BEAN_NAME =
"org.springframework.web.servlet.view.BeanNameViewResolver";
private static final String FREEMARKER_CONFIGURER_BEAN_NAME =
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer";
private static final String FREEMARKER_VIEW_RESOLVER_BEAN_NAME =
"org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver";
private ParserContext parserContext;
private Object source;
public BeanDefinition parse(Element element, ParserContext parserContext) {
this.parserContext=parserContext;
source= parserContext.extractSource(element);
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(),source);
parserContext.pushContainingComponent(compDefinition);
List<Element> viewResolverElements = //DomUtils.getChildElements(element);
DomUtils.getChildElementsByTagName(element, new String[] { "jsp", "tiles","bean-name","freemarker" });
for (Element viewResolverElement : viewResolverElements) {
if ("jsp".equals(viewResolverElement.getLocalName())) {
registerInternalResourceViewResolverBean(parserContext,viewResolverElement);
System.out.println("Registered Internalresource view resolver");
}
if("bean-name".equals(viewResolverElement.getLocalName())){
registerBeanNameViewResolverBean(parserContext,viewResolverElement);
System.out.println("Registered BeanNameViewResolverBean view resolver");
}
if ("tiles".equals(viewResolverElement.getLocalName())) {
registerTilesViewResolverBean(parserContext,viewResolverElement);
registerTilesConfigurerBean(parserContext,viewResolverElement);
}
if("freemarker".equals(viewResolverElement.getLocalName())){
registerFreemarkerViewResolverBean(parserContext,viewResolverElement);
registerFreemarkerConfigurerBean(parserContext,viewResolverElement);
}
}
// MvcNamespaceUtils.registerDefaultComponents(parserContext, source);
parserContext.popAndRegisterContainingComponent();
return null;
}
private void registerBean(String beanName,Map<String,Object> propertyMap,Class beanClass ){
RootBeanDefinition beanDef = new RootBeanDefinition(beanClass);
beanDef.setSource(source);
beanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
for(String propertyName:propertyMap.keySet()){
beanDef.getPropertyValues().add(propertyName, propertyMap.get(propertyName));
}
parserContext.getRegistry().registerBeanDefinition(beanName, beanDef);
parserContext.registerComponent(new BeanComponentDefinition(beanDef, beanName));
}
private void registerFreemarkerConfigurerBean(ParserContext parserContext, Element viewResolverElement) {
String templateLoaderPath=viewResolverElement.getAttribute("templateLoaderPath");
Map<String, Object> propertyMap= new HashMap<String, Object>();
propertyMap.put("templateLoaderPath", templateLoaderPath);
registerBean(FREEMARKER_CONFIGURER_BEAN_NAME, propertyMap, FreeMarkerConfigurer.class);
}
private void registerFreemarkerViewResolverBean(ParserContext parserContext, Element viewResolverElement) {
if (!parserContext.getRegistry().containsBeanDefinition(FREEMARKER_VIEW_RESOLVER_BEAN_NAME)) {
Map<String, Object> propertyMap= new HashMap<String, Object>();
propertyMap.put("prefix", viewResolverElement.getAttribute("prefix"));
propertyMap.put("suffix", viewResolverElement.getAttribute("suffix"));
propertyMap.put("order", 4);
registerBean(FREEMARKER_VIEW_RESOLVER_BEAN_NAME, propertyMap, FreeMarkerViewResolver.class);
}
}
private void registerBeanNameViewResolverBean(ParserContext parserContext, Element viewResolverElement) {
if (!parserContext.getRegistry().containsBeanDefinition(BEANNAME_VIEW_RESOLVER_BEAN_NAME)) {
Map<String, Object> propertyMap= new HashMap<String, Object>();
propertyMap.put("order", 3);
registerBean(BEANNAME_VIEW_RESOLVER_BEAN_NAME, propertyMap, BeanNameViewResolver.class);
System.out.println("Registered BeanNameViewResolverBean view resolver");
}
}
private void registerTilesConfigurerBean(ParserContext parserContext,Element viewResolverElement) {
if (!parserContext.getRegistry().containsBeanDefinition(TILES2_CONFIGURER_BEAN_NAME)) {
Map<String, Object> propertyMap= new HashMap<String, Object>();
propertyMap.put("definitions", viewResolverElement.getAttribute("definitions"));
registerBean(TILES2_CONFIGURER_BEAN_NAME, propertyMap, TilesConfigurer.class);
}
}
private void registerTilesViewResolverBean(ParserContext parserContext, Element viewResolverElement) {
if (!parserContext.getRegistry().containsBeanDefinition(TILES2_VIEW_RESOLVER_BEAN_NAME)) {
Map<String, Object> propertyMap= new HashMap<String, Object>();
propertyMap.put("viewClass", TilesView.class);
propertyMap.put("order", 1);
registerBean(TILES2_VIEW_RESOLVER_BEAN_NAME, propertyMap, TilesViewResolver.class);
}
}
private void registerInternalResourceViewResolverBean(ParserContext parserContext, Element viewResolverElement) {
if (!parserContext.getRegistry().containsBeanDefinition(INTERNAL_VIEW_RESOLVER_BEAN_NAME)) {
Map<String, Object> propertyMap= new HashMap<String, Object>();
propertyMap.put("prefix", viewResolverElement.getAttribute("prefix"));
propertyMap.put("suffix", viewResolverElement.getAttribute("suffix"));
propertyMap.put("order", 2);
registerBean(INTERNAL_VIEW_RESOLVER_BEAN_NAME, propertyMap, InternalResourceViewResolver.class);
}
}
}