【问题标题】:including style sheet in a jsp page with Spring MVC使用 Spring MVC 在 jsp 页面中包含样式表
【发布时间】:2011-01-14 23:09:07
【问题描述】:

我无法从 jsp 页面链接到样式表。我相信这与我的目录结构有关:

WEB-INF
  |-- css
  |    |-- main.css
  |
  |-- jsp
       |-- login.jsp

我尝试过各种形式的标准 html 链接标签,例如:

<link href="css/main.css" rel="stylesheet" type="text/css" media="screen" />
<link href="main.css" rel="stylesheet" type="text/css" media="screen" />
<link href="WEB-INF/css/main.css" rel="stylesheet" type="text/css" media="screen" />

我也尝试在 jsp 文件夹中包含 css 文件并直接链接到它。没有任何效果。部署后查看源码,尝试直接访问css文件,不存在,不过这并不奇怪,因为它在WEB-INF目录下。

我还验证了它正在与应用程序的其余部分一起部署。 jsp源码为:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login</title>

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

</head>

<body>
<div id="wrapper">
<div id="header">
<div id="logout">&nbsp;</div>
<h1>Login</h1>
</div>
<div id="content" class="content">
  <form action="" method="post" name="login-form">
    <fieldset>
      <legend>Login</legend>
      <table border="0" align="center">
        <tr>
          <td><label>User Name:</label></td>
        <td><input type="text" name="userName" /><br><br></td>
        </tr>
        <tr>
            <td><label>Password:</label></td>
        <td><input type="text" name="password" /><br><br></td>
         </tr>
        </table>
      </fieldset>
      <div class="buttons">
        <input type="submit" name="submit" value="Login" />&nbsp;&nbsp;&nbsp;
        <input type="button" name="cancel" value="Cancel" />
      </div>
    </form>
  </div>
</div>
</body>
</html>

谢谢!

【问题讨论】:

    标签: java spring jsp spring-mvc


    【解决方案1】:

    @BalusC 的第二种方法的 Spring 风格实现是使用 mvc:resources,就像这样:

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

    在此之后,您的 main.css 文件应该可以在 /css/main.css 获得

    (注意:如果不起作用,请检查 DispatcherServlet 是否映射到 /

    【讨论】:

    • 它对我来说不起作用。我的 DispatcherServlet 有一个映射 /app(否则 Tiles 不能使用 /)。在这种情况下,对我的 javascript 文件的引用将是:
    • @ruffp 是的,AFAIR,&lt;mvc:resources/&gt; 需要 &lt;mvc:default-servlet-handler/&gt; 才能工作,因此 DispatcherServlet 应该映射到 /
    【解决方案2】:

    或者试试这个

    " type="text/css"/>

    它可能会起作用。

    【讨论】:

    • Casey 询问使用 元素来包含样式表,因此它与 jsp taglibs 没有真正的关系。
    【解决方案3】:

    /WEB-INF 中的文件不可直接公开访问。只有中介(控制器)Servlet 可以在ServletContext#getResourceAsStream() 的帮助下为您访问和流式传输它们。这正是 Spring(与任何其他体面的 MVC 框架一样)对 JSP 文件所做的事情。您不能通过 URL 直接访问 JSP 文件。这可能会泄漏源代码或破坏应用程序的行为。

    所以你基本上有两个选择:

    1. 将 CSS 文件放入公共网页内容中(只需将 WEB-INF 上方的一个文件夹移动,使 /css/WEB-INF 处于同一级别)。

    2. 创建一个 Servlet,它侦听 /css/*url-pattern,通过 HttpServletRequest#getPathInfo() 获取请求的 CSS 文件,基本上使用上述 ServletContext#getResourceAsStream() 从中获取 InputStream 并将其写入响应的OutputStream 沿着一组正确的响应标头,至少包含Content-TypeContent-Length

    毕竟我认为选项 1 更容易,更适合您的要求;)

    【讨论】:

    • 我认为这与它有关。我相信我现在会选择选项 1。谢谢!
    • 谢谢,我使用的是 twitter 引导程序,但访问资产时遇到问题,因为我将它们放在 WEB-INF 下(正如你提到的那样,它不是公开的),将其移动到 webcontent 和访问的 1 级在我的 jsp 中使用 bootstrap/js/bootstrap.js 效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2017-02-16
    相关资源
    最近更新 更多