什么是springMVC?視圖和視圖解析器實(shí)例代碼
??什么是springMVC 視圖和視圖解析器
??基本介紹
- 在 springMVC 中的目標(biāo)方法最終返回都是一個(gè)視圖(有各種視圖)
- 返回的視圖都會(huì)由一個(gè)視圖解析器來(lái)處理 (視圖解析器有很多種)
??自定義視圖
為什么需要自定義視圖
在默認(rèn)情況下,我們都是返回默認(rèn)的視圖, 然后這個(gè)返回的視圖交由 SpringMVC 的InternalResourceViewResolver 視圖處理器來(lái)處理的
在實(shí)際開(kāi)發(fā)中,我們有時(shí)需要自定義視圖,這樣可以滿足更多更復(fù)雜的需求
自定義視圖實(shí)例-代碼實(shí)現(xiàn)
配置 springDispatcherServlet-servlet.xml , 增加自定義視圖解析器
解讀
- 配置自定義視圖解析器BeanNameViewResolver
- BeanNameViewResolver可以去解析我們自定義的視圖
- 配置 屬性 order, 表示視圖解析器執(zhí)行的順序, 值越小, 優(yōu)先級(jí)越高
- 屬性 order 的默認(rèn)值是最低優(yōu)先級(jí) ,值為 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, 就可以作為一個(gè)視圖使用
- @Component(value = “myView”),該視圖會(huì)注入到容器中, 名字/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)的頁(yè)面 [請(qǐng)求轉(zhuǎn)發(fā)] /WEB-INF/pages/my_view.jsp System.out.println("進(jìn)入到自己的視圖.."); //解讀 //1. 下面就是進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)到 /WEB-INF/pages/my_view.jsp //2. /WEB-INF/pages/my_view.jsp 會(huì)被springmvc解析 // /springmvc/WEB-INF/pages/my_view.jsp request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp") .forward(request, response); } }
注意
- 下面就是進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)到 /WEB-INF/pages/my_view.jsp
- /WEB-INF/pages/my_view.jsp 會(huì)被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>自定義視圖測(cè)試</title> </head> <body> <h1>自定義視圖測(cè)試</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頁(yè)面</title> </head> <h1>進(jìn)入到my_view頁(yè)面</h1> <p>是從自定義視圖來(lái)的..</p> <body> </body> </html>
完成測(cè)試(Postman 測(cè)試)
自定義視圖-小結(jié)
- 自定義視圖: 創(chuàng)建一個(gè) View 的 bean, 該 bean 需要繼承自 AbstractView, 并實(shí)現(xiàn)renderMergedOutputModel 方法。
- 并把自定義 View 加入到 IOC 容器中
- 自定義視圖的視圖處理器,使用 BeanNameViewResolver, 這個(gè)視圖處理器也需要配置到 ioc 容器
- BeanNameViewResolver 的調(diào)用優(yōu)先級(jí)需要設(shè)置一下,設(shè)置 order 比 Integer.MAX_VAL小的值. 以確保其在 InternalResourceViewResolver 之前被調(diào)用
自定義視圖-工作流程
SpringMVC 調(diào)用目標(biāo)方法, 返回自定義 View 在 IOC 容器中的 id
SpringMVC 調(diào)用 BeanNameViewResolver 解析視圖: 從 IOC 容器中獲取 返回 id 值對(duì)應(yīng)的 bean, 即自定義的 View 的對(duì)象
SpringMVC 調(diào)用自定義視圖的 renderMergedOutputModel 方法渲染視圖
說(shuō)明: 如果在 SpringMVC 調(diào)用目標(biāo)方法, 返回自定義 View 在 IOC 容器中的 id,不存在, 則仍然按照默認(rèn)的視圖處理器機(jī)制處理
??目標(biāo)方法直接指定轉(zhuǎn)發(fā)或重定向
默認(rèn)返回的方式是請(qǐng)求轉(zhuǎn)發(fā),然后用視圖處理器進(jìn)行處理,比如在目標(biāo)方法中這樣寫:
也可以在目標(biāo)方法直接指定重定向或轉(zhuǎn)發(fā)的 url 地址
如果指定重定向,不能定向到 /WEB-INF 目錄中
應(yīng)用實(shí)例-代碼實(shí)現(xiàn)
修改 GoodsHandler.java, 增加方法 order()
直接指定要請(qǐng)求轉(zhuǎn)發(fā)的或者是重定向的頁(yè)面
- 對(duì)于重定向來(lái)說(shuō),不能重定向到 /WEB-INF/ 目錄下
- redirect 關(guān)鍵字,表示進(jìn)行重定向
- /login.jsp 在服務(wù)器解析 /springmvc/login.jsp
@RequestMapping("/goods") @Controller public class GoodsHandler { /** * 演示直接指定要請(qǐng)求轉(zhuǎn)發(fā)的或者是重定向的頁(yè)面 * @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 然后會(huì)報(bào)404錯(cuò)誤
修改view.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>自定義視圖測(cè)試</title> </head> <body> <h1>自定義視圖測(cè)試</h1> <a href="goods/buy">點(diǎn)擊到自定義視圖-</a><br/> <a href="goods/order">測(cè)試在目標(biāo)方法中指定請(qǐng)求轉(zhuǎn)發(fā)或者重定向的頁(yè)面-</a><br/> </body> </html>
完成測(cè)試(頁(yè)面測(cè)試)
完成測(cè)試(Postman 測(cè)試)
??綜合代碼演示
完成一個(gè)簡(jiǎn)單的用戶登錄案例
- 編寫登錄頁(yè)面 login.jsp
- LoginHandler [doLogin 方法], 如果用戶輸入用戶名是 wyx, 密碼 123 就可以登錄成功.
- 創(chuàng)建 JavaBean : User.java
- 表單提交數(shù)據(jù)到 doLogin 方法, 以 User 對(duì)象形式接收.
- 登錄成功到, 頁(yè)面 login_ok.jsp 并顯示登錄歡迎信息
- 登錄失敗, 到頁(yè)面 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工程路徑的知識(shí)點(diǎn) 如果忘記了 可以去看我的博客 鏈接
- <%=request.getContextPath()%>/homework/login.jsp
服務(wù)器解析 /springmvc/homework/login.jsp
- 瀏覽器會(huì)解析 為 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())){ //驗(yàn)證OK return "forward:/WEB-INF/pages/homework/login_ok.jsp"; } else { return "forward:/WEB-INF/pages/homework/login_error.jsp"; } } }
??總結(jié)
- 對(duì)于重定向來(lái)說(shuō),不能重定向到 /WEB-INF/ 目錄下
- redirect 關(guān)鍵字,表示進(jìn)行重定向
- MyView繼承了AbstractView, 就可以作為一個(gè)視圖使用
- 配置 屬性 order, 表示視圖解析器執(zhí)行的順序, 值越小, 優(yōu)先級(jí)越高
- 屬性 order 的默認(rèn)值是最低優(yōu)先級(jí) ,值為 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647
到此這篇關(guān)于什么是springMVC 視圖和視圖解析器的文章就介紹到這了,更多相關(guān)springMVC視圖解析器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud?Eureka服務(wù)注冊(cè)中心應(yīng)用入門詳解
這篇文章主要介紹了Spring?Cloud?Eureka服務(wù)注冊(cè)中心入門流程分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07SpringBoot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包的操作步驟
在開(kāi)發(fā)過(guò)程中,需要不斷進(jìn)行環(huán)境的切換和打包部署,maven提供了多環(huán)境配置,可以方便實(shí)現(xiàn)不同環(huán)境的配置切換和打包,本文通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04IDEA運(yùn)行java程序時(shí)總彈出提示配置Edit Configurations問(wèn)題
更新IDEA后,運(yùn)行Java程序時(shí)可能需要手動(dòng)配置JDK版本,通過(guò)統(tǒng)一設(shè)置默認(rèn)JDK可以解決每次彈出EditConfigurations的問(wèn)題,此操作可以簡(jiǎn)化開(kāi)發(fā)流程,提高效率2024-09-09Spring Boot應(yīng)用上傳文件時(shí)報(bào)錯(cuò)的原因及解決方案
這篇文章主要介紹了Spring Boot應(yīng)用上傳文件時(shí)報(bào)錯(cuò)的原因及解決方案,幫助大家更好的理解和學(xué)習(xí)使用spring boot框架,感興趣的朋友可以了解下2021-02-02Java通過(guò)Scanner了解if...else if語(yǔ)句
這篇文章主要介紹了Java通過(guò)Scanner了解if...else if語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01解決java?try?throw?exception?finally遇上return?break?conti
這篇文章主要介紹了解決java?try?throw?exception?finally遇上return?break?continue造成異常丟失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11深入理解 Java 中的 Switch 語(yǔ)句示例詳解
在Java編程中,switch語(yǔ)句通過(guò)表達(dá)式值來(lái)執(zhí)行不同代碼塊,本文介紹switch語(yǔ)法、案例、注意事項(xiàng),以及與if語(yǔ)句的對(duì)比,包括基本語(yǔ)法、關(guān)鍵字、表達(dá)式、case常量、break和default的使用,以及如何根據(jù)輸入的字符輸出星期、大小寫轉(zhuǎn)換、成績(jī)判斷和季節(jié)判斷等實(shí)際應(yīng)用場(chǎng)景2024-10-10springboot中.yml文件的值無(wú)法讀取的問(wèn)題及解決
這篇文章主要介紹了springboot中.yml文件的值無(wú)法讀取的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02