Wednesday, October 30, 2013

Sitemesh 2 with Spring MVC 3 – multiple layout for multiple controller

Recently I had bitter experience setting up different layout in sitemesh for different controller of Spring. In general as a developer my expectation is for different controller I setup different url and for each url I add a decorator with unique name and different layout page.
For instance, I have two controllers – AdminController and UserController as follows.
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/admin")
public class AdminController {
 
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public String index() {
        return "admin/index";
    }
}
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/user")
public class UserController {
 
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public String index() {
        return "user/index";
    }
}
So, url project/admin/index – points to admin controller’s index page
and url project/user/index points to user controller’s index page.
Now I want to decorate two urls with two different sitemesh layout. decorator.xml looks like –
1
2
3
4
5
6
7
8
9
10
xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/layouts">
    <decorator name="admin" page="admin.jsp">
        <pattern>*admin*</pattern>
    </decorator>
 
    <decorator name="user" page="user.jsp">
        <pattern>*user*</pattern>
    </decorator>
</decorators>
Take a look into public Decorator getDecorator(HttpServletRequest request, Page page) method in ConfigDecoratorMapper.java
1
2
3
4
5
6
7
8
9
<servlet>
    <servlet-name>project</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
 
<servlet-mapping>
    <servlet-name>project</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
Now request.getServletPath() will return the whole url with controller/method specific part for example /admin/index.html. So the pattern in decorator will work as expected. However it might not be feasiable for you to setup dispatcher servlet mapping like this and you still want different layout for different controller. In that case you might want to consider setting sitemesh layout via meta tag in view jsp.

1 comment:

jeje said...

C'est là que le designer nike air jordan 4 iv retro nuptiale Minal Shah peut vous aider, avec ses conseils d'experts sur ce qu'il faut considérer lors du choix de cette fabuleuse robe. La bioélectronique pourrait être l'application des principes de l'électronique à la biologie et à la médecine. Rajon Rondo et Russell Westbrook sont quelques-uns des joueurs avec PE de Hyperenforcer. Il existe de nombreux magasins, ne pas oublier nike air jordan basketzone les magasins en ligne aussi efficacement à partir d'où vous pouvez commander des vêtements de style urbain de votre choix qui s'intègre bien dans votre budget de dépenses. Eh bien, l'individu a raison. Le but clair de Loctite GO2 Glue aidera les gens chaussure nike sb rouge à faire des réparations invisibles avec moins de problèmes.