问题总结

2018-09-29  本文已影响0人  代码potty

<c:forEach />方法嵌套问题

最近遇到需要<c:forEach />进行嵌套调出数据,但是如果在里层用外层数组的属性会出现问题,例如
lists是List<String>类型的, 我在外层循环时可以获得String的对象,但是如果里层循环如果想要获取这个String对象所对应的后台数据却不能直接用EL表达式的${String},因为这样获取到的还是个String类型,而且也无法嵌套使用${${}}的方式,那么要怎么处理呢,我在修改了很多次后台的数据存放集合类型,终于确认了一个集合---hashmap,原因在此,我可以调用hashmap.value来获取到我想要的对象,而不是直接用${}来获取hashmap.value对象,这样就可以避免嵌套的问题。
例如:

    <c:forEach items="${sale2Maps}" var="map" varStatus="index">
        <li>
            <a href="#" style="font-size: 13px;">${map.key}</a>
            <ul style="display: none;margin-left: 10px" class="closed">
                <c:forEach var="headman" items="${map.value}">
                    <a href="#" style="font-size: 10px;" class="sale_headman">${headman.ename}</a>
                </c:forEach>    
            </ul>
        </li>
    </c:forEach>

json数据传输到前端的问题

昨天遇到个问题就是,前端通过ajax把json数据传输到后台,后台接收到数据,有两部分数据需要发送,这时候就遇到个问题,如果去发送这两部分不同类型的数据,我起初将第一部分数据使用model.addAttribut()的方式进行添加,然后第二部分数据正常使用response将json写前端,这个时候出现问题了,第一部分使用model添加的数据在前端收不到。
这种情况其实很正常,之前能够通过model进行传输,是因为方法的最后返回了页面地址,而在返回页面地址的时候会对model中存储的数据使用request.addAttribute()发送到前端,而在上面的情况中,我的数据流是没有经过这个流程的,而是以response的方式直接写到前端,那么就需要将这个model包装到response中,后来我想了一个办法,既然是两部分数据,虽然数据格式不同,但是我还是可以利用hashmap的方式,赋予第一部分和第二部分不同的key,在前端就可以直接通过key来获取两部分。
hashmap传输到前端的获取方法跟list有点不同
看例子:

    uccess:function(data){
       var str = "";

       for(var a in data){
           str+="<div style='width: 200px;height: auto;min-height: 200px;border:1px solid #999;margin-left:"+
               "40px;margin-top: 40px;float: left;' title='"+params.department+"'><div class='sale_head' "+
               "style='border-bottom: 1px dashed"+
               "#999;'><img src='images/sale.png' style='height: 50px;width: auto;'><span style='font-size:15px;"+
               "margin-left: 30px' class='pic'>"+a+"</span></div><div class='sale_man' style='margin-top: 20px'>";
                for(var j = 0;j<data[a].length;j++){
                    str+="<span style='margin-left: 5px;margin-top: 10px;font-size: 13px' class='pic'>"+data[a][j].ename+"</span>";
                }
                tr+="</div></div>";
            }
         $("#mws-container").html(str);
    },

这要是两部分
第一部分,for(var a in data)
这里的a就直接是key了,可以直接使用

第二部分是获取key中的value
可以通过data[value]的方式获取value


mybatis中resultMap有些列的输出结果为null

当我们进行多表联合查询的时候,就不能简单的使用resultType来设置返回值类型,而需要设置resultMap的方式,基于此,我在输出有些列的时候出现空值,但是将sql语句在dos下执行,又能够正常执行,那么显然问题出现在赋值的时候,我查询到数据没有赋值给我创建的变量,举个例子:
--用户表
create table admin(
id int primary key auto_increment,
name varchar(20) comment "用户名",
age int comment "年龄",
other_id int
)

--用户其他信息表
create table admin_other(
id int,
address varchar(50) comment "地址",
)
在数据库中创建这两个表,然后在java代码中需要创建这两个表相关的POJO,这个时候要注意,我希望的是admin中嵌套admin_other,那么我就需要在admin中提供admin_other的对象,以及它的get与set方法

public class admin{
    private int id;
    private String name;
    private int age;
    private int otherId;
    private AdminOther other;

//getter and setter
...
}

然后在xml文件中,多表联合查询的sql语句可以如下:

    select 
        a.id as adminId,
        a.name as adminName,
        a.age as adminAge,
        b.id as otherId,
        b.address as otherAddress
    from admin a left outer join admin_other b
    on a.other_id = b.id

在这之前的操作都是对的,下面是关于resultMap方面的设置

    <resultMap id="adminResultMap" type="admin">
        <id property="id" column="id" />
        ...
    </resultMap>

如果我这样写,那么id的值绝对是为空,为什么呢,注意下我们前边sql语句的设置,我们设置了别名,也就是我们把admin.id设置为了adminId,也就是说,我们只有按照下边这样的设置才不会有问题

    <resultMap id="adminResultMap" type="admin">
        <id property="id" column="adminId" />
        ...
    </resultMap>

归根究底,原因在于我们SQL得到的列与我们的POJO不匹配的问题,特别是设置了autoMapping这个属性,进行自动匹配,如果你设置了别名,那么就很可能出错,最保守的做法就是每个属性与列进行一一对应,这样就不会出错,但是工作量比较大


2018-10-15

js实现页面刷新计数

今天遇到一个问题,我使用遮罩的方式,简单的进行一个表数据的增删改,但是在修改完表后,我希望马上显示出结果,但是因为我不是使用ajax的方式来添加数据的,那么如果刷新页面,将会回到初始的状态,也就是我的首页,这样我还需要重新点进这个页面才能看到这个数据,这样很不方便,所以我就在想,能不能计算页面刷新来实现,加载页面后直接进入这个页面,测试后的结果是失败的,失败的原因有两方面,一方面,虽然我刷新页面后直接跳转到这个页面,但是还是有个转场的过程,这样就导致体验感不好;另一方面,我不止这个页面有刷新页面的指令,那么就会造成,我刷新界面后,以后只会跳转这个界面的BUG,基于这两个方面,页面刷新计数的方法宣告失败,但是也有可以借鉴的地方,可以计算网站的访问量哈,好,下面介绍下页面刷新计数的方法:

window.onload = function(){
  if(window.name==""){
    window.name = "0";
  }else{
    window.name = eval(window.name)+1;
  }
}

window的name给我们提供了计数方法的实现
原本name的作用是:可设置或返回存放窗口的名称的一个字符串。
参考链接:https://www.jianshu.com/p/ae69ff3d54ea

最后我是怎么实现这个功能的,有点取巧了,我在h5中数据的最后加了一个标识的标签<div />,这个标签可以得到数据的最后一行,然后我根据按钮点击添加,每次都会在这个标签后使用append()方法追加新的文本,也就是说,网页本身没有刷新,我是靠局部追加数据来实现的。

使用ajax获取不到外层对象的问题

通过F12调试可以发现,在ajax里使用$(this)是获取不到外层的对象的,应该说这个时候的this其实指代的是ajax本身,所以我在外层定义一个var变量来保存这个标签的对象,在ajax中还是无法获取到这个对象,怎么回事呢?
我打开这个var变量看了下,他的父类,父类的父类,一层层的往上会将这些标签全部存储到一个数组中,也就是我通过$(this).parents()的方式获取到的不止一个标签了,而是一个标签数组,那么根据你需要标签的位置,取下标索引就可以拿到你要的标签,我也这么做了,可结果还是出了问题,这让我很困惑,于是我对比一下平时我们${对象}和我通过var变量保存的有什么区别,可别说,还真有区别,通过var变量保存的只是标签,而不是标签对象,需要通过${变量}的方式来获取对象,这样对比,是不是说明这个变量等于"#id"或者".class"呢,也就是说,${}里头其实也就是标签,我们只有通过${}才能拿到标签的对象。看下我代码的实现:

    $(".deleteAdmin").live("click",function(){
        var params = {};
        params.userName = $(this).parents().parents().find(".userName").html();
        var target = $(this).parents().parents()[0];//第一部分,将标签存入变量中
        $.ajax({
            url:"deleteAdmin",
            type:"get",
            data:params,
            dataType:"json",
            success:function(){
                $(target).css("display","none");//取出标签并且获取到对象进行后续操作
            },
            error:function(){
                alert("error");
            }
        });
    });
上一篇下一篇

猜你喜欢

热点阅读