目录
HttpServletResponse接口
HttpServletResponse是ServletResponse直接子接口
HttpServletResponse是在javax.servlet.http包下 ServletResponse是在javax.servlet包下
HttpServletResponse:tomcat创建servlet对象调用service方法之前自动给我们创建的对象,主要作用是响应数据给浏览器 响应数据包括以下几种类型 文本内容、图片、视频 …
response 组成:响应行、响应头、响应体
响应行
响应行:协议/版本 状态码 状态码描述
最常用的状态码
200:成功
302:重定向
401:未授权
404:资源未找到
405:没有处理当前请求方式的能力
500:服务器代码错误
HTTP协议
概述:http超文本传输协议、是一种基于请求和响应的无状态的应用层tcp协议。
基于请求和响应:请求和响应是成对出现、先有请求后有响应
无状态:浏览器与服务器进行数据交互的时候、浏览器不会记录上次的交互信息
http://localhost/login/login
https://www.baidu.com/
HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer ,是以安全为目标的HTTP通道,简单的讲是HTTP的安全版本,即HTTP下加入SSL层,简称HTTPS。
版本
0.9: 服务器与浏览器只能交互文本内容
1.0: 服务器与浏览器之间允许发送超文本、但是一次只能从服务器获取一个资源
1.1: 服务器与浏览器之间允许发送超文本
Https:主要作用:
1、网站安全的标识
2、可以保证浏览器与服务器数据交互的数据安全
TCP三次握手,因为HTTP是基于TCP协议的,所有也可以认为是HTTP的三次握手:
第一次握手:浏览器给服务器发送一条信息
第二次握手:服务器收到了浏览器发送的信息、此时浏览器并不知道数据已经被服务器接收、服务器会给浏览器响应一条数据通知浏览器已经收到了
第三次握手:浏览器收到了服务器返回的数据、开始数据交互
三次握手根本目的:保证数据的安全性
响应头
概述:服务器通知浏览器的一些信息
响应头信息大全:
https://www.cnblogs.com/wangshuazi/p/9809756.html 更多的头信息
重要的响应头信息:
Content-disposition 通知浏览器以下载方法打开 attachment; fileName=文件名
Content-Type 返回的内容类型 image/jpg vedio/mp4 text/html
location 立马重定向
refresh 定时重定向 5;url=http://www.baidu.com
如何设置响应头
setHeader(key,value) 设置响应头
addHeader(key,value) 添加响应头
区别:
setHeader()一个key 对应一个值如果出现多个key相同、最终最后一个生效
addHeader()一个Key 允许对应多个值
设置模板
响应图片案例
/*
* 响应图片案例
*/
public class Response_Demo04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通知浏览器返回的内容类型
resp.setHeader("content-type", "image/jpg");
//获取资源在服务器中的真实路径
String path = req.getServletContext().getRealPath("/img/娃娃.jpg");
//创建文件字节输入流对象
FileInputStream fis = new FileInputStream(path);
//一次性读取的字节个数
byte arr[] = new byte[1028*8];
int len;//读取到的有效字节个数
//获取响应流
ServletOutputStream fos = resp.getOutputStream();
while((len=fis.read(arr))!=-1) {
//响应回浏览器
fos.write(arr, 0, len);
}
//关闭资源
fos.close();
fis.close();
}
}
文件下载案例
开发download.html
开发rd5这个servlet
/*
* 下载图片案例
*/
public class Response_Demo05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取你要访问的文件名称
String fileName = req.getParameter("fileName");
//通知浏览器以附件下载的形式打开该资源 URLEncoder.encode(str,编码字符集) 对文件名进行编码解决中文文件名乱码问题
resp.setHeader("content-disposition", "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));
//根据你要下载的资源找到该资源在服务器中的真实路径 /img/李小璐.jpg
String path = req.getServletContext().getRealPath("/img/"+fileName);
//创建字节文件输入流对象
FileInputStream fis = new FileInputStream(path);
byte arr[] = new byte[1024*8];
int len;
//获取响应流对象
ServletOutputStream fos = resp.getOutputStream();
while((len=fis.read(arr))!=-1) {
//响应内容
fos.write(arr, 0, len);
}
//关闭资源
fos.close();
fis.close();
}
}
响应体
概述:服务器处理完请求后、返回给浏览器的内容
API:
response.getWrite().print(); 向页面输出文本内容
response.getWrite().write(); 向页面输出文本内容
response.getOutputStream(); 向页面输入流
区别:
print() 原样打印
write() 如果涉及到数字的时候、会将数字变为对应码表上的值打印比如 97打印a
效果
乱码:当我们响应体中包含中文就会乱码
原因:编码和解码方式不一致造成的、页面是utf-8解码、response缓冲区默认编码方式是iso-8859-1
设置response缓冲区编码
resp.setContentType(“text/html;charset=utf-8”); 放在方法中的第一行
一个servlet中不可以同时使用响应文本、和响应流
错误演示
响应表格
/*
* 响应表格
*/
public class Response_Demo07 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
pw.print("<table width='600px' height='200px' border='1px solid'>");
pw.print("<tr><td>姓名</td><td>性别</td><td>年龄</td><td>爱好</td></tr>");
pw.print("<tr><td>pgone</td><td>男</td><td>18</td><td>少妇</td></tr>");
pw.print("<tr><td>罗志祥</td><td>男</td><td>32</td><td>多人运动</td></tr>");
pw.print("<tr><td>宋哲</td><td>男</td><td>39</td><td>经纪人老婆</td></tr>");
pw.print("</table>");
}
}
HttpServletRequest接口
HttpServletRequest是ServletRequest直接子接口
HttpServletRequest是在javax.servlet.http包下 ServletRequest是在javax.servlet包下
HttpServletRequest是在tomcat创建servlet示例的时候在调用service()方法之前自动创建的对象。浏览器与服务器进行通讯、通讯过程中会携带一些信息、这个信息就会被封装到request对象中、我们就可以使用这个对象获取浏览器发送给服务器一些信息
HttpServletRequest:请求行、请求头、请求体(只有在post提交时候才有)
请求行
请求行获取
request.getMethod() 获取请求方法
request.getContextPath() 获取当前项目名称
request.getRequestURL() 获取请求URL(包含协议和端口)
request.getRequestURI() 获取请求URI(不包含协议和端口)
request.getQueryString() 获取地址栏中?后的参数
/*
* 请求行 信息的获取
* request.getMethod() 获取请求方法
request.getContextPath()获取当前项目名称
request.getRequestURL()获取请求URL(包含协议和端口)
request.getRequestURI()获取请求URI(不包含协议和端口)
request.getQueryString()获取地址栏中?后的参数
*/
public class Request_Demo01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
String method = request.getMethod();
System.out.println("请求方法:"+method);
String name = request.getContextPath();
System.out.println("项目名称:"+name);
StringBuffer url = request.getRequestURL();
System.out.println("获取请求URL(包含协议和端口):"+url);
String uri = request.getRequestURI();
System.out.println("获取请求URI(不包含协议和端口):"+uri);
String str = request.getQueryString();
System.out.println("获取地址栏中?后的参数:"+str);
}
}
请求头
概述:浏览器通知服务器的一些信息
API
request.getHeader(key) 根据key获取值
request.getHeaderNames() 获取当前请求中所有的key
代码
/*
* 请求头数据获取
* request.getHeader(key) 根据key获取值
request.getHeaderNames() 获取当前请求中所有的key
*/
public class Request_Demo02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
//获取浏览器的类型
String user_agent = request.getHeader("user-agent");
//获取主机的端口和ip
String host = request.getHeader("host");
System.out.println(user_agent);
System.out.println(host);
System.out.println("=============");
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
//获取的所有的key
String key = (String) headerNames.nextElement();
//根据key获取value
String value = request.getHeader(key);
System.out.println(key+"\t"+value);
}
}
}
请求体
概述:请求体就是浏览器访问服务器所携带的表单域中数据、(只有post请求才有请求体)
请求体:
请求体中如果包含中文、乱码
原因:编码与解码方式不一致 页面采用utf-8编码 request缓冲区默认解码方式iso-8859-1
解决 request.setCharacterEncoding(“utf-8”);
tomcat8.x之后 get提交乱码已经默认解决了
获取请求体数据
API
request.getParameter(key) 根据key获取一个值
request.getParameterValues(key) 根据key 获取多个值
request.getParameterMap()将整个表单的数据封装到Map中去
代码示例
/*
* 请求体参数的获取
* API
request.getParameter(key) 根据key获取一个值
request.getParameterValues(key) 根据key 获取多个值
request.getParameterMap()将整个表单的数据封装到Map中去
*/
public class Request_Demo03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
//解决post提交乱码
request.setCharacterEncoding("UTF-8");
//根据key获取一个值
String name = request.getParameter("name");
System.out.println(name);
//根据key获取一个值
String sex = request.getParameter("sex");
String work = request.getParameter("work");
System.out.println(sex);
System.out.println(work);
//根据key 获取多个值
String[] hobbys = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbys));
//将整个表单的数据封装到Map中去
Map<String, String[]> map = request.getParameterMap();
Set<Entry<String,String[]>> set = map.entrySet();
for (Entry<String, String[]> entry : set) {
System.out.println(entry.getKey()+"\t"+Arrays.toString(entry.getValue()));
}
}
}
文件上传案例
文件上传必要属性
表单 post提交 enctype=“multipart/form-data”
servlet 上必须加注解
@MutiPartConfig
步骤
1、在html文件夹下创建一个上传页面
2、开发upload对应的servlet
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、根据文件名获取提交的文件资源
Part part = req.getPart("fileName");
//2、将文件资源写入到硬盘上 d:upload 文件内
File file = new File("d:/upload");
//如果此文件夹不存在
if(!file.exists()) {
//创建文件夹
file.mkdir();
}
//3、获取文件名称
String fileName = part.getSubmittedFileName();
//4、拼装写入路径 d:/upload/野结衣.avi
String path =file+"/"+fileName;
//5、将文件资源写入到该路径
part.write(path);
}
}