Web学习历程记录(九)
案例一:完成文件下载
HttpServletReaponse概述
在Servlet API中,定义了一个HttpServletReaponse接口,它继承自SeveletResponse接口,专门用来封装HTTP响应消息
Http响应消息分为响应行,响应消息头,消息体三部分
对应的在该接口中定义了向客户端发送响应状态码、响应头、响应体的方法
操作响应三部分
操作响应行
一般是第一行
常用的状态码:
200:成功
302:重定向
304:访问缓存
404:客户端错误
500:服务器错误
操作响应头
一个key可以对应多个value,也可以对应一个value
掌握的方法:setHeader(String key,String value)
常用的响应头:
Refresh:定时跳动
Location:重定向
Content-Disposition:设置文件下载时候的头
Content-Type:设置响应内容的MIME类型
响应体
文件下载方式
第一种:超链接方式
直接将服务器上的文件的路径写到href属性中,如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开,不再下载了
第二种:手动编码方式
手动编码实现下载,无论浏览器是否识别该格式,都会下载
手动编码格式要求
设置两个头和一个流
两个头:
Content-Dispostion:浏览器识别该格式文件,提示浏览器下载
Content-Type:文件类型(MIME类型)
一个流:
获得要下载的文件的输入流
import sun.misc.BASE64Encoder;
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.*;
import java.net.URLEncoder;
@WebServlet("/downloadServletDemo01")
public class DownloadServletDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("fileName");
System.out.println("fileName = " + fileName);
String realPath = getServletContext().getRealPath("/download/" + fileName);
InputStream is = new FileInputStream(realPath);
response.setHeader("Content-Disposition","attachment;filename=" + fileName);
String mimeType = getServletContext().getMimeType(fileName);
response.setHeader("Content-Type",mimeType);
ServletOutputStream os = response.getOutputStream();
byte[] bs = new byte[1024];
int len;
while ((len = is.read(bs))!= -1){
os.write(bs,0,len);
}
os.close();
is.close();
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>文件下载</h1>
<h3>超链接方式</h3>
<!--超链接方式下载文件,直接将文件的路径写入到href中即可。但是如果浏览器支持文件格式(jpg,png)会直接打开,不会再进行下载-->
<a href="download/WEB01.zip">web01.zip</a><br/>
<a href="download/a.jpg">a.jpg</a>
<h3>编码方式</h3>
<a href="downloadServletDemo01?fileName=a.jpg">a.jpg</a><br/>
<a href="downloadServletDemo01?fileName=WEB01.zip">web01.zip</a><br/>
<a href="downloadServletDemo01?fileName=美女.jpg">美女.jpg</a>
</body>
</html>
Response其他操作
定时刷新
response.setHeader("refresh","秒数";url = 跳转的路径);//几秒之后跳转到指定的路径上
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html ;charset = utf-8");
response.getWriter().write("5秒后跳转");
response.setHeader("refresh", "5; url = http://www.baidu.com");
}
重定向
重定向是两次请求
重定向地址栏路径改变
重定向路径写绝对路径
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("1");
System.out.println("111");
response.sendRedirect("http://localhost:8080/servletDemo02");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("222");
System.out.println("2");
}
向页面输出内容
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type","text/html;charset=utf-8");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("你好".getBytes("utf-8"));
案例二:网站的登陆案例
request操作请求三部分
获取客户机信息(操作请求行)
请求方式 请求路径(url) 协议版本
POST /day17Request/WEB01/register.htm?username=zs&password=123456 HTTP/1.1
getMethod():获取请求方式
getRemoteAddr():获取客户机的IP地址
getContextPath():获得当前应用工程名
getRequestURI():获得请求地址,不带主机名
getRequestURL():获得请求地址,带主机名
getServerPort():获得服务端的端口
getQueryString();获得请求参数(get请求的,URL的?后面的 eg:username=zs&password=123456)
获得请求头信息(操作请求头)
getHeader(String name)
user-Agent:浏览器信息
Referer:来自哪个网站(防盗链)
接受相关参数(操作请求体)
String getParameter(String name)
获得指定参数对应的值,没有返回null,如果有多个则获得第一个
String[] getParameterValues(String name)
获得指定参数名对应的所有的值。此方法专业为复选框提供的
Map getParameterMap()
获得所有的请求参数
使用BeanUtils封装
设置一个登陆页面准备提交表单数据(username,password)
导入BeanUtils相关jar包
创建Servlet获取请求参数
调用BeanUtils.populate方法封装数据
总结
转发
request.getRequestDispatcher(url).forward(request,response);
转发和重定向区别:
转发是一次请求,重定向是二次请求
转发地址栏路径不变。重定向地址栏路径改变了
转发的路径只能写当前项目的内部路径,重定向可以内部可以外部
request域对象存取的值在转发中是有效的,在重定向无效
作为域对象存取值
ServletContext:范围 整个应用
request: 范围 一次请求有效
域对象是一个容器,这种容器主要用于Servlet与Servlet/JSP之间的数据传输使用的