JAVA基础之JDBC开发、JSTL语法、EL表达式与数据分页
一、直接使用JDBC开发的问题
1.当表中的列很多时,需要写很长的SQL语句
还需要写大量 setXXX() 设置参数语句
读取数据时还需要写大量setXXXX()设置属性语句
2.非常容易出错,而且不方便修改
如:某个字段需要去掉,就需要调整后续序号
大量时间都花在“搬砖”上面
而且很容易埋下bug,后期测试和修复时间大大增加!!!
3.效率很差,质量不高
解决方法:将容易出错,大量繁琐的代码封装起来。
给程序员提供更加高级API(Application Programming Interface)
一套完整的,能够解决某个方面问题的API,可以称为框架(framework)、库(library)
二、关于JSTL部门语法
<c:forTokens items =”字符串列表” delims=”字符串中的分隔符” var = “变量名”
varStatus =”迭代状态数据对象名”>
${s.index} 索引(从0开始)
${s.count} 序号(从1开始)
${s.current} 当前值 与var相等
${s.first} 布尔值 是否是第一项
${s.last} 布尔值 是否是最后一项
</c:forTokens>
varStatus 这个属性在<c:forEach>中也存在
JSTL的下拉列表、单选框、复选框的选中问题
<select>
<option value=”3” ${变量== 值?”selected”:””}>要选中的项</option>
<option value=”3” ${变量 eq值?”selected”:””}>要选中的项</option>
<input type=”radio” value=”3” ${变量==值?”checked”:””}>要选中的项
</select>
三、关于Getter/Setter方法
如果属性以is开头,Eclipse生成的getter/setter如下
getter: isXXX
setter : isXXX
举例:isMale、isAdmin
isMale()、setMale()、isAdmin()、setAdmin()
使用EL表达式时,应该写成
${obj.male} ${obj.admin}
四、EL表达式
1、语法结构
${expression}
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${ user. My-Name}应当改为${user["My-Name"]}
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data是一个变量
3、变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
五、数据分页
数据分页的必要性
1.一次性把所有数据(如果很多的话)从数据库中查出来回给数据带来很大的IO开销,而IO是最慢的操作,结果是数据库并发了大大降低!
2.一次性把大量的数据从数据库传到应用服务器,再从应用服务器传到用户浏览器会大大占用服务器宝贵的带宽资源,导致服务器能够处理请求大大减少!
3.查询和传送大量数据需要时间必然很长,结果导致页面反应速度变慢
用户体验变差
4.人类可读的数据不超过几十条,传送成百上千条数据没有意义
分页数据的查询
pageNo 页码(从1开始)
pageSize 每页条数(默认10条)
能够计算出来任意pageNo对应的数据的起始索引位置
start =(pageNo-1)*pageSize -----起始索引位置
count = pageSize -----数据条数
MySQL数据库的Limit子句:
Limit start,count
示例:含义是从role这个表中取从索引为0开始的6条数据
六、Pager类的设计
1. Pager类的职责: 根据pageNo、total、pageSize、showPageNos计算pageCount、start、end
这些数据用来支持在页面上显示分页信息和页码:
如下所示:
共123条数据,第3页/共13页 1 2 3 4 5 6 7 8 9
2.区分哪些数据时传过来的,哪些数据是算出来的
将传过来的数据当做构造方法的参数
根据参数的变化频率调整参数的位置(Eclipse重构功能支持)
将变化频率高的参数放在前面,同时增加构造方法重载,对变化频率低的设置默认值
3.内部类
如果需要把多个类定义在一个文件中,尤其是这些类都需要public的时候,可以把一个类作为主类,其他类定义在它的内部
------内部类
4.自定义异常类
如果希望通过自定义异常向外部提示错误,则需要让自定义异常类从Throwable继承
自定义异常类从Throwable继承或从Throwable的子类继承
常用的子类有Exception、RuntimeException
从Exception继承类是受查异常,必须try/catch或throws
从RuntimeException继承的是非受查异常,不必显式地try/catch或throws
编程时更加自由
使用throw抛出异常