¿Cómo reusar un JSP como vista para diferentes mapeos de solicitudes en Spring MVC? No plantillas

publicado por: user227

Digamos que tengo la siguiente estructura de carpetas dento de WEB-INF:

WEB-INF
- jsp
  - foo
    + bar.jsp

Utilizo el siguiente view resolver:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

bar.jsp tiene el siguiente contenido:

<!DOCTYPE html>
<html lang="en">
    <head> ... </head>
    <body>
        Hola ${nombre}
    </body>
</html>

Tengo el siguiente controlador:

@Controller
@RequestMapping("/foo")
public class MiControlador {
    @RequestMapping("/bar.html")
    public void muestraBar(Model model) {
        model.addAttribute("nombre", "Luiggi");
    }
}

Ahora quiero reusar bar.jsp en el mismo controlador pero usando un mapeo de solicitud diferente, de esta manera:

@Controller
@RequestMapping("/foo")
public class MiControlador {
    @RequestMapping("/bar.html")
    public void muestraBar(Model model) {
        model.addAttribute("nombre", "Luiggi");
    }
    @RequestMapping("/quo.html")
    public String muestraQuo(Model model) {
        model.addAttribute("nombre", "Thomas");
        return "bar";
    }
}

El método usado arriba fallará porque Spring MVC buscará bar.jsp en la raíz, esto es, dentro de WEB-INF/jsp. Quiero/necesito reusar bar.jsp porque básicamente utilizo el mismo contenido, solo con datos diferentes para completar los atributos.

Actualmente, conozco una solución inflexible que es retornar la ruta completa de bar.jsp:

@RequestMapping("/quo.html")
public String muestraQuo(Model model) {
    model.addAttribute("nombre", "Thomas");
    return "foo/bar";
}

¿Existe otra manera de lograr esto?

Nota: No es uso de plantillas. Solo quiero usar el mismo recurso JSP para dos vistas únicamente con URLs diferentes, tal como se muestra en el ejemplo.

solución

Podrias detectar dinamicamente el mapeo usado en la URL y en el mismo metodo decidir dentro que datos mandar a tu vista:

    @RequestMapping({"/bar.html", "/quo.html"})
    public String muestraVista(Model model, HttpServletRequest request) {
        // Aqui obtiene el patron usado en la URL
        String patron= (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);

        // patron seria "/bar.html" o "/quo.html", dependiendo de la url requerida
        System.out.println("Patron encontrado: "+ patron);

        if(patron.equals("/bar.html")){
            model.addAttribute("nombre", "Luigi");
        }else{
            model.addAttribute("nombre", "Thomas");
        }

        return "bar";
    }
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *