3

我对 webapp 和 WEB-INF 下的 spring mvc 和 jsp 页面位置有疑问。

假设我们有以下设置。

webapp
  WEB-INF
    mvc-dispatcher.xml
    web.xml
  login.jsp
  register.jsp
  success.jsp
  error.jsp
  index.jsp

我可以使用http://host.com/app/index.jsp之类的网址从浏览器中引用页面,然后我可以从那里链接(a href)到register.jsp。从register.jsp我发布到控制器,控制器可以返回解析为success.jsp的成功视图(使用InternalResourceViewResolver)。

如果我在WEB-INF下移动 jsp 页面(而不是之前在webapp下),我将无法从浏览器中引用http://host.com/app/index.jsp 。同样从success.jsp ,目前我使用href="index.jsp"链接到index.jsp,这将需要更改为映射到控制器(可能位于/类似于调度程序servlet),该控制器将返回索引作为视图名称。所以我所有的链接都需要由控制器提供服务。我对吗 ?或者当jsp页面位于WEB-INF下(给定InternalResourceViewResolver已配置)时,是否有办法在没有任何映射控制器的情况下引用jsp页面。

问候,

米腾。

4

1 回答 1

6

你是绝对正确的。您不能WEB-INF直接从浏览器中引用 JSP。这很好。您所有的请求都应该通过控制器转发到 JSP,并且您的所有 JSP 都应该在WEB-INF. 这样做的原因有很多:

  • 用户无法获得 JSP 的实际来源,这对安全性产生了积极影响。
  • 许多 JSP 依赖于某些请求属性的存在(模型)。当用户直接从浏览器调用 JSP 时,模型不存在。这可能会打破一些逻辑。
  • 一个 JSP 下WEB-INF可能不做任何更改就可以服务不同的 URL,用户对此一无所知!
  • 当您执行 MVC(模型 2,而不是模型 1)时,这只是一个好习惯

考虑到您关于直接引用没有控制器的 JSP 的问题:

  • 您可以通过JSP 错误页面将 HTTP 异常/Throwables 直接映射到 JSP 。例如,一种简单的技术适用于自定义 404。
  • 当使用 Apache Tiles + Spring 并访问一些/notmappedurlSpring (Tiles) 时会尝试查找notmappedurl模板定义。(根据我使用 Tiles + Spring 的经验)。我认为其他视图技术也有类似的行为。
  • 写起来并不难:@RequestMapping("/someurl")void someurl(){}. Spring 将尝试someurl根据方法名称查找视图。只是一个存根。
于 2013-02-19T11:51:50.280 回答