1沐扳、@Controller
在SpringMVC 中,控制器Controller 負(fù)責(zé)處理由DispatcherServlet 分發(fā)的請求禁荒,它把用戶請求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理之后封裝成一個Model 丁逝,然后再把該Model 返回給對應(yīng)的View 進(jìn)行展示惊搏。在SpringMVC 中提供了一個非常簡便的定義Controller 的方法,你無需繼承特定的類或?qū)崿F(xiàn)特定的接口仪搔,只需使用@Controller 標(biāo)記一個類是Controller 瘾婿,然后使用@RequestMapping 和@RequestParam 等一些注解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界訪問到烤咧。此外Controller 不會直接依賴于HttpServletRequest 和HttpServletResponse 等HttpServlet 對象偏陪,它們可以通過Controller 的方法參數(shù)靈活的獲取到。
@Controller 用于標(biāo)記在一個類上煮嫌,使用它標(biāo)記的類就是一個SpringMVC Controller 對象笛谦。分發(fā)處理器將會掃描使用了該注解的類的方法,并檢測該方法是否使用了@RequestMapping 注解昌阿。@Controller 只是定義了一個控制器類饥脑,而使用@RequestMapping 注解的方法才是真正處理請求的處理器。單單使用@Controller 標(biāo)記在一個類上還不能真正意義上的說它就是SpringMVC 的一個控制器類懦冰,因為這個時候Spring 還不認(rèn)識它灶轰。那么要如何做Spring 才能認(rèn)識它呢?這個時候就需要我們把這個控制器類交給Spring 來管理刷钢。有兩種方式:
######(1)在SpringMVC 的配置文件中定義MyController 的bean 對象笋颤。
###### (2)在SpringMVC 的配置文件中告訴Spring 該到哪里去找標(biāo)記為@Controller 的Controller 控制器内地。
<bean class="com.host.app.web.controller.MyController"/>
< context:component-scan base-package = "com.host.app.web" />//路徑寫到controller的上一層(掃描包詳解見下面淺析)
2伴澄、@RequestMapping
RequestMapping是一個用來處理請求地址映射的注解赋除,可用于類或方法上。用于類上秉版,表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑贤重。
RequestMapping注解有六個屬性,下面我們把她分成三類進(jìn)行說明(下面有相應(yīng)示例)清焕。
1并蝗、 value, method秸妥;
value: 指定請求的實際地址滚停,指定的地址可以是URI Template 模式(后面將會說明);
method: 指定請求的method類型粥惧, GET键畴、POST、PUT突雪、DELETE等起惕;
2、consumes咏删,produces
consumes: 指定處理請求的提交內(nèi)容類型(Content-Type)惹想,例如application/json, text/html;
produces: 指定返回的內(nèi)容類型,僅當(dāng)request請求頭中的(Accept)類型中包含該指定類型才返回督函;
3嘀粱、params,headers
params: 指定request中必須包含某些參數(shù)值是辰狡,才讓該方法處理锋叨。
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求宛篇。
3娃磺、@Resource和@Autowired
@Resource和@Autowired都是做bean的注入時使用,其實@Resource并不是Spring的注解叫倍,它的包是javax.annotation.Resource豌鸡,需要導(dǎo)入,但是Spring支持該注解的注入段标。
1涯冠、共同點
兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上逼庞,那么就不需要再寫setter方法蛇更。
2、不同點
(1)@Autowired
@Autowired為Spring提供的注解,需要導(dǎo)入包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)裝配依賴對象砸逊,默認(rèn)情況下它要求依賴對象必須存在,如果允許null值掌逛,可以設(shè)置它的required屬性為false师逸。如果我們想使用按照名稱(byName)來裝配,可以結(jié)合@Qualifier注解一起使用豆混。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
(2)@Resource
@Resource默認(rèn)按照ByName自動注入篓像,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource皿伺。@Resource有兩個重要的屬性:name和type员辩,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型鸵鸥。所以奠滑,如果使用name屬性,則使用byName的自動注入策略妒穴,而使用type屬性時則使用byType自動注入策略宋税。如果既不制定name也不制定type屬性,這時將通過反射機(jī)制使用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方法上杰赛,因為這樣更符合面向?qū)ο蟮乃枷耄ㄟ^set汁讼、get去操作屬性淆攻,而不是直接去操作屬性阔墩。
@Resource裝配順序:
①如果同時指定了name和type嘿架,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常啸箫。
②如果指定了name耸彪,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常忘苛。
③如果指定了type蝉娜,則從上下文中找到類似匹配的唯一bean進(jìn)行裝配,找不到或是找到多個扎唾,都會拋出異常召川。
④如果既沒有指定name,又沒有指定type胸遇,則自動按照byName方式進(jìn)行裝配荧呐;如果沒有匹配,則回退為一個原始類型進(jìn)行匹配,如果匹配則自動裝配倍阐。
@Resource的作用相當(dāng)于@Autowired概疆,只不過@Autowired按照byType自動注入。
4峰搪、@ModelAttribute和 @SessionAttributes
代表的是:該Controller的所有方法在調(diào)用前岔冀,先執(zhí)行此@ModelAttribute方法,可用于注解和方法參數(shù)中概耻,可以把這個@ModelAttribute特性使套,應(yīng)用在BaseController當(dāng)中,所有的Controller繼承BaseController咐蚯,即可實現(xiàn)在調(diào)用Controller時童漩,先執(zhí)行@ModelAttribute方法。
@SessionAttributes即將值放到session作用域中春锋,寫在class上面矫膨。
具體示例參見下面:使用 @ModelAttribute 和 @SessionAttributes 傳遞和保存數(shù)據(jù)
SpringMVC 支持使用 @ModelAttribute 和 @SessionAttributes 在不同的模型(model)和控制器之間共享數(shù)據(jù)。 @ModelAttribute 主要有兩種使用方式期奔,一種是標(biāo)注在方法上侧馅,一種是標(biāo)注在 Controller 方法參數(shù)上。
當(dāng) @ModelAttribute 標(biāo)記在方法上的時候呐萌,該方法將在處理器方法執(zhí)行之前執(zhí)行馁痴,然后把返回的對象存放在 session 或模型屬性中,屬性名稱可以使用 @ModelAttribute(“attributeName”) 在標(biāo)記方法的時候指定肺孤,若未指定罗晕,則使用返回類型的類名稱(首字母小寫)作為屬性名稱。關(guān)于 @ModelAttribute 標(biāo)記在方法上時對應(yīng)的屬性是存放在 session 中還是存放在模型中赠堵,我們來做一個實驗小渊,看下面一段代碼。
5茫叭、@PathVariable
用于將請求URL中的模板變量映射到功能處理方法的參數(shù)上酬屉,即取出uri模板中的變量作為參數(shù)。如:
@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后臺控制層獲取參數(shù)呐萨,類似一種是request.getParameter("name"),它有三個常用參數(shù):defaultValue = "0", required = false, value = "isApp"莽囤;defaultValue 表示設(shè)置默認(rèn)值谬擦,required 銅過boolean設(shè)置是否是必須要傳入的參數(shù),value 值表示接受的傳入的參數(shù)類型朽缎。
7惨远、@ResponseBody
作用: 該注解用于將Controller的方法返回的對象蔚舀,通過適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對象的body數(shù)據(jù)區(qū)锨络。
使用時機(jī):返回的數(shù)據(jù)不是html標(biāo)簽的頁面赌躺,而是其他某種格式的數(shù)據(jù)時(如json、xml等)使用羡儿;
8礼患、@Component
相當(dāng)于通用的注解,當(dāng)不知道一些類歸到哪個層時使用掠归,但是不建議缅叠。
9、@Repository
用于注解dao層虏冻,在daoImpl類上面注解肤粱。