如何将Spring控制器映射到具有.jsp扩展名的URL?

8
我们正在将一个仅使用JSP的应用程序迁移到Spring-MVC。由于各种原因,我们不能更改当前页面的扩展名。(对login.jsp的调用需要由一个Spring控制器处理,该控制器将使用一个JSP文件作为视图)。
我们正在逐步进行此操作,因此某些页面需要保留为JSP文件(对welcome.jsp的调用将不会由控制器处理)。
为此,我将DispatcherServlet和HandlerMapping都映射到*.jsp,并以标准方式配置了JstlView。
不幸的是,如果我浏览到//login.jsp,就会出现错误。
<No mapping found for HTTP request with URI [/<context>/WEB-INF/jsp/login.jsp] in DispatcherServlet with name 'spring'>

如果我在DispatcherServlet和HandlerMapping中将.jsp更改为任何其他扩展名,它都可以正常工作。

web.xml:

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

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

spring-servlet.xml:

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

<!-- URL Mapping -->
<bean id="publicUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="urlMap">
        <map>
            <entry key="/login.jsp" value-ref="loginController"/>
        </map>
    </property>
</bean>

非常感谢。

更新:我刚刚验证了一下,如果我将我的.jsp文件重命名为其他名称(.jst),并相应地更新viewResolver,那么一切都可以正常工作。显然,如果视图被解析为具有扩展名.jsp的文件,则Spring会尝试将视图转发到另一个控制器。

2个回答

3

[这段内容明显是从http://forum.springsource.org/showthread.php?13263-Using-.jsp-extension抄袭过来的]

这对我有用。尝试将以下内容添加到您的web.xml文件中:

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>/WEB-INF/jsp/*</url-pattern>
</servlet-mapping>

请注意,即使有链接中的信息,我也不明白这是如何帮助的。如果有Spring专家能过来解释一下,我会很乐意知道。
我也不能保证这不会造成潜在的安全/可靠性问题,所以使用时需自行承担风险。

2
如果使用.jsp扩展名真的不起作用(虽然我个人看不出任何原因),您可以尝试先使用http://tuckey.org/urlrewrite/对URL进行重写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接