Spring 4 MVCの処理モデルデータの@ModelAttribute
11531 ワード
@ModelAttribute使用シナリオ
ユーザがデータを変更するシーンでは、ブラウザフォームがサーバに送信するデータは、すべてのデータではなく、一部にすぎません.ユーザーが従業員情報を変更した場合、その勤務番号と入社日は変更できません.フォームには、このフィールドに対応する値はありません.このように他の情報を修正した後、提出されたデータには工番と入社日が空です.このデータでデータベースを直接更新すると、工番と入社日が空に設定され、情報が失われます.
解決策:
1.フォームで非表示のフィールドを使用します.欠点は、フィールドが多い場合、面倒を起こし、コードがはっきりしないことです.パスワードのように、ページに露出することはできません.
2.処理クラスの更新時に、手動でデータベースから取得します.
3.SpringMVCは、@ModelAttribute注記を使用して、より優雅なソリューションを提供します.
@ModelAttribute注記のサンプルコード
1.JSPページ
<li><a href="emp/list">@ModelAttribute </a></li>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>Employee Management</title>
</head>
<body>
<h1>Employee List</h1>
<a href="/org.rabbitx.web.spring4mvc/pages/emp-add.jsp"> </a>
<table border="1" style="border-collapse: collapse;margin:10px 0px;width:800px;">
<tr>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
</tr>
<c:forEach items="${emps}" var="emp">
<tr>
<td>${emp.no}</td>
<td>${emp.name}</td>
<td>${emp.age}</td>
<td>${emp.salary}</td>
<td>${emp.hiredate}</td>
<td>${emp.description}</td>
<td>
<a href="/org.rabbitx.web.spring4mvc/emp/update?id=${emp.id}"> </a>
<a href="/org.rabbitx.web.spring4mvc/emp/delete?id=${emp.id}"> </a>
</td>
</tr>
</c:forEach>
</table>
<hr/>
<a href="/org.rabbitx.web.spring4mvc/index.jsp"> </a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>Employee Management</title>
</head>
<body>
<h1> :${emp.no}, :${emp.hiredate}</h1>
<form action="/org.rabbitx.web.spring4mvc/emp/save" method="POST">
<input type="hidden" name="id" value="${emp.id}">
<table>
<tr>
<td> </td><td><input type="text" name="name" value="${emp.name}"></td>
</tr>
<tr>
<td> </td><td><input type="text" name="age" value="${emp.age}"></td>
</tr>
<tr>
<td> </td><td><input type="text" name="salary" value="${emp.salary}"></td>
</tr>
<tr>
<td> </td><td><input type="text" name="description" value="${emp.description}"></td>
</tr>
<tr align="right">
<td colspan="2"><input type="submit"></td>
</tr>
</table>
</form>
<hr/>
<a href="/org.rabbitx.web.spring4mvc/emp/list"> </a>
</body>
</html>
2.処理クラス
package org.rabbitx.web.spring4mvc.empmgr;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.rabbitx.web.spring4mvc.dao.IEmployeeDao;
import org.rabbitx.web.spring4mvc.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/emp")
public class EmployeeController {
private static final String VIEW_NAME_LIST = "emp-list";
private static final String VIEW_NAME_UPDATE = "emp-update";
@Autowired
private IEmployeeDao employeeDao;
@RequestMapping("/list")
public ModelAndView list() throws Exception
{
ModelAndView modelAndView = new ModelAndView();
List<Employee> emps = employeeDao.getAllEmployees();
modelAndView.addObject("emps", emps);
modelAndView.setViewName(VIEW_NAME_LIST);
return modelAndView;
}
@RequestMapping("/update")
public ModelAndView update(@RequestParam(value="id") Integer id) throws Exception
{
ModelAndView modelAndView = new ModelAndView();
Employee emp = employeeDao.getById(id);
modelAndView.addObject("emp", emp);
modelAndView.setViewName(VIEW_NAME_UPDATE);
return modelAndView;
}
/**
* , :no,hiredate
*
*
* :
* 1. @ModelAttribute : , Map . : "employee"
* 2. SpringMVC Map Employee , Employee .
* 3. SpringMVC .
*
* : @ModelAttribute , Map !
*
* SpringMVC POJO
* 1. key:
* 1). POJO @ModelAttribute , key POJO
* 2). @ModelAttribute , key @ModelAttribute value .
* 2. implicitModel key , ,
* 1). @ModelAttribute Map , key 1 key , .
* 3. implicitModel key , Handler @SessionAttributes ,
* , @SessionAttributes value key, HttpSession key
* value , . .
* 4. Handler @SessionAttributes @SessionAttributes value key,
* POJO ,
* 5. SpringMVC key POJO implicitModel , request .
*
*
* 1. @ModelAttribute . @ModelAttribute Map implicitModel .
* 2. , WebDataBinder target
* 1). WebDataBinder :
* ①. objectName : attrName "", objectName .
* * : attrName. POJO @ModelAttribute , attrName @ModelAttribute
* value
*
* ②. target :
* > implicitModel attrName . , ok
* > * : Handler @SessionAttributes , , Session
* attrName . session , .
* > Handler @SessionAttributes , @SessionAttributes value key
* attrName , POJO
*
* 2). SpringMVC WebDataBinder target .
* 3). *SpringMVC WebDataBinder attrName target implicitModel.
* request .
* 4). WebDataBinder target .
*/
@RequestMapping("/save")
public ModelAndView save(Employee emp) throws Exception
{
System.out.println(emp);
if(emp.getId() == null)
{
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
emp.setHiredate(format.format(date));
employeeDao.addEmployee(emp);
}
else
{
// , :no,hiredate
employeeDao.updateEmployeeById(emp);
}
ModelAndView modelAndView = new ModelAndView();
List<Employee> emps = employeeDao.getAllEmployees();
modelAndView.addObject("emps", emps);
modelAndView.setViewName(VIEW_NAME_LIST);
return modelAndView;
}
/**
* ,SpringMVC @ModelAttribute
*
* 1. @ModelAttribute , SpringMVC !
* 2. @ModelAttribute POJO , value :
* 1). SpringMVC value implicitModel , .
* 2). SpringMVC value key, POJO value, request .
*/
@ModelAttribute
public void getEmployee(@RequestParam(value="id",required=false) Integer id,Map<String,Object> map) throws Exception
{
System.out.println(" : " + id);
System.out.println("-----------getEmployee-------------");
//
if(id != null)
{
Employee emp = employeeDao.getById(id);
map.put("employee", emp);
}
}
/**
*
* @param id
*/
@RequestMapping("/delete")
public ModelAndView delete(@RequestParam(value="id") Integer id) throws Exception
{
employeeDao.deleteEmployeeById(id);
ModelAndView modelAndView = new ModelAndView();
List<Employee> emps = employeeDao.getAllEmployees();
modelAndView.addObject("emps", emps);
modelAndView.setViewName(VIEW_NAME_LIST);
return modelAndView;
}
}
@ModelAttribute
メソッド定義で@ModelAttribute注記を使用:Spring MVCは、ターゲット処理メソッドを呼び出す前に、メソッドレベルに@ModelAttributeのメソッドが1つずつ呼び出されます.
メソッドの参照前に@ModelAttribute注記を使用します.
隠しオブジェクトから隠しモデルデータを取得してオブジェクトを取得し、要求パラメータをオブジェクトにバインドし、インバウンド・パラメータメソッド・インバウンド・パラメータをモデルに追加できます.
@ModelAttribute注記の動作原理
@ModelAttribute注記のソース分析