最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC加載控制與Postmand的使用和Rest風(fēng)格的引入及RestFul開發(fā)全面詳解

 更新時(shí)間:2022年10月13日 14:28:22   作者:懶羊羊.java  
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)

前言

從繁到簡(jiǎn)是貫徹SSM學(xué)習(xí)過程的原始真解

一.bean的加載控制

在MVC的模式中,Spring控制著業(yè)務(wù)和功能的bean,SpringMVC控制著表現(xiàn)層的bean,因?yàn)楦髯缘淖饔貌煌?,我們要避免Spring加載到SpringMVC控制的bean,如何實(shí)現(xiàn)?

方式一:

設(shè)定Spring的包掃描范圍,排除表現(xiàn)層的bean所在的包

@ComponentScan({"com.yu7daily.service","com.yu7daily.dao"})
public class SpringConfig {...}

這樣寫的好處是可以適配所有的數(shù)據(jù)層技術(shù)通用性強(qiáng),如果使用的是mybatis,他的自動(dòng)代理為我們生成了對(duì)象可以不用掃描dao層對(duì)應(yīng)的包

方式二:

按注解過濾掉bean,因?yàn)镾pringMVC的配置類上存在@Controller注解,通過設(shè)置來過濾掉這個(gè)注解所在的類即可

@ComponentScan(value="com.yu7daily",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)
//設(shè)置spring配置類加載bean時(shí)的過濾規(guī)則,當(dāng)前要求排除掉表現(xiàn)層對(duì)應(yīng)的bean
//excludeFilters屬性:排除掃描路徑中指定類別加載的bean
//type屬性:設(shè)置排除規(guī)則,當(dāng)前使用按照bean定義時(shí)的注解類型進(jìn)行排除
//classes屬性:設(shè)置排除的具體注解類,當(dāng)前設(shè)置排除@Controller定義的bean

方式三:

將二者加載到同一個(gè)環(huán)境

二.容器加載

在web3.0中,提供了快速初始化web容器的方式——繼承AbstractDispatcherServletInitializer類并重寫其方法

1.createServletApplicationContext()方法

創(chuàng)建Servlet容器時(shí),加載SpringMVC對(duì)應(yīng)的bean并放入WebApplicationContext對(duì)象范圍中,從而將WebApplicationContext的作用范圍提升至ServletContext范圍,即 整個(gè)web容器范圍

    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringmvcConfig.class);
        return ctx;
    }

2.createRootApplicationContext()方法

創(chuàng)建servlet容器時(shí)需要加載非springMVC對(duì)應(yīng)的bean

    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }

3.getServletMappings()方法

設(shè)定SpringNc對(duì)應(yīng)的請(qǐng)求映射路徑,設(shè)置為 / 后表示攔截所有請(qǐng)求,任意請(qǐng)求都將轉(zhuǎn)入到SpringMVC進(jìn)行處理

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

這樣每當(dāng)我們啟動(dòng)服務(wù)器時(shí),就會(huì)自動(dòng)生成Spring和SpringMVC的容器,簡(jiǎn)化開發(fā)

上述不難發(fā)現(xiàn),都是通過指定配置文件名來完成容器的加載,存在一定的硬編碼問題,于是Spring為我們提供了更簡(jiǎn)單的加載方式——繼承AbstractAnnotationConfigDispatcherServletInitializer即可

代碼量顯著減少,這種方式更值得使用!

三.PostMan的引入

一般向?yàn)g覽器發(fā)送get請(qǐng)求比較容易,但發(fā)送post請(qǐng)求我們得另寫表單,發(fā)送ajax請(qǐng)求得另寫JS代碼,十分麻煩,PostMan的誕生很好地解決了這一問題

它主要是用來模擬各種HTTP請(qǐng)求的(如:get/post/delete/put…等等).,而且與瀏覽器的區(qū)別在于有的瀏覽器不能輸出Json格式,而Postman更直觀接口返回的結(jié)果

1.發(fā)送GET請(qǐng)求

1.首先寫好表現(xiàn)層

   @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println("傳遞的參數(shù)為 name ==> "+name);
        System.out.println("普通參數(shù)傳遞 age ==> "+age);
        return "Hello SpringMVC";
    }

2.在PostMan中發(fā)送請(qǐng)求

3.在IDEA中接收到了Postman發(fā)送過來的請(qǐng)求

2.發(fā)送POST請(qǐng)求

由于POST請(qǐng)求的參數(shù)處于請(qǐng)求體內(nèi),所以在Postman中要選擇以body的形式發(fā)送

服務(wù)器端接受的數(shù)據(jù)如下:

3.中文亂碼問題解決

當(dāng)我將“pyq”改為“懶羊羊”后發(fā)送請(qǐng)求則會(huì)出現(xiàn)中文亂碼問題

按照以往的套路,是在web服務(wù)器中添加一個(gè)過濾器即可,而在SpringMVC中將過濾器寫在配置類中即可

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};   //若要配置多個(gè)過濾器,在數(shù)組中添加即可
    }

四.Rest風(fēng)格

1.REST簡(jiǎn)介

REST(Representational State Transfer),表現(xiàn)形式狀態(tài)轉(zhuǎn)換,它是一種軟件架構(gòu)風(fēng)格,按照這種風(fēng)格來訪問資源則稱之為RESTful

當(dāng)我們想表示一個(gè)網(wǎng)絡(luò)資源的時(shí)候,可以使用兩種方式:

1.傳統(tǒng)風(fēng)格資源描述形式

http://localhost/user/getById?id=1 查詢id為1的用戶信息

http://localhost/user/saveUser 保存用戶信息

2.REST風(fēng)格描述形式

http://localhost/user/1

http://localhost/user

傳統(tǒng)方式一般是一個(gè)請(qǐng)求url對(duì)應(yīng)一種操作,這樣做不僅麻煩,也不安全,可以知道你進(jìn)行的操作,使用rest風(fēng)格后請(qǐng)求地址變的簡(jiǎn)單了,并且光看請(qǐng)求URL并不是很能猜出來該URL的具體功能

為了解決開發(fā)人員明白一個(gè)相同的url地址進(jìn)行的是何種操作,按照REST風(fēng)格訪問資源時(shí)使用行為動(dòng)作對(duì)資源操作進(jìn)行了區(qū)分

http://localhost/users查詢?nèi)坑脩粜畔?GET(查詢)
http://localhost/users/1查詢指定用戶信息 GET(查詢)
http://localhost/users添加用戶信息 POST(新增/保存)
http://localhost/users修改用戶信息 PUT(修改/更新)
http://localhost/users/1刪除用戶信息 DELETE(刪除)

請(qǐng)求的方式比較多,但是比較常用的就4種,分別是GET,POST,PUT,DELETE。

按照不同的請(qǐng)求方式代表不同的操作類型。

  • 發(fā)送GET請(qǐng)求是用來做查詢
  • 發(fā)送POST請(qǐng)求是用來做新增
  • 發(fā)送PUT請(qǐng)求是用來做修改
  • 發(fā)送DELETE請(qǐng)求是用來做刪除

值得注意的是:之所以稱之為REST風(fēng)格是因?yàn)橹皇且环N"風(fēng)格"而已,并不是規(guī)范,在實(shí)際開發(fā)中可以靈活變通,修改

2.RESTful傳參

RESTful的傳參方式稍微和上述有所不同,需要在@RequestMapping中指定請(qǐng)求行為和參數(shù)的名稱,以post提交為例

    @RequestMapping(value = "/users/{age}",method = RequestMethod.POST)
    @ResponseBody
    public String save(@PathVariable Integer age){  //@PathVariable表示此參數(shù)由路徑傳遞
        System.out.println("傳參age");
        return "Hello SpringMVC";
    }

我們輸入的路徑相比之下就顯得格外簡(jiǎn)潔,安全

同樣也可以成功傳送到服務(wù)器端

請(qǐng)求行為可以通過method靈活更改,但是設(shè)定好之后更改傳遞的方式就會(huì)報(bào)錯(cuò),例如method=RequestMethod.POST卻以GET的方式提交

@RequestParam用于接收url地址傳參或表單傳參(非json格式)
@RequestBody用于接收json數(shù)據(jù)(傳參數(shù)>1)
@PathVariable用于接收路徑參數(shù),使用{參數(shù)名稱}描述路徑參數(shù)(傳參數(shù)較少)

@RequestParam、@RequestBody前面的文章有過介紹

3.RESTful簡(jiǎn)便形式(快速開發(fā))

簡(jiǎn)化開發(fā)一般解決硬編碼問題,例如:

每個(gè)方法的@RequestMapping注解中都定義了訪問路徑/books,@RequestMapping注解中都要使用method屬性定義請(qǐng)求方式,響應(yīng)json都需要加上@ResponseBody注解重復(fù)性太高

所以:

1.將@RequestMapping提到類上面,用來定義所有方法共同的訪問路徑。

2.使用@GetMapping @PostMapping @PutMapping @DeleteMapping代替,設(shè)置當(dāng)前控制器方法請(qǐng)求訪問路徑與請(qǐng)求動(dòng)作,每種對(duì)應(yīng)一個(gè)請(qǐng)求動(dòng)作,例如@GetMapping對(duì)應(yīng)GET請(qǐng)求

3.將ResponseBody提到類上面,讓所有的方法都有@ResponseBody的功能

4.使用@RestController注解替換@Controller與@ResponseBody注解,簡(jiǎn)化書寫

就先這樣:

public class QQ {
    @RestController //@Controller + ReponseBody
    @RequestMapping("/goodss")
    public class goodsController {
        @PostMapping
        public String save(@RequestBody Goods goods){
            System.out.println("goods save..." + goods);
            return "Hello SpringMVC";
        }
        @DeleteMapping("/{id}")
        public String delete(@PathVariable Integer id){
            System.out.println("goods delete..." + id);
             return "Hello SpringMVC";
        }
        @PutMapping
        public String update(@RequestBody Goods goods){
            System.out.println("goods update..." + goods);
             return "Hello SpringMVC";
        }
        @GetMapping("/{id}")
        public String getById(@PathVariable Integer id){
            System.out.println("goods getById..." + id);
             return "Hello SpringMVC";
        }
        @GetMapping
        public String getAll(){
            System.out.println("goods getAll...");
            return "Hello SpringMVC";
        }
    }
}

硬編碼問題得到了極大的改善!這就是Restful的極速開發(fā)

4.放行靜態(tài)資源

protected String[] getServletMappings() {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> return new String[]{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->"/"};}

因?yàn)樯鲜鰯r截方法存在的原因,SpringMVC將所有請(qǐng)求都拿去處理(靜態(tài)資源JS/CSS/HTML…)而這些本應(yīng)是交給tomcat來處理,因此客戶端就會(huì)出現(xiàn)404錯(cuò)誤

所以,SpringMVC需要將靜態(tài)資源進(jìn)行放行

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

到此這篇關(guān)于SpringMVC加載控制與Postmand的使用和Rest風(fēng)格的引入及RestFul開發(fā)全面詳解的文章就介紹到這了,更多相關(guān)SpringMVC加載控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Selenium Webdriver實(shí)現(xiàn)截圖功能的示例

    Selenium Webdriver實(shí)現(xiàn)截圖功能的示例

    今天小編就為大家分享一篇Selenium Webdriver實(shí)現(xiàn)截圖功能的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Linux下Java開發(fā)環(huán)境搭建以及第一個(gè)HelloWorld

    Linux下Java開發(fā)環(huán)境搭建以及第一個(gè)HelloWorld

    這篇文章主要介紹了Linux下Java開發(fā)環(huán)境搭建以及第一個(gè)HelloWorld的實(shí)現(xiàn)過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法

    SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法

    這篇文章主要介紹了SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 如何在IDEA中查看依賴關(guān)系的方法步驟

    如何在IDEA中查看依賴關(guān)系的方法步驟

    這篇文章主要介紹了如何在IDEA中查看依賴關(guān)系的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java中set接口使用方法詳解

    java中set接口使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了java中set接口使用方法,介紹了Java中Set集合接口實(shí)現(xiàn)插入對(duì)象不重復(fù)的原理,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java 鎖的知識(shí)總結(jié)及實(shí)例代碼

    Java 鎖的知識(shí)總結(jié)及實(shí)例代碼

    這篇文章主要介紹了Java 鎖的知識(shí)總結(jié)及實(shí)例代碼,需要的朋友可以參考下
    2016-09-09
  • IDEA如何開啟并配置services窗口

    IDEA如何開啟并配置services窗口

    在使用IntelliJ IDEA時(shí),可能會(huì)遇到Services窗口不自動(dòng)彈出的情況,本文介紹了如何手動(dòng)開啟Services窗口的簡(jiǎn)單步驟,首先,通過點(diǎn)擊菜單欄中的“視圖”->“工具窗口”->“服務(wù)”,或使用快捷鍵Alt+F8(注意快捷鍵可能存在沖突)來打開Services窗口
    2024-10-10
  • SpringBoot執(zhí)行有返回值的異步任務(wù)問題

    SpringBoot執(zhí)行有返回值的異步任務(wù)問題

    這篇文章主要介紹了SpringBoot執(zhí)行有返回值的異步任務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MyBatis-Plus多數(shù)據(jù)源的示例代碼

    MyBatis-Plus多數(shù)據(jù)源的示例代碼

    本文主要介紹了MyBatis-Plus多數(shù)據(jù)源的示例代碼,包括依賴配置、數(shù)據(jù)源配置、Mapper 和 Service 的定義,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 打造一款代碼命名工具的詳細(xì)教程

    打造一款代碼命名工具的詳細(xì)教程

    這篇文章主要介紹了來,我們一起打造一款代碼命名工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

资兴市| 康保县| 九龙城区| 晋江市| 湖南省| 称多县| 元谋县| 库车县| 蒙山县| 五华县| 建水县| 安乡县| 冷水江市| 八宿县| 万盛区| 齐河县| 定陶县| 民和| 改则县| 灵山县| 容城县| 津市市| 黎川县| 娄烦县| 余干县| 昌宁县| 潜江市| 临潭县| 泸溪县| 兴义市| 洞头县| 呈贡县| 诏安县| 安仁县| 永德县| 桦川县| 吉水县| 西藏| 邵东县| 腾冲县| 贞丰县|