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注記のソース分析