SpringMVC的映射器、適配器、解析器

来源:https://www.cnblogs.com/guopeng-blogs/archive/2018/01/08/8245092.html
-Advertisement-
Play Games

1.處理器和適配器 1.1springmvc的映射器 根據客戶端請求的url,找到處理本次請求的handler(處理器),將url和controller關聯起來 1.2springmvc的適配器 對映射器查找到的controller中的方法進行調用。 第一種:Controller適配 第二種:Htt ...


1.處理器和適配器

1.1springmvc的映射器

  根據客戶端請求的url,找到處理本次請求的handler(處理器),將url和controller關聯起來

1.2springmvc的適配器

  對映射器查找到的controller中的方法進行調用。

  第一種:Controller適配

  第二種:HttpRequestHandler適配

  第三種:註解適配

  不同的處理器,對應不同的適配器,但是所有適配器最終都返回ModelAndView對象,springmvc通過對ModelAndView對象進行解析,獲得需要響應到客戶端的數據和視圖

1.3springmvc的執行過程

  第一步:客戶端通過url發送請求

  第二步:核心控制器DispatcherServlet接收到請求

  第三步:通過系統的映射器找到對應的handler(處理器),並返回給核心控制器

  第四步:通過核心控制器在找到handler(處理器)對應的適配器,

  第五步:由找到的適配器,調用對應的handler(處理器),並將結果返回給適配器

  第六步:適配器將ModelandView對象返回給核心控制器

  第七步:由核心控制器將返回的ModelandView給視圖解析器

  第八步:有核心控制將解析的結果進行響應,最終將結果響應到客戶端

 

2 自定義Hander的方法定義

2.1方法的參數問題

2.1.1預設參數

  HttpServletRequest

  HttpServletResponse

  HttpSession

  Model(預設作用範圍就是request)

2.1.2客戶端請求數據的綁定(重點)

  使用處理本次請求的方法的形參,接收客戶端發送的數據

  

第一種:定義簡單的類型的參數

  String,基本類型對應的包裝類型

 package org.guangsoft.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.ui.Model;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 
 7 @Controller
 8 public class UserController3
 9 {
10     /**
11      * 返回值:stirng表示跳轉的路徑
12      * username:接受客戶端請求的username
13      * passowrd:接受客戶端請求的password
14      * model:封裝需要響應到客戶端的數據
15      * 參數名稱必須和客戶端請求的參數名稱一致
16      * @return
17      */
18     @RequestMapping("/userLogin")//客戶端請求的url
19     public String userLogin(String username, String password, Model model)
20     {
21         if(username.equals("root") && password.equals("root"))
22         {
23             model.addAttribute("username",username);
24             return "success.jsp";//完成頁面的跳轉
25         }
26         else
27         {
28             model.addAttribute("msg", "您的用戶名或密碼錯誤!");
29             return "error.jsp";
30         }
31     }
32 }

第二種:定義javabean為形參

直接將請求的參數封裝為javabean的對象。

   定義javabean

 1 package org.guangsoft.controller;
 2 
 3 public class User
 4 {
 5     private String username;
 6     private String password;
 7     //定義集合屬性接受客戶端的數據
 8     private Integer age;
 9     public Integer getAge()
10     {
11         return age;
12     }
13     public void setAge(Integer age)
14     {
15         this.age = age;
16     }
17     public String getUsername()
18     {
19         return username;
20     }
21     public void setUsername(String username)
22     {
23         this.username = username;
24     }
25     public String getPassword()
26     {
27         return password;
28     }
29     public void setPassword(String password)
30     {
31         this.password = password;
32     }
33     
34 } 

定義UserController4
1 package org.guangsoft.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.ui.Model;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 
 7 @Controller
 8 public class UserController4
 9 {
10     @RequestMapping("/userLogin2")
11     public String userLogin2(Model model,User user,String hobbys[])
12     {
13         if(user.getUsername().equals("root") && user.getPassword().equals("root"))
14         {
15             model.addAttribute("username", user.getUsername());
16             return "success.jsp";
17         }
18         else
19         {
20             model.addAttribute("msg","用戶名或密碼錯誤!");
21             return "error.jsp";
22         }
23     }
24 }

建立視圖頁面
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML>
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     <title>My JSP 'index.jsp' starting page</title>
12     <meta http-equiv="pragma" content="no-cache">
13     <meta http-equiv="cache-control" content="no-cache">
14   </head>
15   
16   <body>
17       <div align="center">
18       <form action="userLogin.action" method="post">
19           <div>username:<input name="username"  /></div>
20           <div>password:<input name="password"  /></div>
21           <div>age:<input name="age" /></div>
22           <input name="hobbys" type="checkbox" value="1" />1
23           <input name="hobbys" type="checkbox" value="2" />2
24           <div><input type="submit" value="提交" /></div>
25       </form>
26       </div>
27   </body>
28 </html> 

第三種:定義集合形參  見上hobbies

2.2方法返回值

String 類型的返回值表示需要跳轉路徑

3 springmvc和struts2區別

  Struts2的核心控制器是過濾器(filter),springmvc的核心控制器(Servlet)

  Struts2的Action是多例的,springmvc的Handler(處理器)是單例的

  Struts2用Action的屬性接收客戶端數據(必須多例才線程安全),springmvc使用方法的形參接收客戶端數據(線程安全的)

  Struts2是針對Action類型進行mapping(和url關聯)

  Springmvc是針對Handler中的處理請求的方法進行mappring(和url關聯),

  Springmvc在請求處理的控制上更精確,(粒度更小)

 

 

本文源於 https://www.cnblogs.com/guanghe/p/6188553.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 外部模板 傳統 C++ 中,模板只有在使用時才會被編譯器實例化。換句話說,只要在每個編譯單元(文件) 中編譯的代碼中遇到了被完整定義的模板,都會實例化。這就產生了重覆實例化而導致的編譯時間的增加。並且,我們沒有辦法通知編譯器不要出發模板實例化。 C++11 引入了外部模板,擴充了原來的強制編譯器在特... ...
  • JVM 垃圾回收 這篇文章嘗試對當前主流的JVM垃圾回收機制進行簡要介紹。 一 垃圾回收討論的範圍 JVM 的記憶體分為方法區,JVM棧,本地方法棧,堆,程式計數器等幾個部分。 其中程式計數器,JVM棧,本地方法棧三部分的生命周期與線程相同,隨著線程的回收這幾部分記憶體其生命周期自然結束而得以回收。 而 ...
  • UDP通信需要明確的幾點: (1).只不過對於發送端來說,創建發送報文對象需要指定目標套接字信息(ip+port),還需明確數據發送緩衝區。 (2).而對於接收端來說,則只需明確一個數據接收緩衝區即可。 UDPSender端: UDPRecver端: UDP實現群聊: 思路: 註:若您覺得這篇文章還 ...
  • switch有兩種結束方式:1、執行遇到break跳出switch 2、執行到switch語句{ }的結束 如果switch中的case沒有break語句,程式將會繼續執行邏輯語句,不進行case語句判斷 switch的另一種形式 ...
  • 一、單個if語句 二、帶else的if語句 三、多個if else語句 ...
  • 1、輸出 用print()在括弧中加上字元串,就可以向屏幕上輸出指定的文字。 輸入以上代碼,執行後輸出: 事實上,任何基本類型都可以用print()函數輸出。預設輸出是換行的,如果要實現不換行需要在變數末尾加上 end="": 執行以上代碼,輸出: print()函數也可以接受多個字元串,用逗號“, ...
  • 今天主要學習了遞歸函數,已經嘗試了一些小例子,這裡拿階乘和漢諾塔來記錄下。 1、階乘函數 階乘很簡單,即n! = 1x2x3x...xn。 先用了常用的迭代函數來寫階乘,代碼如下,很簡單的函數 邏輯很簡單,不斷地給變數y進行迭代。因為是在學習遞歸,所以又用遞歸的方法,重新來寫一下。 原理就是,n! ...
  • 嵌套類 嵌套類有兩種類別:static and non-static,分別對應為靜態嵌套類和內部類。 其中靜態嵌套類只能訪問外部類的靜態成員,內部類可以訪問外部類的任意成員;它們可以被聲明為private, public, protected, 或 package private。 靜態嵌套類實例化 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...