响应一共分为3部分
响应行
响应头
响应主体
响应行: 协议 版本号 | 状态码
状态码
100-199:请求已经到达服务器,但是没有完成,需要再次请求才能完成。
200-299:请求已到达服务器,并且处理完成。(200)
300-399:资源重定向。服务器中发生资料重定向。(302)
400-499:资源找不到 (404)
500-599:服务器同部异常。(500)
请求 request
请求体
获取方法 Map集合 String[] 枚举
1.解析xml dom4j xpath
2.了解http协议 基于TCP
3.request 行 头 体
4.response 行 头 体
request
请求行 http 1.1 连接地址 提交方式
getMethod getProtocal() getUrl()....
请求头
getHeader()
请求体
getParamter() getParamterMap() getParamterNames/values()
response 响应
响应行
协议 版本号 状态码 200:响应成功 302:重定向 404:未找到资源 500:服务器异常 代码
响应头
response.setHeader(,); response.setContentType() response.setContentLength()
响应体
response.getOutputStream() response.getWriter()
login.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<form action="login" method="get">
用户名:<input name="username"/><br/>
密码:<input name="password"/><br/>
<input type="submit" value="登录"/>
</form>
</center>
</body>
</html>
LoginServlet.java:
package text.web.servlet;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
System.out.println(name);
//response.sendError(404); 设置状态码
//response.setStatus(int sc); 设置状态码
//response.sendError(404, "过时了..."); 设置状态码和返回的信息
//response.setContentLength(1000); 修改响应长度
//response.setContentType("text/html;charset=gbk"); 输出格式
//response.setContentLength(800); 修改响应长度
//response.setHeader("Content-Language", "En,zh"); 设置响应体的语言
//加上状态码
//response.setStatus(302);
//response.setHeader("Location", "welcom.html"); 跳转到页面,需要提前设置好状态码为300-399
//response.setHeader("refresh", "2;url=http://www.baidu.com"); 过2秒跳转到网站(定时刷新)
//-------------------------请求行-------------------------------
//获取请求方式
String method = request.getMethod();
//获取项目路径(一般用第二个,从http开始,比较全)
String uri = request.getRequestURI();
StringBuffer sb = request.getRequestURL();
//获取get方式请求行参数
String str = request.getQueryString();
//获取协议
String protocol = request.getProtocol();
System.out.println("请求方式:"+method);
System.out.println("uri:"+uri);
System.out.println("url:"+sb.toString());
System.out.println("请求行参数:"+str);
System.out.println("请求协议:"+protocol);
//zhangsan
//请求方式:GET
//uri:/day12/login
//url:http://localhost:8080/day12/login
//请求行参数:username=zhangsan&password=123
//请求协议:HTTP/1.1
//--------------------请求头---------------------------
String connVale = request.getHeader("Connection");
System.out.println(connVale);
//keep-alive
Enumeration<String> names = request.getHeaderNames();
//遍历
while(names.hasMoreElements()) {
String na = names.nextElement();
String value = request.getHeader(na);
System.out.println(na+"...."+value);
}
//host....10.10.92.183:8080 (主机地址)
//connection....keep-alive
//upgrade-insecure-requests....1
//user-agent....Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 (内核)
//accept....text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
//referer....http://10.10.92.183:8080/day12/login.html
//accept-encoding....gzip, deflate (编码格式)
//accept-language....zh-CN,zh;q=0.9
//-------------------------请求体--------------------------
//request.getParameter(name)
Map<String, String[]> map = request.getParameterMap();
Set<Entry<String, String[]>> entrySet = map.entrySet();
for(Entry<String, String[]> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue()[0];
System.out.println(key+"..."+value);
}
//username...aaa
//password...12
//request.getParameterNames();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
案例:通过Header显示服务器的图片
IO流(客户端浏览器以流的形式的显示图片或者文件)
要求:告诉浏览器一个文件类型
response.setHeader("Content-Type","jpg");
案例:通过Header下载服务器的图片
Content-Disposition 下载
响应主体的应最多一共是两个
response.getOutputStream() :字节 字符
response.getWriter() :字符
image.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="img">获取童梦的图片</a>
</body>
</html>
ImageServlet.java:
package text.web.servlet;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setHeader("Content-Type", "text/html;charset=utf-8");
//浏览器默认支持一些能解析的类型 图片 文档
//response.setHeader("Content-Type", "jpg");
//response.setHeader("Content-Type", "t");
//告诉浏览器不要解析了,下载(不能显示)
response.setHeader("Content-Disposition", "attachment;filename=mv.jpg");
//1.输入流
InputStream is = ImageServlet.class.getClassLoader().getResourceAsStream("meinv.jpg");
//2.输出流
ServletOutputStream sos = response.getOutputStream();
//3.通过输出流一点点将流传递给浏览器
//定义一个容器
byte[] buf = new byte[1024];
//定义一个长度
int len = 0;
while((len=is.read(buf))!=-1) {
sos.write(buf, 0, len);
}
is.close();
sos.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}