springmvc运算-基础练手项目(4)-更新操作

springmvc错误心得:jstl表单标签

1、在jsp页面中, 因为springmvc要求  jstl的表单标签<form:xxx>  具有回显值。

<form:form action="${pageContext.request.contextPath }/emp" method="POST" modelAttribute="employee">

<form:hidden path="id"/>
<br>
Email: <form:input path="email"/>
<br>
<input type="hidden" name="_method" value="PUT"/>
<%-- 对于 _method 不能使用 form:hidden 标签, 因为 modelAttribute 对应的 bean 中没有 _method 这个属性 --%>
<%--  <form:hidden path="_method" value="PUT"/> --%>

<input type="submit" value="Submit"/>

</form:form>

注意:<form:xxx>标签下的path
1、对应html表单标签的 name属性值,支持级联 如 path=”department.id”
2、如同<form:input path=”email”/>一样,一开始从request中的某个域的bean值映射过来,最后又将结果 pojo返回给handler控制器。如果表单中缺少了一些字段,导致pojo中的一些属性无法被映射,会导致该赋值为空。解决办法就是利用@ModelAttribute ,在表单字段映射到pojo前,控制器先预处理创建一个pojo,然后对pojo的属性赋值【这样可以避免pojo中表单无法映射的属性仍为空值】。后面表单映射到pojo时,不再新创建pojo,只用控制器预创建好的pojo进行赋值。


一、配置文件

web.xml 和 springmvc.xml 配置文件和查询所有雇员信息的配置相同。

二、请求测试页

1、在showGetEmps.jsp页面中配置   删除模块的超链接。

<td><a href="emp/${emp.id}">Edit</a></td>

2、跳转到正式编辑页  updateEmp.jsp

<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ 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>Insert title here</title>
</head>
<body>

	<!--  
		1. WHY 使用 form 标签呢 ?
		可以更快速的开发出表单页面, 而且可以更方便的进行表单值的回显
		2. 注意:
		可以通过 modelAttribute 属性指定绑定的模型属性,
		若没有指定该属性,则默认从 request 域对象中读取 command 的表单 bean
		如果该属性值也不存在,则会发生错误。
		
		大白话:form:form 表单标签,在springmvc中是一定要回显的,哪怕是第一次也要支持回显。
		所以第一次请求时,form:form 表单标签会从 request域中的 关键字中查找 默认值是command(如果 form:form标签 指定modelAttribute="XXX",则按照XXX关键字来)  查看属性值,用来填充表单值。
	
	-->
 <!-- 表单 路径不可以是  action="emp" ,因为是 相对路径 只会在最后一个 目录 替换文件
    比如 http://localhost:8080/springmvc-2/emp/1003 提交后 变成 http://localhost:8080/springmvc-2/emp/emp  -->
	<form:form action="${pageContext.request.contextPath }/emp" method="post" modelAttribute="employee">
	<!-- pageContext.request.contextPath 如果项目放在根目录,就返回 -> "" (空字符串)    如果不是就返回-> "/项目名" -->
       
       <c:if test="${employee.id == null }">
			<!-- 这个lastName的属性是不会出现的,
			这里用 if条件是因为 updateEmp.jsp 和 addEmp.jsp 本来混在一起用if 作为判断区分的 -->
		<!-- path标签对应 html表单标签的 name属性值,支持级联 如 path="department.id" -->			
                        LastName: <form:input path="lastName"/>
		</c:if>
		<br>
       Email:<form:input path="email" />
       
		<form:hidden path="id"/>
		<input type="hidden" name="_method" value="PUT"/>
			<%-- 对于 _method 不能使用 form:hidden 标签, 因为 modelAttribute 对应的 bean 中没有 _method 这个属性 --%>
			<%-- <form:hidden path="_method" value="PUT"/> --%>
		
		<%
			Map<String, String> genders = new HashMap <String, String>() ;
				genders.put("1", "Male");
				genders.put("0", "Female");
				request.setAttribute("genders", genders);
		%>
		<br>
     Gender:<form:radiobuttons path="gender" items="${genders}" />
     <br>
     Department:<form:select path="department.id" items="${departments}" itemLabel="departmentName" itemValue="id"></form:select>
     <br>
		<input type="submit" value="submit" />
	</form:form>

</body>
</html>

三、控制器处理

//该控制器中,运行所有方法前的预处理
	//【这里主要是为了在修改修改雇员信息中,率先创建pojo并进行赋值,
	//避免表单因为缺少一些字段导致赋值给pojo的属性一些为空,当然pojo是同一个】
	@ModelAttribute
	public void getEmployee(@RequestParam(value="id",required=false) Integer id,
			Map<String, Object> map){
		if(id != null){
			map.put("employee", employeeDao.get(id));
		}
	}

	//利用pojo更新雇员信息
	@RequestMapping(value="/emp",method=RequestMethod.PUT)
	public String updateEmp(Employee employee){
		employeeDao.save(employee);
		return "redirect:/emps";
	}
	
	//跳转到更新雇员信息页面
	@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
	public String doUpdateEmp(@PathVariable("id") Integer id,Map<String, Object> map){
		map.put("employee", employeeDao.get(id));
		map.put("departments", departmentDao.getDepartments());
		return "updateEmp";
	}

四、结果响应页

其实就是showGetEmps.jsp

 

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments