¿Por qué poner JSP en WEB-INF?

Noté que un patrón común es poner páginas JSP en la carpeta WEB-INF (en lugar de la raíz WAR). ¿Cual es la diferencia? ¿Por qué es preferido?

Los archivos en WEB-INF no son visibles para los usuarios. Es un poco más seguro de esa manera.

Si (un ejemplo artificial) está incluyendo db.jsp , pero por sí solo arroja una excepción, un usuario malintencionado puede abrir http://yoursite.com/db.jsp y obtener una idea de su aplicación (lo peor: las credenciales de la base de datos) ) del mensaje de excepción.

No creo que sea un buen patrón de diseño, pero creo que puedo explicar el razonamiento.

Los contenedores de servlets no servirán ningún contenido en WEB-INF . Al colocar sus JSP allí, evita que alguien acceda directamente a un JSP navegando hasta él en el navegador por su nombre. Esto podría considerarse una buena práctica, si algunos de sus JSP son solo fragmentos de código / marcado, y no están destinados a ser utilizados directamente, y tal vez abra algún agujero de seguridad del que aún no se haya sentido.

Todavía es posible hacer que el contenedor vea y use los JSP como se esperaba, incluso en WEB-INF .

Una ventaja extra cuando se usa un Controller (o Servlet Frontal) es que desacopla la ruta de la URL de la ubicación física de los archivos JSP en su proyecto.

Como ejemplo aquí una simple solicitud de mapeo de un Controller spring :

 @RequestMapping(value = "/item/edit", method = RequestMethod.GET) public String getItemEdit(@RequestParam(value = "id", required = false) final String id) { return "itemeditform"; } 

ViewResolver se encarga de asignar la URL al lugar donde residen sus JSP.