2-9Servlet和HTTP请求协议

\第1节 Servlet_快速入门

10_Servlet_概述

JavaEE:全称Java平台企业版(Java Platform Enterprise Edition.
现在不找jdk的api。
现在找javaEE的api。

在这里插入图片描述

11_Servlet_快速入门

## Servlet:  server applet
	* 概念:运行在服务器端的小程序
		* Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
		* 将来我们自定义一个类,实现Servlet接口,复写方法。


	* 快速入门:
		1. 创建JavaEE项目,以前我们是用Java项目,现在不行了。
		2. 定义一个类,实现Servlet接口
			* public class ServletDemo1 implements Servlet
		3. 实现接口中的抽象方法
		4. 配置Servlet

在这里插入图片描述

在哪里配置Serlet?

在这里插入图片描述

原理

浏览器通过url,映射到服务器上的代码。
在这里插入图片描述
我们通过在8080后面加/demo1,居然可以自动运行代码。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
也就是说,我们自己定义了一个类,没有调用它的方法,居然自己执行了。
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--配置Servlet -->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>
package cn.itcast.web.servlet;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //提供服务的方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

12_Servlet_执行原理

一直用/,也不太合适。
/:不用输入虚拟目录。
以后就用,/加上你所在的项目。
在这里插入图片描述
在这里插入图片描述

为什么这里是demo1?

在这里插入图片描述
方法的调用,服务器帮忙调用,不用我们。

* 执行原理:
		1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
		2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
		3. 如果有,则在找到对应的<servlet-class>全类名
		4. tomcat会将字节码文件加载进内存,并且创建其对象
		5. 调用其方法

原理图

在这里插入图片描述

修改tomcat默认端口号8080
通过locathost:8080可以找到tomcat。

以后看到全类名,就要想到反射。

\第2节 Servlet_生命周期方法

13_Servlet_生命周期方法

/**
     * 
     * @param servletConfig
     * @throws ServletException
     */

1、重新配置。
在这里插入图片描述

2、运行
在这里插入图片描述
3、弹出网页,改demo2
在这里插入图片描述
4、查看控制台
在这里插入图片描述
5、这里是为了说明,init只被执行一次。多次刷新,init只被执行一次,service多次执行。
在这里插入图片描述

代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--配置Servlet -->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

    <!--配置Servlet -->
    <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>



</web-app>
package cn.itcast.web.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * Servlet的方法
 */
public class ServletDemo2 implements Servlet {
    private int age = 3;

    /**
     * 初始化方法
     * 在Servlet被创建时,执行。只会执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.....");
    }

    /**
     * 获取ServletConfig对象
     * ServletConfig:Servlet的配置对象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服务方法
     * 每一次Servlet被访问时,执行。执行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service.....");
        int number = 3;
    }

    /**
     * 获取Servlet的一些信息,版本,作者等等。。
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁方法
     * 在服务器正常关闭时,执行,执行一次。
     */
    @Override
    public void destroy() {
        System.out.println("destroy.....");
    }
}

14_Servlet_生命周期详解

* Servlet中的生命周期方法:
	1. 被创建:执行init方法,只执行一次
		* Servlet什么时候被创建?执行init方法,就是创建了。
			* 默认情况下,第一次被访问时,Servlet被创建
			* 可以配置执行Servlet的创建时机。
				*<servlet>标签下配置
					1. 第一次被访问时,创建
                		* <load-on-startup>的值为负数。
                		
		            2. 在服务器启动时,创建
		                * <load-on-startup>的值为0或正整数
				* 如果设置为负数,则不会出现init。
				* 如果设置为整数,则会出现init。
				* init 方法是用来加载资源的。
		

	* Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
		* 多个用户同时访问时,可能存在线程安全问题。
		* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

	2. 提供服务:执行service方法,执行多次
		* 每次访问Servlet时,Service方法都会被调用一次。
	3. 被销毁:执行destroy方法,只执行一次
		* Servlet被销毁时执行。服务器关闭时,Servlet被销毁
		* 只有服务器正常关闭时,才会执行destroy方法。
		* destroy方法在Servlet被销毁之前执行,一般用于释放资源

启动服务器,就是运行程序。
第一次访问,需要弹出网页,加上demo2。

在这里插入图片描述

\第3节 Servlet_3.0注解配置

* Servlet3.0* 好处:
			* 支持注解配置。可以不需要web.xml了。

		* 步骤:
			1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
			2. 定义一个类,实现Servlet接口
			3. 复写方法
			4. 在类上使用@WebServlet注解,进行配置
				* @WebServlet("资源路径")


				@Target({ElementType.TYPE})
				@Retention(RetentionPolicy.RUNTIME)
				@Documented
				public @interface WebServlet {
				    String name() default "";//相当于<Servlet-name>
				
				    String[] value() default {};//代表urlPatterns()属性配置
				
				    String[] urlPatterns() default {};//相当于<url-pattern>
				
				    int loadOnStartup() default -1;//相当于<load-on-startup>
				
				    WebInitParam[] initParams() default {};
				
				    boolean asyncSupported() default false;
				
				    String smallIcon() default "";
				
				    String largeIcon() default "";
				
				    String description() default "";
				
				    String displayName() default "";
				}

之前我们写配置,其实是很麻烦的。

在这里插入图片描述

新的方法

不同的JAVAEE版本,对应不同的web application 版本。
在这里插入图片描述

快捷键,enter class name 是用什么快捷键?

ctrl N

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注解的内容,需要复习了

1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举

改虚拟目录

在这里插入图片描述

如何运行?

1、运行TOMCAT在这里插入图片描述
2、自动弹出网页。
3、写上后缀demo
在这里插入图片描述
在这里插入图片描述

\第4节 IDEA与tomcat相关配置

## IDEA与tomcat的相关配置
	1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件
		* 查看控制台的log:Using CATALINA_BASE:   "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"

	2. 工作空间项目    和     tomcat部署的web项目
		* tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
		* WEB-INF目录下的资源不能被浏览器直接访问。
	3. 断点调试:使用"小虫子"启动 dubug 启动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改端口。修改虚拟目录。

在这里插入图片描述在这里插入图片描述

查看server.xml

发现端口,变成了80

在这里插入图片描述

在这里插入图片描述

工作空间?项目空间

在这里插入图片描述

在这里插入图片描述

这个目录,就是项目存放的路径。

在这里插入图片描述
在这里插入图片描述

项目空间和工作空间对应。

tomcat部署的web项目,存放在哪里?

工作空间的out下面。
在这里插入图片描述

在这里插入图片描述

工作空间就是idea上的。

以后我们在idea创建什么东西。

都会在tomcat部署的web项目中显示。

比如这里新建一个aaa.html
在这里插入图片描述
在这里插入图片描述

断点调试:使用"小虫子"启动 dubug 启动

在这里插入图片描述

\第5节 Servlet_体系结构与urlpartten配置

02_Servlet_体系结构

## Servlet:
	1. 概念
	2. 步骤
	3. 执行原理
	4. 生命周期
	5. Servlet3.0 注解配置
	6. Servlet的体系结构	
		Servlet -- 接口
			|
		GenericServlet -- 抽象类		很方便 ,但是我们不用。。。。。
			|
		HttpServlet  -- 抽象类

		* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
			* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

		* HttpServlet:对http协议的一种封装,简化操作
			1. 定义类继承HttpServlet
			2. 复写doGet/doPost方法

配置修改

**在这里插入图片描述**
自动弹出网页,现在手动。
修改虚拟目录。
在这里插入图片描述

现在的操作步骤

需要自己去打开网页。输入虚拟目录。
在这里插入图片描述
然后看idea。

以前我们是去实现接口

但是需要复习4-5个方法。其实我们只用了一个。

需求

我们希望之复写一个。

package cn.itcast.web.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("demo2......");
    }
}

以上是GenericServlet – 抽象类

通过浏览器直接请求是get方式。

post方法,现在暂时先写一个网页来展示。

在这里插入图片描述
然后idea显示dopost
提交后,显示doget

代码

@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("demo2......");
    }
}

package cn.itcast.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost.... ");
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/demo3" method="post">
        <input name="username">
        <input type="submit" value="提交">

    </form>
<!--<form> 标签用于为用户输入创建 HTML 表单。

表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。

表单还可以包含 menus、textarea、fieldset、legend 和 label 元素。-->

<!--action向何处发送表单数据。

可能的值:

绝对 URL - 指向其他站点(比如 src="www.example.com/example.htm")
相对 URL - 指向站点内的文件(比如 src="example.htm"-->
</body>
</html>

03_Servlet_urlpartten配置

	7. Servlet相关配置
		1. urlpartten:Servlet访问路径
			1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
			2. 路径定义规则:
				1. /xxx:路径匹配
				2. /xxx/xxx:多层路径,目录结构
				3. *.do:扩展名匹配
//@WebServlet({"/d4","/dd4","/ddd4"})
//@WebServlet("/user/demo4")
//@WebServlet("/user/*")
//@WebServlet("/*")
@WebServlet("*.do")
//比如可以在浏览器的虚拟目录输入demo4.do

public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget....");
    }
}

\第6节 HTTP请求协议

04_HTTP_概述

一个百度界面,它其实受到了多次请求和多次响应。
里面的CSS。

## HTTP:
	* 概念:Hyper Text Transfer Protocol 超文本传输协议
		* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式
		* 特点:
			1. 基于TCP/IP的高级协议
			2. 默认端口号:80
			3. 基于请求/响应模型的:一次请求对应一次响应
			4. 无状态的:每次请求之间相互独立,不能交互数据

		* 历史版本:
			* 1.0:每一次请求响应都会建立新的连接
			* 1.1:复用连接

在这里插入图片描述

05_HTTP_请求消息_请求行

	* 请求消息数据格式
		1. 请求行
			请求方式 请求url 请求协议/版本
			GET /login.html	HTTP/1.1

			* 请求方式:
				* HTTP协议有7中请求方式,常用的有2* GET:
						1. 请求参数在请求行中,在url后。
						2. 请求的url长度有限制的
						3. 不太安全
					* POST:
						1. 请求参数在请求体中
						2. 请求的url长度没有限制的
						3. 相对安全

在这里插入图片描述
在这里插入图片描述

高端的浏览器,已经把信息解析了。

低端的浏览器,比如火狐,没有解析。

在这里插入图片描述
在这里插入图片描述

06_HTTP_请求消息_请求头&请求体

* 请求消息数据格式
		1. 请求行
			请求方式 请求url 请求协议/版本
			GET /login.html	HTTP/1.1

			* 请求方式:
				* HTTP协议有7中请求方式,常用的有2* GET:
						1. 请求参数在请求行中,在url后。
						2. 请求的url长度有限制的
						3. 不太安全
					* POST:
						1. 请求参数在请求体中
						2. 请求的url长度没有限制的
						3. 相对安全
		2. 请求头:客户端浏览器告诉服务器一些信息
			请求头名称: 请求头值
			* 常见的请求头:
				1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
					* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题

				2. Referer:http://localhost/login.html
					* 告诉服务器,我(当前请求)从哪里来?
						* 作用:
							1. 防盗链:
							2. 统计工作:
		3. 请求空行
			空行,就是用于分割POST请求的请求头,和请求体的。
		4. 请求体(正文)* 封装POST请求消息的请求参数的

		* 字符串格式:
			POST /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

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值