java學習之SpringMVC

来源:https://www.cnblogs.com/0x3e-time/archive/2022/07/05/16446710.html
-Advertisement-
Play Games

SpringMvc相較於Servlet開發簡單了很多只需要常用的註解,我們需要記住的是它用了那些方式去傳輸數據和驗證數據,方便以後對java框架的審計,mvc有很多內容是和Servlet重覆的我只需要大概的複習一遍,解下來還有最後一點mvc的只是就是攔截器。 ...


0x00前言

Spring MVC 是 Spring 提供的一個基於 MVC 設計模式的輕量級 Web 開發框架,本質上相當於 Servlet。

Spring MVC 是結構最清晰的 Servlet+JSP+JavaBean 的實現,是一個典型的教科書式的 MVC 構架,不像 Struts 等其它框架都是變種或者不是完全基於 MVC 系統的框架。

Spring MVC 角色劃分清晰,分工明細,並且和 Spring 框架無縫結合。Spring MVC 是當今業界最主流的 Web 開發框架,以及最熱門的開發技能。

在 Spring MVC 框架中,Controller 替換 Servlet 來擔負控制器的職責,用於接收請求,調用相應的 Model 進行處理,處理器完成業務處理後返回處理結果。Controller 調用相應的 View 並對處理結果進行視圖渲染,最終客戶端得到響應信息

0x01springmvc介紹

  • SpringMVC一種基於Java實現MVC模型的輕量級Web框架
  • 使用簡單方便開發,是簡化版的servlt
  • 用於表現層開發的一種框架
  • 現在都採用註解開發更加方便

0x02SpringMVC簡單入門

是屬於sping容器的spring又是ioc模式的所要把所有都配置成bean

寫一個配置類

//springmvc配置類,本質上還是一個spring配置類
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

寫載入類去載入spring容器里的bean

package com.itheima.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

//web容器配置類
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //載入springmvc配置類,產生springmvc容器(本質還是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext對象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //載入指定配置類
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //設置由springmvc控制器處理的請求映射路徑
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //載入spring配置類
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

控制器

package com.itheima.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

//定義表現層控制器bean
@Controller
public class UserController {

    //設置映射路徑為/save,即外部訪問路徑
    @RequestMapping("/save")
    //設置當前操作返回結果為指定json數據(本質上是一個字元串信息)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }

    //設置映射路徑為/delete,即外部訪問路徑
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

  1. 簡單配置就說的是用@@RequestMapping作為訪問的路徑
  2. @ResponseBody寫在函數上面就可以用該函數的返回值作為響應值,也可以設置請求方式

0x03MVC常用註解

0x1配置簡化開發

package com.itheima.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web配置類簡化開發,僅設置配置類類名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
/*

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}
*/

0x2路徑配置

@Controller
//類上方配置的請求映射與方法上面配置的請求映射連接在一起,形成完整的請求映射路徑
@RequestMapping("/user")
public class UserController {
    //請求路徑映射
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    //請求路徑映射
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }

}
  1. 訪問第一個方法的路徑是/user/save
  2. 第二個方法的路徑是/user/delete

0x3請求方式和註解

//請求參數
@Controller
public class UserController {

    //普通參數:請求參數與形參名稱對應即可完成參數傳遞
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println("普通參數傳遞 name ==> "+name);
        System.out.println("普通參數傳遞 age ==> "+age);
        return "{'module':'common param'}";
    }

    //普通參數:請求參數名與形參名不同時,使用@RequestParam註解關聯請求參數名稱與形參名稱之間的關係
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String userName , int age){
        System.out.println("普通參數傳遞 userName ==> "+userName);
        System.out.println("普通參數傳遞 age ==> "+age);
        return "{'module':'common param different name'}";
    }

    //POJO參數:請求參數與形參對象中的屬性對應即可完成參數傳遞
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo參數傳遞 user ==> "+user);
        return "{'module':'pojo param'}";
    }

    //嵌套POJO參數:嵌套屬性按照層次結構設定名稱即可完成參數傳遞
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println("pojo嵌套pojo參數傳遞 user ==> "+user);
        return "{'module':'pojo contain pojo param'}";
    }

    //數組參數:同名請求參數可以直接映射到對應名稱的形參數組對象中
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("數組參數傳遞 likes ==> "+ Arrays.toString(likes));
        return "{'module':'array param'}";
    }

    //集合參數:同名請求參數可以使用@RequestParam註解映射到對應名稱的集合對象中作為數據
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println("集合參數傳遞 likes ==> "+ likes);
        return "{'module':'list param'}";
    }


    //集合參數:json格式
    //1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
    //2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的集合對象中作為數據
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("list common(json)參數傳遞 list ==> "+likes);
        return "{'module':'list common for json param'}";
    }

    //POJO參數:json格式
    //1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
    //2.使用@RequestBody註解將外部傳遞的json數據映射到形參的實體類對象中,要求屬性名稱一一對應
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("pojo(json)參數傳遞 user ==> "+user);
        return "{'module':'pojo for json param'}";
    }

    //集合參數:json格式
    //1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
    //2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的保存實體類對象的集合對象中,要求屬性名稱一一對應
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list pojo(json)參數傳遞 list ==> "+list);
        return "{'module':'list pojo for json param'}";
    }

    //日期參數
    //使用@DateTimeFormat註解設置日期類型數據格式,預設格式yyyy/MM/dd
    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                            @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
        System.out.println("參數傳遞 date ==> "+date);
        System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);
        System.out.println("參數傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
        return "{'module':'data param'}";
    }

}


  1. 請求方式的配置是在路徑也就是@RequestMapping後面配上method=request.get/post/put/delete
  2. 當輸入的參數和獲取的參數不同時候用,@RequestParam("name")這種類似的標簽給形參綁定值,如果形參和傳入值相同的話可以不用謝註解

0x4JSON傳輸

package com.itheima.controller;

import com.itheima.domain.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
//請求參數
@Controller
public class UserController {

    //普通參數:請求參數與形參名稱對應即可完成參數傳遞
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println("普通參數傳遞 name ==> "+name);
        System.out.println("普通參數傳遞 age ==> "+age);
        return "{'module':'common param'}";
    }

    //普通參數:請求參數名與形參名不同時,使用@RequestParam註解關聯請求參數名稱與形參名稱之間的關係
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String userName , int age){
        System.out.println("普通參數傳遞 userName ==> "+userName);
        System.out.println("普通參數傳遞 age ==> "+age);
        return "{'module':'common param different name'}";
    }

    //POJO參數:請求參數與形參對象中的屬性對應即可完成參數傳遞
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo參數傳遞 user ==> "+user);
        return "{'module':'pojo param'}";
    }

    //嵌套POJO參數:嵌套屬性按照層次結構設定名稱即可完成參數傳遞
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println("pojo嵌套pojo參數傳遞 user ==> "+user);
        return "{'module':'pojo contain pojo param'}";
    }

    //數組參數:同名請求參數可以直接映射到對應名稱的形參數組對象中
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("數組參數傳遞 likes ==> "+ Arrays.toString(likes));
        return "{'module':'array param'}";
    }

    //集合參數:同名請求參數可以使用@RequestParam註解映射到對應名稱的集合對象中作為數據
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println("集合參數傳遞 likes ==> "+ likes);
        return "{'module':'list param'}";
    }


    //集合參數:json格式
    //1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
    //2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的集合對象中作為數據
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("list common(json)參數傳遞 list ==> "+likes);
        return "{'module':'list common for json param'}";
    }

    //POJO參數:json格式
    //1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
    //2.使用@RequestBody註解將外部傳遞的json數據映射到形參的實體類對象中,要求屬性名稱一一對應
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("pojo(json)參數傳遞 user ==> "+user);
        return "{'module':'pojo for json param'}";
    }

    //集合參數:json格式
    //1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
    //2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的保存實體類對象的集合對象中,要求屬性名稱一一對應
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list pojo(json)參數傳遞 list ==> "+list);
        return "{'module':'list pojo for json param'}";
    }

    //日期參數
    //使用@DateTimeFormat註解設置日期類型數據格式,預設格式yyyy/MM/dd
    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                            @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
        System.out.println("參數傳遞 date ==> "+date);
        System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);
        System.out.println("參數傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
        return "{'module':'data param'}";
    }

}

  1. public String listPojoParamForJson(@RequestBody List<User> list)
  2. 這個方法中註解代表的意思是形參接受的是請求頭中的流量
  3. 在config文件裡面加上//開啟json數據類型自動轉換 @EnableWebMvc
  4. json是以後很常用的傳輸方式

0x5響應

@Controller
public class UserController {

    //響應頁面/跳轉頁面
    //返回值為String類型,設置返回值為頁面名稱,即可實現頁面跳轉
    @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("跳轉頁面");
        return "page.jsp";
    }

    //響應文本數據
    //返回值為String類型,設置返回值為任意字元串信息,即可實現返回指定字元串信息,需要依賴@ResponseBody註解
    @RequestMapping("/toText")
    @ResponseBody
    public String toText(){
        System.out.println("返回純文本數據");
        return "response text";
    }

    //響應POJO對象
    //返回值為實體類對象,設置返回值為實體類類型,即可實現返回對應對象的json數據,需要依賴@ResponseBody註解和@EnableWebMvc註解
    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println("返回json對象數據");
        User user = new User();
        user.setName("itcast");
        user.setAge(15);
        return user;
    }

    //響應POJO集合對象
    //返回值為集合對象,設置返回值為集合類型,即可實現返回對應集合的json數組數據,需要依賴@ResponseBody註解和@EnableWebMvc註解
    @RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println("返回json集合數據");
        User user1 = new User();
        user1.setName("傳智播客");
        user1.setAge(15);

        User user2 = new User();
        user2.setName("黑馬程式員");
        user2.setAge(12);

        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);

        return userList;
    }
}

  1. 想返回一個頁面直接把方法的返回值寫成String然後返回那個頁面的名字寫在哪裡
  2. 響應文本數據
    返回值為String類型,設置返回值為任意字元串信息,即可實現返回指定字元串信息,需要依賴@ResponseBody註解
  3. 響應POJO對象
    //返回值為實體類對象,設置返回值為實體類類型,即可實現返回對應對象的json數據,需要依賴@ResponseBody註解和@EnableWebMvc註解
  4. 響應POJO集合對象
    返回值為集合對象,設置返回值為集合類型,即可實現返回對應集合的json數組數據,需要依賴@ResponseBody註解和@EnableWebMvc註解

0x04總結

SpringMvc相較於Servlet開發簡單了很多只需要常用的註解,我們需要記住的是它用了那些方式去傳輸數據和驗證數據,方便以後對java框架的審計,mvc有很多內容是和Servlet重覆的我只需要大概的複習一遍,解下來還有最後一點mvc的只是就是攔截器。


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

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 選擇結構 選擇結構分為為i語句和switch語句 if語句 1.if單選擇語句 結構圖:(用輸出語句打了一個簡單結構圖) 代碼示例: public class IfDemo01 { public static void main(String[] args) { /*if單選擇語句 i ...
  • 搭建免費的代理ip池 需要解決的問題: 使用什麼方式存儲ip 文件存儲 缺點: 打開文件修改文件操作較麻煩 mysql 缺點: 查詢速度較慢 mongodb 缺點: 查詢速度較慢. 沒有查重功能 redis --> 使用redis存儲最為合適 所以 -> 數據結構採用redis中的zset有序集合 ...
  • 順序結構 java的基本結構有順序結構、選擇結構、迴圈結構。我們先來學習順序結構 java的基本結構就是順序結構,也就是java按照順序一步一步執行,除非有特殊說明。 順序結構也是最簡單的演算法結構 語句與語句之間,框與框之間是按從上到下的順序進行的,它是由若幹個一次執行的處理步驟組成的,它是任何一個 ...
  • 本系列Netty源碼解析文章基於 4.1.56.Final版本,公眾號:bin的技術小屋 前文回顧 在前邊的系列文章中,我們從內核如何收髮網絡數據開始以一個C10K的問題作為主線詳細從內核角度闡述了網路IO模型的演變,最終在此基礎上引出了Netty的網路IO模型如下圖所示: 詳細內容可回看《從內核角 ...
  • 基礎學的太枯燥了,當然需要用案例來實踐一下,才能更好的鞏固所學。 所以本次來個對手機號進行加密,檢驗我們所學~ 知識點: 文件讀寫 基礎語法 字元串處理 正則表達式 代碼部分 # 導入系統包 import platform import re print("Hello,秀兒") print("簡單的 ...
  • Hi,大家好,我是Mic 一個工作了3年的粉絲,在面試的時候遇到一個線程相關問題。 想讓我幫他解答一下。 問題是,“什麼是守護線程,它有什麼特點” 下麵看看高手的回答。 高手: 好的。 守護線程,它是一種專門為用戶線程提供服務的線程,它的生命周期依賴於用戶線程。 只有JVM中仍然還存在用戶線程正在運 ...
  • 1.Scanner對象 ​ 在學習java流程式控制制之前,我們首先學一下Scanner對象,通過Scanner類來獲取用戶的輸入,java.util.Scanner是java5之後出現的! 基本語法 Scanner scanner=new Scanner(System.in); 我們可以再程式中按住c ...
  • 一、下載jdk 官網下載地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 需要登錄Oracle賬號 百度網盤下載地址: 鏈接:https://pan.baidu.com/s/1kV0yY2eYz ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...