什么是springMVC?視圖和視圖解析器實(shí)例代碼
??什么是springMVC 視圖和視圖解析器
??基本介紹
- 在 springMVC 中的目標(biāo)方法最終返回都是一個視圖(有各種視圖)
- 返回的視圖都會由一個視圖解析器來處理 (視圖解析器有很多種)
??自定義視圖
為什么需要自定義視圖
在默認(rèn)情況下,我們都是返回默認(rèn)的視圖, 然后這個返回的視圖交由 SpringMVC 的InternalResourceViewResolver 視圖處理器來處理的

在實(shí)際開發(fā)中,我們有時需要自定義視圖,這樣可以滿足更多更復(fù)雜的需求
自定義視圖實(shí)例-代碼實(shí)現(xiàn)
配置 springDispatcherServlet-servlet.xml , 增加自定義視圖解析器
解讀
- 配置自定義視圖解析器BeanNameViewResolver
- BeanNameViewResolver可以去解析我們自定義的視圖
- 配置 屬性 order, 表示視圖解析器執(zhí)行的順序, 值越小, 優(yōu)先級越高
- 屬性 order 的默認(rèn)值是最低優(yōu)先級 ,值為 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="99"/>
</bean>建MyView.java -自定義視圖類
解讀
- MyView繼承了AbstractView, 就可以作為一個視圖使用
- @Component(value = “myView”),該視圖會注入到容器中, 名字/id是 myView
@Component(value = "hspView")
public class MyView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
//完成視圖渲染
//并且可以確定我們要跳轉(zhuǎn)的頁面 [請求轉(zhuǎn)發(fā)] /WEB-INF/pages/my_view.jsp
System.out.println("進(jìn)入到自己的視圖..");
//解讀
//1. 下面就是進(jìn)行請求轉(zhuǎn)發(fā)到 /WEB-INF/pages/my_view.jsp
//2. /WEB-INF/pages/my_view.jsp 會被springmvc解析
// /springmvc/WEB-INF/pages/my_view.jsp
request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp")
.forward(request, response);
}
}注意
- 下面就是進(jìn)行請求轉(zhuǎn)發(fā)到 /WEB-INF/pages/my_view.jsp
- /WEB-INF/pages/my_view.jsp 會被springmvc解析 /springmvc/WEB-INF/pages/my_view.jsp
3.最后瀏覽器解析成http://localhost:8080 /springmvc/WEB-INF/pages/my_view.jsp
創(chuàng)建GoodsHandler.java類
@RequestMapping("/goods")
@Controller
public class GoodsHandler {
@RequestMapping(value = "/buy")
public String buy() {
System.out.println("------buy()-----");
return "myView";
}
}創(chuàng)建view.jsp類
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>自定義視圖測試</title>
</head>
<body>
<h1>自定義視圖測試</h1>
<a href="goods/buy">點(diǎn)擊到自定義視圖-</a><br/>
</body>
</html>創(chuàng)建/WEB-INF/pages/my_view.jsp類
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>my_view頁面</title>
</head>
<h1>進(jìn)入到my_view頁面</h1>
<p>是從自定義視圖來的..</p>
<body>
</body>
</html>完成測試(Postman 測試)

自定義視圖-小結(jié)
- 自定義視圖: 創(chuàng)建一個 View 的 bean, 該 bean 需要繼承自 AbstractView, 并實(shí)現(xiàn)renderMergedOutputModel 方法。
- 并把自定義 View 加入到 IOC 容器中
- 自定義視圖的視圖處理器,使用 BeanNameViewResolver, 這個視圖處理器也需要配置到 ioc 容器
- BeanNameViewResolver 的調(diào)用優(yōu)先級需要設(shè)置一下,設(shè)置 order 比 Integer.MAX_VAL小的值. 以確保其在 InternalResourceViewResolver 之前被調(diào)用
自定義視圖-工作流程
SpringMVC 調(diào)用目標(biāo)方法, 返回自定義 View 在 IOC 容器中的 id
SpringMVC 調(diào)用 BeanNameViewResolver 解析視圖: 從 IOC 容器中獲取 返回 id 值對應(yīng)的 bean, 即自定義的 View 的對象
SpringMVC 調(diào)用自定義視圖的 renderMergedOutputModel 方法渲染視圖
說明: 如果在 SpringMVC 調(diào)用目標(biāo)方法, 返回自定義 View 在 IOC 容器中的 id,不存在, 則仍然按照默認(rèn)的視圖處理器機(jī)制處理
??目標(biāo)方法直接指定轉(zhuǎn)發(fā)或重定向
默認(rèn)返回的方式是請求轉(zhuǎn)發(fā),然后用視圖處理器進(jìn)行處理,比如在目標(biāo)方法中這樣寫:

也可以在目標(biāo)方法直接指定重定向或轉(zhuǎn)發(fā)的 url 地址
如果指定重定向,不能定向到 /WEB-INF 目錄中
應(yīng)用實(shí)例-代碼實(shí)現(xiàn)
修改 GoodsHandler.java, 增加方法 order()
直接指定要請求轉(zhuǎn)發(fā)的或者是重定向的頁面
- 對于重定向來說,不能重定向到 /WEB-INF/ 目錄下
- redirect 關(guān)鍵字,表示進(jìn)行重定向
- /login.jsp 在服務(wù)器解析 /springmvc/login.jsp
@RequestMapping("/goods")
@Controller
public class GoodsHandler {
/**
* 演示直接指定要請求轉(zhuǎn)發(fā)的或者是重定向的頁面
* @return
*/
@RequestMapping(value = "/order")
public String order() {
System.out.println("=======order()=====");
// return "forward:/WEB-INF/pages/my_view.jsp";
// return "forward:/aaa/bbb/ok.jsp";
return "redirect:/login.jsp";
}
}如果是這種
return "redirect:/WEB-INF/pages/my_view.jsp";
/WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp 然后會報404錯誤

修改view.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>自定義視圖測試</title>
</head>
<body>
<h1>自定義視圖測試</h1>
<a href="goods/buy">點(diǎn)擊到自定義視圖-</a><br/>
<a href="goods/order">測試在目標(biāo)方法中指定請求轉(zhuǎn)發(fā)或者重定向的頁面-</a><br/>
</body>
</html>完成測試(頁面測試)


完成測試(Postman 測試)

??綜合代碼演示
完成一個簡單的用戶登錄案例
- 編寫登錄頁面 login.jsp
- LoginHandler [doLogin 方法], 如果用戶輸入用戶名是 wyx, 密碼 123 就可以登錄成功.
- 創(chuàng)建 JavaBean : User.java
- 表單提交數(shù)據(jù)到 doLogin 方法, 以 User 對象形式接收.
- 登錄成功到, 頁面 login_ok.jsp 并顯示登錄歡迎信息
- 登錄失敗, 到頁面 login_error.jsp
代碼實(shí)現(xiàn)
創(chuàng)建login.jsp
<form action="login">
u:<input name="username" type="text"> <br/>
p:<input name="password" type="password"><br/>
<input type="submit" value="登錄">
</form>
</body>
</html>創(chuàng)建login_ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄成功</title>
</head>
<h1>登錄成功</h1>
歡迎你: ${requestScope.user.username}
<body>
</body>
</html>創(chuàng)建login_error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄失敗</title>
</head>
<body>
<h1>登錄失敗</h1>
<a href="<%=request.getContextPath()%>/homework/login.jsp">返回重新登錄</a>
</body>
</html>- 這里考察web工程路徑的知識點(diǎn) 如果忘記了 可以去看我的博客 鏈接
- <%=request.getContextPath()%>/homework/login.jsp
服務(wù)器解析 /springmvc/homework/login.jsp
- 瀏覽器會解析 為 http://localhost:8080/springmvc/homework/login.jsp 創(chuàng)建 User.java
public class User {
//屬性..
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}創(chuàng)建LoginHandler.java
@RequestMapping("/user")
@Controller
public class LoginHandler {
//處理登錄
@RequestMapping(value = "/login")
public String doLogin(User user) {
//判斷
if("wyx".equals(user.getUsername())
&& "123".equals(user.getPassword())){
//驗證OK
return "forward:/WEB-INF/pages/homework/login_ok.jsp";
} else {
return "forward:/WEB-INF/pages/homework/login_error.jsp";
}
}
}??總結(jié)
- 對于重定向來說,不能重定向到 /WEB-INF/ 目錄下
- redirect 關(guān)鍵字,表示進(jìn)行重定向
- MyView繼承了AbstractView, 就可以作為一個視圖使用
- 配置 屬性 order, 表示視圖解析器執(zhí)行的順序, 值越小, 優(yōu)先級越高
- 屬性 order 的默認(rèn)值是最低優(yōu)先級 ,值為 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647
到此這篇關(guān)于什么是springMVC 視圖和視圖解析器的文章就介紹到這了,更多相關(guān)springMVC視圖解析器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(20)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07
Apache POI導(dǎo)出Excel遇NoClassDefFoundError的原因分析與解決方案
在日常的Java開發(fā)中,我們經(jīng)常需要實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到Excel的功能,本文將簡單介紹Apache POI導(dǎo)出Excel遇NoClassDefFoundError錯誤的原因與解決,希望對大家有所幫助2025-10-10
解決spring-integration-mqtt頻繁報Lost connection錯誤問題
這篇文章主要介紹了解決spring-integration-mqtt頻繁報Lost connection錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Spring的同一個服務(wù)會加載多次的問題分析及解決方法
這篇文章主要介紹了Spring的同一個服務(wù)為什么會加載多次,我們先來梳理一下?Web?容器中如何加載?Bean,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10
Java整合mybatis實(shí)現(xiàn)過濾數(shù)據(jù)
這篇文章主要介紹了Java整合mybatis實(shí)現(xiàn)過濾數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
maven如何打包動態(tài)環(huán)境變量(包括啟動腳本)
這篇文章主要介紹了maven如何打包動態(tài)環(huán)境變量(包括啟動腳本)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
java可變參數(shù)當(dāng)做數(shù)組處理的方法示例
這篇文章主要介紹了java可變參數(shù)當(dāng)做數(shù)組處理的方法,結(jié)合實(shí)例形式分析了java可變參數(shù)當(dāng)做數(shù)組處理相關(guān)原理、步驟與操作注意事項,需要的朋友可以參考下2019-09-09
Java設(shè)計模式之裝飾模式(Decorator模式)介紹
這篇文章主要介紹了Java設(shè)計模式之裝飾模式(Decorator模式)介紹,本文講解了為什么使用Decorator、如何使用裝飾模式、Jive中的Decorator實(shí)現(xiàn)等內(nèi)容,需要的朋友可以參考下2015-03-03

