• [Spring MVC]


    在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()。

  • 相关阅读:
    typora 页内跳转
    shell脚本搭建redis集群
    Html
    python json模块
    jenkins 问题合集
    day05 每日一行
    day04 每次一行
    day03 每日一行
    day02
    day02 每日一行
  • 原文地址:https://www.cnblogs.com/HD/p/4127915.html
Copyright © 2020-2023  润新知