国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

這篇具有很好參考價(jià)值的文章主要介紹了Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

學(xué)習(xí)視頻:孫哥說SpringMVC:結(jié)合Thymeleaf,重塑你的MVC世界?。八从械腤eb開發(fā)探索之旅

銜接上文Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(一)

  • SpingMVC中request作用域的處理

    • 代碼

      # 基于Model的方式 
      @RequestMapping("view2")
      public String view2(Model model) {
      		// 等同于 request.addAttribute();
          model.addAttribute("name", "suns");
          return "result1";
      }
      # 基于ModelMap的方式 同上
      @RequestMapping("view3")
      public String view3(ModelMap modelMap) {
          modelMap.addAttribute("name", "suns2");
          return "result1";
      }
      
    • Model、ModelMap相關(guān)細(xì)節(jié)分析

      1. 通過Model、ModelMap進(jìn)行作用域處理,可以解決視圖模板技術(shù)耦合的問題

        因?yàn)镾pringMVC通過視圖解析器區(qū)別JSP、FreeMaker,再將Model、ModelMap的數(shù)據(jù)放到request或root里面運(yùn)行。

        Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

      2. SpringMVC中提供Model和ModelMap兩種方式處理request作用域,他們的區(qū)別是什么

        雖然兩者表現(xiàn)形式以及聲明的形參類型都不同,但是在運(yùn)行時(shí),SpringMVC會(huì)動(dòng)態(tài)提供對(duì)應(yīng)的實(shí)現(xiàn)類型,名字是BindingAwareModelMap。所以本質(zhì)上兩者相同。

      3. 為什么不直接使用BindingAwareModelMap?

        在源碼中,Model接口會(huì)根據(jù)開發(fā)者使用SpringMVC或Spring WebFlux進(jìn)行自動(dòng)適配,使用MVC開發(fā)時(shí)會(huì)使用BindingAwareModelMap,而WebFlux開發(fā)時(shí)使用的是ConcurrentModel。

        Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

        Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

      4. SpringMVC為什么會(huì)提供兩種開發(fā)方式?Model、ModelMap這兩種開發(fā)方式,更推薦哪種使用?

        推薦使用Model,ModelMap是老系統(tǒng)使用的,為了兼容老系統(tǒng)所以留著。Model可以兼容傳統(tǒng)MVC也可以在WebFlux中使用,更有利于項(xiàng)目維護(hù)。

      5. 如果redirect跳轉(zhuǎn),數(shù)據(jù)如何跳轉(zhuǎn)

        SpringMVC會(huì)自動(dòng)把Model或ModelMap中的數(shù)據(jù),通過?的形式在url上進(jìn)行拼接,從而傳遞數(shù)據(jù)

  • SpringMVC中Session作用域的處理

    • 基本使用方式及其存在的問題

      session.setAttribute("name","value");
      
      @RequestMapping("view")
      public String view1(HttpSession session){
      		session.setAttribute("name","value");
      		return "result";
      }
      存在問題:與ServletAPI耦合,在SpringMVC中不建議使用。
      
    • @SessionAttributes注解

      • 存儲(chǔ)數(shù)據(jù)

        @Controller
        @RequestMapping("view3")
        **@SessionAttributes(value = "name")  // 聲明name存在session作用域**
        public class View3Controller {
        
            @RequestMapping("view1")
            public String view1(Model model) {
                model.addAttribute("name", "xiaojr");
        				model.addAttribute("age", 10);
                return "result1";
            }
        }
        // jsp中取值
        <html>
        <body>
            <h1>session attribute is ${sessionScope.name}</h1>
            <h1>request attribute is ${requestScope.age}</h1>
        </body>
        </html>
        
      • 注意

        1. Model、ModelMap把name的數(shù)據(jù)通過@SessionAttributes存儲(chǔ)在Session作用域中的同時(shí)在Request作用域中也會(huì)存儲(chǔ)。
        2. 此時(shí)Request作用域、Session作用域存儲(chǔ)的是一個(gè)對(duì)象的引用。
    • 刪除Session作用域中的數(shù)據(jù)

      Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

  • SpringMVC中application作用域的處理

    Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

  • 為什么SpringMVC沒有提供application作用域

    因?yàn)閍pplication這個(gè)作用域是全局唯一,在開發(fā)中多用于存儲(chǔ)全局唯一的對(duì)象,被框架底層封裝,在開發(fā)時(shí),程序員基本不會(huì)使用其用于業(yè)務(wù)操作。

  • @ModelAttribute注解

    1. SpringMVC通過@ModelAttribute注解:接受請(qǐng)求參數(shù)的同時(shí),把數(shù)據(jù)存儲(chǔ)到request作用域中。

      @RequestMapping("view1")
      public String view1(@ModelAttribute("name") String name) {
          System.out.println("View4Controller.view1");
          return "result2";
      }
      
    • 使用場(chǎng)景

      Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問
      傳遞頁(yè)碼時(shí)可以使用。

    • 注意細(xì)節(jié)

      • 細(xì)節(jié)一

        如果傳遞的是簡(jiǎn)單變量參數(shù):則value屬性必須與超級(jí)鏈接或表單的key名稱保持一致。

        如果傳遞的是POJO類型的請(qǐng)求參數(shù):則沒有上述要求,但是value屬性會(huì)作為request作用域的名稱。

      • 細(xì)節(jié)二

        1. @ModelAttribute中value的值不能與@SessionAttributes中value的值一致,如果一致則會(huì)產(chǎn)生異常
        2. 如果要把請(qǐng)求參數(shù)的數(shù)據(jù)也存在session作用域中,需要將request作用域存儲(chǔ)改為使用傳統(tǒng)做法:model.addAttribute(”name”,name);
  • 什么是ModelAndView【了解】

    • 什么是ModelAndView

      ModelAndView這個(gè)類型,實(shí)際上是一個(gè)復(fù)合類型,起到了2個(gè)方面的作用。

      注意:ModelAndView里面只能使用ModelMap,這也是它的劣勢(shì)之一。

      1. Model 代表作用域的操作,就是前面的ModelMap。
      2. View 代表跳轉(zhuǎn)路徑(頁(yè)面),對(duì)應(yīng)前面的四種跳轉(zhuǎn)。

      最終這兩方面的工作統(tǒng)一被ModelAndView進(jìn)行封裝,做為控制器方法的返回值使用。

      Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

    • 總結(jié)目前控制器方法返回值

      1. public String controller();
      2. public ModelAndView controller();
      注意:SpringMVC處理跳轉(zhuǎn)頁(yè)面和作用域時(shí),把相應(yīng)的內(nèi)容都會(huì)封裝到ModelAndView中,
      所以ModelAndView返回值的這種處理更加底層,而返回值String的處理僅是簡(jiǎn)化開發(fā)。
      

5.5 視圖控制器

5.5.1 什么是視圖控制器

  1. 視圖控制器可以通過配置的方式,訪問受保護(hù)的視圖模板,簡(jiǎn)化開發(fā)。

  2. 什么是視圖模板?

    JSP Thymeleaf FreeMarker Velocity

  3. 為什么需要保護(hù)視圖模板?

    目前的開發(fā)方式都沒有對(duì)視圖模板進(jìn)行保護(hù),有可能導(dǎo)致程序在被用戶訪問時(shí)產(chǎn)生非預(yù)期效果(Bug)

  4. 如何保護(hù)視圖模板

    將所有視圖模板放置在WEB-INF下,這樣用戶就無(wú)法通過地址直接訪問視圖模板了。

    Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

5.5.1 受保護(hù)的視圖模板如何訪問?

  1. 所有的視圖模板,只能通過控制器forward訪問:return "result"; return "forward:/WEB-INF/jsp/result.jsp";

    記得同時(shí)修改viewResolver

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" **value="/WEB-INF/jsp/"/>**
        <property name="suffix" value=".jsp"/>
    </bean>
    

5.5.2 視圖控制器

雖然可以通過控制器forward訪問視圖模板,但是直接訪問頁(yè)面也需要控制器,因此會(huì)變得繁瑣,所以有了視圖控制器的存在:通過在配置文件(dispatcher.xml)可以直接訪問

<mvc:view-controller path="/result3" view-name="result3"/>
注意:path不能和@RequestMapping的路徑?jīng)_突

Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

5.5.3 視圖控制器的Redirect跳轉(zhuǎn)

@RequestMapping("view1")
public String view1() {
    System.out.println("View6Controller.view1");
    return "redirect:/result4";
}

<mvc:view-controller path="/result4" view-name="result4"/>

5.6 靜態(tài)資源處理

5.5.1 什么是靜態(tài)資源

  1. 所謂靜態(tài)資源,指的是項(xiàng)目中非java代碼部分的內(nèi)容,如 圖片、js文件、css文件。

Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

  1. 目前SpringMVC的開發(fā)中,按照現(xiàn)有的配置內(nèi)容,是無(wú)法訪問靜態(tài)資源的。

Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問
g)

在SpringMVC底層,資源請(qǐng)求訪問DispatcherServlet后,會(huì)將其請(qǐng)求當(dāng)成控制器并調(diào)用對(duì)應(yīng)的控制器方法創(chuàng)建對(duì)象,但是在靜態(tài)資源訪問,第一步就走不通了,所以就報(bào)錯(cuò)404。

5.5.3 解決方式

  • 方式一【DefaultServlet】

    Tomcat提供了能夠訪問靜態(tài)資源的DefaultServlet(web.xml)

    Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

    在web.xml添加DefaultServlet后的代碼:

    Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

  • 方式二【default-servlet-handler】推薦

    • 第一種開發(fā)方式的問題

      Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

  • default-servlet-handler開發(fā)方式

    1. 在SpringMVC的配置文件(dispatcher.xml)中,配置<mvc:default-servlet-handler/>即可
  • 實(shí)現(xiàn)原理

    1. <mvc:default-servlet-handler/>標(biāo)簽的底層也是調(diào)用了defaultServlet進(jìn)行的靜態(tài)資源處理。

    2. <mvc:default-servlet-handler/>標(biāo)簽他是如何調(diào)用defaultServlet進(jìn)行靜態(tài)資源處理的?

      他的底層是通過DefaultServletHttpRequestHandler,以forward的形式調(diào)用的DefaultServlet。

      Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問

    mvc:default-servlet-handler/完整運(yùn)行流程:用戶如果發(fā)起控制器的請(qǐng)求,首先會(huì)到DispatcherServlet,然后DispatcherServlet會(huì)通過RequestMappingHandlerMapiping查找控制器上@RequestMapping注解并進(jìn)行相應(yīng)的匹配,進(jìn)而查找,如果查找到則會(huì)通過HandlerAdapter進(jìn)行處理。對(duì)于靜態(tài)資源的操作,也就是使用了<mvc:default-servlet-handler/>的處理,它的請(qǐng)求也一樣會(huì)訪問DispatcherServlet,沒查找到則會(huì)通過SimpleUrlHandlerMapping調(diào)用DefaultServletHttpRequestHandler進(jìn)而調(diào)用DefaultServlet進(jìn)行靜態(tài)資源的處理。

下一章:Spring MVC學(xué)習(xí)隨筆-文件下載和上傳(配置文件上傳解析器multipartResolver)文章來源地址http://www.zghlxwxcb.cn/news/detail-747853.html

到了這里,關(guān)于Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 什么是域控制器Domain Controller?

    一個(gè)域描述了一組用戶、系統(tǒng)、應(yīng)用程序、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)服務(wù)器和其他任何資源,這些資源都受到一組共同的管理規(guī)則的控制。通常,一個(gè)域還包括一個(gè)物理空間,比如一個(gè)辦公室或多個(gè)辦公室。如果你在域內(nèi),你就處于一個(gè)理論上安全和可信的空間。如果在外面,你就是不

    2024年02月07日
    瀏覽(27)
  • beego的控制器Controller篇 — 數(shù)據(jù)處理

    1.1 獲取參數(shù) 通過如下方式獲取數(shù)據(jù): GetString(key string) string GetStrings(key string) []string GetInt(key string) (int64, error) GetBool(key string) (bool, error) GetFloat(key string) (float64, error) 例如: 如果需要的數(shù)據(jù)是其他類型的,例如是 int 類型而不是 int64,那么你需要這樣處理: 1.2?獲取表單中的

    2024年01月17日
    瀏覽(18)
  • 5、Kubernetes核心技術(shù) - Controller控制器工作負(fù)載

    5、Kubernetes核心技術(shù) - Controller控制器工作負(fù)載

    目錄 一、Deployments - 控制器應(yīng)用 二、Deployment升級(jí)回滾和彈性收縮 2.1、創(chuàng)建一個(gè) 1.14 版本的 pod 2.2、應(yīng)用升級(jí) 2.3、查看升級(jí)狀態(tài) 2.4、查看歷史版本 2.5、應(yīng)用回滾 2.6、彈性伸縮? 三、StatefulSet - 有狀態(tài)應(yīng)用 四、DaemonSet - 守護(hù)進(jìn)程 五、Job - 單次任務(wù) 六、Cronjob - 定時(shí)任務(wù) Deplo

    2024年02月15日
    瀏覽(24)
  • 第三十章 Unity角色控制器 Character Controller

    第三十章 Unity角色控制器 Character Controller

    在我們之前的章節(jié)中,我們已經(jīng)了解了碰撞體和剛體。但是,對(duì)于剛體這個(gè)組件來講,有兩種使用方式。其一就是用它來模擬現(xiàn)實(shí)世界的移動(dòng)或碰撞效果(例如,門的開關(guān));其二就是使用代碼來控制物體移動(dòng)或碰撞(例如,角色的行走)。兩種方式使用場(chǎng)景不同而已。 本章

    2024年02月08日
    瀏覽(90)
  • 【P31】JMeter 循環(huán)控制器(Loop Controller)

    【P31】JMeter 循環(huán)控制器(Loop Controller)

    可以對(duì)部分邏輯按常量進(jìn)行循環(huán)迭代 選擇線程組右鍵 添加 邏輯控制器 循環(huán)控制器(Loop Controller) Loop Count:設(shè)置運(yùn)行次數(shù),Infinite 勾選為永久運(yùn)行 2.1、設(shè)置循環(huán)次數(shù) (1)、測(cè)試計(jì)劃右鍵 添加 線程(用戶) 線程組 參數(shù)默認(rèn)即可 (2)、線程組右鍵 添加 取樣器 調(diào)試取樣器

    2024年02月07日
    瀏覽(25)
  • 【P38】JMeter 隨機(jī)控制器(Random Controller)

    【P38】JMeter 隨機(jī)控制器(Random Controller)

    可以讓控制器內(nèi)部的邏輯隨機(jī)執(zhí)行一個(gè),一般用來模擬業(yè)務(wù)的不確定性;隨機(jī)控制器在線程迭代或者控制器循環(huán)的時(shí)候均會(huì)觸發(fā) 選擇線程組右鍵 添加 邏輯控制器 隨機(jī)控制器(Random Controller) 忽略子控制器塊(Ignore sub-controller blocks):子控制器功能失效,由交替控制器代替

    2024年02月07日
    瀏覽(25)
  • 【P30】JMeter 事務(wù)控制器(Transaction Controller)

    【P30】JMeter 事務(wù)控制器(Transaction Controller)

    可以生成一個(gè)額外的樣本,這樣能夠?qū)⑺乃凶釉刈鳛橐粋€(gè)計(jì)量單元進(jìn)行監(jiān)聽;事務(wù)控制器本身不包含任何業(yè)務(wù)邏輯,只是組合出一個(gè)新的計(jì)量單元 選擇線程組右鍵 添加 邏輯控制器 事務(wù)控制器(Transaction Controller) Generate parent sample:選中,事務(wù)控制器將作為其他取樣器

    2024年02月06日
    瀏覽(28)
  • 【P34】JMeter ForEach控制器(ForEach Controller)

    【P34】JMeter ForEach控制器(ForEach Controller)

    可以對(duì)一個(gè)組變量進(jìn)行循環(huán)迭代;該組件通常與后置處理器中的 JSON 提取器、正則提取器、邊界提取器等進(jìn)行聯(lián)合使用 選擇線程組右鍵 添加 邏輯控制器 ForEach控制器(ForEach Controller) 輸入變量前綴(Input variable prefix):默認(rèn)為一個(gè)空字符串作為前綴 開始循環(huán)字段(不包含)

    2024年02月06日
    瀏覽(35)
  • Kubernetes技術(shù)--k8s核心技術(shù)Controller控制器

    Kubernetes技術(shù)--k8s核心技術(shù)Controller控制器

    1.Controller概述 ? ?Controller是在集群上管理和運(yùn)行容器的對(duì)象。是一個(gè)實(shí)際存在的對(duì)象。 2.pod和Controller之間的關(guān)系 pod通過controller實(shí)現(xiàn)應(yīng)用的運(yùn)維,包括伸縮、滾動(dòng)升級(jí)等操作。 這里pod和controller通過label標(biāo)簽來建立關(guān)系。如下所示: 3.Deployment控制器應(yīng)用場(chǎng)景 -1:部署無(wú)狀態(tài)的應(yīng)

    2024年02月10日
    瀏覽(33)
  • 【P33】JMeter 臨界部分控制器(Critical Section Controller)

    【P33】JMeter 臨界部分控制器(Critical Section Controller)

    可以對(duì)指定代碼塊增加同步鎖,確保此代碼塊由單線程執(zhí)行;通過 Java synchronized 實(shí)現(xiàn) 選擇線程組右鍵 添加 邏輯控制器 臨界部分控制器(Critical Section Controller) 鎖名稱(Lock name):鎖名為空,認(rèn)為每個(gè)鎖為不同的鎖;鎖名相同,多個(gè)鎖認(rèn)為是同一個(gè)鎖,同一個(gè)時(shí)間點(diǎn)

    2024年02月07日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包