首頁  >  文章  >  Java  >  SpringMVC 常用註解

SpringMVC 常用註解

Guanhui
Guanhui原創
2020-06-04 16:35:252771瀏覽

SpringMVC 常用註解

SpringMVC 常用註解

#1、@Controller

在SpringMVC 中,控制器Controller負責處理由DispatcherServlet 分發的請求,它把用戶請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 回傳給對應的View 進行展示。在SpringMVC 中提供了一個非常簡便的定義Controller 的方法,你無需繼承特定的類別或實作特定的接口,只需使用@Controller 標記一個類別是Controller ,然後使用@RequestMapping 和@RequestParam 等一些註解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界存取。此外Controller 不會直接依賴HttpServletRequest 和HttpServletResponse 等HttpServlet 對象,它們可以透過Controller 的方法參數靈活的取得。

@Controller 用來標記在一個類別上,使用它標記的類別就是一個SpringMVC Controller 物件。分發處理器將會掃描使用了該註解的類別的方法,並偵測該方法是否使用了@RequestMapping 註解。 @Controller 只是定義了一個控制器類,而使用@RequestMapping 註解的方法才是真正處理請求的處理器。單單使用@Controller 標記在一個類上還不能真正意義上的說它就是SpringMVC 的一個控制器類,因為這個時候Spring 還不認識它。那麼要如何做Spring 才能認識它呢?這時候就需要我們把這個控制器類別交給Spring 來管理。有兩種方式:

  (1)在SpringMVC 的設定檔中定義MyController 的bean 物件。

  (2)在SpringMVC 的設定檔中告訴Spring 該到哪裡去找標記為@Controller 的Controller 控制器。

<!--方式一-->
<bean class="com.host.app.web.controller.MyController"/>
<!--方式二-->
< context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层(扫描包详解见下面浅析)

2、@RequestMapping

RequestMapping是用來處理請求位址對映的註解,可用來類別或方法上。用於類別上,表示類別中的所有回應請求的方法都是以該位址作為父路徑。

RequestMapping註解有六個屬性,下面我們把她分成三類來說明(下面有對應範例)。

1、 value,method;

value:     指定要求的實際位址,指定的位址可以是URI Template 模式(後面將會說明);

method:  指定請求的method類型, GET、POST、PUT、DELETE等;

2、consumes,produces

consumes:指定處理請求的提交內容類型(Content-Type),例如application/json , text/html;

produces:    指定傳回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才會傳回;

3、params,headers

params: 指定request中必須包含某些參數值是,才讓該方法處理。

headers: 指定request中必須包含某些指定的header值,才能讓此方法處理請求。

3、@Resource和@Autowired

@Resource和@Autowired都是在做bean的注入時使用,其實@Resource並不是Spring的註解,它的套件是javax.annotation.Resource,需要導入,但是Spring支援該註解的注入。

1、共同點

兩者都可以寫在欄位和setter方法上。兩者如果都寫在字段上,那麼就不需要再寫setter方法。

2、不同點

(1)@Autowired

@Autowired為Spring提供的註解,需要導入包org.springframework.beans.factory.annotation.Autowired;只依照byType注入。

public class TestServiceImpl {
    // 下面两种@Autowired只要使用一种即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于属性的方法上
        this.userDao = userDao;
    }
}

@Autowired註解是依照型別(byType)組裝依賴對象,預設情況下它要求依賴對象必須存在,如果允許null值,可以設定它的required屬性為false。如果我們想要使用依照名稱(byName)來組裝,可以結合@Qualifier註解一起使用。如下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

(2)@Resource

@Resource預設依照ByName自動注入,由J2EE提供,需要導入包javax.annotation.Resource。 @Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以,如果使用name屬性,使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不制定name也不制定type屬性,這時將透過反射機制使用byName自動注入策略。

public class TestServiceImpl {
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

註:最好是將@Resource放在setter方法上,因為這樣比較符合物件導向的思想,透過set、get去操作屬性,而不是直接去操作屬性。

@Resource組裝順序:

①如果同時指定了name和type,則從Spring上下文中找到唯一符合的bean進行組裝,找不到則拋出例外。

②如果指定了name,則從上下文中尋找名稱(id)符合的bean進行組裝,找不到則拋出例外。

③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會​​拋出異常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

4、@ModelAttribute和 @SessionAttributes

代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

 @SessionAttributes即将值放到session作用域中,写在class上面。

具体示例参见下面:使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据

5、@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:

@Controller  
public class TestController {  
     @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)  
     public String getLogin(@PathVariable("userId") String userId,  
         @PathVariable("roleId") String roleId){  
         System.out.println("User Id : " + userId);  
         System.out.println("Role Id : " + roleId);  
         return "hello";  
     }  
     @RequestMapping(value="/product/{productId}",method = RequestMethod.GET)  
     public String getProduct(@PathVariable("productId") String productId){  
           System.out.println("Product Id : " + productId);  
           return "hello";  
     }  
     @RequestMapping(value="/javabeat/{regexp1:[a-z-]+}",  
           method = RequestMethod.GET)  
     public String getRegExp(@PathVariable("regexp1") String regexp1){  
           System.out.println("URI Part 1 : " + regexp1);  
           return "hello";  
     }  
}

6、@requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

7、@ResponseBody

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

8、@Component

相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议。

9、@Repository

用于注解dao层,在daoImpl类上面注解。

 推荐教程:《Java教程



以上是SpringMVC 常用註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn