java - 为什么 tomcat7.0.47 在将前端 Controller servlet 映射到 *.do 或/或/* 的 URL 模式时无法访问静态资源(js、css)

标签 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>

然后我通过这个 url 访问我的页面:

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

但是,我遇到了一个问题:style.css is 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/”下。但是,问题仍然存在。最后,我知道一件事:

static resources cannot be accessed while servlet is mapped on an URL pattern of / or /*

所以我将我的 web.xml 更改为:

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

最后,问题完全解决了,但是这让我更疑惑了,为什么tomcat不能访问静态资源(js,css),同时在**.do或/的URL模式上映射前端 Controller 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

最佳答案

使用默认的 servlet 映射比使用 /user/* 会更简单、更干净。和类似支柱的*.do映射:

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

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

然后你应该修改你的 Controller @RequestMapping s 并删除 *.do也是 - 所以你的 URL 变成:

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

确保你还有 <mvc:default-servlet-handler />在你的 mvc-dispatcher-servlet.xml 中。

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

关于java - 为什么 tomcat7.0.47 在将前端 Controller servlet 映射到 *.do 或/或/* 的 URL 模式时无法访问静态资源(js、css),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811732/

相关文章:

javascript - CSS - 线性渐变在背景属性中不起作用

css - 在 primefaces 数据表列中居中输出文本

spring - Grails:创建名称为 'properties'的bean时出错:bean的定义是抽象的

java - Spring RabbitTemplate - 如何在发送时自动创建队列

java - 在 Spring Boot 应用程序上添加动态属性

java - 使用 parseBase64Binary 解码图像

java - 可以仅使用队列将中缀表示法中的字符串转换为前缀表示法吗? (考虑唯一的操作是 + 和 - 的情况)

java - 如何在 IntelliJ 中禁用代码完成弹出窗口的 "dimming"?

java - 如何使用 Jackson 进行部分反序列化

html - 当窗口减半时如何使卡不拉伸(stretch)