javascript
SpringMVC @ModelAttribute详解
@ModelAttribute一個(gè)具有如下三個(gè)作用:
①綁定請(qǐng)求參數(shù)到命令對(duì)象:放在功能處理方法的入?yún)⑸蠒r(shí),用于將多個(gè)請(qǐng)求參數(shù)綁定到一個(gè)命令對(duì)象,從而簡(jiǎn)化綁
定流程,而且自動(dòng)暴露為模型數(shù)據(jù)用于視圖頁(yè)面展示時(shí)使用;
②暴露表單引用對(duì)象為模型數(shù)據(jù):放在處理器的一般方法(非功能處理方法)上時(shí),是為表單準(zhǔn)備要展示的表單引用
對(duì)象,如注冊(cè)時(shí)需要選擇的所在城市等,而且在執(zhí)行功能處理方法(@RequestMapping 注解的方法)之前,自動(dòng)添加
到模型對(duì)象中,用于視圖頁(yè)面展示時(shí)使用;
③暴露@RequestMapping 方法返回值為模型數(shù)據(jù):放在功能處理方法的返回值上時(shí),是暴露功能處理方法的返回值為
模型數(shù)據(jù),用于視圖頁(yè)面展示時(shí)使用。
被@ModelAttribute注釋的方法會(huì)在此controller每個(gè)方法執(zhí)行前被執(zhí)行,因此對(duì)于一個(gè)controller映射多個(gè)URL的用法來(lái)說,要謹(jǐn)慎使用。
我們編寫控制器代碼時(shí),會(huì)將保存方法獨(dú)立成一個(gè)控制器也是如此。
?
1、注釋void返回值的方法
@Controller public class HelloModelController {@ModelAttribute public void populateModel(@RequestParam String abc, Model model) { model.addAttribute("attributeName", abc); } @RequestMapping(value = "/helloWorld") public String helloWorld() { return "helloWorld.jsp"; } }在這個(gè)代碼中,訪問控制器方法helloWorld時(shí),會(huì)首先調(diào)用populateModel方法,將頁(yè)面參數(shù)abc(/helloWorld.ht?abc=text)放到model的attributeName屬性中,在視圖中可以直接訪問。
jsp頁(yè)面頁(yè)面如下:
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> </head> <body><c:out value="${attributeName}"></c:out> </body> </html>?
2、注釋返回具體類的方法
@Controller public class Hello2ModelController {@ModelAttribute public User populateModel() { User user=new User();user.setAccount("ray");return user;} @RequestMapping(value = "/helloWorld2") public String helloWorld() { return "helloWorld.jsp"; } }?
當(dāng)用戶請(qǐng)求?http://localhost:8080/test/helloWorld2時(shí),首先訪問populateModel方法,返回User對(duì)象,model屬性的名稱沒有指定,它由返回類型隱含表示,如這個(gè)方法返回User類型,那么這個(gè)model屬性的名稱是user。這個(gè)例子中model屬性名稱有返回對(duì)象類型隱含表示,model屬性對(duì)象就是方法的返回值。它無(wú)須要特定的參數(shù)。
?
jsp 中如下訪問:
<c:out value="${user.account}"></c:out>
3、也可以指定屬性名稱
@Controller public class Hello2ModelController {@ModelAttribute(value="myUser")public User populateModel() { User user=new User();user.setAccount("ray");return user;} @RequestMapping(value = "/helloWorld2") public String helloWorld(Model map) { return "helloWorld.jsp"; } }?
jsp中如下訪問:
<c:out value="${myUser.account}"></c:out>?
4、對(duì)象合并
@Controller public class Hello2ModelController {@ModelAttributepublic User populateModel() { User user=new User();user.setAccount("ray");return user;} @RequestMapping(value = "/helloWorld2") public String helloWorld(User user) {user.setName("老王");return "helloWorld.jsp"; } }?
這個(gè)在編寫代碼的時(shí)候很有用處,比如在更新的時(shí)候,我們可以現(xiàn)在populateModel方法中根據(jù)ID獲取對(duì)象,然后使用spring mvc的自動(dòng)組裝功能,組裝User對(duì)象,這樣在客戶端提交了值的屬性才會(huì)被組裝到對(duì)象中。
比如:User對(duì)象,首先從數(shù)據(jù)庫(kù)中獲取此對(duì)象,客戶端表單只有account屬性,提交時(shí)就只會(huì)改變account屬性。
?
5、對(duì)象合并指定對(duì)象名稱
?
@Controller public class Hello2ModelController {@ModelAttribute("myUser")public User populateModel() { User user=new User();user.setAccount("ray");return user;} @RequestMapping(value = "/helloWorld2") public String helloWorld(@ModelAttribute("myUser") User user) {user.setName("老王");return "helloWorld.jsp"; } }這樣在jsp中可以使用如下方式訪問
<c:out value="${myUser.name}"></c:out> <c:out value="${myUser.account}"></c:out>6、通過此特性控制權(quán)限
我們可以在基類方法中控制寫此注解,需要控制權(quán)限的控制器,繼承控制器就可以了。
public class BaseController {@ModelAttributepublic void populateModel() throws Exception { SysUser user=ContextUtil.getCurrentUser();if(user.getAccount().equals("admin")){throw new Exception("沒有權(quán)限");}} }需要控制權(quán)限的類繼承BaseController
@Controller public class Hello2ModelController extends BaseController {@RequestMapping(value = "/helloWorld2") public String helloWorld(@ModelAttribute("myUser") User user) {user.setName("老王");return "helloWorld.jsp"; } }這樣就可以控制權(quán)限了,當(dāng)然控制權(quán)限的方法有很多,比如通過過濾器等。這里只是提供一種思路。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的SpringMVC @ModelAttribute详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsessionid
- 下一篇: Spring期末试题