SpringMVC(五)SpringMVC的視圖

SpringMVC中的視圖是View接口,視圖的作用渲染數據,將模型Model中的數據展示給用戶

SpringMVC視圖的種類很多,默認有轉發視圖(InternalResourceView)和重定向視圖(RedirectView)

當工程引入jstl的依賴,轉發視圖會自動轉換為JstlView

若使用的視圖技術為Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的視圖解析器,由此視圖解析器解析之后所得到的是ThymeleafView

1.1ThymeleafVIew

當控制器方法中所設置的視圖名稱沒有任何前綴時,此時的視圖名稱會被SpringMVC配置文件中所配置的視圖解析器(ThymeleafViewResolver)解析,視圖名稱拼接視圖前綴和視圖。

我們當前的解析器為:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--掃描控制層組件--><context:component-scan base-package="com.rgf.controller"></context:component-scan><!--配置Thymeleaf視圖解析器--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><!--模板引擎--><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><!--模板解析器--><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!--/WEB-INF/templates/index.html--><!--視圖前綴+邏輯視圖+視圖后綴就是我們完整的物理視圖,即訪問index.html,不用完整路徑,即index即可進行訪問--><!--視圖前綴--><property name="prefix" value="/WEB-INF/templates/"/><!--視圖后綴--><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean>
</beans>

使用的視圖解析器為:ThymeleafViewResolver,被該解析器解析之后為:ThymeleafView

我們在控制方法進行debug:

我們在debug的一個框里面會展示我們當前的一個方法棧,當前方法處于該窗口中,?我們發現DispatcherServlet,找到對應行數:1061行。

存在于方法棧中的方法,在該框中越往上的方法跟當前所要執行的方法的斷點所在的位置越近。

越往下,跟當前斷點所對應的位置越遠。從該方法棧里面從最下面一步步調用到當前所打得斷點的位置。

此時我們查看到:

?我們所獲取的是一個ModelAndView對象。

再次打斷點的位置的作用為執行當前的我們的一個的轉發結果?,此時跳過斷點之后我們就已經獲取到ModelAndVIew。

此時我們跳過斷點之后,我們會發現:

此時的mv已經獲取數據: “ModelAndView? ["view="success"? ;model={testRequestScope="Hello,ModelAndView"}。

箭頭依次為:下一步(F8)、進入某個方法中(F7)、強制進入某個方法(ALT+Shift+F7)、從某個方法中跳出(shift+F8)、跳過斷點(ALT+F9)。

CTRL+G,查找指定行。

我們在進行debug的時候,可以點擊下面的紅點進行管理斷點所在的位置。

?我們選中某一個,點擊上端的-即可。

我們創建一個新的controller之后,先在我們的index.html新建一個超鏈接:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首頁</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">測試@RequestMapping注解所標識的位置</a><br>
<a th:href="@{/abc}">測試@RequestMapping注解的value屬性</a>
<form th:action="@{/hello}" method="post"><input type="submit" value="測試@RequestMapping注解的method屬性">
</form>
<a th:href="@{/hello?username=admin}">測試@RequestMapping注解的params屬性(第一種)</a><br>
<a th:href="@{/hello(username='admin')}">測試@RequestMapping注解的params屬性(第二種)</a><br>
<a th:href="@{/aaa/test/ant(username='admin')}">測試@RequestMapping注解支持ant風格的路徑</a><br>
<br>
<form th:action="@{/param/servletAPI}" method="post">用戶名: <input type="text" name="username"><br>密碼:   <input type="password" name="password"><br>提交: <input type="submit" value="登錄"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
<hr>
<a th:href="@{/test/mav}">測試通過ModelAndView向請求域共享數據</a>
<hr>
<a th:href="@{/test/view/thymeleaf}">測試SpringMVC的視圖ThymeleafView</a>
</body>
</html>

我們在新建的controller里面定義新的方法,我們進行打斷點如下所示:

?我們點擊頁面我們所測試的ThymeleafView:

我們發現首先進入?

我們跳過之后進入如下所示:

?

繼續跳過之后進入:

?此方法為執行處理我們轉發的結果。我們進入該方法進行查看:

我們進去之后,在該處也打一個斷點,此處為渲染的意思。此時即可處理我們當前的ModelAndView,然后把我們Model當中的數據共享在我們的請求域中,把我們所設置的邏輯視圖創建相對應的視圖對象,然后去找到我們相對應的視圖。即為頁面,然后進行跳轉。

此時里面的viewName即為我們設置的success.

此處的?resolveViewName,解析我們當前的視圖名稱來得到一個視圖。所以我們當前所創建的視圖只跟我們的視圖名稱有關。只跟我們當前方法的字符串類型的返回值有關系。

此時,我們的view為ThymeleafView.

ThymeleafView創建過程中沒有任何的前綴。

2.InternalRersourceView

SpringMVC中默認的轉發視圖是InternalResourceView

SpringMVC中創建轉發視圖的情況:
當控制器方法中所設置的視圖名稱以"forward:"為前綴時,創建InternalResourceView視圖,此時的視圖名稱不會被SpringMVC配置文件中所配置的視圖解析器解析,而是會將前綴”forward:"去掉,剩余部分作為最終路徑通過轉發的方式實現跳轉

我們新建如下鏈接:

我們創建新的方法:

我們將其轉發到:

?我們在此處進行打斷點:

運行之后,點擊超鏈接:

點擊之后進入斷點:

跳過之后繼續查看進入:

?其中的render為渲染視圖,來處理ModelAndView.

我們繼續進入里面:

此時我們的mv:"ModelAndView[view="forward:.test/model";此時的視圖名稱如下所示。

跳轉完之后,我們查看View里面的值:

?此時的view為InternalResourceView,url為/test/model;將其轉發到該url.

此時會創建兩個視圖,首先轉發前會創建InternalResourceView這個視圖,跳轉成功之后,dispatcherServlet會進行處理forward:.test/model這個請求,即會進入另一個視圖。而另一個視圖默認為ThymeleafView。

此時我們將斷點跳過之后,會再次進入如下斷點:

我們繼續向下執行的時候,我們的視圖名稱為success.即可進行跳轉到該頁面。此時創建出來的視圖為ThymeleafView。

此時的過程為點擊鏈接之后,進行跳轉到forward:/test/model,攜帶hello,Model,跳轉到success界面。如下所示:

我們比較常用的是ThymeleafView,我們并不是直接跳轉頁面,而是通過ThymeleafView的視圖解析器ThymeleafViewResolver來解析當前的視圖,去解析當前頁面中ThymeleafView中的語法,才能去渲染頁面,看到一個動態數據。

當我們使用

界面是會被Thymeleaf進行渲染的,但是我們使用如下方式進行轉發到該界面的時候

界面是不會被Thymeleaf所渲染的,僅僅是一個簡單的轉發。

如果我們所使用的是一種jsp視圖的話:我們需要在配置文件中配置的視圖解析器為:InternalResourceViewResolver

此時創建的轉發視圖也是InternalResourceViewResolver。但是通InternalResourceViewResolver進行轉發的是無法進行頁面渲染的,ThymeleafView的語法無法被解析,但是ThymeleafView的這種視圖是可以進行頁面渲染的。

?3.RedirectView

SpringMVC中默認的重定向視圖是RedirectView
當控制器方法中所設置的視圖名稱以"redirect:"為前綴時,創建RedirectView視圖,此時的視圖名稱不會被SpringMVC配置文件中所配置的視圖解析器解析,而是會將前綴”redirect:"去掉,剩余部分作為最終路徑通過重定向的方式實現跳轉

我們創建如下鏈接:

?我們創建新的方法:

 @RequestMapping("/test/view/redirect")public  String  testRedirectView(){return "redirect:/test/model";}

此時我們將項目進行運行:

我們點擊如下所示:

我們發現繼續進入斷點:

我們繼續將斷點往下走:

我們繼續進入里面:

此時我們的mv:"ModelAndView[view="redirect:.test/model";此時的視圖名稱如此所示。

跳轉完之后,我們查看View里面的值:

?此時的view為RedirectView。此時跳轉過之后,會繼續訪問test/model,斷點會繼續進入該方法:

此時再次創建的視圖名稱為ThymeleafView。?

此時查看我們所跳轉的界面的地址攔:

一般而言,當我們的業務邏輯處理成功的時候用轉發,處理失敗的時候用重定向。登錄成功用轉發,登錄失敗用重定向。?

重定向所跳轉到的絕對路徑就會被瀏覽器所解析,而瀏覽器解析的絕對路徑是把/解析為localhost:8080.而我們當前設置的重定向的路徑,都可以成功進行跳轉,說明在跳轉過程中會自動在絕對路徑前面加一個上下文路徑。

4.視圖控制器view-controller

當控制器方法中,僅僅用來實現頁面跳轉,即只需要設置視圖名稱時,可以將處理器方法使用view-controller標簽進行表示。

例如我們要進行跳轉到首頁:

我們必須要有這個方法才能跳轉到index.html首頁。

我們利用view-controller,在配置文件里面進行配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--掃描控制層組件--><context:component-scan base-package="com.rgf.controller"></context:component-scan><!--配置Thymeleaf視圖解析器--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><!--模板引擎--><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><!--模板解析器--><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!--/WEB-INF/templates/index.html--><!--視圖前綴+邏輯視圖+視圖后綴就是我們完整的物理視圖,即訪問index.html,不用完整路徑,即index即可進行訪問--><!--視圖前綴--><property name="prefix" value="/WEB-INF/templates/"/><!--視圖后綴--><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean><!--視圖控制器:為當前的請求直接設置視圖名稱實現頁面跳轉--><mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>

我們即可直接進行跳轉該頁面。

我們將該方法進行注掉:

package com.rgf.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class ProtalController {@RequestMapping("/")public  String  protal(){return  "index";}
}

進行重新部署,我們回到首頁,進行刷新:

仍然可以訪問首頁。

此時點擊其他鏈接,發現出現了:404

?如果我們在當前配置文件中使用了view-controller視圖控制器,當前只有視圖控制器所設置的請求才能被處理。此時要在配置文件里再加一個標簽:<mvc:annotation-driver/>,開啟mvc的注解驅動

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--掃描控制層組件--><context:component-scan base-package="com.rgf.controller"></context:component-scan><!--配置Thymeleaf視圖解析器--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><!--模板引擎--><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><!--模板解析器--><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!--/WEB-INF/templates/index.html--><!--視圖前綴+邏輯視圖+視圖后綴就是我們完整的物理視圖,即訪問index.html,不用完整路徑,即index即可進行訪問--><!--視圖前綴--><property name="prefix" value="/WEB-INF/templates/"/><!--視圖后綴--><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean><!--開啟mvc的注解驅動--><mvc:annotation-driver/><!--視圖控制器:為當前的請求直接設置視圖名稱實現頁面跳轉若設置視圖控制器,則只有視圖控制器所設置的請求會被處理,其他的請求將全部404此時必須再配置一個標簽 <mvc:annotation-driver/>,從而開啟mvc的注解驅動<mvc:annotation-driver/>,在好多功能里面都要使用這個標簽,(在處理靜態資源的時候,處理ajax請求,處理json數據的時候),都是要加上這個標簽。--><mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>

此時設置之后,我們的鏈接都可以進行點擊。即視圖解析器和@RequestMapping實現的界面跳轉都可以實現。此時我們再次訪問首頁,其他界面都可以進行點擊。

?點擊其他的也可以成功進行跳轉:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161369.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習 loss 是nan的可能原因

1 loss 損失值非常大&#xff0c;超過了浮點數的范圍&#xff0c;所以表示為overflow 狀態下的男。 解決辦法&#xff1a; 減小學習率&#xff0c;觀察loss值是不是還是nan 在將數據輸入模型前&#xff0c;進行恰當的歸一化 縮放 2 loss 的計算中存在除以0&#xff0c; log(0…

Java架構師軟件架構開發

目錄 1 基于架構的軟件開發導論2 ABSD架構方法論3 ABSD方法論具體實現4 ABSD金融業案例5 基于特定領域的軟件架構開發導論6 DSSA領域分析7 DSSA領域設計和實現8 DSSA國際電商平臺架構案例9 架構思維方法論概述10 AT方法論和案例想學習架構師構建流程請跳轉:Java架構師系統架構…

應用軟件安全編程--25考慮對函數指針進行加密

在某些情況下&#xff0c;攻擊者可以通過修改內存甚至函數指針來執行任意代碼。為了減少這類攻擊的影 響&#xff0c;函數指針應該在運行時進行加密&#xff0c;并在執行程序時才進行解密。 對于考慮對函數指針進行加密的情況&#xff0c;示例1給出了不規范用法(C/C 語言)示…

Unity UI設計 軟件構造實驗報告

實驗1: 仿真系統的UI主界面設計 1.實驗目的 &#xff08;1&#xff09;熟悉Unity中UI界面的設計與編寫&#xff1b; &#xff08;2&#xff09;熟悉UI界面中場景轉換,UI與場景內容相互關聯的方式。 &#xff08;3&#xff09;熟悉Unity中MySQL數據庫的操作 2.實驗內容 新建…

設計模式—單一職責原則

1.背景 單一職責原則&#xff08;SRP&#xff1a;Single responsibility principle&#xff09;又稱單一功能原則&#xff0c;面向對象五個基本原則&#xff08;SOLID&#xff09;之一。它規定一個類應該只有一個發生變化的原因。該原則由羅伯特C馬丁&#xff08;Robert C. Ma…

生成式AI與大語言模型,東軟已經準備就緒

伴隨著ChatGPT的火爆全球&#xff0c;數以百計的大語言模型也爭先恐后地加入了這一戰局&#xff0c;掀起了一場轟轟烈烈的“百模大戰”。毋庸置疑的是&#xff0c;繼方興未艾的人工智能普及大潮之后&#xff0c;生成式AI與大語言模型正在全球開啟新一輪生產力革新的科技浪潮。 …

【C語言】深入理解指針(四)

&#x1f308;write in front :&#x1f50d;個人主頁 &#xff1a; 啊森要自信的主頁 ??真正相信奇跡的家伙&#xff0c;本身和奇跡一樣了不起啊&#xff01; 歡迎大家關注&#x1f50d;點贊&#x1f44d;收藏??留言&#x1f4dd;>希望看完我的文章對你有小小的幫助&am…

帝國cms開發一個泛知識類的小程序的歷程記錄

#帝國cms小程序# 要開發一個泛知識類的小程序&#xff0c;要解決以下幾個問題。 1。知識內容的分類。 2。知識內容的內容展示。 3。知識內容的價格設置。 4。用戶體系&#xff0c;為簡化用戶的操作&#xff0c;在用戶進行下載的時候&#xff0c;請用戶輸入手機號&#xff…

【HarmonyOS】API6上JS實現視頻播放全屏播放時,會回到之前界面

【關鍵字】 API6 / 視頻播放 / 全屏播放異常 【問題現象】 開發者在API6上用JS實現視頻播放器點全屏播放后&#xff0c;不是全屏效果&#xff0c;實際效果是變成了橫屏并返回到首頁。 具體代碼實現是參考video媒體組件指南。 【問題分析】 JS實現視頻播放器有Codelab代碼示…

DedeBIZ 管理系統 DedeV6 v6.2.6 社區版 免費授權版

DedeBIZ 系統&#xff1a;開源、安全、高效的 DedeV6 v6.2.6 社區版 DedeBIZ 系統是基于 PHP 7 版本開發的&#xff0c;具有強大的可擴展性&#xff0c;并且完全開放源代碼。它采用現流行的 Go 語言設計開發&#xff0c;不僅擁有簡單易用、靈活擴展的特性&#xff0c;還具備更…

ElasticSearch之Health API

查看當前集群全部健康指標的信息&#xff0c;執行如下命令&#xff1a; curl -X GET "https://localhost:9200/_health_report?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; {&quo…

Niushop 開源商城 v5.1.7:支持PC、手機、小程序和APP多端電商的源碼

Niushop 系統是一款基于 ThinkPHP6 開發的電商系統&#xff0c;提供了豐富的功能和完善的商品機制。該系統支持普通商品和虛擬商品&#xff0c;并且針對虛擬商品還提供了完善的核銷機制。同時&#xff0c;它也支持新時代的商業模式&#xff0c;如拼團、分銷和多門店砍價等營銷活…

Platform Issues 平臺問題

Set processing does not behave the same on every database platform. On some platforms, set processing can encounter performance breakdowns. Some platforms do not optimize update statements that include subqueries. 集處理在每個數據庫平臺上的行為并不相同。在…

Log4j

通過Log4j&#xff0c;我們可以控制日志信息輸送到目的地是控制臺、文件、GUI組件&#xff0c;甚至是套接口服務器、NT的事件記錄器。我們可以控制每一條日志的輸出格式。通過定義每一條日志信息的級別&#xff0c;能更加細致地控制日志的生成過程。 1 log4j、log4j2與SLF4J …

【Vue3從入門到項目實現】前置知識及Vue基礎

概念 理論基礎 MVC 架構&#xff08;以JavaWeb舉例&#xff09; M &#xff1a;Model&#xff0c;&#xff08;pojo、service、dao等&#xff09;V &#xff1a;View&#xff0c;&#xff08;JSP, HTML等&#xff09;C&#xff1a;Controller (servlet) MVVC 架構&#xff…

C/C++ 使用API實現數據壓縮與解壓縮

在Windows編程中&#xff0c;經常會遇到需要對數據進行壓縮和解壓縮的情況&#xff0c;數據壓縮是一種常見的優化手段&#xff0c;能夠減小數據的存儲空間并提高傳輸效率。Windows提供了這些API函數&#xff0c;本文將深入探討使用Windows API進行數據壓縮與解壓縮的過程&#…

【Rust日報】2023-11-21 如何將 Rust 的編譯效率提高 75%

這是一篇來自 https://benw.is/posts/how-i-improved-my-rust-compile-times-by-seventy-five-percent 的總結和翻譯&#xff0c;我去掉了一些不太重要的章節&#xff0c;保留了所有關鍵技術點。 Rust經常被提到的一個痛點是編譯時間較慢。為了享受借用檢查器、安全性和零成本抽…

pikachu靶場Table pikachu.member doesn’t exist:解決

背景&#xff1a; 第一次搭建pikachu靶場&#xff0c;搭建好后訪問index.php后&#xff0c;嘗試練習&#xff0c;發現界面顯示Table pikachu.member doesn t exist&#xff0c;后來找了很多教程&#xff0c;沒有解決&#xff0c;后來發現是自己沒有進行初始化&#xff0c;給大家…

VMware 系列:ESXI6.7升級7.0

ESXI6.7升級7.0 一、下載補丁二、上傳文件三 啟用Shell四、登錄Shell后臺五、刪除不兼容驅動六、正常升級最近,將一臺使用ESXI6.7的虛擬機升級到了7.0版本,下面記錄一下自己的升級過程。 升級條件 首先確保硬件是否能升級到7.0版本,物理網卡驅動為e1000e不能升級,如果是ig…

不到十個例題帶你拿下c++雙指針算法(leetcode)

移動零問題 https://leetcode.cn/problems/move-zeroes/submissions/ 1.題目解析 必須在原數組進行修改&#xff0c;不可以新建一個數組 非零元素相對順序不變 2.算法原理 【數組劃分】【數組分塊】 這一類題會給我們一個數組&#xff0c;讓我們劃分區間&#xff0c;比如…