前首页实现分页
同理运用上次案例06的分页,在oracle数据库中获取相应的伪列
在src中添加并创建相关的Dao类信息
相关详细内容可看案例6
package com.news.dao;
import java.util.List;
import com.news.entity.News;
/**
* 新闻管理的dao接口
*
* @author Administrator
*
*/
public interface INewsDao {
/**
* 方法功能:根据编号进行删除
*
* @return 整数数据类型
*/
public int deleteById(int nid);
/**
* 方法功能:获取新闻信息表中所有的新闻记录
*
* @return 集合
*/
public List<News> queryNewsAll();
/**
* 分页版本1 方法功能:分页查询
*
*/
public List<News> queryNewsAll2();
/**
* 分页版本2 方法功能:分页
*
* @param pageIndex
* 页码 默认是第一页
* @param pageSize
* 每一页显示的新闻条数
*
*/
public List<News> queryNewsAll3(int pageIndex, int pageSize);
/**
* 方法功能:求新闻信息表中的总记录数
*/
public int getNewsCount();
/**
* 模糊查询
*/
public List<News> queryNewsAll4(String strName);
/**
* 带模糊查询的分页查询
*/
public List<News> queryNewsAll5(int pageIndex, int pageSize, String strName);
/**
* 方法功能:求新闻信息表中的总记录数(带模糊查询)
*/
public int getNewsCount(String strName);
/**
* 方法功能:根据主题分类编号进行查询 分页效果
*/
public List<News> queryNewsAll6(int pageIndex, int pageSize, int ntid);
/**
* 当点击了主题分类时,拿到对应主题下的所有新闻条数
*/
public int getNewsCountByNtid(int ntid);
}
package com.news.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.news.dao.INewsDao;
import com.news.entity.News;
import com.news.entity.Theme;
import com.news.untils.DBHelper;
public class NewsDaoImpl implements INewsDao {
@Override
public int deleteById(int nid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int n = 0;// 保存表的总记录数
try {
// 获取连接对象
conn = DBHelper.getConn();
// 编写sql语句
// sql语句
String sql = "delete from tb_news where nid = ?";
// 将sql语句传入方法返回执行对象
ps = conn.prepareStatement(sql);
ps.setInt(1, nid);
// 返回所影响的行数
n = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, null);
}
return n;
}
@Override
public List<News> queryNewsAll() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
try {
conn = DBHelper.getConn();
String sql = "select * from tb_news";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
@Override
public List<News> queryNewsAll2() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
try {
conn = DBHelper.getConn();
String sql = "select b.* from ( select a.*,rownum as rid from tb_news a ) b where b.rid between 1 and 5";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
@Override
public List<News> queryNewsAll3(int pageIndex, int pageSize) {
// 1 5 第一页 5条数据 start = 1 end = 5;
// 2 5 第二页 5条数据 start = 6 end = 10
// 根据参数pageIndex和pageSize来计算区间查询的规律
int start = (pageIndex - 1) * pageSize + 1;
int end = pageIndex * pageSize;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
try {
conn = DBHelper.getConn();
String sql = "select b.* from ( select a.*,rownum as rid from tb_news a ) b where b.rid between " + start
+ " and " + end + "";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
@Override
public List<News> queryNewsAll4(String strName) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
try {
conn = DBHelper.getConn();
String sql = "select * from tb_news where ntitle like '%" + strName + "%'";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
@Override
public List<News> queryNewsAll5(int pageIndex, int pageSize, String strName) {
// 1 5 第一页 5条数据 start = 1 end = 5;
// 2 5 第二页 5条数据 start = 6 end = 10
// 根据参数pageIndex和pageSize来计算区间查询的规律
int start = (pageIndex - 1) * pageSize + 1;
int end = pageIndex * pageSize;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
try {
conn = DBHelper.getConn();
String sql = "select b.* from (\r\n" + " select a.*,rownum as rid from (\r\n"
+ " select * from tb_news where ntitle like '%" + strName + "%'\r\n"
+ " )a\r\n" + ")b where b.rid between " + start + " and " + end + "";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
public List<News> queryNewsAll5(int pageIndex, int pageSize, String strName, int ntid) {
int start = (pageIndex - 1) * pageSize + 1;
int end = pageIndex * pageSize;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
try {
conn = DBHelper.getConn();
// 默认根据标题进行模糊查询 如果没有点击搜索 默认将strName = ""
String sql = "select * from tb_news where ntitle like '%" + strName + "%' ";
// 当点击了主题分类时 将点击的分类编号作为条件拼接到模糊查询的后面
if (ntid != 0) {
sql += " and ntid = " + ntid;
}
// System.out.println(sql);
// 进行分页
sql = " select b.* from ( select a.*,rownum as rid from ( " + sql + " ) a ) b where b.rid between " + start
+ " and " + end + "";
System.out.println(sql);
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
public static void main(String[] args) {
// List<News> queryNewsAll5 = new NewsDaoImpl().queryNewsAll5(1, 4, "1", 1);
// for (News news : queryNewsAll5) {
// System.out.println(news.getNtitle());
// }
// System.out.println(new NewsDaoImpl().queryNewsAll6(1, 5, 0).size());
// List<News> list = new NewsDaoImpl().queryNewsAll6(1, 5, 6);
// for (News news : list) {
// System.out.println(news.getNtitle());
// }
System.out.println(new NewsDaoImpl().getNewsCountByNtid(6));
}
@Override
public int getNewsCount() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int count = 0;// 保存表的总记录数
try {
conn = DBHelper.getConn();
String sql = "select count(*) from tb_news";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
count = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return count;
}
@Override
public int getNewsCount(String strName) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int count = 0;// 保存表的总记录数
try {
conn = DBHelper.getConn();
String sql = "select count(*) from tb_news where ntitle like '%" + strName + "%'";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
count = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return count;
}
// public static void main(String[] args) {
// // System.out.println(new NewsDaoImpl().getNewsCount());
//
// // List<News> list = new NewsDaoImpl().queryNewsAll2();
// // System.out.println(list.size());
// // for (News news : list) {
// // System.out.println(news);
// // }
//
// List<News> list = new NewsDaoImpl().queryNewsAll5(2, 3, "2");
// for (News news : list) {
// System.out.println(news.getNtitle());
// }
//
// }
@Override
public List<News> queryNewsAll6(int pageIndex, int pageSize, int ntid) {
int start = (pageIndex - 1) * pageSize + 1;
int end = pageIndex * pageSize;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<News> list = new ArrayList<News>();
String sql = "";
String sqlNtid = "";
try {
conn = DBHelper.getConn();
if (ntid != 0) {
sqlNtid = " where ntid = " + ntid;
}
sql = "select c.* from ( select b.*,rownum as rid from (select * from tb_news " + sqlNtid
+ ")b)c where c.rid between " + start + " and " + end + "";
/*
* if(ntid == 0) { sql = "select b.* from\r\n" + "(\r\n" +
* "select a.*,rownum as rid from tb_news a\r\n" +
* ") b where b.rid between "+start+" and "+end+""; }else { sql =
* "select c.* from \r\n" + "(\r\n" + "select b.*,rownum as rid from (\r\n" +
* " select * from tb_news where ntid = "+ntid+" \r\n" + ")b\r\n" + "\r\n"
* + ")c where c.rid between "+start+" and "+end+""; }
*/
System.out.println(sql);
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
// 获取分类编号rs.getInt("ntid");
Theme theme = new ThemeDaoImpl().getThemeByTid(rs.getInt("ntid"));
list.add(new News(rs.getInt("nid"), theme, rs.getString("ntitle"), rs.getString("nauthor"),
rs.getString("nsummary"), rs.getString("ncontent"), rs.getString("nimage"),
rs.getString("ndate"), rs.getInt("ncount")));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
@Override
public int getNewsCountByNtid(int ntid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int count = 0;// 保存表的总记录数
try {
conn = DBHelper.getConn();
String sql = "select count(*) from tb_news ";
if (ntid != 0) {
sql += " where ntid = " + ntid;
}
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
count = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return count;
}
}
注:在INewsDao接口类和NewsDaoImpl类添加了新内容(完整代码已给出)
注:在INewsDao接口类和NewsDaoImpl类添加了新内容(完整代码已给出)
<div class="main">
<div class="class_type">
<img src="admin/images/class_type.gif" alt="新闻中心" />
</div>
<div class="content">
<!-- 3.index.jsp用户首页的新闻分类显示(数据绑定) -->
<ul class="class_date">
<li id='class_month'><a href="index.jsp"><b>全部</b></a> <!-- 利用javabean模式进行封装数据并显示 -->
<%
//实例化分类DAO
IThemeDao itd = new ThemeDaoImpl();
//调用查询所有分类的dao方法
List<Theme> listThemes = itd.queryThemeAll();
for(Theme theme:listThemes){
%>
<a href="index.jsp?tid=<%=theme.getTid()%>">
<b><%=theme.getTname() %></b>
</a>
<%
}
%></li>
</ul>
<!-- 当进入index.jsp页面后,手动点击对应的主题名称 跳转到本页面 获取当前点击的主题名称 -->
<!-- 新闻显示 start-->
<ul class="classlist">
<%
//当点击了主题分类时 跳转本页面 获取tid
//没有点击主题分类 不需要获取
String id = request.getParameter("tid");//null
int tid = 0;//保存最终的编号
if(id!=null){
tid = Integer.valueOf(id);
}
System.out.println("tid = "+tid);
//实例化DAO
INewsDao ind = new NewsDaoImpl();
//定义变量存储页码以及每一夜显示的数据
int pageIndex = 1;
int pageSize = 5;
int pageMax = 0;//存储最大页码
//当点击分页区域的下一页超链接时,获取这个参数
String pIndex = request.getParameter("pageIndex");
//判断,只有你点击了下一页 才将pIndex赋值给pageIndex
if(null!=pIndex){//不为空 说明点击了
pageIndex = Integer.valueOf(pIndex);
}
//根据dao求出总记录数
int count = ind.getNewsCountByNtid(tid);
pageMax = count%pageSize==0?count/pageSize:count/pageSize+1;
System.out.println("最大页码: "+pageMax);
//调用查询所有新闻的方法
List<News> listNews = ind.queryNewsAll6(pageIndex,pageSize,tid);
for(News news:listNews){
%>
<li><a href='#'><%=news.getNtitle() %> </a><span> <%=news.getNdate() %></span></li>
<%
}
%>
</ul>
<hr />
<p style="text-align: center; font-size: 18px;">
《<%=pageIndex %>/<%=pageMax %>》 <a>首页</a> <a>上一页</a> <a
href="index.jsp?pageIndex=<%=pageIndex+1 >pageMax?pageMax:pageIndex+1%><%if(id!=null){out.println("&tid="+tid);}%>">下一页</a>
<a>尾页</a>
</p>
</div>
效果如下:
富文本编辑器
概述
富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器,类似于 Microsoft Word 的编辑功能。
常用的富文本编辑器
①ckeditor
②Kindeditor
③ueditor
④wangEditor
⑤SmartMarkUP
⑥Control.Editor
⑦EditArea
⑧Free Rich Text Editor
CKeditor的使用步骤c
【步骤一】官网https://ckeditor.com/ 下载-解压-引入
步骤二】
<script type="text/javascript" src = "../ckeditor/ckeditor.js"></script>
<script type="text/javascript">
CKEDITOR.replace("ncontent");
</script>
演示:
<p>
<label> 内容 </label>
<!-- 通过富文本编辑器插件将textarea显示为富文本编辑器风格 -->
<textarea name="ncontent" cols="70" rows="10" id="ncontent">
</textarea>
<script type="text/javascript">
CKEDITOR.replace("ncontent");
</script>
</p>
完整代码如下(添加在之前写过的addNews.jsp中):
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新闻发布--管理后台</title>
<link rel="stylesheet" type="text/css" href="css/admin.css" />
<!-- 引入富文本编辑器的插件js文件 -->
<script type="text/javascript" src="ckeditor/ckeditor.js">
</script>
</head>
<body>
<div id="header">
<div id="welcome">欢迎使用新闻管理系统!</div>
<div id="nav">
<div id="logo">
<img src="images/logo.jpg" alt="新闻中国" />
</div>
<div id="a_b01">
<img src="images/a_b01.gif" alt="" />
</div>
</div>
</div>
<div id="admin_bar">
<div id="status">
管理员: 登录     <a href="#">退出</a>
</div>
<div id="channel"></div>
</div>
<div id="main">
<div id="opt_list">
<ul>
<li><a href="admin.jsp">管 理 首 页</a></li>
<li><a href="add_news.jsp">新 闻 发 布</a></li>
<li><a href="admin_themeMaintain.jsp]">主 题 维 护</a></li>
<li><a style="color: red;" href="#">系统账号管理</a></li>
<li><a style="color: red;" href="#">注册用户管理</a></li>
</ul>
</div>
<div id="opt_area">
<h1 id="opt_type">添加新闻:</h1>
<form action="doAddNews.jsp" method="post">
<p>
<label> 主题 </label> <select name="ntid">
<!-- 新闻分类的数据绑定 start -->
<%
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123");
//sql语句
String sql = "select * from tb_news_theme";
//传入方法返回执行对象
PreparedStatement ps = conn.prepareStatement(sql);
//调用方法返回结果集对象
ResultSet rs = ps.executeQuery();
//遍历结果集
while (rs.next()) {
out.println("<option value = '" + rs.getInt(1) + "'>" + rs.getString(2) + "</option>");
}
%>
</select>
</p>
<!-- 新闻分类的数据绑定 end -->
<p>
<label> 标题 </label> <input name="ntitle" type="text"
class="opt_input" />
</p>
<p>
<label> 作者 </label> <input name="nauthor" type="text"
class="opt_input" />
</p>
<p>
<label> 摘要 </label>
<textarea name="nsummary" cols="40" rows="3"></textarea>
</p>
<p>
<label> 内容 </label>
<!-- 通过富文本编辑器插件将textarea显示为富文本编辑器风格 -->
<textarea name="ncontent" cols="70" rows="10" id="ncontent">
</textarea>
<script type="text/javascript">
CKEDITOR.replace("ncontent");
</script>
</p>
<p>
<form enctype="multipart/form-data" action="doFileDemo.jsp"
method="post">
上传图片 <input name="file" type="file"
class="opt_input" />
</p>
<input name="action" type="hidden" value="addnews"> <input
type="submit" value="提交" class="opt_sub" /> <input type="reset"
value="重置" class="opt_sub" />
</form>
</div>
</div>
<!-- 通过jsp中的include指令进行引入第三方页面 -->
<%@ include file="foot.jsp"%>
</body>
</html>
效果如下:
添加成功后将富文本编辑器添加到修改评论网页编辑器中
文件上传
概述
将本地文件上传到服务器端,从服务器端下载文件到本地的过程。例如目前网站需要上传头像、上传下载图片或网盘等功能都是利用文件上传下载功能实现的。
原理
文件上传
(1)客户端浏览器通过文件浏览框,选择需要上传的文件内容(其中包括文件路径及文件内容)。
(2)客户端浏览器通过点击上传按钮,将本地文件上传到服务器端。
(3)服务器端通过程序接收本地文件内容,并将其保存在服务器端磁盘中。
文件下载
(1)客户端浏览器通过点击下载按钮,将服务器端保存的文件下载到本地磁盘。
(2)服务器端通过程序将服务器端文件响应给客户端。
实现方式
SmartUpload组件
Apache CommonsFileUpload组件
Servlet 3.0 文件上传
SmartUpload组件使用
核心类
SmartUpload
概述
该类完成上传下载工作。
上传文件使用的方法
public final void initialize(javax.servlet.jsp.PageContext pageContext)
(1)执行上传下载的初始化工作,必须第一个执行。
(2)pageContext为JSP页面内置对象(页面上下文)
public void upload()
(1)上传文件数据。对于上传操作,第一步执行initialize方法,第二步就要执行这个方法。
public int save(String destPathName)
(1)将全部上传文件保存到指定目录下,并返回保存的文件个数。
public int save(String destPathName,int option)
** 将全部上传文件保存到指定目录下,并返回保存的文件个数。
** option:
** SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下
** AVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下
** SAVE_AUTO则表示由组件自动选择
public Files getFiles()
** 取全部上传文件,以Files对象形式返回,可以利用Files类的操作方法来获得上传文件的数目等信息
public Request getRequest()
** 取得Request对象,以便由此对象获得上传表单参数之值。
public void setAllowedFilesList(String allowedFilesList)
** 设定允许上传带有指定扩展名的文件,当上传过程中有文件名不允许时,组件将抛出异常
public void setDeniedFilesList(String deniedFilesList)
** 用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限制,则上传时组件将抛出异常。
public void setMaxFileSize(long maxFileSize)
** 设定每个文件允许上传的最大长度。
public void setTotalMaxFileSize(long totalMaxFileSize)
** 设定允许上传的文件的总长度,用于限制一次性上传的数据量大小。
下载文件常用的方法
public void setContentDisposition(String contentDisposition)
** 将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,请用此方法。
downloadFile 下载文件
① public void downloadFile(String sourceFilePathName)
** 其中,sourceFilePathName为要下载的文件名(带目录的文件全名)
② public void downloadFile(String sourceFilePathName,String contentType)
** 其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别)。
③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName)
** 其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别),destFileName为下载后默认的另存文件名。
注意事项
(1)表单请求方式必须为POST
(2)设置enctype="multipart/form-data",专用于文件传输
(3)文件标签需设置name属性
Request
概述
这个类的功能等同于JSP内置的对象request。只所以提供这个类,是因为对于文件上传表单,通过request对象无法获得表单项的值,必须通过jspSmartUpload组件提供的Request对象来获取。
常用方法
public String getParameter(String name)。其中,name为参数的名字。
** 获取指定参数之值。当参数不存在时,返回值为null。
public String[] getParameterValues(String name)。其中,name为参数的名字。
** 当一个参数可以有多个值时,用此方法来取其值。它返回的是一个字符串数组。当参数不存在时,返回值为null。
public Enumeration getParameterNames()
** 取得Request对象中所有参数的名字,用于遍历所有参数。它返回的是一个枚举型的对象
File
概述
这个类包装了一个上传文件的所有信息。通过它,可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息。
常用方法
public void saveAs(java.lang.String destFilePathName) 或public void saveAs(java.lang.String destFilePathName, int optionSaveAs)
** destFilePathName是另存的文件名
** optionSaveAs
*** SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件
*** SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件
*** SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存在另存文件的目录时,它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL
public boolean isMissing()
** 这个方法用于判断用户是否选择了文件,也即对应的表单项是否有值。选择了文件时,它返回false。未选文件时,它返回true。
public String getFieldName()
** 取HTML表单中对应于此上传文件的表单项的名字。
public String getFileName()
** 取文件名(不含目录信息)
public String getFilePathName
** 取文件全名(带目录)
public String getFileExt()
** 取文件扩展名(后缀)
public int getSize()
** 取文件长度(以字节计)
public byte getBinaryData(int index)。其中,index表示位移,其值在0到getSize()-1之间。
** 取文件数据中指定位移处的一个字节,用于检测文件等处理。
Files
概述
这个类表示所有上传文件的集合,通过它可以得到上传文件的数目、大小等信息。
常用方法
public int getCount()
** 取得上传文件的数目。
public File getFile(int index)。其中,index为指定位移,其值在0到getCount()-1之间。
** 取得指定位移处的文件对象File(这是com.jspsmart.upload.File,不是java.io.File,注意区分)。
public long getSize()
** 取得上传文件的总长度,可用于限制一次性上传的数据量大小。
public Collection getCollection()
** 将所有上传文件对象以Collection的形式返回,以便其它应用程序引用,浏览上传文件信息。
public Enumeration getEnumeration()
** 将所有上传文件对象以Enumeration(枚举)的形式返回,以便其它应用程序浏览上传文件信息。
需进行导包
演示如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传演示</title>
<style type="text/css">
h1 {
color: plum;
}
</style>
</head>
<body>
<!--
需求:使用SmartUpload组件实现文件上传
图片----保存在web服务器(tomcat中),不是保存在数据库
-->
<h1 align="center">文件上传演示</h1>
<hr />
<form enctype="multipart/form-data" action="doFileDemo.jsp"
method="post">
用户: <input type="text" name="username" /> <br /> <br /> 头像: <input
type="file" name="nfile" /> <input type="submit" value="上传头像" />
</form>
</body>
</html>
<%@page import="com.jspsmart.upload.Request"%>
<%@page import="com.jspsmart.upload.File"%>
<%@page import="com.jspsmart.upload.SmartUpload"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1.实例化SmartUpload组件对象
SmartUpload su = new SmartUpload();
//2.调用初始化组件的方法(钥匙激活)
su.initialize(pageContext);//pageContext内置对象
//3.设置相关要求(允许上传的类型文件,不允许上传的类型文件,限制文件的大小)
//setAllowFilesList 允许上传的文件类型
String allow = "jpg,jpeg,png";
//setDeniedFilesList 不允许上传的文件类型
String denied = "avi,mp4,mp3,wmv,txt";
//setMaxFileSize 设置限制每个文件的最大长度 字节为单位 不是KB
long maxFileSize = 1024 * 1024 * 1024;
//setTotalMaxFileSIze 设置限制总文件的最大长度
long totalMaxFileSize = 1024 * 1024;
try {
//重新设置SmartUpload组件上传文件的编码格式
su.setCharset("UTF-8");
su.setAllowedFilesList(allow);
su.setDeniedFilesList(denied);
su.setMaxFileSize(maxFileSize);
su.setTotalMaxFileSize(totalMaxFileSize);
//4.调用上传的方法 (上传之后,图片暂时存储到内存上)
su.upload();
//5.实际性的保存(最终将图片存储到web服务器中【tomcat】)
//su.getFiles() 获取所有的图片数组 根据下标获取第一个
//获取选中的第一张图片
File file = su.getFiles().getFile(0);
//判断是否选中
String filePath = "upload//";
if (!file.isMissing()) {//选中了文件
//根据选中的文件获取当前的文件名称
String fileName = file.getFileName();
//System.out.println(fileName);
filePath += fileName;
}
//将内存上的文件保存到当前web服务器中 web_10_file的upload文件夹内
file.saveAs(filePath, SmartUpload.SAVE_AUTO);
out.println("上传成功");
System.out.println(filePath);
} catch (Exception e) {
e.printStackTrace();
}
// 通过smartupload组件中提供的request对象获取
//通过smartupload组件提供的request对象获取其它输入项的值
//获取request对象
Request req = su.getRequest();
//获取用户名
String username = req.getParameter("username");
out.println("<hr/>username=" + username);
%>
效果:
最后将文件上传的内容添加到新闻发布系统中的新增新闻和修改新闻中的上传图片部分即可