SpringMVC加載控制與Postmand的使用和Rest風格的引入及RestFul開發(fā)全面詳解
前言
從繁到簡是貫徹SSM學習過程的原始真解
一.bean的加載控制
在MVC的模式中,Spring控制著業(yè)務和功能的bean,SpringMVC控制著表現(xiàn)層的bean,因為各自的作用不同,我們要避免Spring加載到SpringMVC控制的bean,如何實現(xiàn)?
方式一:
設定Spring的包掃描范圍,排除表現(xiàn)層的bean所在的包
@ComponentScan({"com.yu7daily.service","com.yu7daily.dao"})
public class SpringConfig {...}
這樣寫的好處是可以適配所有的數(shù)據(jù)層技術(shù)通用性強,如果使用的是mybatis,他的自動代理為我們生成了對象可以不用掃描dao層對應的包
方式二:
按注解過濾掉bean,因為SpringMVC的配置類上存在@Controller注解,通過設置來過濾掉這個注解所在的類即可
@ComponentScan(value="com.yu7daily",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
//設置spring配置類加載bean時的過濾規(guī)則,當前要求排除掉表現(xiàn)層對應的bean
//excludeFilters屬性:排除掃描路徑中指定類別加載的bean
//type屬性:設置排除規(guī)則,當前使用按照bean定義時的注解類型進行排除
//classes屬性:設置排除的具體注解類,當前設置排除@Controller定義的bean
方式三:
將二者加載到同一個環(huán)境
二.容器加載
在web3.0中,提供了快速初始化web容器的方式——繼承AbstractDispatcherServletInitializer類并重寫其方法
1.createServletApplicationContext()方法
創(chuàng)建Servlet容器時,加載SpringMVC對應的bean并放入WebApplicationContext對象范圍中,從而將WebApplicationContext的作用范圍提升至ServletContext范圍,即 整個web容器范圍
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringmvcConfig.class);
return ctx;
}
2.createRootApplicationContext()方法
創(chuàng)建servlet容器時需要加載非springMVC對應的bean
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
3.getServletMappings()方法
設定SpringNc對應的請求映射路徑,設置為 / 后表示攔截所有請求,任意請求都將轉(zhuǎn)入到SpringMVC進行處理
protected String[] getServletMappings() { return new String[]{"/"}; }
這樣每當我們啟動服務器時,就會自動生成Spring和SpringMVC的容器,簡化開發(fā)
上述不難發(fā)現(xiàn),都是通過指定配置文件名來完成容器的加載,存在一定的硬編碼問題,于是Spring為我們提供了更簡單的加載方式——繼承AbstractAnnotationConfigDispatcherServletInitializer即可

代碼量顯著減少,這種方式更值得使用!
三.PostMan的引入
一般向瀏覽器發(fā)送get請求比較容易,但發(fā)送post請求我們得另寫表單,發(fā)送ajax請求得另寫JS代碼,十分麻煩,PostMan的誕生很好地解決了這一問題
它主要是用來模擬各種HTTP請求的(如:get/post/delete/put…等等).,而且與瀏覽器的區(qū)別在于有的瀏覽器不能輸出Json格式,而Postman更直觀接口返回的結(jié)果
1.發(fā)送GET請求
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ā)送請求

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

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

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

3.中文亂碼問題解決
當我將“pyq”改為“懶羊羊”后發(fā)送請求則會出現(xiàn)中文亂碼問題

按照以往的套路,是在web服務器中添加一個過濾器即可,而在SpringMVC中將過濾器寫在配置類中即可
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter}; //若要配置多個過濾器,在數(shù)組中添加即可
}
四.Rest風格
1.REST簡介
REST(Representational State Transfer),表現(xiàn)形式狀態(tài)轉(zhuǎn)換,它是一種軟件架構(gòu)風格,按照這種風格來訪問資源則稱之為RESTful
當我們想表示一個網(wǎng)絡資源的時候,可以使用兩種方式:
1.傳統(tǒng)風格資源描述形式
http://localhost/user/getById?id=1 查詢id為1的用戶信息
http://localhost/user/saveUser 保存用戶信息
2.REST風格描述形式
傳統(tǒng)方式一般是一個請求url對應一種操作,這樣做不僅麻煩,也不安全,可以知道你進行的操作,使用rest風格后請求地址變的簡單了,并且光看請求URL并不是很能猜出來該URL的具體功能
為了解決開發(fā)人員明白一個相同的url地址進行的是何種操作,按照REST風格訪問資源時使用行為動作對資源操作進行了區(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(刪除) |
請求的方式比較多,但是比較常用的就4種,分別是GET,POST,PUT,DELETE。
按照不同的請求方式代表不同的操作類型。
- 發(fā)送GET請求是用來做查詢
- 發(fā)送POST請求是用來做新增
- 發(fā)送PUT請求是用來做修改
- 發(fā)送DELETE請求是用來做刪除
值得注意的是:之所以稱之為REST風格是因為只是一種"風格"而已,并不是規(guī)范,在實際開發(fā)中可以靈活變通,修改
2.RESTful傳參
RESTful的傳參方式稍微和上述有所不同,需要在@RequestMapping中指定請求行為和參數(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";
}
我們輸入的路徑相比之下就顯得格外簡潔,安全

同樣也可以成功傳送到服務器端

請求行為可以通過method靈活更改,但是設定好之后更改傳遞的方式就會報錯,例如method=RequestMethod.POST卻以GET的方式提交
| @RequestParam | 用于接收url地址傳參或表單傳參(非json格式) |
|---|---|
| @RequestBody | 用于接收json數(shù)據(jù)(傳參數(shù)>1) |
| @PathVariable | 用于接收路徑參數(shù),使用{參數(shù)名稱}描述路徑參數(shù)(傳參數(shù)較少) |
@RequestParam、@RequestBody前面的文章有過介紹
3.RESTful簡便形式(快速開發(fā))
簡化開發(fā)一般解決硬編碼問題,例如:
每個方法的@RequestMapping注解中都定義了訪問路徑/books,@RequestMapping注解中都要使用method屬性定義請求方式,響應json都需要加上@ResponseBody注解重復性太高
所以:
1.將@RequestMapping提到類上面,用來定義所有方法共同的訪問路徑。
2.使用@GetMapping @PostMapping @PutMapping @DeleteMapping代替,設置當前控制器方法請求訪問路徑與請求動作,每種對應一個請求動作,例如@GetMapping對應GET請求
3.將ResponseBody提到類上面,讓所有的方法都有@ResponseBody的功能
4.使用@RestController注解替換@Controller與@ResponseBody注解,簡化書寫
就先這樣:
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-->"/"};}因為上述攔截方法存在的原因,SpringMVC將所有請求都拿去處理(靜態(tài)資源JS/CSS/HTML…)而這些本應是交給tomcat來處理,因此客戶端就會出現(xiàn)404錯誤
所以,SpringMVC需要將靜態(tài)資源進行放行
@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風格的引入及RestFul開發(fā)全面詳解的文章就介紹到這了,更多相關(guān)SpringMVC加載控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Selenium Webdriver實現(xiàn)截圖功能的示例
今天小編就為大家分享一篇Selenium Webdriver實現(xiàn)截圖功能的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld
這篇文章主要介紹了Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld的實現(xiàn)過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-09-09
SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細方法
這篇文章主要介紹了SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
MyBatis-Plus多數(shù)據(jù)源的示例代碼
本文主要介紹了MyBatis-Plus多數(shù)據(jù)源的示例代碼,包括依賴配置、數(shù)據(jù)源配置、Mapper 和 Service 的定義,具有一定的參考價值,感興趣的可以了解一下2024-05-05

