Spring MVC资源映射

4

我一直在测试Spring MVC中的请求映射,并在我的应用程序中遇到了一个奇怪的情况。我决定创建一个简单的场景,以便您能够理解我的问题。首先,我将向您展示我的项目(源代码)的详细信息,然后再提出我的问题。

我的项目具有以下目录结构:

+webapp
  +WEB-INF
    +recursos
      +estilos
        test.css
    +spring
      fronte-beans.xml
    +views
      +testes
        page1.jsp
        page2.jsp
  web.xml

我的Tomcat部署描述符:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.4">

    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>fronte</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/spring/fronte-beans.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>fronte</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

我的DispatcherServlet的应用程序上下文:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd ">

    <mvc:annotation-driven />

    <mvc:resources mapping="/recursos/**" location="/WEB-INF/recursos/" />

    <context:component-scan base-package="com.regra7.minhaapp.contro" />

    <bean id="handlerMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    </bean>

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

</beans>

我的控制器类用于page1.jsp页面:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value="/path")
public class TestController 
{
    @RequestMapping(value="/to/something")
    public String getPage()
    {
        return "testes/page2";
    }
}

我的页面1.jsp:

<!DOCTYPE html>

<%@ page 
    language="java" 
    contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<html lang="pt-BR">

    <!-- ############################################### -->
    <!--                                          HEADER -->
    <!-- ############################################### -->

    <head>
        <title>Test Page</title>
        <meta name="author"                 content="RDS"       />
        <meta name="description"            content="? ? ?" />

        <meta charset="UTF-8" />

        <link rel="stylesheet" type="text/css" href="recursos/estilos/test.css" media="all" />
    </head>

    <!-- ############################################### -->
    <!--                                            BODY -->
    <!-- ############################################### -->

    <body>

        <h1>PAGE 1</h1>
        <p>This is a test, p1.</p>
        <p>This is a test, p2.</p>
        <p>This is a test, p3.</p>

        <a href="${pageContext.request.contextPath}/path/to/something">CLICK TO PAGE 2</a>

    </body>

</html>

我可以顺利访问page1.jsp和page2.jsp页面,但是page2.jsp的CSS文件无法找到。我的控制台输出以下文本:
dez 29, 2014 8:16:22 PM org.springframework.web.servlet.PageNotFound noHandlerFound
WARNING: No mapping found for HTTP request with URI [/testeSpringMvc/path/to/recursos/estilos/test.css] in DispatcherServlet with name 'fronte'

为什么"/path/to"会出现在最终路径中?如果我尝试添加不同的映射组合,无论是类级别还是方法级别,都会发生同样的事情。但是,如果我将链接映射到查询字符串(URL),则可以轻松找到文件,如下所示...

page1.jsp:

<a href="${pageContext.request.contextPath}/?cd=page2">CLICK TO PAGE 2</a>

控制器:

@Controller
@RequestMapping(value="/")
public class TestController
...
@RequestMapping(params="cd=page2")
public String getPage()

发生了什么?我该如何设置所需路径,使页面可以使用和找到必要的资源?我尝试将不同路径的页面分开,以便可以应用来自Tomcat的安全特性(安全约束)。

注意:我尝试使用contextPath来帮助我设置CSS文件路径,但没有任何作用。事实上,情况变得更糟糕了,因为Page1.jsp也没有样式:

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}recursos/estilos/test.css" media="all" />

一如既往,感谢您的关注和时间。

技术相关内容:无法翻译,需要提供具体内容。
4个回答

3

我也遇到了同样的问题,但我找到了解决方法。希望这能帮到其他人:

正如您在错误消息中看到的那样,您用于资源的路径/testeSpringMvc/path/to/recursos/estilos/test.css正在尝试由Spring的DispatchServlet解析。

这是因为在您的web.xml文件中有以下内容:

<servlet-mapping>
    <servlet-name>fronte</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

你的 fronte servlet 会尝试解析任何以 / 开头的内容。

只需在你的 <url-pattern> 中添加一个简单的扩展即可。例如,<url-pattern>/*.html</url-pattern> 应该可以完成工作。


谢谢你分享这个。我肯定不是唯一一个经历这种情况的人。非常感谢你的关注和可用性。我相信其他人也会看到它,因为他们可能正在经历同样的情况。谢谢! :) - Loa

2
我刚找到了解决我的问题的答案。我会在这里留下解决方案,但不幸的是,我没有理解它如何解决所见的情况。
我发现这可以通过JSTL来解决。我读了JSTL文档,所有我发现了这个描述:

创建一个带有可选查询参数的URL。

如果使用以下语句更改对CSS文件的引用,问题将得到解决:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<link rel="stylesheet" type="text/css" href="<c:url value="/recursos/estilos/test.css" />" media="all" />

如果任何版主看到这篇文章并知道如何解决问题,请在此处披露。请编辑我的回答,或评论它。我相信未来其他人可能会有同样的疑问。
感谢所有关注和支持。

0

看看这个博客文章。相关段落如下:

If I want to apply main.css to url: www.mysite.com/index.html, I need to use following construction in HTML code:

< link href="resources/css/main.css" rel="stylesheet" type="text/css"/ >  

If I want to apply main.css to url: www.mysite.com/some/location.html, I need to use following construction in HTML code:

< link href="../resources/css/main.css" rel="stylesheet" type="text/css"/ >

作为一种可能的解决方法,也许这个可以起作用:

<mvc:resources mapping="/**/recursos/**" location="/WEB-INF/recursos/" />

谢谢您的回答。我尝试更改我的应用程序上下文文件,然后也尝试按照提到的方法更改page2.jsp。不幸的是,我没有得到结果。您还有什么建议吗?无论如何感谢您。 - Loa
只是为了明确,您尝试将page2.jsp中的css链接更改为: <link rel="stylesheet" type="text/css" href="../../recursos/estilos/test.css" media="all" /> - Don Bottstein
事实上,我之前尝试了其他方法,但在阅读了您的评论后,我尝试了您建议的方法,不幸的是它没有起作用...我真的对此感到沮丧,我知道我做错了什么。我相信有办法以保持页面样式的方式进行映射。您是否知道一些资源可以指导我查找答案?我将永远感激不尽。如果将来我找到答案,我会在这里与大家分享。无论如何,谢谢您。 - Loa

0

您可以按照以下方式访问资源。

     <link rel="stylesheet" type="text/css" href="/recursos/estilos/test.css" media="all" />

你在开头缺少了 /


谢谢您的回复,但是它没有起作用。现在page1.jsp也没有CSS样式。 - Loa
当您直接访问CSS URL时,会返回什么? - kamoor
你能打开war文件并查看test.css存储在哪里吗? - kamoor
当我查看页面的源代码时,浏览器指示找不到资源。我还没有将应用程序分发为WAR,因为我只是在测试它。但是test.css位于“styles”文件夹中,该文件夹位于“resources”中,而“resources”又位于“WEB-INF”和“webapp”中(目录结构在我的问题范围内)。 - Loa
你想在Github上分享项目吗? - kamoor

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