JavaEE-05 分页与文件上传
学习要点
- 新闻分页显示数据
- 新闻图片上传
JSP分页显示数据
分页
- 数据信息较多的的时候一般采用列表显示,方便展示信息;
- 数据量较大的时候一般采用列表加分页的方式显示,便于阅读。
- 分页方式:集合或者session、存储过程、SQL语句分页
分页步骤
- 确定每页显示的数据数量
- 确定分页显示所需的总页数
- 编写SQL查询语句,实现数据查询
- 在JSP页面中进行分页显示设置
- 对分页过程中的数据进行封装,封装到Page类中
实现过程
- 确定每页显示的数据量:例如:每页显示5条数据
- 计算显示的页数:使用count()函数查询数据库中的记录数;通过记录数和每页数据量计算总页数,把信息封装到Page类中。
- Page类代码
/**分页泛型类*/
public class Page<T> {
// 总页数
private int totalPageCount = 1;
// 页面大小,即每页显示记录数
private int pageSize = 0;
// 记录总数
private int totalCount = 0;
// 当前页号
private int currPageNo = 1;
// 每页数据集合
private List<T> List; public List<T> getList() {
return List;
} public void setList(List<T> list) {
List = list;
} public int getCurrPageNo() {
if (totalPageCount == 0)
return 0;
return currPageNo;
} public void setCurrPageNo(int currPageNo) {
if (this.currPageNo > 0)
this.currPageNo = currPageNo;
} public int getTotalPageCount() {
return totalPageCount;
} public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
} public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
if (pageSize > 0)
this.pageSize = pageSize;
} public int getTotalCount() {
return totalCount;
} public void setTotalCount(int totalCount) {
if (totalCount > 0) {
this.totalCount = totalCount;
// 计算总页数
totalPageCount = this.totalCount % pageSize == 0 ? (this.totalCount / pageSize)
: this.totalCount / pageSize + 1;
}
}
}
JavaBean的概念:JavaEE项目中对数据或者业务进行封装的简单类。
类似于Page或者News新闻实体类。
News类实现了数据的封装,Page类实现了业务的封装,并且这两个类都没有继承除Object类外的其他类或者实现接口,所有属性进行了封装,有无参构造方法。
4.设计SQL语句
MySQL分页语句:
SELECT * FROM news ORDER BY NID ASC LIMIT (pageindex-1)*pagesize,pagesize;
5.数访问层实现
NewsDao:
public abstract int getTotalCount();
public List<News> getPageNewsList(int pageIndex,int pageSize);
NewsDaoImpl:
/** 获取分页新闻信息 */
public List<News> getPgeNewsList(int pageNo, int pageSize) {
List<News> newsList = new ArrayList<News>();
String sql = "select NID,NTITLE,NCREATEDATE from NEWS order by NCREATEDATE desc LIMIT ?,?";
Object[] args = { (pageNo - 1) * pageSize, pageSize };
ResultSet rs = this.executeQuery(sql, args);
try {
while (rs.next()) {
int nId = rs.getInt("NID");
String nTitle = rs.getString("NTITLE");
Timestamp times = rs.getTimestamp("NCREATEDATE");
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
String nCreateDate = sdf.format(times);
// String nCreateDate = rs.getString("NCREATEDATE");
News news = new News();
news.setNid(nId);
news.setNtitle(nTitle);
news.setNcreatedate(nCreateDate);
newsList.add(news);
}
} catch (Exception e) {
e.printStackTrace();
}
return newsList;
} /**查询总记录数*/
public int getTotalCount() {
int count = 0;
Connection conn = this.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select count(1) from news";
try {
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
this.closeAll(rs, pstmt, conn);
}
return count;
}
6.测试方法
public static void main(String[] args) {
NewsDaoImpl newsDao = new NewsDaoImpl();
int totalCount = newsDao.getTotalCount();
Page<News> page = new Page<News>();
page.setCurrPageNo(3); // 设置当前页面
page.setPageSize(3); // 设置每页条数
page.setTotalCount(totalCount); // 设置总记录数
System.out.println("新闻总数量是:" + page.getTotalCount());
System.out.println("每页条数是:" + page.getPageSize());
System.out.println("总页数:" + page.getTotalPageCount());
System.out.println("当前是第" + page.getCurrPageNo() + "页:");
List<News> newsList = newsDao.getPgeNewsList(page.getCurrPageNo(), page.getPageSize());
page.setList(newsList);// 设置每页显示的集合
for (News news : page.getList()) {
System.out.println(news.getNid() + "\t" + news.getNtitle() + "\t" + news.getNcreatedate());
}
}
7.JSP页面信息页控制代码
当前页数:[<%=pageIndex%>/<%=totalpages%>]
<%
if(pageIndex > 1){ //控制页面显示风格
%>
<a href="pageControl.jsp?pageIndex=1">首页</a>
<a href="pageControl.jsp?pageIndex=<%= pageIndex -1%>">上一页</a>
<% }
if(pageIndex < totalpages){ //控制页面显示风格
%>
<a href="pageControl.jsp?pageIndex=<%= pageIndex +1%>">下一页</a>
<a href="pageControl.jsp?pageIndex=<%=totalpages%>">末页</a>
<%}%>
8.信息处理页参考代码
String pageIndex = request.getParameter("pageIndex");//获得当前页数 if (pageIndex == null) { pageIndex = "1"; } int currPageNo = Integer.parseInt(pageIndex); NewsDaoImpl newsDao = new NewsDaoImpl(); int totalCount = newsDao.getTotalCount();//获得总记录数 Page<News> pages = new Page<News>(); pages.setPageSize(3); //设置每页条数 pages.setTotalCount(totalCount); //设置总记录数 int totalpages = pages.getTotalPageCount(); /*对首页与末页进行控制*/ if (currPageNo < 1) { currPageNo = 1; } else if (currPageNo > pages.getTotalPageCount()) { currPageNo = totalpages; } pages.setCurrPageNo(currPageNo); //设置当前页面 List<News> newsList = newsDao.getPgeNewsList(pages.getCurrPageNo(), pages.getPageSize()); pages.setList(newsList); //设置每页显示的集合 request.setAttribute("pages", pages); request.getRequestDispatcher("index.jsp").forward(request, response);
上机练习:实现新闻分页显示
需求说明
编写代码实现首页新闻标题的分页显示,要求能够执行首页、下一页、上一页、末页的操作,并在页面中显示总页数和当前页
实现思路
- 确定每页显示的新闻数量
- 编写数据库访问类,声明查询方法
- 编写SQL语句
- 编写JavaBean封装分页信息(Page类)
- 在JSP中调用JavaBean
使用Commons-FileUpload上传文件
需求
网页应用中,经常需要上传文件到服务器。上传文件网页代码:
<form action="doupload.jsp" enctype="multipart/form-data" method="post">
<p>姓名:<input type="text" name="user"></p>
<p>选择图片:<input type="file" name="nfile"></p>
<p><input type="submit" value="提交"></p>
</form>
表单要上传文件,需要注意两点:
1、设置enctype属性,值必须为multipart/form-data
2、表单的提交方式必须为post
上传文件组件
- Commons-FileUpload组件可以方便地嵌入到JSP文件中,在JSP文件中仅编写少量代码即可完成文件的上传功能,十分方便。
- 能够全程控制上传内容:可以获得全部上传文件的信息,包括文件名称、类型、大小等,方便操作。
- 能够对上传文件的大小、类型进行控制:为了避免在上传过程中出现异常数据,在Commons-FileUpload组件中,专门提供了相应的方法用于对上传文件进行控制。
获取Commons-FileUpload组件的方式
- http://commons.apache.org/fileupload下载Commons-FileUpload组件
Commons-FileUpload组件类库:commons-fileupload-1.3.2.jar
Commons-FileUpload组件的API文档: apidocs
- http://commons.apache.org/io下载Commons-IO组件
Commons-IO组件类库:commons-io-2.5.jar
Commons-IO组件的API文档: commons-io-2.5\docs
Commons-FileUpload组件的API
- ServletFileUpload类的常用方法
方法名称 |
方法描述 |
public void setSizeMax(long sizeMax) |
设置请求信息实体内容的最大允许的字节数 |
public List parseRequest(HttpServletRequest req ) |
解析form表单中的每个字符的数据,返回一个FileItem对象的集合 |
public static final boolean isMultipartContent (HttpServletRequest req ) |
判断请求信息中的内容 是否是“multipart/form-data”类型 |
public void setHeaderEncoding(String encoding) |
设置转换时所使用的字符集编码 |
- FileItem接口的常用方法
方法名称 |
方法描述 |
public boolean isFormField() |
判断FileItem对象封装的数据类型(普通表单字段返回true,文件表单字段返回false) |
public String getName() |
获得文件上传字段中的文件名(普通表单字段返回null) |
public String getFieldName() |
返回表单字段元素的name属性值 |
public void write() |
将FileItem对象中保存的主体内容保存到指定的文件中 |
public String getString() |
将FileItem对象中保存的主体内容以一个字符串返回。其重载方法public String getString(String encoding)中的参数用指定的字符集编码方式 |
public long getSize() |
返回单个上传文件的字节数 |
- FileItemFactory接口与实现类
实现类:DefaultFileItemFactory, DiskFileItemFactory
方法名称 |
方法描述 |
public void setSizeThreshold(int sizeThreshold) |
设置内存缓冲区的大小 |
public void setRepositoryPath(String path ) |
设置临时文件存放的目录 |
文件上传的实现
- 实现步骤
//创建FileItemFactory对象
//创建ServletFileUpload对象
//解析form表单中所有文件
if (普通表单字段){
//获取表单字段的name属性值
if (此属性是“user”)){
//输出XXX上传了文件
}
}else{
//文件表单字段
//获取上传文件的名字
if (名字不为空) {
//保存此文件并输出保存成功
}
}
- 示例代码
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="org.apache.commons.fileupload.FileItemFactory"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <%
request.setCharacterEncoding("utf-8");
String uploadFileName = ""; //上传的文件名
String fieldName = ""; //表单字段元素的name属性值
//请求信息中的内容是否是multipart类型
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//上传文件的存储路径(服务器文件系统上的绝对文件路径)
String uploadFilePath = request.getSession().getServletContext()
.getRealPath("upload/");
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//解析form表单中所有文件
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) { //依次处理每个文件
FileItem item = (FileItem) iter.next();
if (item.isFormField()) { //普通表单字段
fieldName = item.getFieldName(); //表单字段的name属性值
if (fieldName.equals("user")) {
//输出表单字段的值
out.print(item.getString("UTF-8")
+ "上传了文件。<br/>");
}
} else { //文件表单字段
String fileName = item.getName();
if (fileName != null && !fileName.equals("")) {
File fullFile = new File(item.getName());
File saveFile = new File(uploadFilePath,
fullFile.getName());
item.write(saveFile);
uploadFileName = fullFile.getName();
out.print("上传成功后的文件名是:" + uploadFileName);
out.print("<br>文件保存绝对路径为:"+saveFile.getPath());
out.print("<br>文件保存相对路径为:"+"upload\\"+uploadFileName);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
%>
上机练习
需求描述
完成新闻发布信息的添加图片功能
实现思路
1. 添加commons-fileupload.jar和commons-io-2.5.jar
2. 在JSP文件中使用page指令导入Commons-FileUpload类
3. 调用Commons-FileUpload组件相关类的方法获取文件信息并实现保存
控制上传文件的属性
控制文件上传的类型
代码框架
List<String> filType=Arrays.asList("gif","bmp","jpg");
String ext=fileName.substring(fileName.lastIndexOf(".")+1);
if(!filType.contains(ext)){ //判断文件类型是否在允许范围内
out.print("上传失败,文件类型只能是gif、bmp、jpg");
}else{
//上传文件
}
控制文件上传的大小
代码框架
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个文件的最大限制
upload.setSizeMax(1024*30);
try {
//……省略上传代码
}catch(FileUploadBase.SizeLimitExceededException ex){
out.print(“上传失败,文件太大,单个文件的最大限制是:"+
upload.getSizeMax()+"bytes!");
完整代码示例
<%@page import="org.apache.commons.fileupload.FileUploadBase"%>
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="org.apache.commons.fileupload.FileItemFactory"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <%
request.setCharacterEncoding("utf-8");
String uploadFileName = ""; //上传的文件名
String fieldName = ""; //表单字段元素的name属性值
//请求信息中的内容是否是multipart类型
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//上传文件的存储路径(服务器文件系统上的绝对文件路径)
String uploadFilePath = request.getSession().getServletContext()
.getRealPath("upload/");
//创建临时文件目录路径
File tempPatchFile = new File("d:\\temp\\buffer\\");
if (!tempPatchFile.exists()) //判断文件或目录是否存在
tempPatchFile.mkdirs(); //创建指定的目录,包括所有必需但不存在的父目录
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓冲区大小4kb
factory.setSizeThreshold(4096);
//设置上传文件用到临时文件存放路径
factory.setRepository(tempPatchFile);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个文件的最大限制
upload.setSizeMax(1024 * 30);
try {
//解析form表单中所有文件
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) { //依次处理每个文件
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) { //文件表单字段
String fileName = item.getName();
//通过Arrays类的asList()方法创建固定长度的集合
List<String> filType = Arrays.asList("gif", "bmp",
"jpg");
String ext = fileName.substring(fileName
.lastIndexOf(".") + 1);
if (!filType.contains(ext)) //判断文件类型是否在允许范围内
out.print("上传失败,文件类型只能是gif、bmp、jpg");
else {
if (fileName != null && !fileName.equals("")) {
File fullFile = new File(item.getName());
File saveFile = new File(uploadFilePath,
fullFile.getName());
item.write(saveFile);
uploadFileName = fullFile.getName();
out.print("上传成功后的文件名是:" + uploadFileName
+ ",文件大小是:" + item.getSize()
+ "bytes!"); }
}
}
}
} catch (FileUploadBase.SizeLimitExceededException ex) {
out.print("上传失败,文件太大,单个文件的最大限制是:" + upload.getSizeMax()
+ "bytes!");
} catch (Exception e) {
e.printStackTrace();
}
}
%>
上机练习
需求描述
- 管理员在发布新闻时,可以同时实现新闻图片的上传
- 允许上传的图片类型为:GIF文件、JPG文件、JPEG文件、PNG文件
- 上传图片的大小不能超过5MB完成新闻发布信息的添加图片功能
- 管理员选择某一条新闻,单击修改链接后,在新闻编辑页面显示此条新闻内容。
- 编辑好新闻内容后,单击提交按钮更新此条新闻。
上机练习
需求描述
- 管理员选择某一条新闻,单击修改链接后,在新闻编辑页面显示此条新闻内容。
- 编辑好新闻内容后,单击提交按钮更新此条新闻。
JavaEE-05 分页与文件上传的更多相关文章
- springboot中使用分页,文件上传,jquery的具体步骤(持续更新)
分页: pom.xml 加依赖 <dependency> <groupId>com.github.pagehelper</groupId> <arti ...
- CodeIgniter学习笔记五:分页,文件上传,session,验证码
一.分页 示例代码: //装载类文件 $this -> load -> library('pagination'); $controller = $this->router-> ...
- JavaEE开发之SpringMVC中的自定义消息转换器与文件上传
上篇博客我们详细的聊了<JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术>,本篇博客依然是JavaEE开发中的内容,我们就来聊一下SpringMVC中的自定义消息转发器 ...
- php 分页实现 和 php 大文件上传失败的处理方式
1. php分页: 要想做php的分页,首先要弄清楚要什么样的分页,关系到哪些参数,参数之间怎么关联: 目标分页效果如下: 分析: 1.主要涉及两个参数:一个是当前输出页面的页码,用变量$p 表示,另 ...
- django——文件上传_分页_ajax_富文本_celery
上传文件 概述 当Django在处理文件上传时,文件的数据被存储在request.FILES属性中 FILES只有在请求的方法为POST且提交的form表单带有enctype="multip ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- ThinkPHP3验证码、文件上传、缩略图、分页(自定义工具类、session和cookie)
验证码 TP框架中自带了验证码类 位置:Think/verify.class.php 在LoginController控制器中创建生存验证码的方法 login.html登陆模板中 在LoginCont ...
- 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器
springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...
- tp文件上传;org/RBAC.class.php 权限类;think/page,class,php分页类;
一.上传表单: 注意,要使用上传功能 你的表单需要设置 enctype="multipart/form-data" <form action="__URL__/up ...
随机推荐
- linux中目录操作<1>
一.目录的权限 (1)目录文件的访问权限分为三组,分别为所有者,用户,其他.每个权限组的权限位有3个,分别为读.写.执行. 注意:可以使用stat函数得到目录文件的状态信息.权限为在stat结构中st ...
- 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时12&&13
课时12 神经网络训练细节part2(上) 训练神经网络是由四步过程组成,你有一个完整的数据集图像和标签,从数据集中取出一小批样本,我们通过网络做前向传播得到损失,告诉我们目前分类效果怎么样.然后我们 ...
- hdoj5793 A Boring Question【找规律】
找出的规律.... 1 2 3 2 2 7 3 2 15 4 2 31 5 2 63 1 3 4 2 3 13 3 3 40 4 3 121 5 3 361 然后我们来推个公式: 比如说a2=3a1+ ...
- kettle系列-我的开源kettle调度、管理平台[kettle-manager]介绍
kettle管理工具 专门为kettle这款优秀的ETL工具开发的web端调度.管理工具. 新版本 项目简介 kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操 ...
- 【UVA - 10474 】Where is the Marble?(排序)
Where is the Marble? Descriptions: Raju and Meena love to play with Marbles. They have got a lot of ...
- Brush (IV) LightOJ - 1018
题意:平面上有一些点,每刷一次可以把同一条直线上的点都刷光,问最少几次把所有点刷光. 方法: 显然是一个状态压缩dp.ans[S]表示把S集合中点刷掉的最少次数.最开始想到的方法是如果S中只有一个或两 ...
- 二分搜索 2015百度之星初赛1 HDOJ 5248 序列变换
题目传送门 /* 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 比赛时以为是贪心,榨干智商也想不出来:( ...
- B. Code For 1 一个类似于线段树的东西
http://codeforces.com/contest/768/problem/B 我的做法是,观察到,只有是x % 2的情况下,才有可能出现0 其他的,都是1来的,所以开始的ans应该是R - ...
- 基于CentOS 7.2个人网盘的实现
首先使用YUM安装依赖环境: [root@sishen ~]#yum install python python-setuptools python-imaging python-ldap pytho ...
- Unity项目学习笔记
1.TCP和IP IP:主要作用是在复杂的网络环境中将数据包发送给的最终的目标地址. 端口号:系统会分给系统端口号 一般知名的端口号在0-1023之间,而我们经常使用的自定义/动态分配的端口号则一般 ...