1. 程式人生 > 其它 >@Controller和@RestController

@Controller和@RestController

@RestController初步理解

一、在Spring中@RestController的作用等同於@Controller + @ResponseBody。所以想要理解@RestController註解就要先了解@Controller和@ResponseBody註解。

二、@Controller註解

  在一個類上新增@Controller註解,表明了這個類是一個控制器類。但想要讓這個類成為一個處理請求的處理器光有@Controller註解是不夠的,他還需要進一步修煉才能成為一個處理器。

  1.在spring容器中建立該類的例項。建立例項的方式有兩種:

<bean class="test.controller.MyController"/>

  上述這種方式是在spring容器中注入單個bean,當專案比較大,控制器類比較多時,用這種方式向Spring容器中注入bean非常的讓人苦惱,索性有第二種方式。

<context:component-scan base-scan="test.controller"/>

  這種方式會掃描指定包中的所有類,並生成相應的bean注入到spring容器中。使用這種方式當然能夠極大提高我們的開發效率,但是有時候我們不想某一型別的類注入到spring容器中。

  這個時候第二種方式也可以解決。

<context:component-scan base-package="test">  
<context:include-filter type="annotation" expression=``"org.springframework.stereotype.Service"/>
</context:component-scan>

  上述程式碼表示掃描test包中除有@Service註解之外的類。

  2.將@Controller註解的類注入Spring容器中,只是該類成為處理器的第一步,想要修煉大成,還需要在該類中添加註解@RequestMapping。

   @RequestMapping註解是用來對映請求的,即指明處理器可以處理哪些URL請求,該註解既可以用在類上,也可以用在方法上。

   當使用@RequestMapping標記控制器類時,方法的請求地址是相對類的請求地址而言的;當沒有使用@RequestMapping標記類時,方法的請求地址是絕

對路徑。

   @RequestMapping的地址可以是uri變數,並且通過@PathVariable註解獲取作為方法的引數。也可以是萬用字元來篩選請求地址。具體的使用方法不是本次

的重點,有興趣的可以看

@Controller
@RequestMapping("/user")
public class UserController{

@RequestMapping("/users")
public String users() {
return "users";
}
}

  此時請求users方法的url路徑就是:.../user/users。

  可以看到上面users方法的返回值是字串型別的,這個就是處理器在處理完任務後將要跳轉的頁面。如果想要方法直接返回結果,而不是跳轉頁面,這就要用到@ResponseBody註解了。

三、@ResponseBody註解

  @ResponseBody表示方法的返回值直接以指定的格式寫入Http response body中,而不是解析為跳轉路徑。

  格式的轉換是通過HttpMessageConverter中的方法實現的,因為它是一個介面,因此由其實現類完成轉換。

如果要求方法返回的是json格式資料,而不是跳轉頁面,可以直接在類上標註@RestController,而不用在每個方法中標註@ResponseBody,簡化了開發過程。

@Controller

在對應的方法上,檢視解析器可以解析return 的jsp,html頁面,並且跳轉到相應頁面

若返回json等內容到頁面,則需要加@ResponseBody註解

@CrossOrigin
@Controller
public class FileUploadController {

//跳轉到上傳檔案的頁面
@RequestMapping(value="/gouploadimg", method = RequestMethod.GET)
public String goUploadImg() {
//跳轉到 templates 目錄下的 uploadimg.html
return "uploadimg";
}

//處理檔案上傳
@RequestMapping(value="/testuploadimg", method = RequestMethod.POST)
public @ResponseBody String uploadImg(@RequestParam("file") MultipartFile file,
HttpServletRequest request) {
System.out.println("呼叫檔案上傳方法");
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();

@ResponseBody這個註解通常使用在控制層(controller)的方法上,其作用是將方法的返回值以特定的格式寫入到response的body區域,進而將資料返回給客戶端。當方法上面沒有寫ResponseBody,底層會將方法的返回值封裝為ModelAndView物件。

假如是字串則直接將字串寫到客戶端,假如是一個物件,此時會將物件轉化為json串然後寫到客戶端。這裡需要注意的是,如果返回物件,按utf-8編碼。如果返回String,預設按iso8859-1編碼,頁面可能出現亂碼。因此在註解中我們可以手動修改編碼格式,例如@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8"),前面是請求的路徑,後面是編碼格式。

那麼,控制層方法的返回值是如何轉化為json格式的字串的呢?其實是通過HttpMessageConverter中的方法實現的,因為它是一個介面,因此由其實現類完成轉換。如果是bean物件,會呼叫物件的getXXX()方法獲取屬性值並且以鍵值對的形式進行封裝,進而轉化為json串。如果是map集合,採用get(key)方式獲取value值,然後進行封裝

以下部落格均可參考

  https://www.cnblogs.com/daimajun/p/7152970.html