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

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/tian830937/p/5581033.html
Copyright © 2011-2022 走看看