Http协议&Servlet

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.
    在开发中比较少用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值