zoukankan      html  css  js  c++  java
  • 【项目笔记】完成一个基于SSM框架的增删改查的模块后总结的问题

    最近为了准备新工作重新摸出了SSM框架,同时从0学习了JQuery,终于用一周做完了一个包括增删改查的模块(主要是属性太多了,其中一个类50+,复制粘贴耗时)。

    从中特意记下了几个遇到的问题,总结一下。

    1. 执行网页js代码时, 出现$ is not defined错误。

    原因:未引入JQuery,需要在HTML代码中加入以下代码:

    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

    2. 通过Ajax向SSM的后台传递一个Map转JSON的数据时,无法调用方法request.getParameter(name)来获取属性名称。

    原因:具体见:https://blog.csdn.net/u010648555/article/details/79084466

    将代码做如下修改即可成功:

    $.ajax({
        url:selectUrl,
        type:'POST',
        data:dataMap, //而不是JSON.stringify(dataMap)
        contentType: "application/x-www-form-urlencoded", //而不是"application/json"
        success: function(data) {
            if(data.success) {
                alert('提交成功!');
            } else {
                alert('提交失败!' + data.errMsg);
            }
        }
    }); 

    3. 页面输入的中文传到后台变成了乱码。

    原因:数据库和网页需要统一utf-8的编码。将问题2中的代码改为以下即可:

    contentType: "application/x-www-form-urlencoded; charset=utf-8",

    4. 由于有动态、异步插入<option>的需求,同时有“增加新情况”的需求,需要等动态加载完选项后保存下可增项的HTML代码,以便在按下“增加”按钮后添加在页面上。

    解决:1. 每当一个<select>加载完后,更新一次可增项的HTML代码。

       2. 使用$.when()方法(http://www.runoob.com/jquery/misc-when.html),如下例子:

    //获取html
    var addHtml = '';
    $.when(getList1(), getList2()).done(function() {
        addHtml= '<div class="item">' + $('.item').html() + '</div>';
    });
    
    //更新属性1
    function getList1() {
        var initUrl = '/getattr1';
        return getAttrList(initUrl, 'attr1');
    }
    
    //更新属性2
    function getList2() {
        var initUrl = '/getattr2';
        return getAttrList(initUrl, 'attr2');
    }
    
    function getAttrList(url, idname) {
        return $.getJSON(url, function(data) {
                      if(data.success) {
                          var tempHtml = '';
                          data.info.map(function(attr, index) {
                              tempHtml += '<option class="text-style" value="' + attr.attrid+ '">' + attr.attrval+ '</option>';
                          });
                          $('#' + idname).html(tempHtml);
                      } else {
                       $.toast(data.errMsg);
                      }
                  });
    }

     5. 前端向后端传递参数时,@RequestBody不能放多个不同的对象。

    解决:可以把这些对象封装起来,比如:

    public class AllAttrs {
        private Attr1 attr1;
        private List<Attr2> attr2list;
        private List<Attr3> attr3list;
    
        //get/set方法略
    }
    public class AttrController {
        @RequestMapping(value = "updateattr", method = RequestMethod.POST)
        @ResponseBody
        private Map<String, Object> updateAttr(@RequestBody AllAttrs allAttrs) {
            Map<String, Object> modelMap = new HashMap<>();
            //处理代码略
            return modelMap;
        }
    }

    6. 如果更新项有“更新时间”这一属性,且要求“没有更新内容的时候需要特别提示”,update的时候需要注意。

    更新时前端不会向后端传递更新时间,如果将更新时间设定为null或者取当前时间,那么update后会返回1,无法判断有没有更新内容。

    因此设计SQL的时候,类似这样的属性变量要判断是否为空(加<if>标签),如果不为空才更新这个属性。

    7. MyBatis中,保持原值不变,update后返回值不为0。

    原因:MyBatis返回的是匹配值而不是影响值,如果需要影响值,在jdbc.properties中需要加上“&useAffectedRows=true”。

  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/sei-cxt/p/10103497.html
Copyright © 2011-2022 走看看