前段時間做了用Spring Security實現的登錄和訪問權限控制的功能,但是page render使用的是InternalResourceResolver,即在spring的servlet配置文件中做如下配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean>
當controller返回一個view時,Spring MVC就會根據該配置中的設置到/WEB-INF/pages/路徑下尋找view名.jsp這個文件來進行頁面渲染。
通過這樣的方法,我在登錄頁面上顯示出來的是用最基本的html實現的一個form,沒有任何的樣式和圖片。
現在我對這個頁面進行了一些css的樣式和image的修飾,css和images分別放在了/WEB-INF/css/和/WEB-INF/images/路徑下。這樣,我的WEB-INF目錄下的結構是這樣的:
按照一般的相對路徑,在jsp里這樣寫可以找到images里和css里的文件:
<link rel="stylesheet" type="text/css" href="../css/style.css"> <img src="../images/logo.png">
但是當程序在web container里運行時,這個相對地址並不是我們的硬盤里的相對地址,而是項目在web container里的相對地址。當頁面進行顯示時,由於InternalResourceViewResolver中的配置,使得對http://localhost:8080/SpringSecurity/login的訪問是在/WEB-INF/pages/路徑下找到相應的jsp。
所以在Spring MVC里希望通過相對路徑找到resource文件時需要做下面的配置:
在applicationContext.xml中:
<mvc:resources mapping="/images/*" location="WEB-INF/images/" /> <mvc:resources mapping="/css/*" location="WEB-INF/css/" />
然后在jsp的href里:
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/style.css">
${pageContext.request.contextPath}就是將url direct到了當前目錄下,然后再通過applicationContext中的配置來對該相對路徑進行map。這樣就能成功的在頁面上顯示images和css了。