SpringMVC——常用註解

引言:

                SpringMVC註解開發是一種springmvc的便捷方式,通過註解降低了配置文件的複雜性。

概述:

                SpringMVC常用的註解有很多,我們今天只總結最常用的幾個註解,主要包括註解的含義和作用以及相似註解的區別與聯繫。

內容:

                 一 @Controller      

                   1 含義:Controller代表控制層,@Controller定義控制層的bean。

                   2 作用:定義Controller的bean,無需繼承特定的類或者實現特定的接口(public class ItemsController implements   Controller),只需要使用@Controller標記一個類是Controller即可,如下所示

@Controller
Public class ItemsController{};

                   3  說明:我們單純使用@Controller標記一個類並不能真正將該類定義爲SpringMVC的一個控制類,需要把它交給Spring來管理才行,也就是在SpringMVC配置文件(springmvc.xml)中進行配置。

                         (1)在SpringMVC的配置文件中定義類的bean對象

<bean id="itemsController" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController" />
                                (2)在SpringMVC的配置文件中告訴控制類所在的包的路徑cn.itcast.ssm.controller,通過context:component-scan自動掃描匹配,

<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>

          二 @RequestMapping

                  1 含義:請求映射

                  2 作用:定義Controller方法對應的url,進行處理器映射使用,可以窄化請求映射,即在類頭寫入該映射,映射request請求與處理器。

                  3 六大屬性:

                      (1)value和method

                               1)value:指定請求的實際地址,指定的地址可以是URI Template模式

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

                               3)示例:使用method參數限制了以GET或DELETE方法請求/testMethod的時候才能訪問到該controller的testMethod方法。

		      @RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })
	         public String testMethod() {
		      return "testMethod" ;
	         }
                          (2)consumes和produces

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

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

                      (3)params和headers

                               1)params:指定request中必須包含某些參數值,才訪問該controller方法

		        @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¶m2=value2 的時候能夠正確訪問到該testParams 方法,
                當請求/testParams.do?param1=value1¶m2=value2¶m3=value3 的時候就不能夠正常的訪問到該方法,
                因爲在@RequestMapping 的params 參數裏面指定了參數param3 是不能存在的。

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

                     @RequestMapping(value="testHeaders",headers={"host=localhost","Accept"})
                public String testHeaders(){
	             return "headers";
                }
                headers屬性的用法和功能與params 屬性相似。
                在上面的代碼中當請求/testHeaders.do 的時候只有當請求頭包含Accept 信息,
                且請求的host爲localhost 的時候才能正確的訪問到testHeaders 方法。

                  4 使用@RequestMapping映射Request請求與處理器的方式

                     (1)通過常見的類路徑和方法路徑結合訪問controller方法

                     (2)使用URI模板:在URI中給定一個變量,然後再映射的時候動態的給該變量賦值。

                     (3)使用通配符                           

		        @Controller
		@RequestMapping ( "/myTest" )
		public class MyController {
			@RequestMapping ( "*/wildcard" )
			public String testWildcard() {
				 System. out .println( "wildcard------------" );
					return "wildcard" ;
			}  
		}
                  5 支持的方法參數類型

                      (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 對象。 這兩個對象參數必須緊接在需要驗證的實體對象參數之後,它裏面包含了實體對象的驗證結果。

          三 @Resource和Autowired

                  1 作用:都用來注入bean,其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要導入,只不過Spring支持該註解的注入。

                  2 共同點:都可以寫到字段和setter方法上,如果都寫在字段上,不需要再實現setter方法。

                  3 不同點:

                     (1)@Autowired:需要導入包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:默認按照ByName自動注入,由J2EE提供,需要導入javax.annotation.Resource。包含倆個重要屬性:name和type;屬性爲name,採用ByName自動注入策略,屬性爲type採用ByType自動注入策略,如果倆個屬性都不使用,通過反射機制使用ByName自動注入策略。@Resource的作用相當於@Autowired,只不過@Autowired按照ByType自動注入。
		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裝配順序

                                  1)如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常。

                                  2)如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。

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

                                  4)如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配。

          四 @ModelAttribute和SessionAttributes:傳遞和保存數據,在不同模型和控制器之間共享數據。

          五 @PathVariable:將請求URL中的模板變量映射到功能處理方法的參數上,即取出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";  
	        }  
	}
                        與@requestParam區別:請求路徑上有個id的變量值,可以通過@PathVariable來獲取 @RequestMapping(value ="/page/{id}", method = RequestMethod.GET);@requestParam用來獲得靜態的URL請求參數,spring註解時action裏用到。

          六 @requestParam:用於後臺獲取參數,類似於request.getParameter("name")

                  三個常用參數:(1)defaultValue:設置默認值;(2)required:是否必須要傳入參數,true/false;(3)value:表示接受的傳入參數的類型

          七 @ResponseBody:用於Controller方法返回對象,通過適當的HttpMessageConverter轉換爲指定格式後,寫入Response對象的body數據。

                 使用場景:返回json、xml等格式的數據時,返回值不能是html標籤的頁面。  

          八 @Component:泛指組件,標註不好歸類的組件

          九 @Repository:用於標註數據訪問層組件,即DAO組件

總結:

                SpringMVC註解開發能減少配置文件的大量配置內容,熟悉常用註解的使用,可以提高我們的開發效率,上述註解是很常用的註解,還有其他常用的註解也需要掌握,例如@Transactional等。註解開發已成爲互聯網流行的開發方式,註解在手,配置我有。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章