Java Spring控制器映射配置和静态资源
我对控制器拦截对静态资源的请求有问题 以下是web.xml(与问题相关的部分): 以及doView.jsp和getView.jsp文件的最后一个片段,其中使用JavaScript声明了静态文件:Java Spring控制器映射配置和静态资源,java,spring,spring-mvc,url-pattern,static-resource,Java,Spring,Spring Mvc,Url Pattern,Static Resource,我对控制器拦截对静态资源的请求有问题 以下是web.xml(与问题相关的部分): 以及doView.jsp和getView.jsp文件的最后一个片段,其中使用JavaScript声明了静态文件: <script src="testing/resources/js/jquery.js"></script> 有一件事我不明白——为什么只输入http://localhost:8080/app/testing但是为了获得getView.jsp,我需要输入http://loc
<script src="testing/resources/js/jquery.js"></script>
有一件事我不明白——为什么只输入http://localhost:8080/app/testing
但是为了获得getView.jsp,我需要输入http://localhost:8080/app/testing/testing/getSomething
(“测试”键入两次)
现在是本主题的主要原因——当我从类定义中删除请求映射注释时(@RequestMapping(value=“/testing”)
并将其保留在方法上,则我根本无法获取jquery.js文件。当我键入http://localhost:8080/app/testing/resources/js/jquery.js
我得到了doView.jsp。浏览器中的开发人员工具没有报告任何问题(缺少jquery.js文件或其他东西)-此请求刚刚被Spring的dispatcher servlet截获。此配置的唯一优点是,我不必键入两次“testing”来打开getView.jsp
有人知道如何使
mvc:resources
标记在这种情况下工作吗?不,我不能将整个测试servlet的URL映射设置为“/”;) 首先是你问题的第一部分,这是一种正常的行为。您将/testing/*
声明为DispatcherServlet的url模式,这意味着在/testing/之后出现的所有“东西”都被spring考虑并截取。然后,您添加了一个@RequestMapping
注释,并用testing
填充该注释的值参数,这可能会导致混淆。您可以考虑使用<强> /另一个名称>强> >代码> URL模式< /代码>,而不是测试并将您的控制器定义上的请求映射为<强>测试>/P>
第二部分,在我看来,你把JS文件放在<强> /SRC/主/资源< /强>中,这是一个私有的安全文件夹,你可以考虑把它放在<强> /SRC/WebAPP/公共资源< /强>中,然后配置你的<强> <强>如下:
<mvc:resources mapping="/resources/**"
location="/, classpath:/WEB-INF/public-resources/"
cache-period="10000" />
首先,你的问题的第一部分,这是一种正常的行为。您将
/testing/*
声明为DispatcherServlet的url模式,这意味着在/testing/之后出现的所有“东西”都被spring考虑并截取。然后,您添加了一个@RequestMapping
注释,并用testing
填充该注释的值参数,这可能会导致混淆。您可以考虑使用<强> /另一个名称>强> >代码> URL模式< /代码>,而不是测试并将您的控制器定义上的请求映射为<强>测试>/P>
第二部分,在我看来,你把JS文件放在<强> /SRC/主/资源< /强>中,这是一个私有的安全文件夹,你可以考虑把它放在<强> /SRC/WebAPP/公共资源< /强>中,然后配置你的<强> <强>如下:
<mvc:resources mapping="/resources/**"
location="/, classpath:/WEB-INF/public-resources/"
cache-period="10000" />
请添加这个罐子
<mvc:resources mapping="/resources/**" location="/resources/"/>
<mvc:annotation-driven/>
此jar将自动下载为maven/pom.xml结构,但是如果是您自己的lib,那么您必须将此jar放入hamcrest-core-1.3.jar请添加此jar
<mvc:resources mapping="/resources/**" location="/resources/"/>
<mvc:annotation-driven/>
这个jar将自动下载为maven/pom.xml结构,但是如果是您自己的lib,那么您必须像我写的那样将这个jar
hamcrest-core-1.3.jar
/放在servlet映射中-我不想这样做,因为我不能这么做。在那个应用程序中有更多的servlet。/在我写的servlet映射中-我不想这样做,因为我不能。该应用程序中有更多servlet。谢谢您的回答。根据问题的第一部分,我的想法是相同的,但当我在注释值中添加了不同于“/测试”的内容时,我请求http://localhost:8080/app/testing
不起作用,我必须在/之后添加新值。这就是我不理解这种行为的原因。关于第二部分,静态资源位于WEB-INF目录中,正如我之前所写的,开发人员工具没有报告任何问题,比如缺少文件或类似的问题。当我想手动访问静态资源时,我会被重定向到doView.jsp页面。。。在$root/webapp/resources内,因为WEB-INF是一个私有/受保护的目录,这意味着当您试图手动(通过URL)访问WEB-INF内的资源时,您将被拒绝并重定向(在您的情况下)默认视图,即您在控制器中定义的doView.jsp。我现在总是将这些文件放在WEB-INF/resources中,并使用mvc:resources使它们可用于请求,但WEB.xml描述符中有一个不同之处-url模式设置为“/”not to“/anyValue/*”。但对于这个应用程序,我无法做到这一点,我正试图找到解决这个问题的任何方法。我试试你的答案。此外,我还有一个问题,当您的文件位于与WEB-INF处于同一文件系统级别的公共资源目录中时,为什么要将位置指定为/WEB-INF/public resources/
?直接位于webapp目录中?谢谢您的回答。根据问题的第一部分,我的想法是相同的,但当我在注释值中添加了不同于“/测试”的内容时,我请求http://localhost:8080/app/testing
不起作用,我必须在/之后添加新值。这就是我不理解这种行为的原因。关于第二部分,静态资源位于WEB-INF目录中,正如我之前所写的,开发人员工具没有报告任何问题,比如缺少文件或类似的问题。当我想手动访问静态资源时,我会被重定向到doView.jsp页面
<mvc:resources mapping="/resources/**" location="/resources/"/>
<mvc:annotation-driven/>