使用Spring MVC在jsp页面中包含样式表
问题内容:
我无法从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"> </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" />
<input type="button" name="cancel" value="Cancel" />
</div>
</form>
</div>
</div>
</body>
</html>
谢谢!
问题答案:
文件中/WEB- INF
不能直接公众开放。在的Servlet
帮助下,只有中间人(控制器)可以访问和流式传输它们ServletContext#getResourceAsStream()
。这正是Spring(与其他任何不错的MVC框架一样)对JSP文件所做的工作。您不能直接通过URL访问JSP文件。这可能会泄漏源代码或破坏应用程序的行为。
因此,这里基本上有2个选项:
-
将CSS文件放入公共网络内容中(只需在上方移动一个文件夹
WEB-INF
,以便与/css
处于同一级别/WEB-INF
)。 -
创建一个Servlet,使用侦听
url-pattern
的/css/*
,从中获取请求的CSS文件,HttpServletRequest#getPathInfo()
并基本上InputStream
使用上述方法从中获取,然后沿着正确的响应标头集(至少包含和)ServletContext#getResourceAsStream()
将其写入OutputStream
响应的。Content-Type``Content-Length
毕竟,我认为选项1更容易且更适合您的要求;)