【问题标题】:Introducing Spring MVC介绍 Spring MVC
【发布时间】:2009-08-14 17:58:06
【问题描述】:

我想将 Spring MVC 介绍给一个迄今为止使用简单直接访问 JSP 文件的应用程序,即包含业务逻辑和表示细节的 www.example.com/login.jsp

我想剥离业务逻辑,只保留 JSP 中的表示。为此,我将 jsp 文件从 webapp/login.jsp 移动到 webapp/WEB-INF/jsp/login.jsp,然后将所有带有 *.jsp 模式的 url 映射到 Spring 的 DispatchServlet,该 DispatchServlet 转到一个控制器,然后是一个(应该)转发到 @987654325 的视图@。

web.xml 看起来像这样:

<servlet>
    <servlet-name>springapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

springapp-context.xml

<bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <value>
            /*.jsp=urlFilenameViewController
        </value>
    </property>
</bean>

<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"></property>
</bean>

但是,这样做的根本问题是,我将以 .jsp 结尾的外部 URL 请求映射到也映射到 .jsp 的内部 Web 请求。然后内部.jsp 请求第二次通过 DispatchServlet,它返回错误,因为它找不到任何东西来处理请求:

WARN - DispatcherServlet.noHandlerFound(1077) | No mapping found for HTTP request with URI [/myapp/WEB-INF/jsp/login.jsp] in DispatcherServlet with name 'springapp'

鉴于我无法更改外部 URL,在将外部文件类型映射到相同的内部文件类型时,有没有办法解决这个问题?

【问题讨论】:

  • 我猜您不能只在不同的文件扩展名下显示外部 URL,例如 .htm?
  • 不,很遗憾,我无法更改外部 URL,因为我们已经有依赖它们的客户端。

标签: java servlets spring-mvc


【解决方案1】:

我们在应用程序中通过对请求 URL 使用不同的模式(*.htm 而不是 *.jsp)来解决这个问题。这可以避免这个问题,而且无论如何这是一个很好的做法,因为 URL 和 JSP 之间可能没有一对一的关系。

【讨论】:

  • 恐怕我不能选择不同的外部 URL 扩展,因为我们已经有依赖于 *.jsp URL 的客户端。不幸的是,我们在项目开始时做出了这个(不可否认的错误)决定,这是无法逆转的!
  • 也许您可以对传入的请求进行 URL 重写,以在 servlet 获取扩展之前切换扩展。我使用了来自 tukey.org 的 UrlRewriteFilter,它运行良好。或者,如果您的应用程序前面有 Apache Web 服务器,您可以使用 mod_rewrite。只需 google 搜索“URL 重写”即可找到这些链接和其他链接。但是,这种方法需要您维护要重写的 URL(或 URL 模式)列表。希望这只是暂时的。
【解决方案2】:

我建议你:

  • 将 Spring MVC 请求映射到不同的模式(例如 *.do);
  • 使用UrlRewriteFilter 或应用服务器的url 重写功能将*.jsp 调用映射到*.do

【讨论】:

    【解决方案3】:

    我不确定如何告诉 Spring 忽略其对 JSP 文件的内部请求,但拦截其他 JSP 请求。为什么不保留旧的 jsps,而只是将它们转发给控制器。例如。 “page.jsp”:

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
    <c:redirect url="/page.htm" />
    

    这样,您可以保持旧 URL 不变,但唯一的功能是重定向到控制器。

    【讨论】: