1. 程式人生 > >SpringMVC中幾個常用註解的用法

SpringMVC中幾個常用註解的用法

一、@Controller

        以前在編寫Controller方法的時候,需要開發者自定義一個Controller類實現Controller介面,實現handleRequest方法返回ModelAndView。並且需要在Spring配置檔案中配置Handle,將某個介面與自定義Controller類做對映。         這麼做有個複雜的地方在於,一個自定義的Controller類智慧處理一個單一請求。而在採用@Contoller註解的方式,可以使介面的定義更加簡單,將@Controller標記在某個類上,配合@RequestMapping註解,可以在一個類中定義多個介面,這樣使用起來更加靈活。     被@Controller標記的類實際上就是個SpringMVC Controller物件,它是一個控制器類,而@Controller註解在org.springframework.stereotype包下,其中被@RequestMapping標記的方法會被分發處理器掃描識別,將不同的請求分發到對應的介面上。

       掃描@Controller:<context:component-scan base-package="com.sunhui.ssm.controller"/>

       base-package:包的路徑。意思就是,啟動了報掃描功能,將com.sunhui.ssm.controller這個包下以及子包下的所有類掃描一遍,將標記有@Controller、@Service、@repository、@Component等註解的類注入到IOC容器中,作為Spring的Bean來管理。

        這樣,Spring就能找到Controller類,通過@RequestMapping註解處理對應的請求。

二、@RequestMapping

當我們需要在控制類的內部為每一個動作開發相應的處理方法。要讓Spring知道用哪一種方法來處理它的動作,需要使用import org.springframework.web.bind.annotation.RequestMapping註解型別來對映uri與方法。

1、@RequestMapping註解修飾類

@Controller
@RequestMapping(value="/Items")
public class ItemsController {
    ......
}

2、@RequestMapping註解修飾方法 

@Controller
@RequestMapping(value="/Items")
public class ItemsController {
	
	@Autowired
	private ItemsService itemsService ;
	
	@RequestMapping(value="/queryItems")
	public ModelAndView itemsList(HttpServletRequest request,ItemsQueryVo itemsQueryVo) {
        ......
    }
}

       類上的@RequestMapping中的value值相當於web應用的根目錄,而方法上的@RequestMapping中的value值相當於web應用的子目錄,這時候請求的URL的值應該是:Items/queryItems

3、@RequestMapping註解的請求方式

	/*
	 * 使用method屬性來指定請求方式 
	 */
	@RequestMapping(value="/testmethod",method=RequestMethod.POST)
	public String testMethod() {
		return SUCCESS;
	}

三、@RequestParam

@RequestParam註解:在處理方法入參除使用@RequestParam可以把請求引數傳遞給請求方法。

        value:引數名

        required:是否必須。預設為true,表示請求引數中必須包含對應的引數,若不存在,將丟擲404錯誤碼。

        defaultValue:預設值。當沒有傳遞引數是使用該值。

例1:

@RequestMapping("/items")
public String queryUserName(@RequestParam(value="username") String UserName)

解釋:

        @RequestParam註解用於處理請求引數username和處理方法的入參UserName名稱不同,從而形成了二者的對應關係,即將username的值傳遞給UserName。

        這種情況要求瀏覽器url中必須帶有引數,即localhost:8080/items/username=?,如果不帶引數username則會報錯。

例2:

public String requestParam(@RequestParam(value="username", required=true, defaultValue="zhangsan") String username)   

解釋:

        required=true,表示必須傳入引數,但是由於設定了defaultValue="zhangsan",這就說明傳入引數值時正常接收,如果不傳入引數值,此時為預設引數值為zhangsan。

四、PathVariable

1、@PathVariable註解對映URL繫結的佔位符

  • 帶佔位符的 URL 是 Spring3.0 新增的功能,該功能在SpringMVC 向 REST 目標挺進發展過程中具有里程碑的意義
  • 通過 @PathVariable 可以將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable(“xxx“) 繫結到操作方法的入參中。

2、REST

  • REST:即 Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種網際網路軟體架構。它結構清晰、符合標準、易於理解、擴充套件方便,所以正得到越來越多網站的採用
  • 資源(Resources):網路上的一個實體,或者說是網路上的一個具體資訊。它可以是一段文字、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的 URI 。要獲取這個資源,訪問它的URI就可以,因此 URI 即為每一個資源的獨一無二的識別符。 --------------------- 本文來自 偉大的程式猿csdn 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_36084681/article/details/79222946?utm_source=copy
  • 表現層(Representation):把資源具體呈現出來的形式,叫做它的表現層(Representation)。比如,文字可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以採用二進位制格式。
  • 狀態轉化(State Transfer):每發出一個請求,就代表了客戶端和伺服器的一次互動過程。HTTP協議,是一個無狀態協議,即所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生“狀態轉化”(State Transfer)。而這種轉化是建立在表現層之上的,所以就是“表現層狀態轉化”。具體說,就是 HTTP 協議裡面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。

示例:  - /order/1 HTTP GET :得到 id = 1 的 order  - /order/1 HTTP DELETE:刪除 id = 1的 order  - /order/1 HTTP PUT:更新id = 1的 order  - /order HTTP POST:新增 order

HiddenHttpMethodFilter:瀏覽器 form 表單只支援 GET與 POST 請求,而DELETE、PUT 等 method 並不支援,Spring3.0 添加了一個過濾器,可以將這些請求轉換為標準的 http 方法,使得支援 GET、POST、PUT 和DELETE 請求。

3、在web.xml中配置HiddenHttpMethodFilter

web.xml

 <!--
     配置org.springframework.web.filter.HiddenHttpMethodFilter:可以把POST請求轉換成DELETE或者POST請求
 -->
 
   <filter>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>   
 
   <filter-mapping>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

index.jsp

    <a href="springmvc/testRest/1">Test Rest Get</a><br/>
    <form action="springmvc/testRest" method="post">
         <input type="submit" value="TestRest Post"/>
    </form><br/>
    <form action="springmvc/testRest/1" method="post">
         <input type="hidden" name="_method" value="DELETE"/>
         <input type="submit" value="TestRest DELETE"/>
    </form><br/>
    <form action="springmvc/testRest/1" method="post">
         <input type="hidden" name="_method" value="PUT"/>
         <input type="submit" value="TestRest PUT"/>
    </form><br/>

測試類程式碼:

/*
     * 如何傳送PUT和DELETE請求
     * 1.需要配置HiddenHttpMethodFilter
     * 2.需要傳送POST請求
     * 3.需要傳送POST請求時攜帶一個name="_method"的隱藏域,value值為DELETE或者PUT
     * 
     * 在springmvc框架中通過@PathVariable註解來獲取id值
     * */
    //get請求
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)
    public String testRest(@PathVariable Integer id)
    {
        System.out.println("testRest Get"+id);
        return SUCCESS;
    }
 
    //post請求
    @RequestMapping(value="/testRest",method=RequestMethod.POST)
    public String testRest()
    {
        System.out.println("testRest POST");
        return SUCCESS;
    }
 
    //delete請求
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)
    public String testRestDelete(@PathVariable Integer id)
    {
        System.out.println("testRest DELETE"+id);
        return SUCCESS;
    }
 
    //delete請求
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.PUT)
    public String testRestPut(@PathVariable Integer id)
    {
        System.out.println("testRest PUT"+id);
        return SUCCESS;
    }