1. 程式人生 > >Spring常用註解和標籤

Spring常用註解和標籤

標籤注入時,屬性必須要有對應name的set方法,否則會報錯
註解和標籤是SpringMVC的,//沒有事物層
1、@Controller
負責DispatcherServlet分發的請求,他把使用者的請求資料封裝成Model,然後吧改Model返回給view進行展示。
特點:無需繼承或實現某類介面,只需"@"標記,結合@requestMapping和@requestParam,即可被外界訪問,
不依賴HttpServletRequest、httpServletResponse
@Controller標記的類如何交給Spring來管理?
1.<bean class="com.huawei.controller.MyController"></bean>指定具體類
2.<context:component-scan base-package="com.huawei.controller"/>指定包名
2、@RequestMapping

用來處理請求路徑的對映,用在類上,表示該類中相應所有請求的方法,都應該以該路徑作為父路徑
屬性:
value:指定請求的路徑
method:指定請求的method型別,GET,PUT.DELETE.POST
consumes:指定處理請求的提交內容型別(Content-Type),application/json,text/html
produces:指定返回的內容型別,僅當request請求頭中(Accept)的型別中包含改指定型別時才返回
params:request請求中必須包含某些指定的引數時才讓該方法處理
header:request請求中必須包含某些指定的header值,才讓該方法處理
3、@Resource和@Autowired

兩者均做bean注入時使用的,其實@Resource是javax.annotation.Resource,需要匯入,但Spring支援該註解
不同點:
Autowired:
Spring提供的註解,只按照型別注入。預設情況下要求依賴物件必須存在,如果允許null值,可設定reuqired屬性為false,
如果還想使用name來注入 ,可結合@Qualifier註解
@Autowired
@Qualifier("userDao")
private UserDao userDao;
Resource:
有j2EE提供,@Resource有兩個重要屬性,name和type,特點是,指定什麼,就按照哪種方式來注入
public class TestServiceImpl {
@Resource(name="userDao")
    private UserDao userDao; // 用於欄位上
        @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用於屬性的setter方法上
        this.userDao = userDao;
注,將Resource放在set方法上更符合面向物件的思想,對set方法操作而不是直接對屬性進行操作
4、@ModelAttribute和@SessionAttribute

代表在所有的Controller在執行之前,先執行,@ModelAttribute方法,可用於註解和方法引數中
【【可以把這個@ModelAttribute特性,應用在BaseController當中,所有的Controller繼承BaseController,即可實現在呼叫Controller時,先執行@ModelAttribute方法。】】
5、@PathVarible
將請求URL中的模板變數對映到功能處理方法的引數上,即取出模板中的變數作為引數
@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類上面註解。


新增劑:

1、 @RequestMapping:使用RequestMapping來對映request請求與處理器
指定請求路徑的三種方式:
1.普通的具體的值 ,當然包含佔位符 * 
2.可以指定為含有某變數的一類值(URI Template Patterns with Path Variables)–restful風格;
@RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id2) {
System.out.println("testPathVariable: " + id2);
return SUCCESS;
    }
3.可以指定為含正則表示式的一類值( URI Template Patterns with Regular Expressions);
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")  
  public void handle(@PathVariable String version, @PathVariable String extension) {      
    // ...  
  }  
}  


高階用法:
requestMapping:
1.param屬性:
@RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" })
    public String testParams() {
       System. out .println( "test Params..........." );
       return "testParams" ;
    }
用@RequestMapping 的params 屬性指定了三個引數,這些引數都是針對請求引數而言的,它們分別表示引數param1 的值必須等於value1 ,引數param2 必須存在,值無所謂,引數param3 必須不存在,只有當請求/testParams.do 並且滿足指定的三個引數條件的時候才能訪問到該方法。所以當請求/testParams.do?param1=value1&param2=value2 的時候能夠正確訪問到該testParams 方法,當請求/testParams.do?param1=value1&param2=value2&param3=value3 的時候就不能夠正常的訪問到該方法,因為在@RequestMapping 的params 引數裡面指定了引數param3 是不能存在的。
2.method屬性
@RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })
    public String testMethod() {
       return "method" ;
    }
在上面的程式碼中就使用method 引數限制了以GET 或DELETE 方法請求/testMethod 的時候才能訪問到該Controller 的testMethod 方法。
3.headers屬性
@RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" })
    public String testHeaders() {
       return "headers" ;
    }
headers 屬性的用法和功能與params 屬性相似。在上面的程式碼中當請求/testHeaders.do 的時候只有當請求頭包含Accept 資訊,且請求的host 為localhost 的時候才能正確的訪問到testHeaders 方法。
-----------------------------------------------------
@RequestMapping 標記的處理器方法支援的方法引數和返回型別
  1. 支援的方法引數型別
     (1 )HttpServlet 物件,主要包括HttpServletRequest 、HttpServletResponse 和HttpSession 物件。 這些引數Spring 在呼叫處理器方法的時候會自動給它們賦值,所以當在處理器方法中需要使用到這些物件的時候,可以直接在方法上給定一個方法引數的申明,然後在方法體裡面直接用就可以了。但是有一點需要注意的是在使用HttpSession 物件的時候,如果此時HttpSession 物件還沒有建立起來的話就會有問題。
     (2 )Spring 自己的WebRequest 物件。 使用該物件可以訪問到存放在HttpServletRequest 和HttpSession 中的屬性值
     (3 )InputStream 、OutputStream 、Reader 和Writer 。 InputStream 和Reader 是針對HttpServletRequest 而言的,可以從裡面取資料;OutputStream 和Writer 是針對HttpServletResponse 而言的,可以往裡面寫資料。
     (4 )使用@PathVariable 、@RequestParam 、@CookieValue 和@RequestHeader 標記的引數。
     (5 )使用@ModelAttribute 標記的引數。
     (6 )java.util.Map 、Spring 封裝的Model 和ModelMap 。 這些都可以用來封裝模型資料,用來給檢視做展示。
     (7 )實體類。 可以用來接收上傳的引數。
     (8 )Spring 封裝的MultipartFile 。 用來接收上傳檔案的。
     (9 )Spring 封裝的Errors 和BindingResult 物件。 這兩個物件引數必須緊接在需要驗證的實體物件引數之後,它裡面包含了實體物件的驗證結果。
 2. 支援的返回型別
     (1 )一個包含模型和檢視的ModelAndView 物件。
     (2 )一個模型物件,這主要包括Spring 封裝好的Model 和ModelMap ,以及java.util.Map ,當沒有檢視返回的時候檢視名稱將由RequestToViewNameTranslator 來決定。
     (3 )一個View 物件。這個時候如果在渲染檢視的過程中模型的話就可以給處理器方法定義一個模型引數,然後在方法體裡面往模型中新增值。
     (4 )一個String 字串。這往往代表的是一個檢視名稱。這個時候如果需要在渲染檢視的過程中需要模型的話就可以給處理器方法一個模型引數,然後在方法體裡面往模型中新增值就可以了。
     (5 )返回值是void 。這種情況一般是我們直接把返回結果寫到HttpServletResponse 中了,如果沒有寫的話,那麼Spring 將會利用RequestToViewNameTranslator 來返回一個對應的檢視名稱。如果檢視中需要模型的話,處理方法與返回字串的情況相同。
     (6 )如果處理器方法被註解@ResponseBody 標記的話,那麼處理器方法的任何返回型別都會通過HttpMessageConverters 轉換之後寫到HttpServletResponse 中,而不會像上面的那些情況一樣當做檢視或者模型來處理。