HTTP协议
超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议。HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到请求后,给予相应的响应信息。先请求后响应。
Http请求协议包括:请求行、请求头、请求体。Http响应协议包括:响应行、响应头、响应体。
请求行:请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请方方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
- GET:当客户端要从服务器中读取某个资源时,使用GET 方法。
- POST:当客户端给服务器提供信息较多时可以使用POST 方法,POST 方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。
请求头: 通知服务器有关于客户端请求的信息,典型的请求头有:
- User-Agent:产生请求的浏览器类型;
- Accept:客户端可识别的响应内容类型列表
- Accept-Language:客户端可接受的自然语言;
- Accept-Encoding:客户端可接受的编码压缩格式;
- Accept-Charset:可接受的应答的字符集
- Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机
- connection:连接方式(close 或 keepalive)
- Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie
请求包体:请求包体不在 GET 方法中,而是在POST 方法中使用,需要填写表单的场合,所有POST更安全
如下图
http请求
请求行:POST /index.jsp HTTP/1.1
GET /get.html?name=xiaoming&passWord=123456 HTTP/1.1
(请求方式 资源路径 协议/版本)
请求头:
Host:localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests:1
User-Agent: Chrome/58.0.3029.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html, application/xhtml +xml, application/xml;q=0.9,image/webp,*/*;q=0.8
Refhrer: http://1ocalhost:8080/post. html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.8, en;q=0.6
Cookie: Idea-cf2f8ff1=49d3921e-2812-464b-b68b-6c54c9b5cbc7.
JSESSIONID=8990466BFC3DCC6778D2A03630270A7D
请求体:name=xiaoming&passWord=123456 (GET请求没有请求体)
响应行:响应行由 HTTP 协议版本字段、状态码和状态码的描述文本 3 个部分组成,他们之间使用空格隔开; 状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示:
- 1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;
- 2xx:表示服务器已成功接收到请求并进行处理;
- 3xx:表示服务器要求客户端重定向;
- 4xx:表示客户端的请求有非法内容;
- 5xx:表示服务器未能正常处理客户端的请求而出现意外错误;
响应头:
- Allow 服务器支持哪些请求方法(如GET、POST等)
- Content-Encoding 文档的编码(Encode)方法。
- Content-Length 表示内容长度。
- Content-Type 表示后面的文档属于什么MIME类型。
- Date 当前的GMT时间。
响应体:服务器向浏览器返回的html正文
如下图
http响应
响应行:HTTP/1.1 200 OK
(协议/版本 状态码 状态码描述)
200 请求成功 302 请求重定向 400请求错误语法错误 403权限不够 404 资源不存在 500 服务器内部错误
响应头:
Accept-Ranges:bytes
ETag:W/"413-1495617981796"
Last-lModified:Wed,24 May 2017 09:26:21 GMT
Content-Type:text/html
Content-Length:413
Date:Wed,24 May 2017 09:29:37 GMT
响应体:服务器向浏览器返回的html正文
Servlet
Servlet是javaWEB的核心,简单的说就是用Java编写的服务器端程序。用户进行一个动态请求(静态请求就是直接请求HTML )时,实际上是请求—个servlet。在HTTP请求过程中会把请求的参数存放在请求行的URL中,或者是请求体中,这个参数需要服务器来接收解析并处理,Servlet就是用来处理这个过程的。
Service()方法根据请求方法调用对应的处理方法doPost()或doGet(),还有一些其他的请求方法doPut(),doDELETE()…但这些方法不常用,
一个Servlet 2.0
1.继承HttpServlet
2.复写HttpServlet中的doGet()、doPost()
3.配置web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>httphello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
4.部署项目并通过浏览器访问servlet
一个Servlet 3.0
注解:
@WebServlet(name = "TestServlet",urlPatterns = "/hello")
HttpServletRequest
在Servlet的API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用于封装HTTP的请求,由于HTTP请求包含着请求行、请求头和请求体三部分,因此在HttpServletRequest中分别定义了接收请求行、请求头和请求体的相关方法。
请求行:
request.getMethod(); //请求方式
request.getRequetURI(); //request.getRequetURL() 请求资源
request.getProtocol(); //请求http协议版本
request.getRemoteAddr(); //发出请求客户端IP地址
request.getLocalAddr(); //服务器接收请求的IP地址
request.getRemotePort(); //访问客户端的端口号
请求头:
request.getHeader("name") //根据name,获取对应请求头数据
request.getHeaderNames() //获取所有的请求头名称返回类型Enumeration
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
System.out.println(name+":"+request.getHeader(name));
}
请求参数:
request.getParameter("参数名"); //根据参数名获取参数值(注意,只能获取一个值的参数)
request.getParameterValue("参数名“); //根据参数名获取参数值(可以获取多个值的参数)
request.getParameterNames(); //获取所有参数名称列表 返回类型Enumeration
request.getParameterMap(); //该方法用于将请求中的所有参数和值装入一个map对象然后返回
1.访问html文件(html中action提交的Servlet)
2.调用对应的Servlet中的方法,获取html中对应参数的内容
3.输出在对应位置。
HttpServletResponse
在Servlet的API中,定义了个HttpServletResponse接口,它继承自ServletResponse接口,专门用于封装HTTP的响应,由于HTTP响应包含着响应行、响应头和响应体三部分,因此在HttpServletResponse中分别定义了发送响应行、响应头和响应体的相关方法。
响应行:
setStatus(int status); //状态码200
sendError(int code); //错误信息的状态码404
响应成功了,需要第一个,sendError是返回页面的。
响应头:
百度
响应消息体:
由于在HTTP响应消息中,大量的数据都是通过响应体传递的,因此ServletResponse遵循以I0流传递大数据的设计理念,定义了两个与输出流相关的方法,具体如下:
1.getoutputStream()方法:该方法获取的字节流输出对象为ServletOutputStream类型,它是0utputStream的子类,因此可以直接输出字节数组中的二进制数据。
2.getWrite()方法:该方法获得的字符输出流对象是PrintWriter类型由于它可以直接输出文本类型,因此要输出网页文档,需要使用这个方法
Servlet生命周期
servlet生命周期包括加载和实例化、 初始化、 处理请求 以及服务结束。
第一次:
判断Servlet实例是否存在?
> 装载Servlet类并创建实例
> 调用init(ServletConfig)方法
> 调用service(ServletRequest,ServletResponse)方法
> 调用对应的doGet doPost方法
服务器关闭?
>调用destroy()方法。
第二次:
判断Servlet实例是否存在?
> 调用service(ServletRequest,ServletResponse)方法
Servlet启动时,开始加载servlet生的周期开始。Servlet 被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service 方法自动派遣运行与请求对应的doXXX方法(doGet, doPost) 等,当服务器决定将实例销毁的时候(服务器关闭)调用其destroy方法。
注意:Servlet实例是单例的,即无论请求多少次Servlet,最多只有一个Servlet实例,如果是多个客户端并发,同时访问Servlet的时候,服务器会启动多个线程分别执行Servlet的service方法
原因:如果我们每次访问都创健一个Servlet实例,会占用和浪费过多的计算机资源
servlet中forward()与redirect()的区别
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,后者则是完全的跳转,浏览器(客户端)将会得到跳转的地址,并重新发送请求链接。Forward 还是原来的请求,而redirect是重新发起请求。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward)方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到另一个其它服务器上的资源,则必须使用sendRedirect0方法。forward()是一次请求一次响应,redirect()是两次请求两次响应。
forward是服务器的转向而redirect是客户端的转向
jsp内置对象
9个内置的对象:
- request 用户端请求,此请求会包含来自GET/POST请求的参数
- response 网页传回用户端的回应
- pageContext 管理网页的属性
- session 与请求有关的会话期
- application servlet 正在执行的内容
- out 用来传送回应的输出
- config servet 的构架部件
- pageISP 网页本身
- exception 针对错误网页,未捕捉的例外
四大作用城: pageContext request session application可以通过istl从四大作用域中取值、jsp传递值request session application cookie也能传值
Cookie、Session会话
request无法完成多个Servlet数据共享,ServletContext可以但是不能为每个客户端保存数据。
Cookie
将数据存储在客户端的本地,在本地清除后,数据消失。存储在response中的响应头中set-cookie。请求其他Servlet时通过request携带cookie在请求头中带过去
Session
session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当访问浏览器请求http地址时,将传递到web服务器上并与访问信息进行匹配, 当关闭网站时就表示会话已经结束,网站无法访问该信息了,所以它无法保存永久数据,我们无法访问以及禁用网站
Session和Cookie的区别
- cookle 数据存放在客户的浏览器上,session 数据放在服务器上
- cookie 不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session
- session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个COOKIE
Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat的目录结构
- bin………………………………可执行程序(脚本),启动停止调试Tomcat的一些bat.sh
- conf…………………………….配置文件 webx.ml server.xml 等
- lib………………………………Tomcat运行需要的jar包
- logs…………………………….曰志文件
- temp…………………………….临时文件
- webapps………………………WEB 程序(编译后的项目文件)
- work…………………………….将jsp文件生成java文件在此目录进行