SSM中的相關注解
-
@Resource
jdk1.8以前自帶,之後就沒了,需要新增javax.annotation-api包
只有在*Service/Impl實現類中進行@Service註解,並已經在spring.xml匯入該service包的掃描,才能通過註解查到
先按照名字找,找不到在按照型別去找
@Resource(name = "question"),註解指定了按照名稱去找,不會再按照型別去找了
@Resource(type= Question.class),註解指定了按照型別去找,不會再按照名稱去找了
-
@Autowired
可以代替@Resource
只有在*Service/Impl實現類中進行@Service註解,並已經在spring.xml匯入該service包的掃描,才能通過註解查到
只按照型別去找,叫什麼無所謂
如果想按照名字去找,需要配合@Qualifier("名稱")去找
但要注意註解在*Service/Impl的實現類中查詢,實現類的名稱是首字母改成小寫的名稱,(如類名為:QuestionTypeServiceImpl,則查詢的名稱為questionTypeServiceImpl)
可以在實現類的@Service("名稱")與@Qualifier("名稱")一致,或者將@Qualifier("名稱")中的名稱改為實現類的名稱首字母小寫的名稱questionTypeServiceImpl。
-
@Controller
spring中的註解
-
@RequestParam("名稱")
在網頁提交資料時,表單中的標籤的屬性name中的名稱需要對應Controller中的方法的形參列表中形參的名稱,當形參名不匹配時,springmvc不會識別對應的物件,獲取對應的值,此時,只需要呼叫@RequestParam("名稱")註解,輸入與網頁中name對應的名稱,即可獲取該值。
@RequestParam(value="名稱",required = false,defaultValue="預設值")
value和name的作用一樣
required預設值為true,必須傳值才能行;
如果改成false,就跟不加註解名稱對應產生的效果一樣,可以不傳值。
defaultValue是新增預設值,如果網頁中沒有傳值,則將預設值傳入。
-
@RequestHeader("屬性")
作用: 獲取請求頭的資訊
一般獲取請求頭資訊,通過呼叫request.getHeader("accept")獲得請求頭資訊。
通過在形參列表中@RequestHeader("accept")String accept,即可獲取請求頭資訊。
-
@CookieValue("屬性")
之前的方法通過CookieUtile工具類進行獲取。
通過在形參列表中@CookieValue("JSESSIONID")String sessionId,即可獲取請cookie的相關資訊。
//4,5,6相關程式碼
@PostMapping("insert")
public String insert(@RequestParam(value = "title",required = false,defaultValue = "型別") String title, Integer sort,@RequestHeader("accept") String accept,@CookieValue("JSESSIONID") String sessionId,HttpServletRequest request)
{
//String accept = request.getHeader("accept");
System.out.println(accept);
System.out.println(sessionId);
System.out.println("title="+title);
return null;
}
-
@SessionAttributes("名稱")
一般存到session中,通過request存到session中。
當屬性值共享到ModelAndView/Model/ModelMap中時,會同時放在session中一份。
@SessionAttributes("questionTypes") public class QuestionTypeController {}
從Session中取值:
${sessionScope.questionTypes}
-
@SessionAttribute("名稱")
用在形參列表中,將session中的資料取出來,給對應型別的物件。
一般從session中取資料,通過request中取。
@GetMapping("update") @ResponseBody public void update(@SessionAttribute("questionTypes") List<QuestionType> questionTypes) { questionTypes.forEach(System.out::println); }
-
@RequestAttribute("名稱")
用在形參列表中,將request中的資料取出來,給對應型別的物件。
一般通過request取。
@GetMapping("update") @ResponseBody public void update(@RequestAttribute("questionTypes") List<QuestionType> questionTypes) { questionTypes.forEach(System.out::println); }
-
@ModelAttribute("名稱")
作用:①放到方法前,指定功能處理方法,並含有@RequestMapping註解,返回值共享到ModelAndView的屬性名中。
② 放到控制器的普通的方法前面,沒有加@RequestMapping註解,在執行控制器的所有的其他功能處理方法時,都會執行該方法,並且會共享返回值到ModelAndView中。
@ControllerAdvice public class CommonControllerAdvice { @ModelAttribute("menus") public List<Menu> findMenus() { return menuService.findAll(); } }
執行所有方法前,先執行該方法,並將返回值放到ModelAndView中,網頁中可以直接通過Request呼叫。
③可以將註解的資料轉發到網頁,並且可以修改網頁呼叫的物件名。
@PostMapping("insert") public String insert(@ModelAttribute("questionType") QuestionType questionType) { if (questionType.getTitle() == null || questionType.getTitle().length() < 3) { //命令物件questionType會共享到轉發到的頁面上,預設的屬性名為引數名questionType, //可以通過@ModelAttribute註解修改共享的屬性名 return "manage/questionType/insert"; } questionTypeService.insert(questionType); return "redirect:/manage/questionType/list"; }
拓展:
@RequestMapping("list") @ModelAttribute("questionTypes") public List<QuestionType> list() { return questionTypeService.findAll(); }
(1)Model代替@ModelAttribute
@RequestMapping("list") public void list(Model model) { model.addAttribute("questionTypes", questionTypeService.findAll()); }
(2)ModelMap代替@ModelAttribute
@RequestMapping("list") public void list(ModelMap modelMap) { //modelMap.addAttribute("questionTypes", questionTypeService.findAll()); //modelMap自帶put()方法,與上述操作效果一樣 modelMap.put("questionTypes", questionTypeService.findAll()); }
(3)ModelAndView代替@ModelAttribute
//注意這裡不需要new,但ModelAndView必須返回 @RequestMapping("list") public ModelAndView list(ModelAndView modelAndView) { modelAndView.addObject("questionTypes", questionTypeService.findAll()); return modelAndView; }