Spring MVC @ModelAttribute 詳解,mvc@modelattribute

來源:互聯網
上載者:User

Spring MVC @ModelAttribute 詳解,mvc@modelattribute

1.@ModelAttribute注釋void傳回值的方法[java] view plaincopyprint?01.@Controller  02.public class HelloModelController {  03.      04.    @ModelAttribute   05.    public void populateModel(@RequestParam String abc, Model model) {    06.       model.addAttribute("attributeName", abc);    07.    }    08.  09.    @RequestMapping(value = "/helloWorld")    10.    public String helloWorld() {    11.       return "helloWorld.jsp";    12.    }    13.  14.}  在這個代碼中,存取控制器方法helloWorld時,會首先調用populateModel方法,將頁面參數abc(/helloWorld.ht?abc=text)放到model的attributeName屬性中,在視圖中可以直接存取。jsp頁面頁面如下:[html] view plaincopyprint?01.<%@ page language="java" contentType="text/html; charset=utf-8"  02.    pageEncoding="utf-8"%>  03.<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  04.<html>  05.<head>  06.</head>  07.<body>  08.<c:out value="${attributeName}"></c:out>  09.</body>  10.</html>  2.@ModelAttribute注釋返回具體類的方法[java] view plaincopyprint?01.@Controller  02.public class Hello2ModelController {  03.      04.    @ModelAttribute   05.    public User populateModel() {    06.       User user=new User();  07.       user.setAccount("ray");  08.       return user;  09.    }    10.    @RequestMapping(value = "/helloWorld2")    11.    public String helloWorld() {    12.       return "helloWorld.jsp";    13.    }    14.}  當使用者請求 http://localhost:8080/test/helloWorld2.html時,首先訪問populateModel方法,返回User對象,model屬性的名稱沒有指定,它由傳回型別隱含表示,如這個方法返回User類型,那麼這個model屬性的名稱是user。 這個例子中model屬性名稱有返回物件類型隱含表示,model屬性對象就是方法的傳回值。它無須要特定的參數。jsp 中如下訪問:[html] view plaincopyprint?01.<c:out value="${user.account}"></c:out>  也可以指定屬性名稱[java] view plaincopyprint?01.@Controller  02.public class Hello2ModelController {  03.      04.    @ModelAttribute(value="myUser")  05.    public User populateModel() {    06.       User user=new User();  07.       user.setAccount("ray");  08.       return user;  09.    }    10.    @RequestMapping(value = "/helloWorld2")    11.    public String helloWorld(Model map) {    12.       return "helloWorld.jsp";    13.    }    14.}  jsp中如下訪問:[html] view plaincopyprint?01.<c:out value="${myUser.account}"></c:out>  對象合并:[java] view plaincopyprint?01.@Controller  02.public class Hello2ModelController {  03.      04.    @ModelAttribute  05.    public User populateModel() {    06.       User user=new User();  07.       user.setAccount("ray");  08.       return user;  09.    }    10.      11.    @RequestMapping(value = "/helloWorld2")    12.    public String helloWorld(User user) {  13.        user.setName("老王");  14.       return "helloWorld.jsp";    15.    }    16.}   對象合并指定對象名稱:[java] view plaincopyprint?01.@Controller  02.public class Hello2ModelController {  03.      04.    @ModelAttribute("myUser")  05.    public User populateModel() {    06.       User user=new User();  07.       user.setAccount("ray");  08.       return user;  09.    }    10.      11.    @RequestMapping(value = "/helloWorld2")    12.    public String helloWorld(@ModelAttribute("myUser") User user) {  13.        user.setName("老王");  14.       return "helloWorld.jsp";    15.    }    16.}  這樣在jsp中可以使用如下方式訪問[html] view plaincopyprint?01.<c:out value="${myUser.name}"></c:out>  02.<c:out value="${myUser.account}"></c:out>  3.通過此特性控制許可權.我們可以在基類方法中控制寫此註解,需要控制許可權的控制器,繼承控制器就可以了。[java] view plaincopyprint?01.public class BaseController {  02.      03.    @ModelAttribute  04.    public void populateModel() throws Exception {    05.       SysUser user=ContextUtil.getCurrentUser();  06.       if(user.getAccount().equals("admin")){  07.           throw new Exception("沒有許可權");  08.       }  09.    }    10.}  需要控制許可權的類繼承BaseController[java] view plaincopyprint?01.@Controller  02.public class Hello2ModelController extends BaseController {  03.      04.    @RequestMapping(value = "/helloWorld2")    05.    public String helloWorld(@ModelAttribute("myUser") User user) {  06.        user.setName("老王");  07.       return "helloWorld.jsp";    08.    }    09.}  這樣就可以控制許可權了,當然控制許可權的方法有很多,比如通過過濾器等。這裡只是提供一種思路。總結:@ModelAttribute具有如下三個作用:①綁定請求參數到命令對象:放在功能處理方法的入參上時,用於將多個請求參數綁定到一個命令對象,從而簡化繫結資料流程,而且自動暴露為模型資料用於視圖頁面展示時使用。其實@ModelAttribute此處對於供視圖頁面展示來說與model.addAttribute("attributeName", abc);功能類似。[java] view plaincopyprint?01.public String test(@ModelAttribute("user") UserModel user)   此處多了一個註解@ModelAttribute("user"),它的作用是將該綁定的命令對象以“user”為名稱添加到模型對象中供視圖頁面展示使用。我們此時可以在視圖頁面使用${user.username}來擷取綁定的命令對象的屬性。②暴露@RequestMapping 方法傳回值為模型資料:放在功能處理方法的傳回值上時,是暴露功能處理方法的傳回值為模型資料,用於視圖頁面展示時使用。[java] view plaincopyprint?01.public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)  大家可以看到傳回值類型是命令物件類型,而且通過@ModelAttribute("user2")註解,此時會暴露傳回值到模型資料( 名字為user2 ) 中供視圖展示使用@ModelAttribute 註解的傳回值會覆蓋@RequestMapping 註解方法中的@ModelAttribute 註解的同名命令對象③暴露表單引用對象為模型資料:放在處理器的一般方法(非功能處理方法)上時,是為表單準備要展示的表單引用對象,如註冊時需要選擇的所在城市等,而且在執行功能處理方法(@RequestMapping 註解的方法)之前,自動添加到模型對象中,用於視圖頁面展示時使用;

擷取【】 java後台架構 springmvc mybatis(oracle 和 mysql) HTML5 全新高大尚

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.