双方在交互、通信的时候, 遵照的一种规范、规则。css
针对网络上的客户端 与 服务器端在执行http请求的时候,遵照的一种规范。 其实就是规定了客户端在访问服务器端的时候,要带上哪些东西, 服务器端返回数据的时候,也要带上什么东西。html
版本java
1.0web
请求数据,服务器返回后, 将会断开链接
1.1算法
请求数据,服务器返回后, 链接还会保持着。 除非服务器 | 客户端 关掉。 有必定的时间限制,若是都空着这个链接,那么后面会本身断掉。
在地址栏中键入网络地址 回车 或者是日常注册的时候,点击了注册按钮 , 浏览器都能显示出来一些东西。那么背地里到底浏览器和服务器是怎么通信。 它们都传输了哪些数据。浏览器
安装抓包工具 HttpWatch (IE插件)缓存
打开tomcat. 输入localhost:8080 打开首页tomcat
在首页上找到Example 字样安全
6.x 和 7.x 的文档页面有所不一样,可是只要找到example就可以找到例子工程服务器
4.选择 servlet 例子 ---> Request Parameter
接着点击Request Parameters 的 Execute超连接
执行tomcat的例子,而后查看浏览器和 tomcat服务器的对接细节
请求的数据里面包含三个部份内容 : 请求行 、 请求头 、请求体
请求行
POST /examples/servlets/servlet/RequestParamExample HTTP/1.1 POST : 请求方式 ,以post去提交数据 /examples/servlets/servlet/RequestParamExample 请求的地址路径 , 就是要访问哪一个地方。 HTTP/1.1 协议版本
请求头
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */* Referer: http://localhost:8080/examples/servlets/servlet/RequestParamExample Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 31 Connection: Keep-Alive Cache-Control: no-cache Accept: 客户端向服务器端表示,我能支持什么类型的数据。 Referer : 真正请求的地址路径,全路径 Accept-Language: 支持语言格式 User-Agent: 用户代理 向服务器代表,当前来访的客户端信息。 好比经过此信息把手机电脑登陆的同一个网页进行不一样显示 Content-Type: 提交的数据类型。通过urlencoding编码的form表单的数据 Accept-Encoding: gzip, deflate : 压缩算法 。 Host : 主机地址 Content-Length: 数据长度 Connection : Keep-Alive 保持链接 Cache-Control : 对缓存的操做
请求体
浏览器真正发送给服务器的数据
发送的数据呈现的是key=value ,若是存在多个数据,那么使用 & firstname=zhang&lastname=sansan
请求的数据里面包含三个部份内容 : 响应行 、 响应头 、响应体
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=ISO-8859-1 Content-Length: 673 Date: Fri, 17 Feb 2017 02:53:02 GMT ...这里还有不少数据...
响应行
HTTP/1.1 200 OK 协议版本 状态码 我们此次交互究竟是什么样结果的一个code. 200 : 成功,正常处理,获得数据。 403 : for bidden 拒绝 404 : Not Found 500 : 服务器异常 OK 对应前面的状态码
响应头
Server: 服务器是哪种类型。 Tomcat Content-Type : 服务器返回给客户端你的内容类型 Content-Length : 返回的数据长度 Date : 通信的日期,响应的时间
post
1. 数据是以流的方式写过去,不会在地址栏上面显示。 如今通常提交数据到服务器使用的都是POST 2. 以流的方式写数据,因此数据没有大小限制。
get
1. 会在地址栏后面拼接数据,因此有安全隐患。 通常从服务器获取数据,而且客户端也不用提交上面数据的时候,可使用GET 2. 可以带的数据有限, 1kb大小
在http协议当中,规定了请求和响应双方, 客户端和服务器端。与web相关的资源。
有两种分类
静态资源
html 、 js、 css
动态资源
servlet/jsp
其实就是一个java程序,运行在咱们的web服务器上,用于接收和响应 客户端的http请求。
更多的是配合动态资源来作。 固然静态资源也须要使用到servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet
得写一个Web工程 , 要有一个服务器。
测试运行Web工程
1. 新建一个类, 实现Servlet接口 2. 配置Servlet , 用意: 告诉服务器,咱们的应用有这么些个servlet。 在webContent/WEB-INF/web.xml里面写上如下内容。 <!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫作HelloServlet , 具体的路径是com.itheima.servlet.HelloServlet --> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet</servlet-class> </servlet> <!-- 注册servlet的映射。 servletName : 找到上面注册的具体servlet, url-pattern: 在地址栏上的path 必定要以/打头 --> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> 3. 在地址栏上输入 http://localhost:8080/项目名称/a
Servlet (接口) | | GenericServlet | | HttpServlet (用于处理http的请求)
从建立到销毁的一段时间
从建立到销毁,所调用的那些方法。
init方法
在建立该servlet的实例时,就执行该方法。 一个servlet只会初始化一次, init方法只会执行一次 默认状况下是 : 初次访问该servlet,才会建立实例。
service方法
只要客户端来了一个请求,那么就执行这个方法了。 该方法能够被执行不少次。 一次请求,对应一次service方法的调用
destroy方法
servlet销毁的时候,就会执行该方法 1. 该项目从tomcat的里面移除。 2. 正常关闭tomcat就会执行 shutdown.bat
doGet 和 doPost不算生命周期方法,所谓的生命周期方法是指,从对象的建立到销毁必定会执行的方法, 可是这两个方法,不必定会执行。
默认状况下,只有在初次访问servlet的时候,才会执行init方法。 有的时候,咱们可能须要在这个方法里面执行一些初始化工做,甚至是作一些比较耗时的逻辑。
那么这个时候,初次访问,可能会在init方法中逗留过久的时间。 那么有没有方法可让这个初始化的时机提早一点。
在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 通常不写负数, 从2开始便可。
<servlet> <servlet-name>HelloServlet04</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet04</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
Servlet的配置,经过这个对象,能够获取servlet在配置的时候一些信息
先说 , 在写怎么用, 最后说有什么用。
//1. 获得servlet配置对象 专门用于在配置servlet的信息 ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name 的文本内容 String servletName = config.getServletName(); System.out.println("servletName="+servletName); //二、。 能够获取具体的某一个参数。 String address = config.getInitParameter("address"); System.out.println("address="+address); //3.获取全部的参数名称 Enumeration<String> names = config.getInitParameterNames(); //遍历取出全部的参数名称 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); }
将来咱们本身开发的一些应用,使用到了一些技术,或者一些代码,咱们不会。 可是有人写出来了。它的代码放置在了本身的servlet类里面。
恰好这个servlet 里面须要一个数字或者叫作变量值。 可是这个值不能是固定了。 因此要求使用到这个servlet的公司,在注册servlet的时候,必需要在web.xml里面,声明init-params
在开发当中比较少用。
刚才的这个实验, 但愿基础好或者感兴趣的同窗,回去本身作一下。
Http协议
1. 使用HttpWacht 抓包看一看http请求背后的细节。 2. 基本了解 请求和响应的数据内容 请求行、 请求头 、请求体 响应行、响应头、响应体 3. Get和Post的区别
Servlet【重点】
1. 会使用简单的servlet 1.写一个类,实现接口Servlet 2. 配置Servlet 3. 会访问Setvlet 2. Servlet的生命周期 init 一次 建立对象 默认初次访问就会调用或者能够经过配置,让它提早 load-on-startup service 屡次,一次请求对应一次service destory 一次 销毁的时候 从服务器移除 或者 正常关闭服务器 3. ServletConfig 获取配置的信息, params
HelloServlet
package com.itheima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class HelloServlet implements Servlet{ public void service1(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("helloServlet..."); } @Override public void destroy() { // TODO Auto-generated method stub } public ServletConfig getServletConfig1() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } public void init1(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub } }
HelloServlet02
package com.itheima.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet02 extends HttpServlet { //Get请求会来这个方法 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get---"); } //POST请求会来这个方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post----"); } }
HelloServlet03
package com.itheima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; /** * 该servlet 用于演示servlet的生命周期调用时机 */ public class HelloServlet03 implements Servlet{ //一、 //在建立该servlet的实例时,就执行该方法。 //一个servlet只会初始化一次, init方法只会执行一次 //默认状况下是 : 初次访问该servlet,才会建立实例。 @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloServlet03 初始化..."); } //2. /* * 只要客户端来了一个请求,那么就执行这个方法了。 * 该方法能够被执行不少次。 一次请求,对应一次service方法的调用 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("helloservlet03 service方法调用了"); } /** * servlet销毁的时候,就会执行该方法 * * 1. 该项目从tomcat的里面移除。 * 2. 正常关闭tomcat就会执行 shutdown.bat */ @Override public void destroy() { System.out.println("helloservlet03 destroy方法调用了"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } }
HelloServlet04
package com.itheima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; /** * 该servlet 用于让servlet建立实例的时机提早。 */ public class HelloServlet04 implements Servlet{ //一、 //在建立该servlet的实例时,就执行该方法。 //一个servlet只会初始化一次, init方法只会执行一次 //默认状况下是 : 初次访问该servlet,才会建立实例。 @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloServlet04 初始化..."); } //2. /* * 只要客户端来了一个请求,那么就执行这个方法了。 * 该方法能够被执行不少次。 一次请求,对应一次service方法的调用 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("HelloServlet04 service方法调用了"); } /** * servlet销毁的时候,就会执行该方法 * * 1. 该项目从tomcat的里面移除。 * 2. 正常关闭tomcat就会执行 shutdown.bat */ @Override public void destroy() { System.out.println("HelloServlet04 destroy方法调用了"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } }
HelloServletConfig
package com.itheima.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServletConfig extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletConfig 能够获取servlet在配置的一些信息 //1. 获得servlet配置对象 专门用于在配置servlet的信息 ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name 的文本内容 String servletName = config.getServletName(); System.out.println("servletName="+servletName); //二、。 能够获取具体的某一个参数。 String address = config.getInitParameter("address3333"); System.out.println("address="+address); System.out.println("----------------------------------"); //3.获取全部的参数名称 Enumeration<String> names = config.getInitParameterNames(); //遍历取出全部的参数名称 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); } } //来了post请求,就让它去执行doGet方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
package com.itheima.config; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SerlvetConfigDemo extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 获取该servlet配置的参数。 ServletConfig config = getServletConfig(); String number = config.getInitParameter("number"); if(number == null){ throw new IllegalArgumentException("servlet在配置的时候,必定要写number这个参数。。"); }else{ System.out.println("number...."); } } private com.itheima.config.ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }