Servlet文件的上传|下载
文件上传
在上传界面中:upload.jsp
在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的请求方式为
POST;其次我们的 form 表单的 enctype 必须设为"multipart/form-data",即
enctype=“multipart/form-data”,意思是设置表单的类型为文件上传表单。默认情况下这个表单类
型是 “application/x-www-form-urlencoded”, 不能用于文件上传。只有使用了multipart/form-data 才
能完整地传递文件数据。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="uploadServlet" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname">
<br>
文件:<input type="file" name="myfile">
<br>
<input type="submit" value="上传"/>
</form>
</body>
</html>
在servlet中:FileLoad:
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
@WebServlet("/uploadServlet")
@MultipartConfig // 如果是文件上传表单,一定要加这个注解
public class Fileload extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String uname = req.getParameter("uname");
Part part = req.getPart("myfile");
String fileName = part.getSubmittedFileName();
String realPath = req.getServletContext().getRealPath("/");
//part.write("D:\\"+fileName);可以直接指定路径
part.write(realPath+fileName);
}
}
注意点:
1、上传提交方式必须是post,编码格式必须是"multipart/form-data"
method=“post” enctype=“multipart/form-data”
2、Servlet中添加注解:@MultipartConfig
3、注意Servlet版本
4、注意上传位置
文件下载
两种下载方式
1、在html中使用a标签自带的功能下载:
下载
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="test01.txt">a标签测试下载1</a>
<hr>
<a href="test01.txt" download>a标签测试下载2</a>
<hr>
<a href="test01.txt" download="download">a标签测试下载3</a>
</body>
</html>
2、使用Servlet下载:
a标签中区别:
<a href="downFile?FileName=test01.txt download/>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="downFile?FileName=test01.txt" download="download">txt文件下载测试</a>
<hr>
<a href="downFile?FileName=photo.png" download="download">png文件下载测试</a>
<hr>
<a href="downFile?FileName=003.mp4" download="download">mp4文件下载测试</a>
</body>
</html>
Servlet中:FileDown:
注意:
// 设置响应类型 (浏览器无法使用某种方式或激活某个程序来处理的类型)
resp.setContentType("application/x-msdownload");
// 设置头信息
resp.setHeader("Content-Disposition", "attachment;filename="+file);
代码:
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/downFile")
public class FileDown extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//获取文件下载路径
String path = getServletContext().getRealPath("/");
//获取下载文件名
String fileName = req.getParameter("FileName");
//搭接路径
File file=new File(path+"/"+fileName);
//判断文件是否存在,是否是一个文件
if(file.exists() && file.isFile()){
// 设置响应类型 (浏览器无法使用某种方式或激活某个程序来处理的类型)
resp.setContentType("application/x-msdownload");
// 设置头信息
resp.setHeader("Content-Disposition", "attachment;filename="+file);
//流式操作进行文件下载
FileInputStream in = new FileInputStream(file);
ServletOutputStream ou = resp.getOutputStream();
byte[] arr=new byte[1024];
int len=-1;
while ((len=in.read(arr))!=-1){
ou.write(arr,0,len);
}
ou.flush();
ou.close();
in.close();
System.out.println("文件下载成功");
}else {
System.out.println("文件下载失败");
}
}
}
Cookie
1、概述:Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行
处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服
务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常见
的记住密码则可以通过 Cookie 来实现。
2、实现
通过 new Cookie(“key”,“value”);来创建一个 Cookie 对象,
Cookie 的格式:键值对用“=”链接,多个键值对间通过“;”隔开。
Cookie cookie=new Cookie("cookie","zheshiyigeCookie");
同名Cookie问题
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。
3 存储
浏览器存放Cookie的数量不同的浏览器对Cookie也有限定,Cookie的存储有是上限的。Cookie是存储在客户端(浏览 器)的,而且一般是由服务器端创建和设定。后期结合Session来实现回话跟踪。
4、安全性(不安全)
最大的原因是因为它存储在浏览器端(用户本地),一些别有用心的人能够通过浏览器截获cookie(脚本、利用工具抓取等)
5、cookie分类
瞬时Cookie 【默认,session级别】
持久化Cookie -->可用setMaxAge()来设置持续时间
到期时间的取值
负整数
若为负数,表示不存储该 cookie。
cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那
么 cookie 就会消失。
正整数
若大于 0 的整数,表示存储的秒数。
表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算
关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。
零
若为 0,表示删除该 cookie。
cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存
了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内
存中,还是在客户端硬盘上都会删除这个 Cookie。
6、Cookie的路径
//与路径绑定
cookie.setPath("/");
7、Cookie中的各种方法
//创建cookie
Cookie cookie=new Cookie("cookie","zheshiyigeCookie");
//设置cookie持久性
cookie.setMaxAge(1*24*60*60);
//添加cookie
resp.addCookie(cookie);
//与路径绑定
cookie.setPath("/");
//获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie ck :
cookies) {
System.out.println(ck.getName()+"----"+ck.getValue());
}
//响应到服务器
resp.sendRedirect("cookieTest.jsp");
注意:
- Cookie保存在当前浏览器中。
在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这
些信息就无效了。而且 cookie 还不能跨浏览器。 - Cookie存中文问题
Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过
URLDecoder.decode()来进行解码。
String name = "姓名";
String value = "张三";
// 通过 URLEncoder.encode()来进行编码
name = URLEncoder.encode(name);
value = URLEncoder.encode(value);
// 创建Cookie对象
Cookie cookie = new Cookie(name,value);
// 发送Cookie对象
response.addCookie(cookie);
// 获取时通过 URLDecoder.decode()来进行解码
URLDecoder.decode(cookie.getName());
URLDecoder.decode(cookie.getValue());
JSP
MVC模式
- M:model javaBean
- V:view html,jsp.freemarker
- C:controller servlet…
JSP java server page
jsp就是一种特殊的Servlet
1、三种脚本
- <%! 成员变量%>
- <% 局部变量 %>
- <%= 原样输出 %>
2、页面包含
静态包含(包含多个页面会出错)
<%@ include file="……"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@ include file="common.jsp"%>
<hr>
<%--<%@ include file="common.jsp"%>--%>
<hr>
<%
//int age=200;
%>
include.jsp!
</body>
</html>
动态包含(可以包含多个页面,包含页面和被包含页面是2个文件)
<jsp include file="……"/>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="common.jsp"/>
<jsp:include page="common.jsp"/>
<jsp:include page="common.jsp"/>
<jsp:include page="common.jsp"/>
<hr>
jsp include 动态包含
</body>
</html>
3、EL表达式
1、
所
有
E
L
表
达
式
的
格
式
都
是
以
“
{} 所有EL表达式的格式都是以“
所有EL表达式的格式都是以“ {}”表示。
2、作用域取值
默认从最小作用域查找
可以指定作用域,在指定的作用域查找
3、四个内置对象
- pageScope
- requestScope
- sessionScope
- applicationScope
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("name","lisi"); // request作用域
pageContext.setAttribute("uname","zhangsan"); // page作用域
session.setAttribute("uname","wangwu"); // session作用域
application.setAttribute("uname","zaholiu"); // application
%>
<hr>
${requestScope.uname }<<<<<
</body>
</html>
4、jsp九大内置对象
1.PageContext javax.servlet.jsp.PageContext JSP的页面容器
2.request javax.servlet.http.HttpServletrequest 获取用户的请求信息
3.response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
4.session javax.servlet.http.HttpSession 用来保存每一个用户的信息
5.application javax.servlet.ServletContext 表示所有用户的共享信息
6.config javax.servlet.ServletConfig 服务器配置信息,可以取得初始化参数
7.out javax.servlet.jsp.jspWriter 页面输出
8.page java.lang.object)
9.exception java.lang.Throwable