<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");
}
});
});