分页插件
分页这个组件前端要写也很麻烦,而且与业务逻辑代码无关,因此我们引入一个分页查询的插件。
进行jsp测试
三大步骤:
1、引入相关的包
2、创建容器来保存插件的运行结果
容器是<input type=text/>
或者div
。
3、容器加载完成后,调用容器的工具函数。
注意刷新市场列表有以下几种情况
1、添加市场活动,显示第一页数据,按照创建时间降序排列
2、当跳转到活动页面的时候,无条件显示所有数据的第一页
3、模糊查询符合条件数据的第一页。
4、用户切换也换和每页显示条数,刷新活动列表进行显示
5、删除市场活动,显示第一条数据,每页显示条数不变。
由此可见,查询+刷新市场活动这个功能的代码会在很多场景下都会出现,因此我们将这个功能代码封装成函数。
函数:如果一段用来完成特定功能的代码到处出现,可以封装成函数。
函数的参数:在编写函数的过程中,如果有一个或者多个数据无法确定,则可以把这些数据定义成函数的参数。
由上可知,变换的有页号和每页显示条数,因此这两个作为函数的参数。
流程图:
Controller,service,mapper语句的参数怎么选取类型+封装?
1、设置一个pojo类,这个pojo类一般是数据表中的pojo类
2、设置一个map集合,这个map集合中封装的一般是pojo类+多余参数。如Controller接收很多参数,然后封装成map集合,传到service层中。
3、个别形参封装成map类。
4、单一参数原始形式,如传进来id或者name。
5、无参。
重点:编写sql语句
活动列表需要的数据是一个活动列表List<Activity>
,为什么活动列表显示的只有活动名称,所有者,开始日期,结束日期,我们却需要的是一个活动列表呢?
为了防止以后显示的数据增增减减,这样后端的代码就无需改动了,因为活动的信息我们都有,只需要显示即可。
重点:sql语句的分页查询
先排序再分页。
我们要整合不同业务下的分页查询,需要用到动态sql
<select id="selectActivityByConditionForPages" parameterType="map" resultMap="BaseResultMap">
select a.id,u1.name as owner,a.name,a.start_date,a.end_date,a.cost,a.description,a.create_time,
u2.name as create_by,a.edit_time,u3.name as edit_by
from tbl_activity a
join tbl_user u1 on a.owner=u1.id
join tbl_user u2 on a.create_by=u2.id
left join tbl_user u3 on a.edit_by=u3.id
<where>
<if test="name!=null and name!=''">
and a.name like '%' #{name} '%'
</if>
<if test="owner!=null and owner!=''">
and u1.name like '%' #{owner} '%'
</if>
<if test="startDate!=null and startDate!=''">
and a.start_date>=#{startDate}
</if>
<if test="endDate!=null and endDate!=''">
and a.end_date<=#{endDate}
</if>
</where>
order by a.create_time desc
limit #{beginNo},#{pageSize}
</select>
细节:
1、查询的活动列表虽然只有显示的那几条但可能以后会有所变动,因此我们可以查出所有数据。注意,查出的显示的所有者是用户的名称,但数据库存的是用户的id,因此需要连表查询,并作为owner这个字段传给前端,对应给map,map会通过ResultMap找到对应的owner值的。为什么一定要起别名呢?
因为在resultmap找对应的字段的时候,如果不起别名,此时查询语句中就会有两个name,一个是u1.name,一个是a.name,那么必然会引起其中的一个name值为空,因此我们需要起别名,让这个u1.name占据其他的字段名,其他的字段名必须是与之对应外键相关的字段名
2、因为需要实现共同的查询语句,我们分页查询的或者第一次进入主页面的时候没有模糊查询,因此我们的where语句内的内容是动态的。
需要判断模糊查询是否传过来有值,test语句中的字段name,owner,startDate,endDate是传过来map集合中的key值,根据key值看value是否为空或者空字符串来判断是否写入if动态sql中的语句。
模糊查询 like '%' #{key} '%'
3、先排序再分页。
页号是beginNo=(pageNo-1)*pageSize
pageNo代表第几页,beginNo代表第几页的第一条数据的,pageSize代表一页的页数
limit #{beginNo},#{pageSize}
4、注意在起别名的时候如果不注意可能会出现空指针异常,起得别名不能加前缀。必须是map中的字段名。
如 edit_by 不能写成 a.edit_by
要不然会有歧义,机器无法识别,报空指针异常
还有在内连接的时候on后面的条件必须是主表在前,从表在后。
前端动态显示数据-响应服务器端返回的数据
在html中取动态的显示数据:
1、收集数据
2、ajax请求成功后获取服务器返回的数据,响应到浏览器上,怎么显示?
通过选择器.text/html()
进行显示
text只能显示文本,html显示标签页面是覆盖显示,append也可以但是是追加显示
页面遍历函数有两种方法,一种是 jstl标签库的foreach标签,这种遍历是利用el表达式取作用域中的数据。
第二种是js变量的用jquery的each函数
$.each(遍历对象,function(遍历下标index,循环变量obj){
"id="this.value; });
刷新列表后按钮全部取消
已知按钮是类型是checkbox,是多选,他的checked值默认是true,因此这个属性值为true或者false,我们要将按钮全部取消那么我们必须设置按钮的值为false,这样就可以取消了
$("#checkAll").prop("checked",false);
$("#tbody input[type='checkbox']").prop("checked",false);
想知道为啥这样写嘛?请听下回详解