RestController 和Controller的區別


restful風格,restcontroller與controller

初步接觸springmvc的時候,被要求使用restful風格,彼時一頭霧水,不懂何謂restful,參閱了很多資料,慢慢的接觸的也越來越多,如今spring的況且已基本運用熟練,簡單談一下我的一些看法,當然,只是我自己的淺顯粗陋的見解,不對的地方還望指正。

restful風格

簡單的理解,restful是一種url風格,或者說是規范,在以前的網址中,假定一個業務,取得數據網址為http://test/get,添加信息的網址為http://test/post,類似這樣。 
但是在restful風格中,取得數據和添加數據的網址均應為http://test,方法為get或者post;所以,在restful風格中,一個網址就是一個資源,其形式類似於http://xxx.com/xx/{id}/{id} ,例如某購物網站,產品有很多種類,每種產品下有很多子類型,那么http://shop.com/laptop/lenovo/1103 代表了聯想1103型號電腦,而http://shop.com/laptop/hp/1024 代表了2014型號電腦。

在spring mvc中,有@requestparm, @requestbody和@pathvariable 三種注解來獲得瀏覽器端的參數,其中前兩者都是由瀏覽器post提交的參數,而@pathvariable 則是從網址中取得參數;假設代碼如下:

@Requestmapping(value="/{category}/{brand}/{id},method=RequestMethod.POST) public void getbyid(@PathVariable("category") String category @PathVariable("brand") String brand @PathVariable("id") String id){ //具體代碼略 }

在上述代碼中,訪問http://shop.com/laptop/hp/1024網址時,則,category為“laptop”,brand為”hp”,id為”1024”;所以說,在restful風格中,一個網址即表示了一個資源。

restcontroller與controller

假定一個user對象,對象有很多屬性(name,sex,age,birth,address,tel) 
在我的了解中,這二者的區分為:@restcontroller為@controller和@responsebody的結合 
在@controller注解中,返回的是字符串,或者是字符串匹配的模板名稱,即直接渲染視圖,與html頁面配合使用的,在這種情況下,前后端的配合要求比較高,java后端的代碼要結合html的情況進行渲染,使用model對象(或者modelandview)將user的屬性渲染到頁面; 
java示例代碼如下:

@Controller @RequestMapping(method = RequestMethod.GET, value = "/") public String getuser(Model model) throws IOException { model.addAttribute("name",bob); model.addAttribute("sex",boy); return "user"; }

對應的html代碼:
<html xmlns:th="http://www.thymeleaf.org"> <body> <div> <p>"${name}"</p> <p>"${sex}"</p> </div> </body> </html>

而在@restcontroller中,返回的應該是一個對象,即return一個user對象,這時,在沒有頁面的情況下,也能看到返回的是一個user對象對應的json字符串,而前端的作用是利用返回的json進行解析渲染頁面,java后端的代碼比較自由。 

java端代碼:

@RestController @RequestMapping(method = RequestMethod.GET, value = "/") public User getuser( ) throws IOException { User bob=new User(); bob.setName("bob"); bob.setSex("boy"); return bob; } 

訪問網址得到的是json字符串{“name”:”bob”,”sex”:”boy”},前端頁面只需要處理這個字符串即可。

http://blog.csdn.net/pinebud55/article/details/52183238?locationNum=12;

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

 

 

1.@RestController與@Controller的作用及區別

  作用:

都是用來表示spring某個類的是否可以接收HTTP請求

原因:使用@RestController注解后,無法跳轉指定頁面的問題 
解決:改用@Controller注解即可

一,對比@Controller與@RestController

@Controller注解源碼:

package org.springframework.stereotype;

 

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

 

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller {

    String value() default "";

}

 

@RestController注解源碼:

package org.springframework.web.bind.annotation;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}

 

官方文檔對@RestController的解釋:

@RestController is a stereotype annotation that combines @ResponseBody and @Controller.

結論 : @RestController注解相當於@ResponseBody + @Controller合在一起的作用。

為Controller類使用@RestController注解

Controller類使用@RestController注解,Controller中的方法無法返回jsp頁面
配置的視圖解析器InternalResourceViewResolver不起作用
例如:return “hello" 不會返回hello.jsp頁面,會直接輸出hello字符串

這里大家要清楚一個概念:

1)返回到指定頁面,則需要用 @Controller配合視圖解析器InternalResourceViewResolver才行
 
2)如果需要返回JSONXML或自定義mediaType內容到頁面顯示,需要在對應的方法上加上@ResponseBody注解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM