首页 > 代码库 > [Spring MVC] - @ModelAttribute使用

[Spring MVC] - @ModelAttribute使用

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

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

 

比如我们有一个Controller:TestController

@Controller@RequestMapping(value="http://www.mamicode.com/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="http://www.mamicode.com/login", method=RequestMethod.POST)    public ModelAndView login(@ModelAttribute @Valid Account account, BindingResult result)        :        :    }        @RequestMapping(value="http://www.mamicode.com/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="http://www.mamicode.com/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="http://www.mamicode.com/${item.userName}"></c:out><br/>    </c:forEach></body></html>

页面将输出:

技术分享

在Console中输出为:

技术分享

 

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

[Spring MVC] - @ModelAttribute使用