JavaWeb基础

1、Web开发简述

1.1、什么是Web

Web(互联网总称)

web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。

1.2、什么是JavaWeb开发

Java Web:是用Java技术来解决相关Web互联网领域的技术综合。

1.3、JavaWeb开发中的资源

静态web资源
            HTML
            CSS
            JavaScript(js)

动态web资源
            Servlet
            JSP

1.4、URL请求路径

URL(Uniform Resource Locator),统一资源定位符是对互联网上资源位置的一种表示,互联网上的每
个文件都有一个唯一的URL。

完整格式如下:
            协议://域名:端口号/资源位置?参数=值&参数2=值&参数3=值
                        ●协议:http、https、ftp等
                        ●域名:域名或IP地址,都可以访问WEB资源
                        ●端口号:程序必须使用端口号,才可以让另一个计算机访问。http协议的默认端口:80 ,https协议默认的端口:443
                        ●资源位置:用于描述WEB资源在服务器上的位置
                        ●参数=值:浏览器和服务器交换传递的数据

例如:
        https://www.baidu.com
        https://www.jd.com

1.5、软件开发的结构分类

(1)CS结构的软件
        CS:Client/Server 客户端和服务器,这种软件往往需要安装,比如:QQ、迅雷、播放器

        优缺点:
                优点:
                     ●可以减轻服务器压力,将部分代码写到客户端
                     ●界面美观、速度快
                缺点:
                     ●一旦服务器更新类,客户端也需要更新
                     ●分布式开发比较弱
                     ●人力资源成本大

(2)BS结构的软件
        BS:Browser/Server 浏览器和服务器,这种软件不需要安装,只需要通过浏览器就可以访问。

        优缺点:
                优点:
                     ●只需要专注于服务器端的开放即可
                     ●分布式开发比较强
                缺点:
                     ●服务器端压力会比较大
                     ●对带宽的要求比较高

1.6、WEB服务器

服务器:
           硬件:其实就是一台电脑(高配电脑)
           软件:需要安装在电脑上,为Web应用程序提供服务,所以称为Web服务器的软件
在这里插入图片描述
请求和响应流程图:

在这里插入图片描述

1.7、常见的WEB服务器

常见的WEB服务器:
           Tomcat:Apache组织提供的一个开源的免费的WEB服务器,满足JavaEE的Servlet和JSP的规范
           WebSphere:IBM公司开发的一个收费的大型WEB服务器,满足了JavaEE所有的规范
           WebLogic:BEA公司开发的一个收费的大型WEB服务器,满足了JavaEE所有的规范
           IIS:应用在.NET平台上,asp
           Apache:应用在PHP平台上

2、HTTP协议

2.1、Http简介

什么是Http协议

HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。用于定义WEB浏览器与WEB服务器之间交换数据的过程。
在这里插入图片描述
必须先有请求,才会有响应

Http协议的作用及特点

HTTP协议的作用:
         HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。
在这里插入图片描述
HTTP协议的特点:
         ●基于请求/响应模型的协议。
                  ■请求和响应必须成对;
                  ■先有请求后有响应。

         ●简单快捷
                  ■因为发送请求的时候只需要发送请求方式和请求路径即可

         ●HTTP协议默认的端口:80
                  ■例如: http://www.bdit.com:80

         ●HTTP协议是一种明文协议

         ●HTTP协议是一种无状态协议(无状态指的是服务器端并不会记录客户端的任何信息)

Http协议的版本

HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。

HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。

HTTP协议有两种报文格式:

请求报文:由客户端向服务器端发出的报文。

响应报文:从服务端到客户端的报文。

2.2、Http协议详解

2.2.1、Http请求报文详解

HTTP请求报文:由客户端向服务器端发出的报文。

HTTP请求报文格式:包含请求行、请求头、空行、请求体 四个部分
在这里插入图片描述
【只有POST请求时,才会有请求体,如果是get请求,给服务器端的数据会直接放在URL的后面】

请求行

例如:POST /web01/login.html HTTP/1.1
请求行必须在HTTP请求格式的第一行。
请求行格式:请求方式 资源路径 协议/版本

请求方式:协议规定7种,常用两种:GET和POST
         GET请求:
                  将请求参数追加在URL后面,不安全。例如:login.html?username=tom&password=1234
                  URL长度限制GET请求方式的数据大小。
                  没有请求体
         POST请求
                  请求参数显示请求体处,较安全。
                  请求数据大小没有显示。

         只有表单设置为method=”post”才是post请求.其他的都是get请求。

         常见GET请求:地址栏直接访问、< a href=””>、< img src=””> 等

请求头

请求头: 描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度,referer,等等。

请求头也是用的键值对key:value

常见请求头描述
Referer浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链
Cookie与会话有关技术,用于存放浏览器缓存的cookie信息。
User-Agent浏览器通知服务器,客户端浏览器与操作系统相关信息
请求体

通常情况下,只有post请求方式才会使用到请求体,请求体中都是用户表单提交的数据,每一项数据都使用键 值对key=value,多组值使用&相连。

例如:username=tom&password=1234

MIME类型

就是互联网中的内容类型的标准

    html----》text/html
    css----》 text/css
    jpg------》image/jpg

Http请求报文演示

创建页面,编写“login.html”,并提供表单,分别设置表单的提交方式为:get和post。将表单提交位置设置成#,表示提交到当前表单。
在这里插入图片描述

<form action="#" method="post"> 
	用户名:<input type="text" name="username" value=""/> <br/> 
	密 码:<input type="text" name="password" value=""/> <br/> 
	<input type="submit" /> 
</form>

观看下图,我们采用GET请求方式、POST请求方式的抓包结果:(Chrome浏览器)

GET请求抓包数据:
在这里插入图片描述
POST请求抓包数据:
在这里插入图片描述

2.2.2、 Http响应报文详解

响应报文:从服务端到客户端的报文。

HTTP响应报文格式:响应行、响应头、空行、响应体 四个部分
在这里插入图片描述

响应行

例如:HTTP/1.1 200 OK
格式:协议/版本 状态码 状态码描述
   状态码:服务器与浏览器用于确定状态的固定数字号码
      200 :请求成功。
      302 :请求重定向。
      304 :请求资源没有改变,访问本地缓存。
      404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
       500 :服务器内部错误。通常程序抛异常。

响应头

响应头: 用来描述服务器回给客户端浏览器的content的一些描述,例如: 我是什么服务器,我返回的是啥编码,我返回的内容有多长等等

响应头也是用的键值对 key:value

常见请求头描述
Location指定响应的路径,需要与状态码302配合使用,完成跳转
Content-Disposition文件下载的时候使用。通过浏览器以下载方式解析正文
Set-Cookie与会话相关技术。服务器向浏览器写入cookie
Refresh定时刷新
响应体

响应体,就是服务器发送给浏览器的正文。

<!DOCTYPE html> 
<html > 
<head>
	<meta charset="UTF-8"> 
	<title>Title</title> 
</head> 
<body>
	<form action="#" method="post"> 
		用户名:<input type="text" name="username" value=""/> <br/> 
		密 码:<input type="text" name="password" value=""/> <br/> 
		<input type="submit"/> 
	</form> 
</body> 
</html>
Http响应报文演示

如下图,我们提供的响应的抓包结果(Chrome浏览器)
在这里插入图片描述

3、Servlet

3.1、Servlet的概述

什么是Servlet

Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序,Servlet它是用Java编写的一个服务端程序,没有main方法,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据、生成动态WEB内容。

狭义的Servlet是指Java语言实现的一个接口

广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,将Servlet理解为后者,Servlet运行于支持Java的应用服务器中,简单的来说,Servlet必须运行在一个Web容器中,tomcat就是一个这样的容器。

Servlet是支持多线程的,每个请求对应一个线程,效率高,但是同时也存在线程安全问题,所以为了避免线程安全问题,不建议在Servlet中操作成员(全局)变量。

Servlet它可以接收用户的请求,然后处理请求,并能够做出响应。

3.2、使用Servlet

编写一个Java类实现Servlet的接口

在web.xml中,配置Servlet

3.2.1、Servlet的入门

步骤1,创建包和类,实现Servlet接口

package com.bdit.servlet;

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

/*** Servlet入门示例 */
public class HelloWorldServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }

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

    /** 用来处理用户的请求,并且对请求作出响应的方法 
     *@param servletRequest 代表的是请求对象 
     * @param servletResponse 代表的是响应对象 
     * @throws ServletException 
     * @throws IOException
     * */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("==================我的第一个Servlet程序 =================");
        //响应,给客户端浏览器输出一个HelloServlet 
        servletResponse.getWriter().println("Hello Servlet");
    }

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

    @Override
    public void destroy() {
    }
}

步骤2,在web.xml配置Servlet

<?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_4_0.xsd"
         version="4.0"> 
    <!--配置Servlet-->
    <servlet> 
    	<!--用来给Servlet 指定一个对象名-->
        <servlet-name>helloWorldServlet</servlet-name> 
        <!--指定当前Servlet类的全限定名-->
        <servlet-class>com.bdit.servlet.HelloWorldServlet</servlet-class>
    </servlet> 
    <!--配置Servlet的访问路径(映射关系)-->
    <servlet-mapping>
    	 <!--配置关联的Servlet名称-->
        <servlet-name>helloWorldServlet</servlet-name>
        <!--配置Servlet的访问路径,访问路径必须以/开头-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

步骤3,访问Servlet

http://localhost:8080/servlet_base1/hello
在这里插入图片描述

3.3、Servlet程序执行的原理

在这里插入图片描述
Tomcat容器(引擎)执行的操作:
    ●接受并解析客户端浏览器的请求URL“/servlet_base1/hello”
    ●在web.xml中根据请求的路径,找到对应的Servlet
    ●Tomcat会创建当前Servlet对象并为对象做一些初始化的工作,同时还会创建request,response对象
    ●调用Servlet中的service方法来处理请求,并作出响应,响应的数据会写在response对象的缓冲区中
    ●service方法结束后,数据从response对象的缓冲区中取出,组装成HTTP的响应信息,交给tomcat容器
    ●最终,再由tomcat容器,把响应的结果,回传给客户端的浏览器。

3.4、Servlet生命周期

Servlet对象的创建和生命周期的管理,统统都是由tomcat容器来负责的。我们必须要清楚容器是怎么管理Servlet的生命周期?
在这里插入图片描述
【用户发送request,首先请求先到达web容器,然后web容器根据请求的路径,去和web.xml文件中进行相应 信息的查找。然后根据对应的路径,就可以找到相应的Servlet类。这个时候,容器会先判断当前Servlet的 实例在容器中是否已经存在,如果没有,容器则会立马调用当前Servlet的无参数的构造方法,创建对象,对 象创建完后,容器会立马自动回调Init方法,对Servlet对象进行一些初始化的工作,然后容器会自动回调 service方法,service方法否则对用户请求进行处理。当web容器停止时,容器会自动回调servlet中的 destroy方法,进行servlet实例的销毁,释放所占系统资源。】

●init(ServletConfig config) Servlet对象的初始化方法,对象被创建的时候自动回调

   在Servlet生命周期中,仅执行一次init()方法

●service(request,response)客户端访问一次,执行一次

   它是Servlet的核心,每当客户端发送一个请求,都要交给service方法来处理,同时它还能作出 响应

●destory()方法,Servlet对象销毁时调用

   仅执行一次,当Servlet从Web容器中移除或者Web容器关闭服务的时候Servlet对象被销毁,然后垃圾回收器就会将Servlet对象回收

Servlet对象什么时候被创建:
   默认情况下,第一次访问的时候,对象被创建
   也可以在tomcat容器启动时就创建Servlet的对象,需要修改web.xml(一般不配置),如下:

<servlet>
    <servlet-name>lifeCycleServlet</servlet-name>
    <servlet-class>com.bdit.servlet.LifeCycleServlet</servlet-class> 
    <!--容器启动时,就创建servlet的对象,正整数,值越小优先级越高-->
    <load-on-startup>0</load-on-startup>
</servlet> 

<servlet-mapping>
    <servlet-name>lifeCycleServlet</servlet-name>
    <url-pattern>/life</url-pattern>
</servlet-mapping>

生命周期,理解参考图:
在这里插入图片描述
生命周期,Servlet示例代码:

package com.bdit.servlet;

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

/*** Servlet生命周期示例 */
public class LifeCycleServlet implements Servlet {
    public LifeCycleServlet() {
        System.out.println("================LifeCycleServlet无参数的构造方法 ================");
    }

    /**** @param servletConfig * @throws ServletException */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("=============对Servlet对象进行一系列初始化的工作 ==============");
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("==================处理用户的请求,并作出响应 ===============");
    }

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

    @Override
    public void destroy() {
        System.out.println("====================销毁Servlet对象,释放资源 ==============");
    }
}

3.5、Servlet的启动时加载(了解)

3.5.1、 什么是Servlet启动时加载

Servlet启动时加载,就是让Web(Tomcat)容器启动的时候创建Servlet对象

【Servlet默认情况下,是第一次访问时,才会创建Servlet对象】

3.5.2、 为什么使用启动时加载

Servlet对象是第一次被访问的时候会被创建,然后执行init方法,进行初始化。

假如在init方法中做了一些比较耗时的操作(例如,加载了一些配置文件并且解析,这个过程可能会消耗3-5秒),那么,第一次访问这个Servlet的时候,需要等待3-5秒。解决办法,我们通过配置Servlet启动时加载就可以避免第一次访问Servlet,等待3-5秒类。

配置Servlet启动时加载,需要修改web.xml文件,格式如下,配置后,Tomcat服务器启动时就会完成Servlet对象的创建

<load-on-starup>...</load-on-starup>

值为正整数,值越小优先级越高

<servlet>
    <servlet-name>lifeCycleServlet</servlet-name>
    <servlet-class>com.bdit.servlet.LifeCycleServlet</servlet-class> <!--容器启动时,就创建servlet的对象,正整数,值越小优先级越高-->
    <load-on-startup>0</load-on-startup>
</servlet> 

<servlet-mapping>
    <servlet-name>lifeCycleServlet</servlet-name>
    <url-pattern>/life</url-pattern>
</servlet-mapping>

3.6、Servlet的访问路径

url-pattern的配置有三种方式:
   ●完全匹配
   ●目录匹配(模糊匹配)
   ●扩展名匹配

1.完美匹配

/path :浏览器地址栏必须写 /path

2.目录匹配(模糊匹配)

/aaa/bbb/*:浏览器地址栏可以写 /aaa/bbb/任意

3.扩展名匹配

*.do :浏览器地址栏可以写 任意.do

注意:目录匹配和后缀名不能同时使用

错误的写法: /aa/bb/*.do

示例代码:

<!--配置Servlet-->
<servlet>
    <!--用来给Servlet 指定一个对象名-->
    <servlet-name>helloWorldServlet</servlet-name>
    <!--指定当前Servlet类的全限定名-->
    <servlet-class>com.bdit.servlet.HelloWorldServlet</servlet-class>
</servlet>

<!--配置Servlet的访问路径(映射关系)-->
<servlet-mapping>
    <!--配置关联的Servlet名称-->
    <servlet-name>helloWorldServlet</servlet-name>
    <!--配置Servlet的访问路径,访问路径必须以/开头-->
    <url-pattern>/hello</url-pattern>
    <!--模糊匹配或者目录匹配-->
    <url-pattern>/bdit/java/*</url-pattern>
    <!--扩展名,如果是匹配模式,不需要添加/-->
    <url-pattern>*.abc</url-pattern>
    <url-pattern>/bdit.do</url-pattern>
    <!--默认访问路径-->
    <url-pattern>/*</url-pattern>
</servlet-mapping>

总结:tomcat获取路径时,访问优先级顺序:完全匹配路径 > 目录匹配(模糊匹配) > 扩展名匹配 >缺省路径(默认路径)

我们在开发中,Servlet配置路径选择完全匹配。

3.7、 Tomcat的全局web.xml配置标签

tomcat安装目录中/conf/web.xml是全局配置文件,所有的WEB项目都使用

我们web项目中的web.xml文件中,也可以配置全局的属性,针对当前整个项目起作用。

<!--配置项目默认页面-->
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
</welcome-file-list>

注意,如果项目中web.xml的配置和tomcat全局的web.xml配置冲突了,用我们自己配置的参数作为条件。

4、HttpServlet

4.1、HttpServlet概述

SUN设计Servlet之初,考虑互联网中使用的协议不仅仅只是http协议,为了支持更多的协议,Servlet采用了接口的设计思想。

HttpServlet是一个与HTTP协议相关的Servlet,专门用来处理HTTP协议的请求和响应。

   ●在HttpServlet类的service方法内部,根据HTTP协议请求方式不同,执行不同的doXXX的方法(get请求执行doGet方法,如果是post请求就会执行doPost方法)

   ●继承类HttpServlet之后,不需要重写service方法,只需要重写doGet和doPost方法即可。

package com.bdit.servlet;

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

public class HttpServletDemo1 extends HttpServlet {
    /**doGet方法对应客户端的Get请求方式 
     *@param req * @param resp 
     *@throws ServletException 
     *@throws IOException 
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("====================使用的get请求 ===================");
        doPost(req, resp);
    }

    /**doPost方法对应客户度的post请求方式 
     *无论post请求还是get请求,都可以处理,可以通过doGet和doPost的互相调用 
     *@param req * @param resp 
     *@throws ServletException 
     *@throws IOException 
     **/
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("==================使用post请求 =======================");
    }
}

4.2、Servlet版本和JavaEE版本对应关系

Servlet版本JavaEE版本
4.08.0
3.18.0
3.17.0
3.06.0
2.55.0

●Servlet2.5版本
   ○Servlet、过滤器Filter、监听器Listener的声明必须使用web.xml
●Servlet3.0版本开始
   ○新增注解的支持,用于简化Servlet、过滤器、监听器的配置,所以从3.0开始web.xml不再是必选的。

4.3、基于注解的Servlet

@WebServlet,注解添加到自定义的Servlet中的类声明上即可,注解的属性value和urlPatterns,都是用来指定访问该Servlet的url,它俩只能同时出现一个。

package com.bdit.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(name = "demo2", urlPatterns = {"/demo2"})
public class AnnotationServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("=================基于注解的Servlet post请求 ================");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("=================基于注解的Servlet get请求 ================");
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值