1. 程式人生 > >SpringMVC註解詳解

SpringMVC註解詳解

1.對映請求註解:@RequestMapping        標記在類上:提供初步的請求對映資訊。相對於WEB 應用的根目錄        標記在方法上:提供進一步的細分對映資訊。相對於標記在類上的 URL。        若類上未標註 @RequestMapping,則方法處標記的 URL 相對於 WEB 應用的根目錄        作用:DispatcherServlet 截獲請求後,就通過控制器上 @RequestMapping 提供的對映資訊確定請求所對應的處理方法。  (1) RequestMapping對映請求方式:      value:指定請求的實際地址,指定的地址可以是URI Template 模式(後面將會說明);
     method:指定請求的method型別, GET、POST、PUT、DELETE等;
@Controller
@RequestMapping("/springmvc")
public class SpringMVCController {
   @RequestMapping(value="/testMethord",method=RequestMethod.POST)
   public String testMethord(){
       System.out.println("testMethord...");
       return "success";
   }
}
說明:預設後面是get請求,如果為post請求,必須在請求頁面的method後面加post方式請求;
          如果是get請求,預設在method方法體後面和請求體後面的method後面都不用寫。           注意:post請求不能以超連結形式提交,只能以表單的形式提交,而get請求可以既可以以表單的形式提交,也可以以post的形式提交。
get方式請求:
<a href="springmvc/testMethord">testMethord</a><br/><br/>
post 方式請求:
<form action="springmvc/testMethord" method="post">
     <input type="submit" value="submit">
</form>
(2) RequestMapping對映請求引數和請求頭:      params: 指定request中必須包含某些引數值是,才讓該方法處理。      headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求。
/*
可以使用 params 和 headers 來更加精確的對映請求. params 和 headers 支援簡單的表示式.
*/
@RequestMapping(value="/testParamsAndHeaders",
    params={params={"username","age!=10"},
    headers = { "Accept-Language=en-US,zh;q=0.8" })
  public String testParamsAndHeaders(){
    System.out.println("testParamsAndHeaders...");
    return "success";
  }
<!--設定請求引數和請求頭資訊 -->
<a href="springmvc/testParamsAndHeaders">testParamsAndHeaders</a>
(3) consumes,produces;      consumes:指定處理請求的提交內容型別(Content-Type),例如application/json, text/html;
//方法僅處理request Content-Type為“application/json”型別的請求。
@Controller 
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json") 
public void addPet(@RequestBody Pet pet, Model model) {     
    // implementation omitted 
} 
     produces: 指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回;
//方法僅處理request請求中Accept頭中包含了"application/json"的請求,同時暗示了返回的內容型別為application/json;
@Controller 
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json") 
@ResponseBody 
public Pet getPet(@PathVariable String petId, Model model) {     
    // implementation omitted 
}
(4) RequestMapping對映請求佔位符PathVariable註解:      通過 @PathVariable 可以將 URL 中佔位符引數繫結到控制器處理方法的入參中:
①定義控制器方法
/*
 @PathVariable 註解可以將請求URL路徑中的請求引數,傳遞到處理請求方法的入參中
*/
@RequestMapping(value="/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id){
   System.out.println("testPathVariable...id="+id);
   return "success";
}
②請求連結
<!-- 測試 @PathVariable -->
<a href="springmvc/testPathVariable/1">testPathVariable</a><br/><br/>
2.請求資料傳入註解: (1) @RequestParam註解 :在處理方法入參處使用 @RequestParam 可以把請求引數傳遞給請求方法。      value:引數名      required:是否必須。預設為 true, 表示請求引數中必須包含對應的引數,若不存在,將丟擲異常      defaultValue: 預設值,當沒有傳遞引數時使用該值      ①增加控制器方法
@RequestMapping(value="/testRequestParam")
public String RequestParam(
      @RequestParam(value="username") String username,
      @RequestParam(value="age",required=false,defaultValue="0") Integer age
      ){
  System.out.println("username="+username+"----"+"age="+age);
return "success";
}
     ②增加頁面連結
<a href="springmvc/testRequestParam?username=tom&age=10">testRequestParam</a>
(2) @RequestHeader:對映請求頭資訊      ①增加控制器方法
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language") String abc){
     System.out.println("testRequestHeader - Accept-Language:"+abc);
     return "success";
}
     ②增加頁面連結
<a href="springmvc/testRequestHeader">testRequestHeader</a>
(3) @CookieValue: 對映一個 Cookie值      ① 增加控制器方法
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
     System.out.println("testCookieValue: sessionId: " + sessionId);
     return "success";
}
     ② 增加頁面連結
<a href="springmvc/testCookieValue">testCookieValue</a>
(4) 使用pojo作為引數:使用 POJO 物件繫結請求引數值 Spring MVC 會按請求引數名和 POJO 屬性名進行自動匹配,自動為該物件填充屬性值。支援級聯屬性。      ① 填加控制器方法、表單頁面
@RequestMapping("/testPOJO")
public void testPOJO(User user){
  System.out.println(user);
  return "success";
}
     ② 增加頁面連結
<!-- 測試pojo物件傳參,支援級聯屬性 -->
<form action="springmvc/testPOJO" method="post">
     username:<input type="text" name="username"/><br>
     password:<input type="password" name="password"><br>
     email:<input type="text" name="email"/><br>
     age:<input type="text" name="age"/><br>
     city:<input type="text" name="address.city"/><br>
     province:<input type="text" name="address.province"/>
     <input type="submit" value="提交"/>
</form>
     ③ 如果有中文亂碼,在web.xml中需要配置字元編碼過濾器,且配置其他過濾器之前,否則不起作用。
<!--  配置字符集,解決中文亂碼問題 -->
        <filter>
               <filter-name> encodingFilter</filter-name >
               <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class>
               <init-param>
                      <param-name> encoding</param-name >
                      <param-value> UTF-8</param-value >
               </init-param>
               <init-param>
                      <param-name> forceEncoding</param-name >
                      <param-value> true</param-value >
               </init-param>
        </filter>
        <filter-mapping>
               <filter-name> encodingFilter</filter-name >
               <url-pattern> /*</url-pattern >
        </filter-mapping>
3.響應資料傳出 SpringMVC中提供了以下幾種途徑輸出模型資料: ① ModelAndView: 處理方法返回值型別為 ModelAndView 時, 方法體即可通過該物件新增模型資料.      ② Map 及 Model: 入參為 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 時,處理方法返回時,Map 中的資料會自動新增到模型中。      ③ @SessionAttributes: 將模型中的某個屬性暫存到 HttpSession 中,以便多個請求之間可以共享這個屬性。      ④ @ModelAttribute: 方法入參標註該註解後, 入參的物件就會放到資料模型中 (1) 處理模型資料之 ModelAndView:      ① 控制器處理方法的返回值如果為 ModelAndView, 則其既包含檢視資訊,也包含模型資料資訊。      ② 新增模型資料: MoelAndView addObject(String attributeName, Object attributeValue) ModelAndView addAllObject(Map<String, ?> modelMap)      ③設定檢視: void setView(View view) void setViewName(String viewName) 實驗程式碼      a.增加控制器方法
// 目標方法的返回型別可以是ModelAndView型別,其中包含檢視資訊和模型資料資訊.
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
     System.out.println("testModelAndView");
     String viewName = "success";
     ModelAndView mv = new ModelAndView(viewName );
     mv.addObject("time",new Date().toString()); //實質上存放到request域中
     return mv;
}
      b.增加頁面連結
<!--測試 ModelAndView 作為處理返回結果 -->
<a href="springmvc/testModelAndView">testModelAndView</a>
      c.增加成功頁面,顯示資料
time: ${requestScope.time }
(2) 處理模型資料Map(方法的入參可以是Map,Model,ModelMap但是我們一般使用Map ): ①增加控制器方法
// 目標方法的返回型別也可以是一個Map型別引數
@RequestMapping("testMap")
public String testMap(Map<String,Object> map){
    System.out.println(map.getClass().getName());
    //org.springframework.validation.support.BindingAwareModelMap
    map.put("names", Arrays.asList("Tom","Jerry","Kite"));
    return "success";
}
②增加頁面連結
<!-- 測試 Map 作為處理返回結果 -->
<a href="springmvc/testMap">testMap</a>
③增加成功頁面,顯示結果
names: ${requestScope.names }
     注意:Map集合的泛型,key為String,Value為Object。 (3) 處理模型資料之 SessionAttributes 註解:    (1) 若希望在多個請求之間共用某個模型屬性資料,則可以在控制器類上標註一個 @SessionAttributes, Spring MVC 將在模型中對應的屬性暫存到 HttpSession 中。
    @SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外,還可以通過模型屬性的物件型別指定哪些模型屬性需要放到會話中
例如:
    ① @SessionAttributes(types=User.class) 會將隱含模型中所有型別為 User.class 的屬性新增到會話中。
    ② @SessionAttributes(value={“user1”, “user2”})
    ③ @SessionAttributes(types={User.class, Dept.class})
    ④ @SessionAttributes(value={“user1”, “user2”}, types={Dept.class})     (2).實驗程式碼:
@Controller
//@SessionAttributes("user")
@SessionAttributes(value={"user"},types={String.class})
public class SpringMVCController {
    /**
    * @SessionAttributes
    *  除了可以通過屬性名指定需要放到會話中的屬性外(實際上是通過value指定key值),
    *  還可以通過模型屬性的物件型別指定哪些模型屬性需要放到會話中(實際上是通過types指定型別)
    * 注意:只能放在類的上面,不能修飾方法
    */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Map<String,Object> map){
    User user = new User(null,"Tom","123","[email protected]",22);
    map.put("user", user);
    map.put("school", "清華大學");
    //預設是被存放到request 域,如果設定了@SessionAttribute註解,就同時存放到session域中
    return "success";
    }
}
<!--測試 @SessionAttribute 將資料存放到session域中 -->
<a href="testSessionAttributes">testSessionAttributes</a>
request user : ${requestScope.user } <br><br>
session user : ${sessionScope.user } <br><br>
request school : ${requestScope.school } <br><br>
session school : ${sessionScope.school } <br><br>
(4) @ModelAttribute註解:      ①  @ModelAttribute註解


     ② @ModelAttribute註解之示例程式碼      在方法定義上使用 @ModelAttribute 註解:Spring MVC 在呼叫目標處理方法前,會先逐個呼叫在方法級上標註@ModelAttribute 的方法。      在方法的入參前使用 @ModelAttribute 註解:可以從隱含物件中獲取隱含的模型資料中獲取物件,再將請求引數繫結到物件中,再傳入入參,將方法入參物件新增到模型中.      a.頁面表單
<!--測試 @ModelAttribute 類似Struts2框架的模型驅動 -->
<!--
    模擬修改操作:
    1.原始資料為:1,Tom,123456,[email protected],12
    2.密碼不需要修改
    3.表單回顯,模擬操作直接在表單value屬性上賦值
-->
<form action="springmvc/testModelAttribute" method="POST">
    <input type="hidden" name="id" value="1"><br>
    username: <input type="text" name="username" value="Tom"/>
    email: <input type="text" name="email" value="[email protected]"/>
    age: <input type="text" name="age" value="12"/>
    <input type="submit" value="Submit"/>
</form>
     b.增加@ModelAttribute註解
// 由 @ModelAttribute 標記的方法(getUser), 會在每個目標方法(testModelAttribute)執行之前被 SpringMVC 呼叫!
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
    System.out.println("user="+user);
    return "success";
}

@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,Map<String,Object> map){
    if(id!=null){
    //模擬從資料庫中獲取到的user物件
    User user = new User(1,"Tom","123456","[email protected]",12);
    System.out.println("從資料庫中查詢的物件:user="+user );
    map.put("user", user);
    }
}
     ③ @ModelAttribute註解之執行原理      a.執行@ModelAttribute註解所修飾的方法,將從資料庫中獲取的物件存放到Map集合中,key為user
     b.SpringMVC從Map集合中獲取 user物件,將表單資料封裝到與引數名稱對應的user物件屬性上
     c.SpringMVC將user物件作為引數,傳遞給目標方法。
     d.注意:@ModelAttribute 註解修飾的方法中,放入到Map集合中的key值,應該和目標方法引數型別的類名稱首字母小寫一致。

相關推薦

SpringMVC註解——(持續更新)

@RequestMapping常見的可用引數如下:            1.value: 制定請求的地址,可以是URLTemplate模式;(value可以省略不寫)          

SpringMVC註解

1.對映請求註解:@RequestMapping        標記在類上:提供初步的請求對映資訊。相對於WEB 應用的根目錄        標記在方法上:提供進一步的細分對映資訊。相對於標記在類上的

SpringMVC中的引數繫結註解及其使用場景

我認為只有深刻地研究過人,才能創造出人物,如同只有認真地學習了一種語言才能講它一樣。——《茶花女》 0、引言 最近在寫一個介面的時候,採用put請求,接收引數時採用了兩個@requestparam接收。前端通過application/json傳來兩個引數,測

SpringMvc三層架構註解@Controller、@Service和@Repository

1. @Controller控制層 2. @Service() 3. @Repository持久層 springvmc採用經典的三層分層控制結構,在持久層,業務層和控制層分別採用@Repository、@Service、@Controller對分層中

springmvc 引數繫結註解

簡介   Handler method引數繫結常用的註解,我們根據它們處理request的不同內容部分來看主要分為四類:   A. 處理requesr uri部分的註解,@PathVariable   B. 處理 request header部分的註解,@RequestH

(轉)@RequestParam @RequestBody @PathVariable 等參數綁定註解

erro 後綁定 false zip ons type() eba veh manager 引言: 接上一篇文章,對@RequestMapping進行地址映射講解之後,該篇主要講解request 數據到handler method 參數數據的綁定所用到的註解和什麽情形下使用

Spring中@Component註解,@Controller註解(網摘)

tin ava 代碼 autowired reat control type imp 訪問   在使用Spring的過程中,為了避免大量使用Bean註入的Xml配置文件,我們會采用Spring提供的自動掃描註入的方式, 只需要添加幾行自動註入的的配置,便可以完成Servic

@Qualifier註解

num fine ali factor BE comm alt nta expec @Qualifier註解意味著可以在被標註bean的字段上可以自動裝配。Qualifier註解可以用來取消Spring不能取消的bean應用。 下面的示例將會在Customer的person

springboot的註解

ica prope pan span 配置 作用 cat fix 文件中 配置類相關: @PropertySource(value = "classpath:test.properties") //我們都把配置文件寫到application.yml中。有時我們不願意把

Sping框架中的註解

例子 上下 troy getbean 用戶id 查找 oge 數據庫 配置 傳統的Spring做法是使用.xml文件來對bean進行註入或者是配置aop、事物,這麽做有兩個缺點:1、如果所有的內容都配置在.xml文件中,那麽.xml文件將會十分龐大;如果按需求分開.xml文

Spring MVC @RequestMapping註解(2)

並不是 value get ecif 使用 .com java代碼 處理方法 分開 @RequestMapping 參數說明   value:定義處理方法的請求的 URL 地址。(重點)   method:定義處理方法的 http method 類型,如 GET、POST

第一個SpringMVC程式

建立一個java類: package com.myproject.cn; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org

JPA註解及示例

文章出處:https://blog.csdn.net/zhengchao1991/article/details/70236919 1、用例項介紹JPA 使用JPA,肯定是有ORM的意思在裡面,當然我們首先要定義一個實體類(要將 Java 類指定為 JPA 實體,請使用 @Entity 批註

@GeneratedValue 註解

springboot中@GeneratedValue作用: (1)、@GeneratedValue註解存在的意義主要就是為一個實體生成一個唯一標識的主鍵、@GeneratedValue提供了主鍵的生成策略。 (2)、@GeneratedValue註解有兩個屬性,分別是strategy和g

@Table 註解

spring @Table註解  作用是 : 宣告此物件對映到資料庫的資料表,通過它可以為實體指定表(talbe) 常用的兩個屬性:  1、name 用來命名 當前實體類 對應的資料庫 表的名字  @Table(name = "tab_u

SwaggerAPI註解,以及註解常用引數配置

官網github地址:https://github.com/swagger-api/swagger-core/wiki/Annotations-1.5.X 註解 @Api: 作用在類上,用來標註該類具體實現內容。表示標識這個類是swagger的資源 。  引數:  1

Java 註解

一、什麼是註解 註解也叫元資料,例如我們常見的@Override和@Deprecated,註解是JDK1.5版本開始引入的一個特性,用於對程式碼進行說明,可以對包、類、介面、欄位、方法引數、區域性變數等進行註解 註解都預設繼承介面Annotation.jav

java元註解

java中元註解有四個: @Retention @Target @Document @Inherited;    @Retention:註解的保留位置                @Retention(RetentionPolicy.SOURCE)   //註解僅

Java——註解

Java註解同 classs 和 interface 一樣,註解也屬於一種型別。它是在 Java SE 5.0 版本中開始引入的概念。 註解的定義 通過 @interface 關鍵字進行定義。 public @interface TestAnnotation { } 這段程式碼就建立了一個名字為 Tes

SpringMVC FistMVC

實現一個簡單的SpringMVC框架的配置   1.依賴     這是mybatis+spring+現在需要的依賴 <dependency> <groupId>junit</groupId> <ar