Servlet&HTTP&Reques&Response快速入门
servlet相关配置
URLPattern:servlet访问路径
一个servlet可以定义多个访问路径
1
@WebServlet({"/d4","/dd4","/ddd4"})
路径规则:
- /xxx:路径匹配
- /xxx/xx:多层路径,目录结构
- *.do:拓展名匹配
HTTP
概念
Hyper Text Transfer Protocol超文本传输协议。何谓协议?即定义了两个设备之间传输信息的格式。
特点
- 默认端口号是80
- 基于请求/响应模型的:一次请求对应一次响应
- 无状态的,每次请求之间相互独立,不能交互数据
3.版本
- 1.0:每一次请求相应都会建立新的连接
- 1.1:复用连接
请求消息数据格式
请求行
1
GET /login.html HTTP/1.1
HTTP协议中有7种请求方法,常用的有2种
GET
- 请求参数在请求行中,在url后?连接
- 请求的url长度有限制
- 不太完全
POST
- 请求参数在请求体中
- 请求的url长度没有限制
- 相对安全
请求头
User-agent
浏览器告诉服务器,我的浏览器的版本信息
Referer
高速浏览器我从哪里来
可以防止盗链、进行统计工作
请求空行
空行,用于分隔post请求头和请求体。
请求体(正文)
post请求方式请求数据存放的地方
举例:
1
2
3
4
5
6
7
8
9
10
11POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
username=zhangsan
响应消息数据格式(略)
Request
Resquest功能
主要用户获取请求消息数据
获取请求行数据 GET /day14/demo1?name=zhangsan HTTP/1.1
- getMethod 获取请求方法GET
- getContextPath获取虚拟路径/day14
- getServletPath获取servlet路径/demo1
- getQueryString获取Get请求参数name=zhangsan
- getRequestURI获取请求URI/day14/demo1
- getProtocol获取协议及版本HTTP/1.1
- getRemoteAddr获取客户机IP地址
获取请求头数据
- getHeader(String name)
- getHeaderNames():获取所有的请求头名称
获取请求体数据
getReader获取流对象后获取
其他功能
获取请求参数通用方法
- String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
- String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
- Enumeration
getParameterNames():获取所有请求的参数名称 - Map<String,String[]> getParameterMap():获取所有参数的map集合
中文乱码问题
1 | request.setCharacterEncoding("utf-8"); |
请求转发
1 | request.getRequestDispatcher.forward(ServletRequest request,ServletResponse response) |
特点
- 转发只是一次请求
- 只能转发到当前服务器内部资源中
- 浏览器地址栏不发生变化
共享数据
域对象:在一定的作用范围内共享数据
request域:在一次请求中的数据共享范围
1
2
3setAttribute() 存储数据
getAttribute()获取数据
removeAttribute移除数据
ServletContext
(在Response下详细学习)
1 | ServletContext getServletContext() |
案例-登录
链接:案例-登录
Response
HTTP协议响应
请求消息:客户端发送给服务器的数据
- 请求行
- 请求头
- 请求空行
- 请求体
响应消息:服务端发送给客户端的消息
响应行
组成
协议/版本 响应状态码 状态码描述
响应状态码
1xx:服务端接受客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2xx:成功,200
3xx:重定向。302重定向。304访问缓存
4xx:客户端错误
404请求路径没有对应的资源
405请求方式没有对应的doxxx方法
5xx:服务端错误500服务端内部异常
响应头
Content-Type:服务端告诉客户端本次响应体的数据格式以及编码格式
Content-disposition:服务端高数客户端以什么格式打开相应数据
–inline默认
–attachment;filename=xxx 以附件方式打开
1
response.setHeader("content-disposition","attachment;filname=111");
响应空行
响应体:传输的数据
响应内容实例
1
2
3
4
5
6
7
8
9
10
11
12
13HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>
Response对象
设置响应消息
设置响应行
格式:HTTP/1.1 200 OK
设置状态码:setStatus
设置响应头
setHeader(String name, String value)
设置响应体
1.获取输出流getWriter或者getOutputStream
2.使用输出流
重定向
1
2
3
4
5//response.setStatus(302);//1. 设置状态码为302
// response.setHeader("location","/day/servletDemo3"); //2.设置响应头location
//上面的写法的简介
response.sendRedirect("/day/servletDemo3");
重定向和转发区别
- 重定向特点
- 地址栏发生变化
- 重定向可以访问其他站点
- 重定向是两次请求,不能用request域类共享数据
- 转发特点
- 转发地址路径不变
- 是一次请求
- 转发只能访问当前服务器的资源
访问路径
相对路径
比如./index.html
./当前目录
../后退一级目录
绝对路径
比如 http://localhost/day14/demo
或者 /day14/demo
路径使用
客户端使用
需要添加虚拟目录,虚拟目录动态获取
1
request.getContextPath()
服务器使用
不需要添加虚拟目录,一般转发时用
服务器输出字符数据到浏览器
步骤
获取字符输出流 -> 输出数据
乱码问题
设置响应头
1
response.setContentType("text/html;charset=utf-8");
案例-验证码
链接:验证码案例
ServletContext对象
概念
代表整个web应用,可以和程序的容器(服务器)通信
获取
request获取
1
request.getServletContext();
HttpServlet获取
1
this.getServletContext();
功能
获取MIME类型
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型
text/html image/jpeg
获取方式
1
getMimeType(String file)
域对象:共享数据
- setAttribute
- getAttribute
- removeAttribute
ServletContext对象的范围:所有用户请求的数据,个人理解是所有的servlet之间共享数据
获取文件的真实(服务器)路径
1
2
3
4
5
6String b = context.getRealPath("/b.txt");//web目录下资源访问
System.out.println(b);
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println(c);
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(a);
案例-文件下载
文件下载需求
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件下载
链接 文件下载-案例