[学习笔记] JSP/Servlet技术之JSP开发业务应用

# 学习 # · 2020-09-18

JSP分页显示数据

1、实现数据的分页显示的步骤:①确定每页显示的数据数量。②计算显示的总页数。③编写SQL语句。

2、实现分页功能:

(1)通过count()聚合函数计算数据总数。

public int getTotalCount() {
    //省略其他代码
    String sql = "select count(nid) from `news`";
}

(2)编写Page类。

public class Page {
    private int totalPageCount = 0;    //总页数
    private int pageSize = 10;    //每页显示条数
    private int totalCount;        //数据总数
    private int currPageNo = 1;    //当前页码
    private List<NewsInfo> newsList;    //每页的新闻集合

    //获取当前页码,如果总页数为0则返回页码0
    public int getCurrPageNo() {
        if(totalPageCount == 0) return 0;
        return currPageNo;
    }

    //当传入的页码值有效,则设置当前页码
    public void setCurrPageNo(int currPageNo) {
        if(currPageNo > 0) this.currPageNo = currPageNo;
    }

    //省略getPageSize()、setPageSize()、getTotalCount()
    //省略getTotalPageCount()、setTotalPageCount()
    //省略getNewsList()、setNewsList();

    //设置数据总数的时候,设置分页参数
    public void setTotalCount(int totalCount) {
        if(totalCount > 0) {
            this.totalCount = totalCount;
            //计算总页数,总页数 = 数据总数÷每页显示条数,逢小数进一
            if(this.totalCount % pageSize == 0) {
                this.totalPageCount = this.totalCount / this.pageSize;
            } else {
                this.totalPageCount = this.totalCount / this.pageSize + 1;
            }
        }
    }
}

(3)编写SQL语句:起始偏移量 = (当前页页码 - 1) * 每页显示的记录数

public List<NewsInfo> getPageNewsList(int pageNo, int pageSize) {
    //省略其他代码
    List<NewsInfo> newsList = new ArrayList<NewsInfo>();
    String sql = "selset * from `news` limit ?, ?";
    //...
    Object[] param = {(pageNo-1)*pageSize, pageSize};
    rs = this.executeQuery(sql,param);
}

用Commons-FileUpload组件实现文件上传

在此之前需要复习:Java OOP之File I/O

1、Commons:Apache开放源代码组织的一个Java子项目,该项目主要涉及一些开发中常用的模块,如文件上传、命令行处理、数据库连接池等。

2、Commons-FileUpload组件的特点:使用简单、能够全程控制上传内容、能对上传文件的大小类型进行控制。

3、获取Commons-FileUpload组件:http://commons.apache.org/

4、表单的属性设置:

<form enctype="multipart/form-data" method="post">

(1)上传文件是form的method只能是post。

(2)enctype之application/x-www-form-urlencoded:默认值,用于处理少量文本数据传递。

(3)enctype之multipart/form-data:上传二进制数据。

(4)enctype之text/plain:主要用于向服务器传递大量文本数据,比较适用于电子邮件的应用。

5、使用File空间选择文件:

<span>选择图片:</span><input type="file" name="pic">

6、Commons-FileUpload组件的API:

(1)使用前添加jar,并在页面中导入。

<%@ import="org.apache.commons.fileupload.*" %>

(2)ServletUpload类:用于文件上传操作。

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);    //设置转换时所使用的字符集编码

(3)FileItem类:用于封装单个表单字段元素的数据。

public boolean isFormField();    //判断FileItem对象封装的数据类型,文件表单字段返回false
public String getName();    //获得文件上传字段中的文件名,普通表单字段返回null
public String getFieldName();    //返回表单字段元素的name属性值
public void write(File file);    //将FileItem对象中的保存的主体内容保存到指定的文件中
public String getString();    //将FileItem对象中保存的主体内容以一个字符串返回
public long getSize();    //返回单个上传文件的字节数

(4)FileItemFactory接口与实现类:创建ServletFileUpload实例需要依赖工厂接口。DiskFileItemFectorys FileItemFecdtory接口的实现类。

public void setSizeThreshold(int sizeThreshold);    //设置内存缓冲区大小
public void setRepositoryPath(String path);        //设置临时文件存放的目录

用Commons-FileUpload组件控制文件上传

1、控制文件上传类型:

<%
    //省略其他代码
    FileItem item = (FileItem)iter.next();
    String fileName = item.getName();
    //通过Arrays类的asList()方法创建固定长度的集合
    List<String> fileType = Arrays.asList("gif","bmp","jpg");
    String ext = fileName.subString(fileName.lastIndexOf(".")+1);
    //判断文件类型是否在允许范围内
    //contains:当且仅当此字符串包含指定的 char 值序列权时,返回 true
    if(!fileType.contains(ext)) {
        out.print("上传失败!文件类型只能是gif、bmp、jpg!");
    }
%>

2、控制文件上传的大小:

<%
    //省略其他代码
    DiskFileItemFactory fectory = new DiskFileItemFactory();
    //设置缓冲区大小为4kb
    factory.setSizeThreshold(4096);
    //设置上传文件用到临时文件存放路径
    factory.setRepositoryPath(tempPatchFile);
    //使用factory的缓冲区和临时文件
    ServletFileUpload upload = new ServletFileUpload(fectory);
    //设置一个完整请求的最大允许大小
    upload.setSizeMax(1024*30);
    try {

    } catch (FileUploadBase.SizeLimitExceededException ex) {
        out.print("上传失败,文件大小限制为" + upload.getSizeMax() + "bytes!");
    }
%>
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/118/

评论