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