在Spring MVC里,@ModelAttribute一般使用在Controller方法的参数注解中,用于解释model entity,但同时,也能够放在方法注解里。html
若是把@ModelAttribute放在方法的注解上时,表明的是:该Controller的全部方法在调用前,先执行此@ModelAttribute方法。java
好比咱们有一个Controller:TestControllerweb
@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()方法。spring
咱们能够把这个@ModelAttribute特性,应用在BaseController当中,全部的Controller继承BaseController,便可实如今调用Controller时,先执行@ModelAttribute方法。安全
好比权限的验证(也能够使用Interceptor)等session
下面是一个设置request和response的方式(这个未测试,不知有没线和安全问题)app
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时使用,好比:jsp
测试例子测试
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>
页面将输出:ui
在Console中输出为:
这里能够看到,运行的前后次序为:先调用getAccounts(),再调用index()。