JSP作為視圖層展示數據,已經有很長一段時間了,不管是在校學習還是企業工作,總會或多或少接觸這個。特別是對於一些傳統中小型或者一些幾年前的企業而言,有很多使用JSP作為視圖展示層。
JSP本質是就是Servlet,Servlet可以說也是JSP。
用圖描述就是如下:
通過上述兩張圖,足以知道,不管是JSP還是Servlet最后都是以HTML的形式在前端顯示。
關於JSP和Servlet學習教程可以參考這個教程:http://www.runoob.com/jsp/jsp-tutorial.html
JSP作為視圖展示數據,通常情況下會有這么幾個問題?
1.如果是SpringMVC攔截條件為*.do,可以不考慮靜態資源被攔截問題,如果是/的話,就不得不考慮了。通常情況下,解決辦法如下:
在SpringMVC的配置文件中寫:
<!-- 使用注解 --> <mvc:annotation-driven/> <mvc:resources location="/static/css/" mapping="/css/**"/> <mvc:resources location="/static/images/" mapping="/images/**"/> <mvc:resources location="/static/js/" mapping="/js/**"/> <mvc:resources location="/static/layer/" mapping="/layer/**"/> <mvc:resources location="/static/layui/" mapping="/layui/**"/>
或者是在web.xml這么寫
<!-- 靜態資源放行 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/view/</url-pattern> <url-pattern>/assets/</url-pattern> <url-pattern>/components/*</url-pattern> <url-pattern>/header/*</url-pattern> <url-pattern>/layouts/*</url-pattern> <url-pattern>/snippets/*</url-pattern> <url-pattern>/swagger-ui/*</url-pattern> <url-pattern>*.html</url-pattern> </servlet-mapping>
需要SpringMVC配置文件補充<mvc:default-servlet-handler/>
如果是這樣使用,需要注意的是必須放在SpringMVC的前端控制器前面,否則是不起作用的。
2.使用jsp視圖解析器,路徑問題需要注意
解決辦法:在web.xml配置或者直接在jsp頁面每個靜態資源../或者../../替換為${pageContext.request.contextPath}
${pageContext.request.contextPath},因為通過它直接就獲得上下文路徑。
還有就是新建兩個類定義全局路徑,也是可以解決這個問題的。
BaseListener.java
package com.blog.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * Application Lifecycle Listener implementation class BaseListener * */ public class BaseListener implements ServletContextListener { /** * Default constructor. */ public BaseListener() { // TODO Auto-generated constructor stub } /** * @see ServletContextListener#contextDestroyed(ServletContextEvent) */ public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } /** * @see ServletContextListener#contextInitialized(ServletContextEvent) */ public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub } }
ServerStartupListener.java
package com.blog.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; /** * 獲取Web應用路徑 * @author yc * */ public class ServerStartupListener extends BaseListener { @Override public void contextInitialized(ServletContextEvent sce) { // Web應用對象 ServletContext application= sce.getServletContext(); // 獲取web應用路徑 String path = application.getContextPath(); // 將Web應用路徑保存到應用范圍中 application.setAttribute("APP_PATH", path); } }
並在web.xml配置如下監聽器即可:
<listener> <listener-class>com.blog.listener.ServerStartupListener</listener-class> </listener>
該監聽器最好放在org.springframework.web.context.ContextLoaderListener監聽器下面。
3.關於使用jstl標簽庫問題
注意要引用這個maven依賴
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
至於為什么要使用jstl,簡單的說比<%%>簡潔方便,相對靈活,功能也比較強大。
當然了,建議不要濫用,濫用的代價會導致維護起來十分困難。
如果你的jstl是使用1.0版本的話,遇到不能使用的問題可以參考這個鏈接:https://blog.csdn.net/whh743/article/details/53580954
4.視圖解析器問題
視圖解析一般是沒有問題的,除非路徑寫錯了,或者tomcat應用服務器存在問題。不然的話一般配置正確的視圖解析器路徑,都會正常解析並返回視圖數據。
SpringMVC配置文件,正確配置內容如下:
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前后綴 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/pages/" /> <property name="suffix" value=".jsp" /><!--可為空,方便實現自已的依據擴展名來選擇視圖解釋類的邏輯 --> </bean>
如果是將jsp放在WEB-INF下可以這么寫:
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前后綴 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /><!--可為空,方便實現自已的依據擴展名來選擇視圖解釋類的邏輯 --> </bean>
至於為什么放在WEB-INF下,原因是因為用戶不能直接通過瀏覽器輸入URL訪問對應的jsp文件或者是其他資源,簡單的說這樣有利於安全性。
5.關於用戶信息保存Session問題,不管是Servlet(JSP)或者是在SPringMVC中,都可以通過如下代碼定義Session的屬性及其值和獲取屬性及其值
HttpSession session=request.getSession(); session.setAttribute("User", user);
HttpSession session = request.getSession();
session.getAttribute(“名稱”);------得到session放入進去的信息。
session.getAttributeNames()-----得到session里面所有的信息名稱。
session.getMaxInactiveInterval()----得到session最大存活時間。
seesion.getId();------得到session的id。比較有用的屬性,可以實現共享session。
session.getCreationTime()-----session創建時間。
小結:
本文主要圍繞的是關於JSP視圖解析器在實際開發中常見的問題,以供大家參考解決一些問題