zoukankan      html  css  js  c++  java
  • springMVC注解用法:@modelattribute的用法

    在Spring MVC里,@ModelAttribute通常使用在Controller方法的参数注解中,用于解释model entity,但同时,也可以放在方法注解里。

    如果把@ModelAttribute放在方法的注解上时,代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法

    比如我们有一个Controller:TestController

    复制代码
    @Controller
    @RequestMapping(value="test")
    public class PassportController {
    
        @ModelAttribute
        public void preRun() {
            System.out.println("Test Pre-Run");
        }
        
        @RequestMapping(method=RequestMethod.GET)
        public String index() {
            return "login/index";
        }
        
        @RequestMapping(value="login", method=RequestMethod.POST)
        public ModelAndView login(@ModelAttribute @Valid Account account, BindingResult result)
            :
            :
        }
        
        @RequestMapping(value="logout", method=RequestMethod.GET)
        public String logout() {
            :
            :
        }
        
    }
    复制代码

    在调用所有方法之前,都会先执行preRun()方法。

    我们可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

    比如权限的验证(也可以使用Interceptor)等

    下面是一个设置request和response的方式(这个未测试,不知有没线和安全问题)

    复制代码
    package com.my.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.web.bind.annotation.ModelAttribute;
    
    public class BaseController {
        
        protected HttpServletRequest request;  
        protected HttpServletResponse response;  
        protected HttpSession session;
          
        @ModelAttribute
        public void setReqAndRes(HttpServletRequest request, HttpServletResponse response){  
            this.request = request;
            this.response = response;
            this.session = request.getSession();
        }
        
    }
    复制代码

    @ModelAttribute也可以做为Model输出到View时使用,比如:

    测试例子

    复制代码
    package com.my.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.my.controller.bean.Account;
    
    @Controller
    @RequestMapping(value="attr")
    public class TestModelAttributeController {
        
        private static List<Account> accounts = new ArrayList<Account>();
        {
            accounts.add(new Account());
            accounts.add(new Account());
            
            Account ac1 = accounts.get(0);
            Account ac2 = accounts.get(1);
            
            ac1.setUserName("Robin");
            ac1.setPassword("123123");
            
            ac2.setUserName("Lucy");
            ac2.setPassword("123456");
        }
    
        @RequestMapping(method=RequestMethod.GET)
        public String index() {
            System.out.println("index");
            return "TestModelAttribute/index";
        }
        
        @ModelAttribute("accounts")
        public List<Account> getAccounts() {
            System.out.println("getAccounts");
            return accounts;
        }
        
    }
    复制代码
    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    <%@ taglib prefix="st" uri="http://www.springframework.org/tags" %>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>TestModelAttribute</title>
    </head>
    <body>
        <c:forEach items="${accounts}" var="item">
            <c:out value="${item.userName}"></c:out><br/>
        </c:forEach>
    </body>
    </html>
    复制代码

    页面将输出:

    在Console中输出为:

    这里可以看到,运行的先后次序为:先调用getAccounts(),再调用index()。

  • 相关阅读:
    Macbook键盘的使用基础技巧
    JSTL详解
    为了理想,因为爱情-开课第一天有感(鸡汤向)
    HK游记 Day2迪斯尼(下)
    MP20 MBO issue summary
    音频测量加权
    有没有降噪
    信源编码信源译码和信道编码和译码和加密和解密数字调制和解调和同步
    gcc
    数据挖掘|统计的艺术
  • 原文地址:https://www.cnblogs.com/tian830937/p/5581033.html
Copyright © 2011-2022 走看看