基于 JSP 搭建 Web 应用程序
第五章 Web 应用程序优 化
回顾 什么是会话跟踪技术 ? cookie 和 session 的区别是什么 ? 对象的四种作用域范围分别是什么?
使用分页技术实现页面的分页显示 使用 SmartUpload 实现文件上传功能 学习内容
掌握分页显示的原理及实现步骤 掌握 SmartUpload 组件实现上传功能 能力目标
为什么需要数据分页 使用 Google 搜索 “android” 的搜索结果页面 较多数据信息以分页方式显示 大容量数据分页显示
以列表方式显示数据的特点 优势 数据能够按照指定格式显示,布局清晰 不受信息数量的限制 不足 当数据量较多,页面显示不完全时,需要用户拖动页面才 能浏览更多信息 大容量数据显示特点 那有没有另一种显示方式,既能显示多条信息, 又不需要拖动页面呢? 采用分页技术实现批量数据的页面显示
分页实现的思路 分页显示的步骤 确定每页显示的数据条数 计算出总页数 编写分页查询 SQL 语句及方法
确定分页页数 实现步骤 获取总记录数 根据每页显示记录数与总记录数计算总页数 public int getTotalPages(int count, int pageSize){ int totalpages =0; totalpages = (count%pageSize ==0)?(count/pageSize):(count/pageSize+1); return totalpages; } 计算分页页数
分页 SQL 语句 分页查询基本思路 : 1. 每页显示数据的开始位置等于 ” 每页显示条数 *( 当前页码 -1)” 2. 每页显示条数在外层 select 语句中使用 top 语句设定 eg: String sql = "select top “+pageSize+” * from table where id not in (select top “+(currentPage-1)*pageSize+” id from table order by id) order by id”;
当前页的确认 获取当前页 获取显示页的页码 如果获取的页码为 NULL ,则设置当前页为首页 如果获取的页码不为 NULL ,则该页码即为当前页页 码 // 获取当前页 String currentPage = request.getParameter("pageIndex"); if(currentPage == null){ currentPage = "1"; } int pageIndex = Integer.parseInt(currentPage); 读取页码 判断页码 将当前页码赋值给 变量进行后续的传递 将当前页码赋值给 变量进行后续的传递
分页的设置 分页设置的实现 根据已确认的当前页,设置上页和下页 根据总页数设置首页和末页 首页 "> 上一页 "> 下一页 "> 末页 演示示例:读取主题列表分页显示
首页和末页的控制 已经设置了首页和末页,为什么还要进行控制? String currentPage = request.getParameter("pageIndex"); if(currentPage == null){ currentPage = "1"; } int pageIndex = Integer.parseInt(currentPage); // 对首页与末页进行控制 if(pageIndex < 1){ pageIndex = 1; }else if(pageIndex > totalpages){ pageIndex = totalpages; } 假设当前页为首页,当用户点击上页链接时,传递 的 pageIndex 参数为当前页减一,此时入部进行控 制将会导致错误的查询。 通过判断 pageIndex 变 量实现首末页的控制 通过判断 pageIndex 变 量实现首末页的控制
SmartUpload 组件简介 SmartUpload 组件 专门用于实现文件上传及下载的免费组件 SmartUpload 组件特点 使用简单:编写少量代码,完成上传下载功能 能够控制上传内容 能够控制上传文件的大小、类型 缺点:目前已停止更新服务
SmartUpload 组件应用 单文件上传 混合表单上传 多文件上传 控制上传文件的格式 设定文件上传的大
SmartUpload 组件应用条件 环境准备 使用 SmartUpload 组件需要在项目中引入 jspsmartupload.jar 文件 需要设置表单的 enctype 属性 将 jspsmartupload.jar 添加到 WEB-INF\lib 目录下 设置了 enctype 属性后, 表单必须以 post 方式提交 设置了 enctype 属性后, 表单必须以 post 方式提交
SmartUpload 类及方法 SmartUpload 类 用于实现文件上传和下载的操作 常用方法 属性名称 说 明 public final void initialize(PageContext pageContext) 执行上传和下载的初始化工作,必须实 现 public void upload() 实现文件数据的上传,在 initialize 方法 后执行 public int save(String pathName) 将全部上传文件保存到指定的目录下, 并返回保存的文件个数 public void setAllowFilesList(String ExtList) 指定允许上传的文件扩展名,接收一个 扩展名列表,以逗号分隔 public void setDeniedFilesList ( String fileList) 指定了禁止上传的文件扩展名列表,每 个扩展名之间以逗号分隔 public void setMaxFileSize(long filesize) 设 定每个文件允许上传的最大长度 public void setTotalMaxFileSIze(long totalfilesize) 设定允许上传文件的总长度
Files 类及方法 Files 类 封装了所有上传文件的信息集合 常用方法 属性名称 说 明 public int getCount ()取得文件上传的数目 public File getFile ( int index ) 取得指定位置的 File 文 件对象 public long getSize ()取得上传文件的总长度 public Files getFiles () 将所有上传文件对象以 Collection 的形式返回
File 类及方法 File 类 封装了单个上传文件所包含的所有信息 常用方法 方法名称 说 明 saveAs(String destFilePathName) 将文件保存,参数 destFilePathName 是保存的 文件名 isMissing( ) 判断用户是否选择了文件,即 对应表单项是否为空,返回值 为 boolean 类型 public String getFiledName( ) 获取表单中当前上传文件所对 应的表单项的名称 public String getFileName( ) 获取上传文件的文件名称,不 包含路径
单文件上传的实现 编写上传文件处理页 uploadManage.jsp <% smartUpload su = new SmartUpload(); su.initialize(pageContext); su.setCharset(“GBK”); su.upload(); // 获取单个上传文件 [ 如果要得到文件信息, 则用 file, 如果不需要, 则直接保 // 存 ] com.jspsmart.upload.file file = su.getFiles().getFile(0); // 文件在服务器端保存 file.save(filepath); 导入包 创建 smartupload 对象 上传初始化 上传文件 创建文件读取对象 指定文件保存路径 保存文件 演示示例:实现文件上传
混合表单 如果要上传文件,则表单必须设置 enctype 属性 为 multipart/form-data ,一旦这样设置后,其它 普通表单控件也无法通过 request 对象获取,此时 必须通过 SmartUpload 对象的 getRequest() 方法 取得全部请求参数值。 <% // 实例化 SmartUpload 上传组件 SmartUpload smart = new SmartUpload(); // 初始化上传操作 smart.initialize(pageContext); // 设置字符集 smart.setCharset("gbk"); // 准备上传 smart.upload(); Request smartReq =smart.getRequest(); String username = smartReq.getParameter("username"); // 将上传的文件保存到项目根路径下的 uploadfile 目录中 smart.save("uploadfile"); %> 姓名: 使用 request 内置对象获取: 创建 smartupload 对象 上传初始化 创建 Request 对象 获取不到值 演示示例:实现文件上传
获取表单数据 SmartUpload 获取表单数据 getRequest() :得到 com.jspsmart.upload.Request 对象 常用方法 属性名称 说 明 getParameter(String name) 获取指定参数之值,等同 JSP 内 置对象 Request 的 getParameter 方法 getParameterValues(String name) 获取一个页面表单组件对应多个 值时的用户的请求数据,等同 JSP 内置对象 Request 的 getParameterValues 方法 上传文件: 文件描述:... com.jspsmart.upload.Request surequest = su.getRequest(); String explanation = surequest.getParameter("explanation"); out.println(explanation) ;... 获取 Request 对象 获取表单提交数据
多文件上传 同时上传多个文件 <% // 实例化 SmartUpload 上传组件 SmartUpload smart = new SmartUpload(); // 初始化上传操作 smart.initialize(pageContext); // 设置字符集 smart.setCharset("gbk"); // 准备上传 smart.upload(); // 取得所有上传文件 Files files = smart.getFiles(); // 循环保存各个文件 for(int i=0;i<files.getCount();i++){ smart.save("uploadfile"); } %> 创建 smartupload 对象 上传初始化 获取上传文件 演示示例:实现文件上传 循环保存文件
控制上传文件的类型 使用 SmartUpload 组件可以对上传文件的类型进 行限制 setAllowedFilesList(): 允许上传的文件类型 setDeniedFilesList() :禁止上传的文件类型 SmartUpload su = new SmartUpload(); // 初始化 SmartUpload 对象 su.initialize(pageContext); try { // 定义允许上传文件类型 su.setAllowedFilesList("gif,jpg,doc"); // 不允许上传文件类型 su.setDeniedFilesList("jsp,asp,php,aspx,html,htm,exe,bat"); // 执行上传 su.upload(); }catch(Exception e) 多个文件类型之间以 逗号进行分隔 多个文件类型之间以 逗号进行分隔 演示示例:控制文件上传的类型
控制上传文件的大小 使用 SmartUpload 组件可以对上传文件的大小进 行限制 setMaxFileSize(): 允许上传的单个文件大小 setTotalMaxFileSize() :允许上传的文件总容量 … // 定义允许上传文件类型 su.setAllowedFilesList("gif,jpg,doc"); // 不允许上传文件类型 su.setDeniedFilesList("jsp,asp,php,aspx,html,htm,exe,bat") ; // 单个文件最大限制 su.setMaxFileSize(20000); // 所有上传文件的总容量限制 su.setTotalMaxFileSize(500000); … 限制可上传文件的容量 演示示例:控制文件上传的大小
本章总结 请描述分页显示的 SQL 语句如何实现? 请描述在页面中如何确定上页和下页的页码? SmartUpload 如何实现对上传文件的控制?