课程笔记Day43
- 上传和下载
- JQuery
第一章 上传和下载
第01节 上传操作
1、方案一
要求:
前端页面:
form 表单的要求:
1、提交方式必须是 post 提交。
2、需要指定表单的类型 enctype="multipart/form-data"
3、需要指定 input 标签的 type="file" name="xxx"
后端实现:
Servlet 当中的实现
1、在Servlet当中需要指定注解 @MultipartConfig
2、获取到 part 的值, 采用请求进行获取 Part p =req.getPart("xxx");
3、写数据到指定路径 p.write("路径");
代码:
位置 web/upload/upload01.jsp
<%--
http://localhost:8080/JavaWebDay21/upload/upload01.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传版本1</title>
</head>
<body>
<h1> 文件上传版本1 - Part 原始版本 </h1>
<form
method="post"
enctype="multipart/form-data"
action="${pageContext.request.contextPath}/UpLoad01Servlet">
<input type="text" name="username" placeholder="普通文本"> <br>
<input type="file" name="upfile" placeholder="选择你需要上传的文件"> <br>
<input type="submit" value="提交数据到服务器">
</form>
</body>
</html>
位置: src/blb.chc02.UpLoad01Servlet
/***
* 强调: 这里需要加上注解 @MultipartConfig 表示支持 part提交的方式
*/
@WebServlet("/UpLoad01Servlet")
@MultipartConfig
public class UpLoad01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad01Servlet.doGet");
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad01Servlet.doPost");
//获取到数据,获取到普通文本框的数据
String username = req.getParameter("username");
System.out.println("username = " + username);
//获取到文件的数据。文件需要通过 getPart("xxx") 获取
Part p = req.getPart("upfile");
//获取到文件的名称
String fileName = p.getSubmittedFileName();
//获取到准备存放文件的路径
String path = req.getServletContext().getRealPath("/");
System.out.println("path = " + path);
//准备写数据
p.write(path + "/" + fileName);
}
}
2、方案二
要求:
前端页面:
form 表单的要求:
1、提交方式必须是 post 提交。
2、需要指定表单的类型 enctype="multipart/form-data"
3、需要指定 input 标签的 type="file" name="xxx"
后端实现:
导入两个 jar 包:
1、commons-fileupload-1.3.1.jar
2、commons-io-2.4.jar
Servlet 当中的实现
1、在Servlet当中操作流程:
A. 磁盘工厂 DiskFileItemFactory
B. 上传文件对象 ServletFileUpload
C. 表单项集合 List<FileItem>
2、对集合进行遍历,获取得到FileItem
A. 判断是否是 普通的文本输入框 fileItem.isFormField()
B. 判断是否不为 普通文本输入框,那么就是 上传的输入框
代码:
位置 web/upload/upload02.jsp
<%--
http://localhost:8080/JavaWebDay21/upload/upload02.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传版本2</title>
</head>
<body>
<h1> 文件上传版本2 - FileUpload 版本 </h1>
<form
method="post"
enctype="multipart/form-data"
action="${pageContext.request.contextPath}/UpLoad02Servlet">
<input type="text" name="username" placeholder="普通文本"> <br>
<input type="file" name="upfile" placeholder="选择你需要上传的文件"> <br>
<input type="submit" value="提交数据到服务器">
</form>
</body>
</html>
位置 src/blb.chc02.UpLoad02Servlet
@WebServlet("/UpLoad02Servlet")
public class UpLoad02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad02Servlet.doGet");
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad02Servlet.doPost");
try {
//定义一个普通的方法,用于接收请求和响应,作为文件上传的操作
upload(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
//自己定义的文件上传的方法,这里可能存在异常,为了让大家看代码更加舒服一点
protected void upload(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//判断一下,是否是文件上传的表单, 如果不是文件上传的类型,则直接返回
if (!ServletFileUpload.isMultipartContent(req)) {
return;
}
//流程: 磁盘工厂 DiskFileItemFactory --> 上传文件对象 ServletFileUpload --> 表单集合 List<FileItem>
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload load = new ServletFileUpload(factory);
List<FileItem> fileItems = load.parseRequest(req);
//针对于集合,进行循环遍历
for (FileItem item : fileItems) {
//判断当前的类型是否是普通文本类型,只有两种类型:1、普通文本,2、文件类型 type="file"
if (item.isFormField()) {
//如果是普通文本类型,只需要得到键和和值
String name = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(name + " = " + value);
}else{
//如果是文件的类型,需要得到文件的名称
String name = item.getName();
//准备上传的路径,上传文件之后,保存文件的路径
String path = req.getServletContext().getRealPath("/");
System.out.println("path = " + path);
//创建文件的对象
File f = new File(path,name);
//存放文件
item.write(f);
}
}
}
}
第02节 下载操作
1、方案一
要求:
前端页面:
可以使用超链接,完成下载的功能。
1、直接在超链接上面添加 download 属性,就可以完成下载。同时还可以指定下载的文件名称
2、如果当前的超链接标签,不能被浏览器解析,则直接判定为下载的操作
代码:
位置 web/download/download01.jsp
<%--
http://localhost:8080/JavaWebDay21/download/download01.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>下载的操作-超链接完成下载</title>
</head>
<body>
<h1> 超链接完成下载功能 </h1>
<h3> 展示界面 </h3>
如果不能正常解析的文件,则直接判定为下载。<br><hr>
<a href="face.png"> 展示图片 </a> <br>
<a href="hello.txt"> 展示文本 </a> <br>
<a href="Demo.zip"> 展示压缩包,无法解析则下载 </a> <br>
<a href="chui.mp3"> 展示音乐 </a> <br>
<h3> 下载界面 </h3>
指定 download属性可以实现下载,如果想要指定名称,则指定download的属性值。<br><hr>
<a href="face.png" download> 下载图片 </a> <br>
<a href="hello.txt" download>下载文本 </a> <br>
<a href="Demo.zip"> 下载压缩包 </a> <br>
<a href="chui.mp3" download="大风吹.mp3"> 下载音乐 </a> <br>
</body>
</html>
2、方案二
要求:
后端页面:
直接响应一段浏览器无法识别的操作,浏览器会自动帮我们下载。可以去设置响应头的信息。
1、设置响应头信息:
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachement;filename="+filename);
2、采用IO流读写数据
FileInputStream is = new FileInputStream("路径或者对象");
ServletOutputStream os = response.getOutputStream();
代码:
位置 web/download/download02.jsp
<%--
http://localhost:8080/JavaWebDay21/download/download02.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>采用后端代码完成下载</title>
</head>
<body>
<h1>后端代码完成下载功能</h1>
文件列表信息如下:
<ul>
<li> chui.mp3 </li>
<li> Demo.zip </li>
<li> face.png </li>
<li> hello.txt </li>
</ul>
<form method="get" action="${pageContext.request.contextPath}/DownLoad02Servlet">
<input type="text" name="filename" placeholder="请输入上述的文件名称">
<input type="submit" value="提交则完成下载">
</form>
</body>
</html>
位置:src/blb.chc03.DownLoad02Servlet
@WebServlet("/DownLoad02Servlet")
public class DownLoad02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DownLoad02Servlet.doGet");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DownLoad02Servlet.doPost");
//可以获取到请求的参数
String filename = req.getParameter("filename");
//可以获取到资源文件的路径
String path = req.getServletContext().getRealPath("/download");
//封装成为File对象
File f = new File(path,filename);
//判断文件如果不存在,则直接返回
if (!f.exists()){
System.out.println("文件不存在... "+f);
return;
}
//如果文件存在,则响应文件到浏览器当中
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition","attachement;filename="+filename);
//获取流对象
FileInputStream is = new FileInputStream(f);
ServletOutputStream os = resp.getOutputStream();
//读写操作
byte[] array = new byte[1024];
int len;
while ((len = is.read(array))!=-1){
os.write(array,0,len);
os.flush();
}
//释放资源
os.close();
is.close();
}
}
第二章 JQuery
第01节 基础理论
1、概念说明
1. 什么是 JQuery ? 有什么作用呢?
JQuery 是一个前端的框架,封装了一堆的 JavaScript 的代码。
JQuery 可以实现 "用最少的代码,做最多的事情" 简化 JavaScript 的书写效果。
2、快速入门
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JQuery的快速入门</title>
</head>
<body>
<div id="divid">
嘻嘻,我是div,你是啥?
</div>
<hr>
<!-- 引入JQuery代码 -->
<script src="jquery-3.3.1.min.js"></script>
</body>
</html>
<script>
/*
方式1:采用 JavaScript 完成实现,采用ES6版本实现
*/
let divElement = document.querySelector("#divid");
document.write("输出对象:<br>");
document.write(divElement+"<br>");
document.write("输出对象的内容值:<br>");
document.write(divElement.innerHTML+"<br>");
document.write("<hr>");
/*
方式2:采用JQuery 方式实现
*/
let divJqElement = $("#divid");
document.write("输出对象:<br>");
document.write(divJqElement+"<br>");
document.write("输出对象的内容值:<br>");
document.write(divJqElement.html()+"<br>");
</script>
第02节 基础语法
1、对象转换
需求:
现在想要使用彼此的功能,JavaScript 当中,想要去使用 JQuery的功能。例如: html()
又想要在 JQuery 里面去使用 JavaScript 的功能。例如 innerHtml 属性
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象转换</title>
</head>
<body>
<div id="divid">
嘻嘻,我是div,你是啥?
</div>
<hr>
<!-- 引入JQuery代码 -->
<script src="jquery-3.3.1.min.js"></script>
</body>
</html>
<script>
//1. 把 JavaScript的对象,转换成为 JQuery 的对象
let divJs01Element = document.querySelector("#divid");
//使用js当中的属性
document.write(divJs01Element.innerHTML + "<br>");
//转换成为 JQuery
let divJq01Element = $(divJs01Element);
document.write(divJq01Element.html() + "<br>");
document.write("<hr>");
//2. 把 JQuery 的对象,转换成为 JavaScript 的对象
let divJq02Element = $("#divid");
//使用Jq当中的函数
document.write(divJq02Element.html() + "<br>");
//转换成为JS
let divJs02Element = divJq02Element[0];
document.write(divJs02Element.innerHTML+"<br>");
//转换成为JS
let divJs022Element = divJq02Element.get(0);
document.write(divJs022Element.innerHTML+"<br>");
</script>
小结
1. JavaScript ---> JQuery:
let JQuery的对象 = $(JS的对象);
2. JQuery ---> JavaScript
方式一: let JS的对象 = JQuery的对象[索引值];
方式二: let JS的对象 = JQuery的对象.get(索引值);
2、事件处理
语法:
1. 事件的使用
$("选择器").事件的名称(function(){
.....
})
2. 事件的绑定和解绑
A. 绑定事件
JQuery的对象.on(事件的名称,执行的功能);
B. 解绑事件
JQuery的对象.off(事件的名称);
3. 事件支持链式调用,例如:
$("选择器").事件的名称(function(){
.....
}).事件的名称(function(){
.....
});
案例1:点击显示和点击隐藏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JQuery的事件处理1</title>
</head>
<body>
<button id="showbtn">点我展示妹子</button>
<button id="hiddenbtn">点我隐藏妹子</button>
<br><hr>
<img src="../image/meinv01.png" width="320" height="560" id="picid">
<script src="jquery-3.3.1.min.js"></script>
</body>
</html>
<script>
//设置点击显示按钮的时候,图片展示
$("#showbtn").click(function () {
//通过css样式去控制显示
$("#picid").css("display","block");
});
//设置点击隐藏按钮的时候,图片隐藏
$("#hiddenbtn").click(function () {
//通过css样式去控制隐藏
$("#picid").css("display","none");
});
</script>
案例2:事件的绑定和解绑操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JQuery的事件处理2</title>
</head>
<body>
<button id="showbtn">点我展示妹子</button>
<button id="hiddenbtn">点我隐藏妹子</button>
<button id="bindbtn">事件的绑定</button>
<button id="unbindbtn">事件的解绑</button>
<br>
<hr>
<img src="../image/meinv01.png" width="320" height="560" id="picid">
<script src="jquery-3.3.1.min.js"></script>
</body>
</html>
<script>
//设置点击显示按钮的时候,图片展示
$("#showbtn").click(function () {
//通过css样式去控制显示
$("#picid").css("display", "block");
});
//设置点击隐藏按钮的时候,图片隐藏
$("#hiddenbtn").click(function () {
//通过css样式去控制隐藏
$("#picid").css("display", "none");
});
//设置点击 事件绑定按钮之后,给隐藏按钮 绑定事件。
$("#bindbtn").click(function () {
//通过css样式去控制显示
$("#hiddenbtn").on("click",function () {
//通过css样式去控制隐藏
$("#picid").css("display", "none");
});
alert("点击了绑定...");
});
//设置点击 事件解绑按钮之后,给隐藏按钮 解绑事件。
$("#unbindbtn").click(function () {
//通过css样式去控制显示
$("#hiddenbtn").off("click");
alert("点击了解绑...");
});
</script>
案例3:事件的链式调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件处理3</title>
</head>
<body>
<!-- 鼠标移入小图,则大图展示,鼠标移出小图,则大图消失 -->
<img src="../image/meinv_small.png" id="smallid" width="120" height="160">
<img src="../image/meinv_big.png" id="bigid" width="480" height="640" style="display: none">
<script src="jquery-3.3.1.min.js"></script>
</body>
</html>
<script>
$("#smallid").mouseover(function () {
//展示大图的效果
$("#bigid").css("display","block");
}).mouseout(function () {
//隐藏大图的效果
$("#bigid").css("display","none");
});
</script>