org.springframework.web.bind.annotation.ModelAttribute注解類型將請求參數綁定到Model對象。
@ModelAttribute注解只支持一個屬性value,類型為String,表示綁定的屬性名稱。
提示:被@ModelAttribute注釋的方法會在Controller每個方法執行前被執行,因此在一個Controller映射到多個URL時,要謹慎使用。
實例:@ModelAttribute注解的使用
index.jsp
用於展示調用關於@ModelAttribute注解不同的使用方法。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h3>測試@ModelAttribute</h3>
<a href="loginForm1">測試@ModelAttribute(value="")注釋返回具體類的方法</a>
<a href="loginForm2">測試@ModelAttribute注釋void返回值的方法</a>
<a href="loginForm3">測試@ModelAttribute注釋返回具體類的方法</a>
<a href="loginForm4">測試@ModelAttribute和@RequestMapping同時注釋一個方法</a>
<a href="loginForm5">測試@ModelAttribute注釋一個方法的參數</a>
</body>
</html>
FormController
用於接受index.jsp頁,a標簽(超鏈接)傳遞的地址。
@Controller
public class FormController {
@RequestMapping(value = "/{formName}")
public String loginForm(@PathVariable String formName){
return formName;
}
}
測試@ModelAttribute(value="")注釋返回具體類的方法
loginForm1.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>測試@ModelAttribute(value="")注釋返回具體類的方法 </h3>
<form action="login111" method="post">
<label for="loginName">登錄名:</label><input type="text" id="loginName" name="loginName">
<input type="submit">
</form>
</body>
</html>
ModelAttribute1Controller
package com.wen.controller;
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.RequestParam;
@Controller
public class ModelAttribute1Controller {
//使用@ModelAttribute注釋的value屬性,來指定model屬性的名稱,model屬性的值就是方法的返回值
@ModelAttribute("loginName")
public String userModel1(
@RequestParam("loginName") String loginName){
return loginName;
}
@RequestMapping(value = "/login111")
public String login111(){
return "result1";
}
}
result1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.loginName}
</body>
</html>
測試@ModelAttribute注釋void返回值的方法
loginForm2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>測試@ModelAttribute注釋void返回值的方法</h3>
<form action="login222" method="post">
<label for="loginName">登錄名:</label><input type="text" id="loginName" name="loginName">
<label for="password">密碼:</label><input type="password" id="password" name="password">
<input type="submit" value="登錄">
</form>
</body>
</html>
ModelAttribute2Controller
package com.wen.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class ModelAttribute2Controller {
//model屬性名稱和值由model.addAttribute()實現,前提是要在方法中加入圖個Model類型的參數
@ModelAttribute
public void userModel2(
@RequestParam("loginName") String loginName,
@RequestParam("password") String password,
Model model) {
model.addAttribute("loginName", loginName);
model.addAttribute("password", password);
}
@RequestMapping(value = "/login222")
public String login222(){
return "result2";
}
}
result2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.loginName}
${requestScope.password}
</body>
</html>
測試@ModelAttribute注釋訪問具體類的方法
loginForm3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>測試@ModelAttribute注釋返回具體類的方法</h3>
<form action="login333" method="post">
<label for="loginName">登錄名:</label><input type="text" id="loginName" name="loginName">
<label for="password">密碼:</label><input type="password" id="password" name="password">
<input type="submit" value="登錄">
</form>
</body>
</html>
</body>
</html>
ModelAttribute3Controller
package com.wen.controller;
import com.wen.domain.User;
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.RequestParam;
import java.util.ArrayList;
import java.util.List;
@Controller
public class ModelAttribute3Controller {
//靜態List<User>集合,此處代替數據庫用來保存注冊的用戶信息
private static List<User> userList;
//此構造器,初始化List<User>集合
public ModelAttribute3Controller() {
super();
userList = new ArrayList<>();
User user1 = new User("test", "123");
User user2 = new User("admin", "456");
userList.add(user1);
userList.add(user2);
}
//根據登錄名和密碼查詢用戶,用戶存在返回用戶信息的User對象,不存在返回null
private User find(String loginName, String password) {
for (User user : userList) {
if (user.getName().equals(loginName) && user.getPwd().equals(password)) {
return user;
}
}
return null;
}
//model屬性的名稱沒有被鎖定,它由返回類型隱含表示,如這個方法返回User類型,
//那么這個model屬性的名稱就是user
@ModelAttribute
public User userModel3(
@RequestParam("loginName") String loginName,
@RequestParam("password") String password) {
return find(loginName, password);
}
@RequestMapping(value = "/login333")
public String login333() {
return "result3";
}
}
result3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.user.name}
</body>
</html>
測試@ModelAttribute和@RequestMapping同時注釋一個方法
loginForm4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<body>
<h3>測試@ModelAttribute注釋void返回值的方法</h3>
<form action="login444" method="post">
<label for="loginName">登錄名:</label><input type="text" id="loginName" name="loginName">
<label for="password">密碼:</label><input type="password" id="password" name="password">
<input type="submit" value="登錄">
</form>
</body>
</body>
</html>
ModelAttribute4Controller
package com.wen.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ModelAttribute4Controller {
/**
* 視圖名稱是@RequestMapping的value值——"/login444",即跳轉結果
*
* @return model屬性名稱就是value的值
*/
@RequestMapping(value = "/login444")
@ModelAttribute(value = "username")
public String login444() {
return "admin";
}
}
login444.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.username}
</body>
</html>
測試@ModelAttribute注釋一個方法的參數
loginForm5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<body>
<h3>測試@ModelAttribute注釋一個方法的參數</h3>
<form action="login555" method="post">
<label for="loginName">登錄名:</label><input type="text" id="loginName" name="loginName">
<label for="password">密碼:</label><input type="password" id="password" name="password">
<input type="submit" value="登錄">
</form>
</body>
</body>
</html>
ModelAttribute5Controller
package com.wen.controller;
import com.wen.domain.User;
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.RequestParam;
@Controller
public class ModelAttribute5Controller {
//model的屬性名稱就是value的值,即"user",model屬性對象就是方法的返回值
@ModelAttribute("user")
public User userModel5(
@RequestParam("loginName") String loginName,
@RequestParam("password") String password){
User user =new User();
user.setName(loginName);
user.setPwd(password);
return user;
}
@RequestMapping(value = "/login555")
public String login555(@ModelAttribute("user") User user){
user.setName("管理員");
return "result5";
}
}
result5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.user.name}
</body>
</html>
Tips:@ModelAttribute注解的使用的方法有很多種,非常靈活,我們可以根據業務需求選擇使用。