修改报销单

修改报销单

http://img1.sycdn.imooc.com//climg/5add7f120001931210720162.jpg

http://img1.sycdn.imooc.com//climg/5add7f99000186df09860340.jpg

http://img1.sycdn.imooc.com//climg/5add7fb20001876607220320.jpg

这是去修改的时候,带过去的数据,

http://img1.sycdn.imooc.com//climg/5add802200019e3909930314.jpg这是修改页面,

修改完了之后

http://img1.sycdn.imooc.com//climg/5add83c70001227f10140276.jpg

修改完之后为什么报销单的编号是空的,没有关联上http://img1.sycdn.imooc.com//climg/5add843c0001b00d05370287.jpg

http://img1.sycdn.imooc.com//climg/5add844f0001e9ee05670377.jpg

<%@ 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个没有关联起来


正在回答

登陆购买课程后可参与讨论,去登陆

6回答

跟踪了一下代码,找到了问题的原因,在ClaimVoucherBizImpl类的update()方法中,还要加上如下语句,设置item的claimVoucherId的值,加上这个就没有空指针异常了。新增的隐藏域没有获取到这个值,所以对于新增来说这条语句很重要。我们也会在视频中添加相关的说明,也非常感谢你的反馈!祝学习愉快!

http://img1.sycdn.imooc.com//climg/5adefc02000127a109840544.jpg

  • 奶茶三兄弟d 提问者 #1
    之前在else语句中添加了这句话,没有放在外面,难怪还是报的空指针
    2018-04-24 17:56:15
提问者 奶茶三兄弟d 2018-04-24 10:53:14

更新报销单操作的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"/>

提问者 奶茶三兄弟d 2018-04-24 10:52:53

报销单的相关操作 :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";

    }



提问者 奶茶三兄弟d 2018-04-23 21:30:52

老师,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"/>



  • 同学贴代码的时候,进行一下格式化,方便查看你的代码。并说明这些代码是哪个类的~~
    2018-04-24 10:10:27
  • 提问者 奶茶三兄弟d 回复 一叶知秋519 #2
    报销单相关操作的 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); } } } /** * 修改报销单的信息:1、打开修改的界面 2、保存修改的内容 */
    2018-04-24 10:48:43
  • 提问者 奶茶三兄弟d 回复 一叶知秋519 #3
    我整体贴的时候,说是内容太长了,格式就那样了
    2018-04-24 10:51:50
好帮手慕珊 2018-04-23 18:57:32

你按F12,看一下浏览器中claimVoucherId的值是多少?提交修改之前的值。另外,可以多贴一下相关代码,比如提交后是如何处理数据的代码

提问者 奶茶三兄弟d 2018-04-23 15:07:45

http://img1.sycdn.imooc.com//climg/5add86000001046909890090.jpg修改完了之后,就这样了,点击在修改的时候,就不行了http://img1.sycdn.imooc.com//climg/5add86360001529210290333.jpg,没有关联,

  • 你的意思是没有修改之前的数据点击修改以后,数据是可以传递过去的;但是修改过以后,再点击修改数据就传递不过去了?
    2018-04-23 17:03:54
  • 提问者 奶茶三兄弟d 回复 一叶知秋519 #2
    对啊,修改完之后,claimVoucherId是空的,条目和报销单没有关联上,
    2018-04-23 17:07:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师