带有控制器请求映射的spring静态资源

时间:2014-08-17 16:28:02

标签: spring jsp spring-mvc

我有一个春季MVC项目:这是我的文件

的web.xml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

调度员的servlet

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

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

MainController.java

@Controller
@RequestMapping(value="/test")
public class MainController {

    @RequestMapping(value="/home")
    public ModelAndView home()
    {
        String view="home";
        ModelAndView modelAndView=new ModelAndView(view);
        return modelAndView;
    }

}

针对home.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>

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

    </head></html>

我的webaps托管网址    localhost:8080/projectName/test/home 但它并没有加载我的静态资源,即bootstrap.css。它应该工作,因为我已将我的静态资源放在适当的位置webapp/resources/css/bootstrap.css

问:为什么我的静态资源是来自控制器路径的路由..为什么显示404未找到。     localhost:8080/projectName/test/resources/css/bootstrap.css

为什么控制器路径&#34;测试&#34;当spring想要查找静态资源时,会附加URL。

3 个答案:

答案 0 :(得分:1)

要避免网址问题,请使用JSTL的<c:url代码或${pageContext.request.contextPath}

例如在你的情况下:

<link href='<c:url value="/resources/css/bootstrap.css"/>'
      rel="stylesheet" type="text/css" />

OR

<link href='${pageContext.request.contextPath}/resources/css/bootstrap.css'
      rel="stylesheet" type="text/css" />

<子> 注意:对于第一个示例,在使用之前在jsp顶部导入JSTL标记库。 喜欢:

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

答案 1 :(得分:0)

我让它运行..我的home.jsp应该包含我的静态资源:

“../”资源前缀使控制器路由符合静态资源。

答案 2 :(得分:0)

<mvc:resources mapping="/resources/**" location="/resources/" />

因为“/ resources /”的配置指向WebRoot的“resources”目录,所以问题变得清晰,只需使用

<link href="<%= request.getContextPath() %>/resources/css/bootstrap.css" rel="stylesheet" type="text/css" />

引用静态资源。
此外,还有另一种解决此问题的方法,即配置 base 标记,如下所示,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
    <base href="<%=basePath %>">
    <title></title>
    <link href="resources/css/bootstrap.css" rel="stylesheet" type="text/css" />
</head>
....

两者都可以正常工作,希望你能帮忙:)。