1. 程式人生 > >SSM框架之關於使用JSP作為視圖展示問題解決方案

SSM框架之關於使用JSP作為視圖展示問題解決方案

span value 必須 div see 共享 web session問題 com

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視圖解析器在實際開發中常見的問題,以供大家參考解決一些問題

  

SSM框架之關於使用JSP作為視圖展示問題解決方案