Http协议:
什么是协议?
双方在交互,通讯的时候,遵守的一种规范
http协议:
针对网络上的客户端 与 服务端执行http请求的时候,遵守的一种规范。其实就是规定了客户端在访问服务端的时候,要带上什么东西,服务端返回数据的时候,也要带上什么东西。
版本:
1.0
请求数据,服务器返回后,将会断开连接
2.0
请求数据,服务器返回后,连接还会保持着,除非服务器|客户端关掉。有一定的额时间限制,如果都空着这个连接,那么后面会自己断掉。
演示客户端 如何 与服务器通讯
>在地址栏中键入网络地址 回车 或者平常注册的时候,点击了注册按钮,浏览器都能显示出来一些东西。那么背地里到底浏览器和服务器怎么通讯。他们都传输了哪些数据。
1.安装抓包工具。HttpWatch(IE插件)
2.打开tomcat,输入locahost:8080打开首页
3.在首页找到Example字样
4.选择servlet例子--->Request Parameter
接着点击Request parameters的execute超链接
执行tomcat的例子,然后查看浏览器和 tomcat服务器的而对接细节。
HTTP请求数据解释
>请求的数据里面包含三个部分:请求行,请求头,请求体。
http请求数据:
POST /examples/servlets/servlet/RequestParamExample HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 33
Cache-Control: max-age=0
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/examples/servlets/servlet/RequestParamExample
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
firstname=lili&lastname=sisisisfs
请求行:
post请求方式:
POST
访问地址:
/examples/servlets/servlet/RequestParamExample
协议版本:
HTTP/1.1
请求头:
Host: localhost:8080
Connection: keep-alive
Content-Length: 33
Cache-Control: max-age=0
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/examples/servlets/servlet/RequestParamExample
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Accept:客户端向服务端表示,我能支持什么类型的数据
Referer:真正请求的地址路径,全路径
Accept-Language:支持语言格式
User-Agent:用户代理 向服务器表明,当前来访的客户端信息。
Content-Type:提交的数据类型,经过urlencoding编码的form表单信息
Accept-Encoding:gzip, deflate, br压缩算法
host:主机地址
Content-Length:数据长度
Connection: keep-alive保持连接
Cache-Control:对缓存的操作
请求体:
浏览器真正给服务器发送的数据
发送的数据呈现的是key=value,如果存在多个数据,那么使用&
firstname=lili&lastname=sisisisfs
HTTP响应数据解释
>响应的数据里面包含三个部分:响应行,响应头,响应体
http响应数据:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 675
Date: Wed, 21 Nov 2018 03:24:03 GMT
......
->响应行
HTTP/1.1 200 OK
协议版本:
HTTP
状态码:
本次交互是什么样的一个code.
200:成功,正常处理,得到数据。
404:Not Found
403:for biddern 拒绝
500:服务器异常
ok:
对应前面的状态码
->响应头
Server:服务器的类型。Tomcat
Content-Type:服务器返回给客户端的内容类型
Content-Length:返回数据长度(数据实体)
Date:时间
Get 和 Post 请求区别
->post:
1.数据是以流的形式写过去,不会再地址栏上面显示。现在一般提交数据到服务器使用的都是Post
2.以流的形式写数据,所以数据大小没有限制。
->get:
1.会在地址栏后面拼接数据,所以有安全隐患。一般从服务器获取数据,并且客户端也不用提交上面数据的时候,可以使用get。
2.能够携带的数据有限,1kb大小。
Web资源:
在http协议中,规定了请求和响应双方,客户端和服务端。与web相关的资源。
有两种分类:
->静态资源:
html、js、css
->动态资源
servlet/jsp
Servlet:
servlet是什么?
->其实就是一个Java程序,运行在Web服务器上,用于接受和响应客户端的http请求。Tomcat是一个容器。
->更多的是配合动态资源来做。当然静态资源也需要使用Servlet,只不过tomcat里面已经定义好了一个DefaultServlet
1.得写一个Web工程,要有一个服务器。
2.测试运行Web工程
1>新建一个类,实现Servlet接口
2>配置Servlet,用意:告诉服务器,我们的应用有这么些个Servlet.
在WebContent/WEB-INF/web.xml里面写下以下内容。
<!-- 向Tomcat报告,我这里有个servlet,名字叫做HellowServlet,具体路径是it.cast.servlet.HellowServlet-->
<servlet>
<servlet-name>HellowServlet</servlet-name>
<servlet-class>it.cast.servlet.HellowServlet</servlet-class>
</servlet>
<!-- 注册servlet的映射。servlet-name:找到上面具体的servlet。 url-pattern:地址栏上的path-->
<servlet-mapping>
<servlet-name>HellowServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
3>在地址栏上输入:http://localhost:8080/项目名称/a
3.servlet的执行过程
实例:
package it.cast.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 HellowServlet implements Servlet{
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("HellowServlet...2333");
}
}
Servlet的通用写法
Servlet(接口)
|
|
GenericServlet
|
|
HttpServlet
1.定义一个类,继承HttpServlet复写doGet 和 doPost
实例:
package it.cast.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 HellowServlet02 extends HttpServlet{
//get请求会来这个方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get run...");
}
//post请求会来这个方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post run...");
}
}
Servlet的生命周期
生命周期方法:
从创建到销毁,所调用的那些方法
ini方法:
1.在创建servlet该实例时,就执行该方法
一个servlet只会初始化一次,init方法只会执行一次
默认情况是:初次访问该servlet,才会创建实例
service方法:
只要客户端来了请求,就执行这个方法
该方法可以被执行多次,一次请求对应一次调用service
destory方法:
servlet被销毁的时候就执行该方法:
1.该项目从tomcat里边移除
2.正常关闭tomcat就会移除,执行shutdown.bat
doGet和doPost方法不算生命周期,所谓生命周期方法是指,从对象的创建到销毁一定会执行的方法,但这两个方法不一定执行。
实例:
package it.cast.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;
/*
该servlet用于演示servlet生命周期的调用时机
*/
public class HellowServlet03 implements Servlet {
/*
1.在创建servlet该实例时,就执行该方法
一个servlet只会初始化一次,init方法只会执行一次
默认情况是:初次访问该servlet,才会创建实例
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("HellowServlet03 init 方法运行了");
}
/*
只要客户端来了请求,就执行这个方法
该方法可以被执行多次,一次请求对应一次调用service
*/
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("HellowServlet03 service 方法运行了");
}
/*
servlet被销毁的时候就执行该方法:
1.该项目从tomcat里边移除
2.正常关闭tomcat就会移除,执行shutdown.bat
*/
public void destroy() {
System.out.println("HellowServlet03 destroy 方法运行了");
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
}
让Servlet创建实例的周期提前
1.默认情况下,只有在初次访问servlet的时候,才会执行init方法。有时候,我们可能需要在这个方法里边执行一些初试化的操作,甚至做一些比较耗时的逻辑。
2.那么这个时候,初次访问,可能会在init方法逗留太久的时间。那么久有方法让这个初始化的时机提前一点。
3.在配置的时候,使用load-on-startup元素来指定,给定的数字越小,启动的实际就越小。一般不谢负数,从2开始。
实例配置:
<servlet>
<servlet-name>HellowServlet04</servlet-name>
<servlet-class>it.cast.servlet.HellowServlet04</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet04</servlet-name>
<url-pattern>/d</url-pattern>
</servlet-mapping>
实例:
package it.cast.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;
/*
该servlet用于演示让servlet创建实例的时机提前
*/
public class HellowServlet04 implements Servlet {
/*
1.在创建servlet该实例时,就执行该方法
一个servlet只会初始化一次,init方法只会执行一次
默认情况是:初次访问该servlet,才会创建实例
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("HellowServlet04 init 方法运行了");
}
/*
只要客户端来了请求,就执行这个方法
该方法可以被执行多次,一次请求对应一次调用service
*/
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("HellowServlet04 service 方法运行了");
}
/*
servlet被销毁的时候就执行该方法:
1.该项目从tomcat里边移除
2.正常关闭tomcat就会移除,执行shutdown.bat
*/
public void destroy() {
System.out.println("HellowServlet04 destroy 方法运行了");
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
}
ServletConfig
>Servlet的配置,通过这个对象,可以获取Servlet在配置的时候得到一些信息。
实例:
package it.cast.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 HellowServletConfig extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletConfig 可以获取servlet的一些配置信息
//1.得到servlet的配置对象,专门用于在配置Servlet的信息
ServletConfig config=getServletConfig();
//获得的是配置 sevlet 的配置 servelt-name 的文本内容
String servletName = config.getServletName();
System.out.println(servletName);
//2.可以获取具体的某一个参数
String parameter = config.getInitParameter("address");
System.out.println(parameter);
//3.获取所有的参数名称
Enumeration<String> parameterNames = config.getInitParameterNames();
while (parameterNames.hasMoreElements()) {
String key = (String) parameterNames.nextElement();
String value = config.getInitParameter(key);
System.out.println("value="+value+":::key="+key);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
以上所有类的配置信息:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>HellowServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 向Tomcat报告,我这里有个servlet,名字叫做HellowServlet,具体路径是it.cast.servlet.HellowServlet-->
<servlet>
<servlet-name>HellowServlet</servlet-name>
<servlet-class>it.cast.servlet.HellowServlet</servlet-class>
</servlet>
<!-- 注册servlet的映射。servlet-name:找到上面具体的servlet。 url-pattern:地址栏上的path-->
<servlet-mapping>
<servlet-name>HellowServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HellowServlet02</servlet-name>
<servlet-class>it.cast.servlet.HellowServlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet02</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HellowServlet03</servlet-name>
<servlet-class>it.cast.servlet.HellowServlet03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet03</servlet-name>
<url-pattern>/c</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HellowServlet04</servlet-name>
<servlet-class>it.cast.servlet.HellowServlet04</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HellowServlet04</servlet-name>
<url-pattern>/d</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HellowServletConfig</servlet-name>
<servlet-class>it.cast.servlet.HellowServletConfig</servlet-class>
<!-- 可以添加初始化参数 -->
<init-param>
<param-name>address</param-name>
<param-value>xian.......</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>shanxi*****</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>19</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HellowServletConfig</servlet-name>
<url-pattern>/e</url-pattern>
</servlet-mapping>
</web-app>
最后:ServletConfig01和TestServletConfig01
1.未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会。但是有人写出来了。它的代码放置在servlet类里面。
2.刚好这个servelt里面需要一个数据或者叫做变量。但是这个值不能是固定的了。所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,生命init-params.
在开发中比较少用。