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 中,而不會像上面的那些情況一樣當做視圖或者模型來處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章