• 【项目笔记】完成一个基于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”。

  • 相关阅读:
    MVC HtmlHelper用法大全
    mysql查询结果输出到文件
    未能加载文件或程序集“Autofac, Version=3.4.0.0,
    IHttpModule接口
    演练:创建和注册自定义 HTTP 模块
    Tablespace for table '`pomelo`.`bag`' exists. Please DISCARD the tablespace before IMPORT.
    java开发知识IO知识之输入输出流以及文件
    Java开发知识之Java中的Map结构
    Java开发知识之Java中的集合Set接口以及子类应用
    Java开发知识之Java中的集合上List接口以及子类讲解.
  • 原文地址:https://www.cnblogs.com/sei-cxt/p/10103497.html
Copyright © 2020-2023  润新知