修改报销单
这是去修改的时候,带过去的数据,
这是修改页面,
修改完了之后
修改完之后为什么报销单的编号是空的,没有关联上
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<jsp:include page="top.jsp"/>
<section id="content" class="table-layout animated fadeIn">
<div class="tray tray-center">
<div class="content-header">
<h2> 修改报销单 </h2>
<p class="lead"></p>
</div>
<div class="admin-form theme-primary mw1000 center-block" style="padding-bottom: 175px;">
<div class="panel heading-border">
<%-- 运用spring的form标签 --%>
<form:form id="admin-form" name="addForm" action="/claim_voucher/update" modelAttribute="info">
<%-- 修改的话,一定是要传递报销单的编号 --%>
<form:hidden path="claimVoucher.id"></form:hidden>
<div class="panel-body bg-light">
<div class="section-divider mt20 mb40">
<span> 基本信息 </span>
</div>
<div class="section">
<label for="claimVoucher.cause" class="field prepend-icon">
<form:input path="claimVoucher.cause" cssClass="gui-input" placeholder="事由..."/>
<label for="claimVoucher.cause" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<div class="section-divider mt20 mb40">
<span> 费用明细 </span>
</div>
<div class="section row" id="items">
<%-- 修改界面肯定是多个条目,需要迭代,没迭代一次,生成一行 --%>
<c:forEach items="${info.items}" varStatus="sta">
<div>
<%-- 这里是用javaScript实现的 --%>
<div class="col-md-3">
<label for="items[${sta.index}].item" class="field prepend-icon">
<%-- 以隐藏域的形式显示ClaimVoucherItems里面的值 --%>
<form:hidden path="items[${sta.index}].id"/>
<form:hidden path="items[${sta.index}].claimVoucherId"/>
<%-- 因为这里的items集合里面是字符串 --%>
<%-- ${sta.index}表示迭代时候的下标 --%>
<form:select path="items[${sta.index}].item" cssClass="gui-input" placeholder="花销类型..." items="${items}"/>
</label>
</div>
<div class="col-md-3">
<label for="items[${sta.index}].amount" class="field prepend-icon">
<form:input path="items[${sta.index}].amount" cssClass="gui-input money" placeholder="金额..." />
<label for="items[${sta.index}].amount" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<div class="col-md-5">
<label for="items[${sta.index}].comment" class="field prepend-icon">
<form:input path="items[${sta.index}].comment" cssClass="gui-input" placeholder="备注..." />
<label for="items[${sta.index}].comment" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<div class="col-md-1" style="text-align:right;">
<button type="button" class="button"> X </button>
</div>
</div>
</c:forEach>
</div>
<div class="section row">
<div class="col-md-3">
<label for="totalMoney" class="field prepend-icon">
<%-- 这里的id和name不一样,所以这样里的 --%>
<form:input id="totalMoney" path="claimVoucher.totalAmount" cssClass="gui-input" placeholder="总金额..." readonly="true"/>
<label for="totalMoney" class="field-icon">
<i class="fa fa-user"></i>
</label>
</label>
</div>
<div class="section" style="text-align:right;">
<div class="col-md-9">
<button type="button" class="button" id="addItemButton"> + </button>
</div>
</div>
</div>
<div class="panel-footer text-right">
<button type="submit" class="button"> 保存 </button>
<button type="button" class="button" onclick="javascript:window.history.go(-1);"> 返回 </button>
</div>
</div>
</form:form>
</div>
</div>
</div>
</section>
<jsp:include page="bottom.jsp"/>
这是对应jsp页面,不是已经加上了隐藏域属性吗,怎么2个没有关联起来
正在回答
跟踪了一下代码,找到了问题的原因,在ClaimVoucherBizImpl类的update()方法中,还要加上如下语句,设置item的claimVoucherId的值,加上这个就没有空指针异常了。新增的隐藏域没有获取到这个值,所以对于新增来说这条语句很重要。我们也会在视频中添加相关的说明,也非常感谢你的反馈!祝学习愉快!
更新报销单操作的JSP页面:claim_voucher_update.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<jsp:include page="top.jsp"/>
<section id="content" class="table-layout animated fadeIn">
<div class="tray tray-center">
<div class="content-header">
<h2> 修改报销单 </h2>
<p class="lead"></p>
</div>
<div class="admin-form theme-primary mw1000 center-block" style="padding-bottom: 175px;">
<div class="panel heading-border">
<%-- 运用spring的form标签 --%>
<form:form id="admin-form" name="addForm" action="/claim_voucher/update" modelAttribute="info">
<%-- 修改的话,一定是要传递报销单的编号 --%>
<form:hidden path="claimVoucher.id"></form:hidden>
<div class="panel-body bg-light">
<div class="section-divider mt20 mb40">
<span> 基本信息 </span>
</div>
<div class="section">
<label for="claimVoucher.cause" class="field prepend-icon">
<form:input path="claimVoucher.cause" cssClass="gui-input" placeholder="事由..."/>
<label for="claimVoucher.cause" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<div class="section-divider mt20 mb40">
<span> 费用明细 </span>
</div>
<div class="section row" id="items">
<%-- 修改界面肯定是多个条目,需要迭代,没迭代一次,生成一行 --%>
<c:forEach items="${info.items}" varStatus="sta">
<div>
<%-- 这里是用javaScript实现的 --%>
<div class="col-md-3">
<label for="items[${sta.index}].item" class="field prepend-icon">
<%-- 以隐藏域的形式显示ClaimVoucherItems里面的值 --%>
<form:hidden path="items[${sta.index}].id"/>
<form:hidden path="items[${sta.index}].claimVoucherId"/>
<%-- 因为这里的items集合里面是字符串 --%>
<%-- ${sta.index}表示迭代时候的下标 --%>
<form:select path="items[${sta.index}].item" cssClass="gui-input" placeholder="花销类型..." items="${items}"/>
</label>
</div>
<div class="col-md-3">
<label for="items[${sta.index}].amount" class="field prepend-icon">
<form:input path="items[${sta.index}].amount" cssClass="gui-input money" placeholder="金额..." />
<label for="items[${sta.index}].amount" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<div class="col-md-5">
<label for="items[${sta.index}].comment" class="field prepend-icon">
<form:input path="items[${sta.index}].comment" cssClass="gui-input" placeholder="备注..." />
<label for="items[${sta.index}].comment" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<div class="col-md-1" style="text-align:right;">
<button type="button" class="button"> X </button>
</div>
</div>
</c:forEach>
</div>
<div class="section row">
<div class="col-md-3">
<label for="totalMoney" class="field prepend-icon">
<%-- 这里的id和name不一样,所以这样里的 --%>
<form:input id="totalMoney" path="claimVoucher.totalAmount" cssClass="gui-input" placeholder="总金额..." readonly="true"/>
<label for="totalMoney" class="field-icon">
<i class="fa fa-user"></i>
</label>
</label>
</div>
<div class="section" style="text-align:right;">
<div class="col-md-9">
<button type="button" class="button" id="addItemButton"> + </button>
</div>
</div>
</div>
<div class="panel-footer text-right">
<button type="submit" class="button"> 保存 </button>
<button type="button" class="button" onclick="javascript:window.history.go(-1);"> 返回 </button>
</div>
</div>
</form:form>
</div>
</div>
</div>
</section>
<jsp:include page="bottom.jsp"/>
报销单的相关操作 :ClaimVoucherBizImpl
/**
* 更新报销单功能:
* 1、更新报销单的基本信息
* 2、更新报销单的条目信息:分为三个步骤:
* 1)删除我们不要的条目 2)修改已经存在的条目 3)添加不存在的条目信息
* @param claimVoucher
* @param items
*/
public void update(ClaimVoucher claimVoucher, List<ClaimVoucherItem> items) {
claimVoucher.setNextDealSn(claimVoucher.getCreateSn());
claimVoucher.setStatus(Contant.CLAIMVOUCHER_CREATED);
claimVoucherDao.update(claimVoucher);
//如果集合里面没有数据的条目项,就删除
List<ClaimVoucherItem> olds = claimVoucherItemDao.selectByClaimVoucher(claimVoucher.getId());
for (ClaimVoucherItem old:olds){
//当前的项目是否在当前的集合中
boolean isHave=false;
for(ClaimVoucherItem item:items){
if(item.getId()==old.getId()){
//说明存在,
isHave=true;
break;
}
}
//判断ifHave的情况
if(!isHave){
//说明新的集合中没有当前的条目--进行删除
claimVoucherItemDao.delete(old.getId());
}
}
//迭代新的条目
for(ClaimVoucherItem item:items){
if(item.getId()>0){
//说明数据库中存在的,更新内容
claimVoucherItemDao.update(item);
}else{
claimVoucherItemDao.insert(item);
}
}
}
报销单控制器:ClaimVoucherController
@RequestMapping("/to_update") //这个报销单的id是待处理页面的功能按钮传递过来的
public String toUpdate(int id,Map<String,Object> map){
//1、需要传递过去我们的报销单的条目可供选择
map.put("items",Contant.getItems());
//2、就是传递报销单的信息和条目的信息,保存在我们的dto中的ClaimVoucherInfo中
ClaimVoucherInfo info= new ClaimVoucherInfo();
info.setClaimVoucher(claimVoucherBiz.get(id));
info.setItems(claimVoucherBiz.getItems(id));
//然后把这个对象传递到我们的modelAttribute中,更添加的有点类似,只不过添加的时候,对象是空的
map.put("info",info);
return "claim_voucher_update";
}
@RequestMapping("/update")
public String update(HttpSession session,ClaimVoucherInfo info){
Employee employee = (Employee)session.getAttribute("employee");
//设置报销单的待处理人
info.getClaimVoucher().setCreateSn(employee.getSn());
//进行更新的操作
claimVoucherBiz.update(info.getClaimVoucher(),info.getItems());
//跳转到我们的待处理页面
return "redirect:deal";
}
老师,id值有了,但是修改报销单的时候,修改条目,删除条目,点击保存,更新的话没有问题,
就是新增加一个条目,会报空指针异常
涉及到的部分代码:
/** * 更新报销单功能: * 1、更新报销单的基本信息 * 2、更新报销单的条目信息:分为三个步骤: * 1)删除我们不要的条目 2)修改已经存在的条目 3)添加不存在的条目信息 * @param claimVoucher * @param items */public void update(ClaimVoucher claimVoucher, List<ClaimVoucherItem> items) { claimVoucher.setNextDealSn(claimVoucher.getCreateSn()); claimVoucher.setStatus(Contant.CLAIMVOUCHER_CREATED); claimVoucherDao.update(claimVoucher); //如果集合里面没有数据的条目项,就删除 List<ClaimVoucherItem> olds = claimVoucherItemDao.selectByClaimVoucher(claimVoucher.getId()); for (ClaimVoucherItem old:olds){ //当前的项目是否在当前的集合中 boolean isHave=false; for(ClaimVoucherItem item:items){ if(item.getId()==old.getId()){ //说明存在, isHave=true; break; } } //判断ifHave的情况 if(!isHave){ //说明新的集合中没有当前的条目--进行删除 claimVoucherItemDao.delete(old.getId()); } } //迭代新的条目 for(ClaimVoucherItem item:items){ if(item.getId()>0){ //说明数据库中存在的,更新内容 claimVoucherItemDao.update(item); }else{ claimVoucherItemDao.insert(item); } }}
@RequestMapping("/deal")public String deal(HttpSession session,Map<String,Object> map){ Employee employee =(Employee)session.getAttribute("employee"); //这里的步骤和上面个人报销单是一样的 map.put("list",claimVoucherBiz.getForDeal(employee.getSn())); return "claim_voucher_deal";} /** * 修改报销单的信息:1、打开修改的界面 2、保存修改的内容 */ @RequestMapping("/to_update") //这个报销单的id是待处理页面的功能按钮传递过来的 public String toUpdate(int id,Map<String,Object> map){ //1、需要传递过去我们的报销单的条目可供选择 map.put("items",Contant.getItems()); //2、就是传递报销单的信息和条目的信息,保存在我们的dto中的ClaimVoucherInfo中 ClaimVoucherInfo info= new ClaimVoucherInfo(); info.setClaimVoucher(claimVoucherBiz.get(id)); info.setItems(claimVoucherBiz.getItems(id)); //然后把这个对象传递到我们的modelAttribute中,更添加的有点类似,只不过添加的时候,对象是空的 map.put("info",info); return "claim_voucher_update"; } @RequestMapping("/update") public String update(HttpSession session,ClaimVoucherInfo info){ Employee employee = (Employee)session.getAttribute("employee"); //设置报销单的待处理人 info.getClaimVoucher().setCreateSn(employee.getSn()); //进行更新的操作 claimVoucherBiz.update(info.getClaimVoucher(),info.getItems()); //跳转到我们的待处理页面 return "redirect:deal"; }
jsp页面
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page isELIgnored="false" %><%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %><jsp:include page="top.jsp"/><section id="content" class="table-layout animated fadeIn"> <div class="tray tray-center"> <div class="content-header"> <h2> 修改报销单 </h2> <p class="lead"></p> </div> <div class="admin-form theme-primary mw1000 center-block" style="padding-bottom: 175px;"> <div class="panel heading-border"> <%-- 运用spring的form标签 --%> <form:form id="admin-form" name="addForm" action="/claim_voucher/update" modelAttribute="info"> <%-- 修改的话,一定是要传递报销单的编号 --%> <form:hidden path="claimVoucher.id"></form:hidden> <div class="panel-body bg-light"> <div class="section-divider mt20 mb40"> <span> 基本信息 </span> </div> <div class="section"> <label for="claimVoucher.cause" class="field prepend-icon"> <form:input path="claimVoucher.cause" cssClass="gui-input" placeholder="事由..."/> <label for="claimVoucher.cause" class="field-icon"> <i class="fa fa-lock"></i> </label> </label> </div> <div class="section-divider mt20 mb40"> <span> 费用明细 </span> </div> <div class="section row" id="items"> <%-- 修改界面肯定是多个条目,需要迭代,没迭代一次,生成一行 --%> <c:forEach items="${info.items}" varStatus="sta"> <div> <%-- 这里是用javaScript实现的 --%> <div class="col-md-3"> <label for="items[${sta.index}].item" class="field prepend-icon"> <%-- 以隐藏域的形式显示ClaimVoucherItems里面的值 --%> <form:hidden path="items[${sta.index}].id"/> <form:hidden path="items[${sta.index}].claimVoucherId"/> <%-- 因为这里的items集合里面是字符串 --%> <%-- ${sta.index}表示迭代时候的下标 --%> <form:select path="items[${sta.index}].item" cssClass="gui-input" placeholder="花销类型..." items="${items}"/> </label> </div> <div class="col-md-3"> <label for="items[${sta.index}].amount" class="field prepend-icon"> <form:input path="items[${sta.index}].amount" cssClass="gui-input money" placeholder="金额..." /> <label for="items[${sta.index}].amount" class="field-icon"> <i class="fa fa-lock"></i> </label> </label> </div> <div class="col-md-5"> <label for="items[${sta.index}].comment" class="field prepend-icon"> <form:input path="items[${sta.index}].comment" cssClass="gui-input" placeholder="备注..." /> <label for="items[${sta.index}].comment" class="field-icon"> <i class="fa fa-lock"></i> </label> </label> </div> <div class="col-md-1" style="text-align:right;"> <button type="button" class="button"> X </button> </div> </div> </c:forEach> </div> <div class="section row"> <div class="col-md-3"> <label for="totalMoney" class="field prepend-icon"> <%-- 这里的id和name不一样,所以这样里的 --%> <form:input id="totalMoney" path="claimVoucher.totalAmount" cssClass="gui-input" placeholder="总金额..." readonly="true"/> <label for="totalMoney" class="field-icon"> <i class="fa fa-user"></i> </label> </label> </div> <div class="section" style="text-align:right;"> <div class="col-md-9"> <button type="button" class="button" id="addItemButton"> + </button> </div> </div> </div> <div class="panel-footer text-right"> <button type="submit" class="button"> 保存 </button> <button type="button" class="button" onclick="javascript:window.history.go(-1);"> 返回 </button> </div> </div> </form:form> </div> </div> </div></section><jsp:include page="bottom.jsp"/>
- 参与学习 人
- 提交作业 205 份
- 解答问题 4317 个
Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星