在具有 Spring MVC 的 jsp 页面中包含样式表

2022-09-04 01:15:26

我在从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" />

我还尝试将css文件包含在jsp文件夹中并直接链接到它。没有任何效果。当我在部署后查看源代码并尝试直接访问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>

谢谢!


答案 1

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

所以你在这里基本上有2个选择:

  1. 将CSS文件放在公共Web内容中(只需在上面移动一个文件夹,以便与) 处于同一级别。WEB-INF/css/WEB-INF

  2. 创建一个 Servlet,它侦听 一个 的 ,通过 HttpServletRequest#getPathInfo() 获取请求的 CSS 文件,并且基本上使用上述方法从中获取一个,并沿着一组正确的响应标头将其写入响应,至少具有 and 。url-pattern/css/*InputStreamServletContext#getResourceAsStream()OutputStreamContent-TypeContent-Length

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


答案 2

从@BalusC的第二种方法的Spring式实现是使用mvc:resources,如下所示:

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

在此之后,您的文件应该在main.css/css/main.css

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