1. 程式人生 > 實用技巧 >SSM中的相關注解

SSM中的相關注解

  1. @Resource

    jdk1.8以前自帶,之後就沒了,需要新增javax.annotation-api包

    只有在*Service/Impl實現類中進行@Service註解,並已經在spring.xml匯入該service包的掃描,才能通過註解查到

    先按照名字找,找不到在按照型別去找

    @Resource(name = "question"),註解指定了按照名稱去找,不會再按照型別去找了

    @Resource(type= Question.class),註解指定了按照型別去找,不會再按照名稱去找了


  2. @Autowired

    可以代替@Resource

    只有在*Service/Impl實現類中進行@Service註解,並已經在spring.xml匯入該service包的掃描,才能通過註解查到

    只按照型別去找,叫什麼無所謂

    如果想按照名字去找,需要配合@Qualifier("名稱")去找

    但要注意註解在*Service/Impl的實現類中查詢,實現類的名稱是首字母改成小寫的名稱,(如類名為:QuestionTypeServiceImpl,則查詢的名稱為questionTypeServiceImpl)

    可以在實現類的@Service("名稱")@Qualifier("名稱")一致,或者將@Qualifier("名稱")中的名稱改為實現類的名稱首字母小寫的名稱questionTypeServiceImpl。


  3. @Controller

    spring中的註解


  4. @RequestParam("名稱")

    在網頁提交資料時,表單中的標籤的屬性name中的名稱需要對應Controller中的方法的形參列表中形參的名稱,當形參名不匹配時,springmvc不會識別對應的物件,獲取對應的值,此時,只需要呼叫@RequestParam("名稱")註解,輸入與網頁中name對應的名稱,即可獲取該值。

    @RequestParam(value="名稱",required = false,defaultValue="預設值")

    value和name的作用一樣

    required預設值為true,必須傳值才能行;

    如果改成false,就跟不加註解名稱對應產生的效果一樣,可以不傳值。

    defaultValue是新增預設值,如果網頁中沒有傳值,則將預設值傳入。


  5. @RequestHeader("屬性")

    作用: 獲取請求頭的資訊

    一般獲取請求頭資訊,通過呼叫request.getHeader("accept")獲得請求頭資訊。

    通過在形參列表中@RequestHeader("accept")String accept,即可獲取請求頭資訊。


  6. @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;
}

  1. @SessionAttributes("名稱")

    一般存到session中,通過request存到session中。

    當屬性值共享到ModelAndView/Model/ModelMap中時,會同時放在session中一份。

    @SessionAttributes("questionTypes")
    public class QuestionTypeController {}
    

    從Session中取值:

    ${sessionScope.questionTypes}
    

  2. @SessionAttribute("名稱")

    用在形參列表中,將session中的資料取出來,給對應型別的物件。

    一般從session中取資料,通過request中取。

     @GetMapping("update")
    @ResponseBody
    public void update(@SessionAttribute("questionTypes") List<QuestionType> questionTypes) {
        questionTypes.forEach(System.out::println);
    }
    

  3. @RequestAttribute("名稱")

    用在形參列表中,將request中的資料取出來,給對應型別的物件。

    一般通過request取。

    @GetMapping("update")
    @ResponseBody
    public void update(@RequestAttribute("questionTypes") List<QuestionType> questionTypes) {
        questionTypes.forEach(System.out::println);
    }
    

  4. @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;
    }