1. 程式人生 > >【SpringMVC】6.SpringMVC的檢視和檢視解析器

【SpringMVC】6.SpringMVC的檢視和檢視解析器

注意!!!

此文章需要配置了SpringDispatcherServletInternalResourceViewResolver才能夠使用,如果不會配置,請翻看我【SpringMVC】系列的第一篇文章《【SpringMVC】1. SpringMVC的第一個程式——HelloWorld》

一、檢視和檢視解析器

1.什麼是檢視

  • 檢視的作用是渲染模型資料,將模型裡的資料以某種形式呈現給客戶。
  • 為了實現檢視模型和具體實現技術的解耦,Spring 在org.springframework.web. servlet 包中定義了一個高度抽象的 View 介面。
  • 檢視物件由檢視解析器負責例項化
    。由於檢視是無狀態(既每次都從新建立)的,所以他們不會有執行緒安全的問題。
  • 常用的檢視實現類: 這裡寫圖片描述

2.SpringMVC如何解析檢視

其實檢視解析器我們在之前就已經配置過了,那就是配置在springmvc.xml中的InternalResourceViewResolver。 它的作用就是把我們Handler方法中返回的StringModelAndViewView,Spring MVC 也會在內部將它們裝配成一個ModelAndView 物件,它包含了邏輯名和模型物件的檢視。

Spring MVC 藉助檢視解析器ViewResolver得到最終 的檢視物件View,最終的檢視可以是 JSP ,也可能是Excel、JFreeChart等各種表現形式的檢視。對於最終究竟採取何種檢視物件對模型資料進行渲染,處理器並不關心,處理器工作重點聚焦在生產模型資料的工作上,從而實現 MVC 的充分解耦。

這裡寫圖片描述
SpringMVC解析檢視流程

3.什麼是檢視解析器

  • SpringMVC 為邏輯檢視名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一種或多種解析策略,並 指定他們之間的先後順序。每一種對映策略對應一個具體的檢視解析器實現類。
  • 檢視解析器的作用比較單一:將邏輯檢視解析為一個具體的檢視物件。
  • 所有的檢視解析器都必須實現 ViewResolver 介面
  • 常用的檢視解析器實現類:程式設計師可以選擇一種檢視解析器或混用多種檢視解析器每個檢視解析器都實現了Ordered 介面並開放出一個 order屬性,可 以通過 order 屬性指定解析器的優先順序,order 越小優先順序越高。SpringMVC會按檢視解析器順序的優先順序對邏輯檢視名進行解 析,直到解析成功並返回檢視物件,否則將丟擲 ServletException
    異常。

這裡寫圖片描述

常用的檢視解析器

二、使用InternalResourceViewResolver進行檢視解析

相關程式碼:

1.加入相關的JAR包

  • jstl.jar
  • standard.jar

2.在src目錄下的springmvc.xml配置檢視解析器(如果已經配置好則不需再次配置)和國際化資原始檔

<!-- 配置檢視解析器:如何把Handler方法返回值解析為實際的物理檢視 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 配置國際化資原始檔 -->
    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
    </bean>

3.在src目錄下建立國際資原始檔i18n_en_US.propertiesi18n_zh_CN.properties

i18n_en_US.properties相關程式碼

i18n.username=Username
i18n.password=Password

i18n_zh_CN.properties相關程式碼 由於在properties檔案中是不支援中文的,所以你在properties檔案中輸入中文,就會自動轉變為Unicode編碼。我輸入的是中文的使用者名稱和密碼

i18n.username=\u7528\u6237\u540D
i18n.password=\u5BC6\u7801

4.Handler類com.springmvc.handlersSpringMVCTest相關程式碼

@RequestMapping("/testViewAndViewResolver")
    public String testViewAndViewResolver(){
        System.out.println("testViewAndViewResolver");
        return SUCCESS;
    }

5.WebRoot/WEB-INF/views/success.jsp相關程式碼

使用jstl的時候注意加入fmt標籤

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>success</title>
</head>

<body>
    <h1>Success page</h1>
    <fmt:message key="i18n.username"></fmt:message>
     <br>-----------------------------------------<br>
     <fmt:message key="i18n.password"></fmt:message>
</body>
</html>

6.WebRoot/index.jsp的相關程式碼

在原來程式碼的基礎上新增一個超連結

<a href="springmvc/testViewAndViewResolver">testViewAndViewResolver</a>

7.(可選)如果不想經過Handler方法,而是直接訪問頁面可以做以下配置

WebRoot/WEB-INF/views/success.jsp加入以下程式碼

<!-- 配置直接轉發的頁面 -->
    <!-- 可以直接響應轉發的頁面,而不需經過Handler的方法 -->
    <mvc:view-controller path="/success" view-name="success" />
    <!-- 實際開發中通常需要配置mvc:annotation標籤 -->
    <mvc:annotation-driven></mvc:annotation-driven>

7.效果展示

這裡寫圖片描述
會發現是中文字樣的的賬戶和密碼

如果我們更改瀏覽器的語言首選項為英語的時候,發現原來的中文變成了英文

這裡寫圖片描述

修改語言首選項步驟:

1.開啟IE,按一下右上角的齒輪標誌,選擇Internet選項

這裡寫圖片描述

2.點選“語言”,彈出來的視窗選擇“設定語言首選項”

這裡寫圖片描述

3.選擇“新增語言”,找到 English(United States)選擇新增,等待自動下載完成後點選下面圖片的上箭頭標誌,最後重啟IE瀏覽器,重新訪問即可。 這裡寫圖片描述

三、使用BeanNameViewResolver來解析檢視

1.springmvc.xml配置BeanNameViewResolver檢視解析器

<!-- 配置檢視BeanNameViewResolver解析器:使用檢視的名字來解析檢視 -->
    <!-- 通過order屬性來定義檢視解析器的優先順序,,值越小優先順序越高 -->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <property name="order" value="100"></property>
    </bean>

2.新建包com.springmvc.views

並在這個包下新建檢視類HelloView,並將該類放到spring容器中

package com.springmvc.views;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;

@Component
public class HelloView implements View {

    @Override
    public String getContentType() {
        return "text/html";
    }

    @Override
    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.getWriter().print("hello view,time:"+new Date());
    }

}

3.測試類SpringMVCTest的相關程式碼

位於com.springmvc.handlers

/*
     * 測試自定義檢視
     */
    @RequestMapping("/testView")
    public String testView(){
        System.out.println("Test view");
        return "helloView";
    }

4.WebRoot根目錄下的index.jsp相關程式碼

<a href="springmvc/testView">testView</a>

5.效果展示

四、重定向

  • 一般情況下,控制器方法返回字串型別的值會被當成邏輯檢視名處理。
  • 如果返回的字串中帶forward:或redirect:字首時,SpringMVC會對他們進行特殊處理:將forward:和redirect:當成指示符,其後的字串作為 URL來處理
  • redirect:success.jsp:會完成一個到 success.jsp 的重定向的操作
  • forward:success.jsp:會完成一個到 success.jsp 的轉發操作
@RequestMapping("/testRedirect")
    public String testRedirect(){
        System.out.println("testRedirect");
        return "redirect:/index.jsp";
    }