目录
获取请求时的部分路径(从项目的站点名称开始,到“?”前面结束)
实现Servlet
1.创建普通的Java类
2.实现Servlet的规范,继承HttpServlet
3.重写service方法,用来处理请求
4.设置注解,指定访问的路径(以下方式任选其一)
@WebServlet("/ser01") (最常用)@WebServlet(name = "Servlet01",value = "/ser01")
@WebServlet(name = "Servlet01",value = {"/ser01","/ser001"})
@WebServlet(name = "Servlet01",urlPatterns = {"/ser01","/ser001"})
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ser01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//打印内容在控制台
System.out.println("Hello Servlet!");
//通过流输出数据到浏览器
resp.getWriter().write("Hello Servlet!");
}
}
-
Servlet方法
-
就绪/服务方法(处理请求数据)
系统方法,服务器自动调用
当有请求到达Servlet时,就会调用该方法,方法可以被多次调用。
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet被调用了.....");
}
-
销毁方法
系统方法,服务器自动调用
当服务器关闭或应用程序停止时,调用该方法,方法只会执行一次。
@Override
public void destroy() {
System.out.println("Servlet被销毁了.....");
}
-
初始化方法
系统方法,服务器自动调用
当请求到达Servlet容器时,Servlet容器会判断该Servlet对象是否存在,如果不存在,则创建实例并初始化,方法只会执行一次。
@Override
public void init() throws ServletException {
System.out.println("Servlet被创建了.....");
}
-
HttpServletRequest对象
常用方法
获取请求时的完整路径(从http开始,到“?”前面结束)
request.getRequestURL();
获取请求时的部分路径(从项目的站点名称开始,到“?”前面结束)
request.getRequestURI();
获取请求时的参数字符串(从“?”后面开始,到最后的字符串)
request.getQueryString();
获取请求方式(GET和POST)
request.getMethod();
获取当前协议的版本(HTTP/1.1)
request.getProtocol();
获取项目的站点名(项目对外访问路径)
request.getContextPath();
获取请求的参数
获取指定名称的参数值
request.getParameter("参数名");
获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
request.getParameterValues("参数名");
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*常用方法*/
//获取请求时的完整路径(从http开始,到“?”前面结束)
String url = request.getRequestURL() + "";
System.out.println("获取请求时的完整路径:" + url);
//获取请求时的部分路径(从项目的站点名称开始,到“?”前面结束)
String uri = request.getRequestURI() + "";
System.out.println("获取请求时的部分路径:" + uri);
//获取请求时的参数字符串(从“?”后面开始,到最后的字符串)
String queryString = request.getQueryString();
System.out.println("获取请求时的参数字符串:" + queryString);
//获取请求方式(GET和POST)
String method = request.getMethod();
System.out.println("获取请求方式:" + method);
//获取当前协议的版本(HTTP/1.1)
String protocol = request.getProtocol();
System.out.println("获取当前协议的版本:" + protocol);
//获取项目的站点名(项目对外访问路径)
String webapp = request.getContextPath();//上下文路径
System.out.println("获取项目的站点名:" + webapp);
/*获取请求的参数*/
//获取指定名称的参数值
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
System.out.println("uname" + uname + ",upwd" + upwd);
//获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
String[] hobbys = request.getParameterValues("hobby");
//判断数组是否为空
if (hobbys != null && hobbys.length > 0) {
for (String hobby : hobbys){
System.out.println("爱好:"+hobby);
}
}
}
}
请求乱码问题
请求方式 | Tomcat8以上版本 | Tomcat7及以下版本 |
---|---|---|
GET请求 | 不会乱码 | 会乱码 new String(req.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8"); |
POST请求 | 会乱码,通过设置服务器解析编码格式,req.setCharacterEncoding("UTF-8"); | 会乱码,通过设置服务器解析编码格式,req.setCharacterEncoding("UTF-8"); |
POST请求:无论什么版本中文都会乱码req.setCharacterEncoding("UTF-8");
1.req.setCharacterEncoding("UTF-8");只针对POST请求
2.new String(req.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");针对任何形式请求,但数据本身不乱码使用会乱码
请求转发
request.getRequestDispatcher(url).forward(request,response);
可以让请求从服务端跳到客户端(或跳转到指定Servlet)
特点:
1.服务端行为
2.地址栏不发生改变
3.从始至终只有一个请求
4.request数据可以共享
request作用域
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。(请求转发跳转时有效)
设置域对象的内容
request.setAttribute(String name,Object value);
获取域对象内容
request.getAttribute(String name);
删除域对象内容
request.removeAttribute(String name);
-
HttpServletResponse对象
响应数据
response.getWriter(); 字符输出流(输出字符串)
response.getOutputStream() 字节输出流(输出一切数据)
两种流不可同时使用,同时使用会报错
package com.xxxx.servlet;
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.IOException;
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//getWriter() 字符输出流(输出字符串)
//获取字符输出流
/* PrintWriter writer=response.getWriter();
writer.write("Hello");*/
//getOutputStream() 字节输出流(输出一切数据)
//得到字节输出流
ServletOutputStream out=response.getOutputStream();
//输出
out.write("Hi".getBytes());
}
}
字符流响应数据乱码
原因:
响应必定乱码,服务端编码默认使用ISO-8859-1格式,该编码不支持中文
解决:
1.设置服务端编码格式
response.setCharacterEncoding("UTF-8");
2.设置客户端的编码格式
response.setHeader("content-type","text/html;charset=UTF-8");
总结:设置服务端和客户端的编码都支持中文,且保持一致
同时设置服务端和客户端编码格式:
response.setContentType("text/html;charset=UTF-8");
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/s02")
public class Servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*//设置服务端编码格式
response.setCharacterEncoding("UTF-8");
//设置客户端的编码格式
response.setHeader("content-type","text/html;charset=UTF-8");*/
//同时设置服务端和客户端编码格式
response.setContentType("text/html;charset=UTF-8");
//getWriter() 字符输出流(输出字符串)
//获取字符输出流
PrintWriter writer=response.getWriter();
writer.write("<h2>你好</h2>");
}
}
字节流响应数据乱码
原因:
服务端与客户端编码不一致解决:
同时设置服务端和客户端编码格式:
response.setContentType("text/html;charset=UTF-8");
package com.xxxx.servlet;
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.IOException;
@WebServlet("/s03")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//同时设置服务端和客户端编码格式
response.setContentType("text/html;charset=UTF-8");
//getOutputStream() 字节输出流(输出一切数据)
//得到字节输出流
ServletOutputStream out=response.getOutputStream();
//输出
out.write("<h2>你好</h2>".getBytes("UTF-8"));
}
}
重定向
response.sendRedirect("重定向地址");
特点:
1.服务端指导,客户端行为
2.存在两次请求
3.地址栏会发生改变
4.request对象不共享
重定向与请求转发的区别
1.请求转发的地址啦不会发生改变,重定向的地址栏会发生改变
2.请求转发只有一次请求,重定向有两次请求
3.请求转发时request对象可共享,重定向时request对象不共享
4.请求转发是服务端行为,重定向是客户端行为
5.请求转发时的地址只能是当前站点(项目)下的资源,重定向可以是任何地址
-
Cookie对象
cookie的创建和发送
cookie的创建
Cookie cookie=new Cookie("参数名","参数值");
cookie的发送
response.addCookie(cookie);
package com.xxxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cook01")
public class Cookie01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Cookie的创建
Cookie cookie=new Cookie("name","admin");
//发送Cookie对象
response.addCookie(cookie);
}
}
cookie的获取
Cookie[] cookies=request.getCookies();
返回的是cookie数组。
package com.xxxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cook02")
public class Cookie02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Cookie的获取
Cookie[] cookies=request.getCookies();
//判断cookie是否为空
if(cookies!=null&&cookies.length>0){
//遍历cookie数组
for (Cookie cookie : cookies) {
//获取cookie的名称和值
String name=cookie.getName();
String value=cookie.getValue();
System.out.println("名称:"+name+"值:"+value);
}
}
}
}
cookie的到期时间
负整数
默认值-1,表示只在浏览器中存活,关闭浏览器失效
正整数
表示存活指定秒数,会将数据存在硬盘中
零
表示删除cookie
package com.xxxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cook03")
public class Cookie03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*到期时间:负整数(默认值-1,表示只在浏览器中存活,关闭浏览器失效)*/
Cookie cookie=new Cookie("uname1","zhangsan");
cookie.setMaxAge(-1);//关闭浏览器失效
response.addCookie(cookie);
/*到期时间:正整数(表示存活指定秒数,会将数据存在硬盘中)*/
Cookie cookie2=new Cookie("uname2","lisi");
cookie2.setMaxAge(30);//存活30秒
response.addCookie(cookie2);
/*到期时间:零(表示删除cookie)*/
Cookie cookie3=new Cookie("uname3","wangwu");
cookie3.setMaxAge(0);//删除cookie
response.addCookie(cookie3);
}
}
cookie的注意点
1.cookie只在当前浏览器中有效(不跨浏览器和电脑)
2.cookie不能存中文
如果一定要存中文,则需要通过URLEncoder.encode()方法进行编码,获取时通过URLDecoder.decode()方法进行解码
3.如果出现同名的cookie对象则会覆盖
4.cookie的存储数量是有上限的,不同浏览器上限不同。cookie的大小也是有限制的,在4KB左右
package com.xxxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
@WebServlet("/cook04")
public class Cookie04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Cookie存中文
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);
//获取cookie时,通过URLEncoder.encode()进行解码
Cookie[] cookies = request.getCookies();
//判断非空
if (cookies != null&&cookies.length>0) {
//遍历
for (Cookie cookie1 : cookies) {
//解码
System.out.println(URLDecoder.decode(cookie1.getName()));
System.out.println(URLDecoder.decode(cookie1.getValue()));
}
}
//将原来已有的cookie对象重新设置
Cookie cookie2=new Cookie("name","zhangsan");
response.addCookie(cookie2);
}
}
cookie的路径
1.当前服务器下任何项目的任意资源都可获取cookie对象
设置路径为“/”,表示当前服务器下任何项目都可访问cookie对象
2.当前项目下的资源可获取cookie对象(默认不设置cookie的path)
默认不设置cookie的path,或设置为当前站点名
3.指定项目下的资源可获取cookie对象
设置为指定项目的站点名
4.指定目录下的资源可获取cookie对象
设置为指定项目目录下的资源总结:只有访问的路径中包含cookie对象的path值,才可以获取到该cookie对象
package com.xxxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
@WebServlet("/cook05")
public class Cookie05 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*当前服务器下任何项目的任意资源都可获取cookie对象*/
Cookie cookie01=new Cookie("cookie01","cookie01");
//设置路径为“/”,表示当前服务器下任何项目都可访问cookie对象
cookie01.setPath("/");
response.addCookie(cookie01);
/*当前项目下的资源可获取cookie对象(默认不设置cookie的path)*/
Cookie cookie02=new Cookie("cookie02","cookie02");
//默认不设置cookie的path,或设置为当前站点名
cookie02.setPath("/cookie04");
response.addCookie(cookie02);
/*指定项目下的资源可获取cookie对象*/
Cookie cookie03=new Cookie("cookie03","cookie03");
//设置为指定项目的站点名
cookie03.setPath("/servlet03");
response.addCookie(cookie03);
/*指定目录下的资源可获取cookie对象*/
Cookie cookie04=new Cookie("cookie04","cookie04");
//设置为指定项目目录下的资源
cookie04.setPath("/cookie04/cook02");
response.addCookie(cookie04);
}
}
-
HttpSession对象
Session对象
获取Session对象
当获取session对象时会判断session对象是否存在,如果存在,则获取session对象;如果不存在,则创建session对象。
HttpSession session=request.getSession();
获取session的会话标识符
session.getId();
获取session的创建时间
session.getCreationTime();
获取最后一次访问时间
session.getLastAccessedTime();
判断是否是新的session对象
session.isNew();
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/ses01")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session对象
HttpSession session=request.getSession();
//获取session的会话标识符
String id=session.getId();
System.out.println(id);
//获取session的创建时间
System.out.println(session.getCreationTime());
//获取最后一次访问时间
System.out.println(session.getLastAccessedTime());
//判断是否是新的session对象
System.out.println(session.isNew());
}
}
Session域对象
设置域对象
session.setAttribute("属性名","属性值");获取域对象
session.getAttribute("属性名");移除域对象
session.removeAttribute("属性名");
request和session的作用域
请求转发
一次请求
request作用域有效
session作用域有效
重定向
两次请求
request作用域无效
session作用域有效
Session的销毁
1.默认到期时间
tomcat默认30分钟无操作销毁
2.手动设置到期时间
通过session.setMaxInactiveInterval(int);设置最大不活动时间,单位为秒
通过session.getMaxInactiveInterval();方法来查看最大不活动时间
3.立即销毁
session.invalidate();让session立即失效
4.关闭浏览器失效
session底层依赖cookie,cookie默认只在浏览器内存中存活,关闭浏览器即失效
5.关闭服务器失效
session销毁
-
ServletContext对象
获取ServletContext对象
1.通过request对象获取
request.getServletContext();
2.通过session对象获取
request.getSession().getServletContext();
3.通过ServletConfig对象获取
getServletConfig().getServletContext();
4.通过Servlet直接获取
getServletContext();
常用方法:
1.获取当前服务器的版本信息
request.getServletContext().getServerInfo();
2.获取项目的真实路径
request.getServletContext().getRealPath("/");
package com.xxxx.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过request对象获取
ServletContext servletContext1=request.getServletContext();
//通过session对象获取
ServletContext servletContext2=request.getSession().getServletContext();
//通过ServletConfig对象获取
ServletContext servletContext3= getServletConfig().getServletContext();
//直接获取
ServletContext servletContext4=getServletContext();
//常用方法
//1.获取当前服务器的版本信息
String serverInfo=request.getServletContext().getServerInfo();
System.out.println("当前服务器的版本信息:"+serverInfo);
//2.获取项目的真实路径
String realPath=request.getServletContext().getRealPath("/");
System.out.println("项目的真实路径:"+realPath);
}
}
-
文件上传
前台代码
文件上传
1.准备表单
2.设置表单的提交类型为POST请求 method="POST"
3.设置表单类型为文件上传表单 enctype="multipart/form-data"
4.设置文件提交的地址
5.准备表单元素
1.普通的表单项 type="text"
2.文件项 type="file"
6.设置表单元素的name属性值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="uploadServlet">
姓名:<input type="text" name="uname"><br>
文件:<input type="file" name="myfile"><br>
<button>提交</button>
</form>
</body>
</html>
后台代码
文件上传需要添加注解@MultipartConfig
(需要JDK1.8、Dynamic Web Module 3.0才可以使用。
如果版本较低那么只能使用Apache的jar包,也就是现在SpringMVC中支持的文件上传。)
将POST请求封装成Part对象。
package com.xxx.servlet;
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 UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("文件上传....");
//设置请求的编码格式
request.setCharacterEncoding("UTF-8");
//设置普通表单项(获取参数)
String uname=request.getParameter("uname");
System.out.println("uname:"+uname);
//获取Part对象
Part part=request.getPart("myfile");
//通过Part对象得到上传的文件名
String fileName=part.getSubmittedFileName();
System.out.println("上传的文件名:"+fileName);
//得到文件存放的路径
String filePath=request.getServletContext().getRealPath("/");
System.out.println("文件存放的路径"+filePath);
//上传文件到指定目录
part.write(filePath+"/"+fileName);
}
}
-
文件下载
前台代码
超链接下载
当使用超链接(a标签)时,如果遇到浏览器能识别的资源,会显示内容,否则会进行下载。
download属性
通过download属性规定浏览器进行下载,设置download的属性值可以作为文件名
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<!--浏览器能识别的资源-->
<a href="download/test.txt">文本文件</a>
<a href="download/1.jpg">图片文件</a>
<!--浏览器不能识别的资源-->
<a href="download/test.zip">压缩文件</a>
<hr>
<a href="download/test.txt" download>文本文件</a>
<a href="download/1.jpg" download="图片.jpg">图片文件</a>
<hr>
<form action="downloadServlet">
文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
<button>下载</button>
</form>
</body>
</html>
后台代码
1.需要通过response.setContentType方法设置Content-type头字段的值为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,
例如"application/octet-stream"或 "application/x-msdownload"等。
2.需要通过response.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名"
3.读取下载文件,调用response.getOutputStream方法向客户端写入附件内容。
package com.xxx.servlet;
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;
import java.io.InputStream;
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("文件下载....");
//设置请求的编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取参数(得到要下载的文件名)
String fileName=request.getParameter("fileName");
//参数的非空判断 trim()去除字符串前后空格
if (fileName == null||"".equals(fileName.trim())) {
response.getWriter().write("请输入要下载的文件名");
response.getWriter().close();
return;
}
//得到图片存放的路径
String path=request.getServletContext().getRealPath("/download/");
//通过路径得到file对象
File file=new File(path+fileName);
//判断文件对象是否存在,并且是标准文件
if(file.exists()&&file.isFile()){
//设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的MIME类型)
response.setContentType("application/x-msdownload");
//设置响应头
response.setHeader("Content-Disposition","attachment;filename=" + fileName);
//得到fil文件的输入流
InputStream inputStream=new FileInputStream(file);
//得到字节输出流
ServletOutputStream outputStream=response.getOutputStream();
//定义byte数组
byte[] bytes=new byte[1024];
//定义长度
int len=0;
//循环输出
while ((len=inputStream.read(bytes))!=-1){
//输出内容
outputStream.write(bytes,0,len);
}
//关闭资源
outputStream.close();
inputStream.close();
}else{
response.getWriter().write("文件不存在,请重试!");
response.getWriter().close();
}
}
}