为什么tomcat7.0.47在* .do或/或/ *的URL模式上映射前端控制器servlet时无法访问静态资源(js,css)

时间:2013-12-28 06:27:20

标签: java css spring servlets tomcat7

事实上,我正在编写一个带有spring的maven项目。在我想导入我的css文件之前一切正常。这是我的web.xml(只有servlet部分):

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

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

然后我在这个网址上访问我的网页:

http://localhost:8080/hello.do?method=reg

但是,我遇到了一个问题: style.css是404 Not Found

所以,我搜索了一些文件然后我得到了一个方法:在我的servlet.xml中添加一些配置(我的servlet是 mvc-dispatcher-servlet.xml ):

<mvc:resources mapping="resources/**" location="/WEB-INF/resources/" />
<mvc:default-servlet-handler />

如您所见,我的css文件位于“/WEB-INF/resources/”。但是,问题仍然存在。最后,我知道一件事:

  当servlet映射到/或/ *

的URL模式时,无法访问

静态资源

所以我将 web.xml 更改为:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/user/*</url-pattern>
</servlet-mapping>

最后,问题完全解决了,但这让我更加困惑,为什么tomcat无法访问静态资源(js,css),同时将前端控制器servlet映射到**模式的​​*。或者/或/ *

更新(2013年12月30日):

我的申请是:

MyApplication
pom.xml
src
    test
    main
       java
            com.roger.spring
                controller
                    UserController.java
                dao
                    impl
                        UserDaoImpl.java
                    UserDao.java
                domain
                    User.java
                service
                    impl
                        UserService.java
                    UserService.java
        webapp
            WEB-INF
                applicationContext.xml
                dao.xml
                db.properties
                mvc-dispatcher-servlet.xml
                service.xml
                web.xml
                pages
                    index.jsp
                    taglib.jsp
                    user
                         login.jsp
                         reg.jsp
                         profile.jsp
                 resources
                    css
                         style.css
                    js
                         calendar.js

1 个答案:

答案 0 :(得分:0)

使用默认的servlet映射会更简单,更简洁 - 而不是/user/*和类似struts的*.do映射:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

现在所有请求都将通过Spring MVC发送 - 包括静态资源请求。

然后您应该修改您的控制器@RequestMapping并删除*.do - 这样您的网址就会变为:

http://localhost:8080/hello?method=reg

确保mvc-dispatcher-servlet.xml中仍有<mvc:default-servlet-handler />

然后,您应该能够使用<mvc:resources mapping="resources/**" location="/WEB-INF/resources/" />提供静态资源而不会出现任何问题。