第一章.Web相关概述

1.1 软件架构

**C/S : **客户端/服务器端(Client/Server)通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可充分利用两端硬件环境优势.早期软件系统多以此作为首选设计标准.

**B/S : **浏览器/服务器端(Browser/Server)是随着Internet技术的星期,对C/S结构的一种变化或者改进的结构.在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是只要事务逻辑在服务器端是子安的,节约了开发成本,便于软件维护.

区别:

  1. C/S是建立在局域网的基础上的;B/S是建立在广域网上的,但并不是说B/S结构不能再局域网上使用.
  2. B/S业务扩展简单方便,通过增加页面即可增加服务器功能.C/S的客户端还需要安装专用的客户端软件,不利于扩展.
  3. B/S维护简单方便.开发,维护等几乎所有工作集中在了服务器端,当企业对网络应用进行升级时,只需更新服务器端的软件就可以了,还减轻了异地用户系统维护与升级的成本.
  4. B/S响应速度不及C/S
  5. B/S用户体验效果不是很理想

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9efpSIvL-1647675649735)(E:\java笔记\笔记\bs,cs的关系.png)]

1.2 资源分类

静态资源 : 所有用户访问后,得到的结果是一样的,称之为静态资源. 如html,css,js等,静态资源可以直接被浏览器解析.

动态资源 : 每个用户访问相同的资源后,的到的结果可能不一样,称之为动态资源.如:Servlet,jsp等.登台资源被访问后,需要先转换为静态资源,在返回给浏览器.

1.3 网络通信三要素

IP: 点在设备在网络中的唯一标识

端口:应用程序在计算机中的唯一的标识 >> 0-65536

传输协议:规定了数据传输的规则

TCP : 安全协议,三次握手,速度较慢

UDP:不安全协议,速度快

第二章. web服务器

2.1 概述

服务器 : 安装了服务器软件的计算机.

服务器软件 : 用来接收用户的请求,处理用户请求,并作出响应.

常见的java相关的web服务器软件:

  1. webLogic : Oracal公司, 大型的JavaEE服务器,支持所有的JavaEE规范,收费的 (默认端口:9521)
  2. Tomcat : Apache基金组织,中香型的JavaEE规范,开源的,免费的 (默认端口:8080)

JavaEE : java语言在企业级开发中使用的技术规范的总和

2.2 Tomcat服务器

一般情况是在官网下载Tomcat的压缩格式,进行解压即可,安装目录建议不要有中文.

Tomcat服务器就是用java写的.

解压后主要有以下几个文件夹:

  • bin目录: 放置可执行文件夹,其中startup和shutdown是开启和关闭Tomcat的.注意: 后缀名为.bat的是运行在window环境中的, 后缀名为.sh的是运行在linux环境中的.
  • conf目录: 配置文件,是config的缩写.其中server.xml中可更改Tomcat默认端口号(默认端口为8080)
  • lib目录: 放置相关的jar包. 第三方依赖的相关jar包.
  • logs目录: 放置日志文件. 如:会记录你做了哪些操作.
  • temp目录 : 临时文件
  • webapps目录 : 项目部署目录. 一般情况使用户将项目发布到这个里面,但是因为idea的集成性(idea会形成一个个的服务器副本),被idea中的out给替代了(和out一个作用)
  • work目录 : JSP的本质的内容 >> JSP的本质内容就是一个java文件,然后编译成.class,最后.class文件被运行执行.

**注意: **使用eclipse时,服务器部署空间就在webapps里,而idea由于他集成性的特点,他的每一个项目都会复制一份Tomcat的副本,部署的空间就不在webapps目录中了.

2.2.1 启动问题分析

问题一:黑窗口一闪而过

原因:没有正确配置JAVA_HOME环境变量

解决问题:正确配置JAVA_HOME环境即可

问题二:启动报错

1.保留:找到占用的端口号,找到相应的进程,杀死该进程

2.柔和:修改自身的端口号

一般会将tomcat的默认端口号修改为80。

80端口是http协议的默认端口号

443是https的默认端口号

关闭:

正常关闭:

1.bin/shutdown.bat

2.ctrl+c(窗口中)

强制关闭:直接关掉窗口

3. 常用概念解析

3.1 动态网页和静态网页

联系:

  1. 静态网页是网站建设的基础,静态网页和动态网页都是需要使用到HTML 语言.
  2. 静态网页是相对与动态网页而言,指没有后台数据库,不含程序和不可交互的网页,是标准的HTML文件,它的文件扩展名是.htm或.html.你编写的是什么样子它就显示的是什么样子,不会有任何改变
  3. 静态网页和动态网页之间并不矛盾,为了网站适应搜索引擎检索的需要,动态网站可以采用静动结合的原则(纯动态网页运行加载可能速度较慢),适合采用动态网页的地方采用动态网页,如果必要使用静态网页,则可以考虑使用静态网页的方法来实现,在一个网站上,动态网页内容和静态网站内容同时存在也是很常见的事情.

区别:

  1. 程序是否在服务器端运行,是重要标志.
    在服务器端运行的程序,网页,组件属于动态网页,它们会随着不同客户,不同时间,返回不同的网页,如:ASP,PHP,JSP,ASP.net等.
    运行于客户端的程序,网页,插件,组件属于静态网页,例如:html,Flash,js等.
  2. 编程技术不同.
    静态网页和动态网页主要根据网页制作的语言来分区分.静态网页使用语言:HTML ; 动态网页使用语言 : HTML+JSP,HTML+PHP等其他网站动态语言.
  3. 被搜索引擎收录情况不同.
    由于编程技术不同,静态网页是纯粹HTML格式的网页,页面内容稳定,不论是否被访问,页面都被保存在网页服务器上,很容易被搜索引擎收录.
    而动态网页的内容是当用户点击请求时才从数据库中调出返回给用户一个网页的内容,并不是存放在服务器的独立文件,相比较于静态网页而言,动态网页很被搜索引擎收录.
  4. 用户访问速度不同.
    用户访问动态网页时,网页在获得搜索指令后经过数据库的调查匹配,再将与指令相符的内容传递给服务器,通过服务器的编译将网页编译成标准的和HTML代码,从而传递给用户浏览器,多个读取过程大大降低了用户的访问速度.
    而静态网页不同,由于网页内容直接存取在服务器上,省去了服务器的编译过程,用户访问网页速度很快.
  5. 制作和后期维护的工作量不同.
    动态网页的实际已数据库技术为基础,可以实现多种功能,降低了网站维护的工作量.
    而静态网页由于没有数据库的支持,网页内容更改时需要直接修改代码,在网页内容的制作和维护中,所需的工作量很大.

注意: 在设计网页时,主要根据网站的功能需求和网站内容的多少来选择不同的网页.

eg: 网站包含信息量太大时,就需要选择动态网页,反之,则选择静态网页.

第三章. HTTP协议

3.1 概述

HTTP : Hyper Text Transfer Protocol 超文本传输协议

传输协议 : 定义了客户端和服务器端通信时,发送数据的格式.

HTTP协议是基于TCP/IP的高级协议.默认端口是80.

HTTPS默认端口:443

3.1 HTTP工作原理

1.遵循请求(Request)/应答(Response)模型.

2.无法实现在客户端没有发起请求的时候,服务器将小子推送给客户端.(必须要客户端有请求,服务器端才能做出响应)

3.请求前需要建立连接,响应后悔断开连接; 连接不会持续存在.

4.一个页面有多个图片,JS,CSS等,就会发生多个请求和响应.

5.**HTTP/1.0 **每次请求都需要键立新的TCP连接,连接不能复用.HTTP/1.1新的请求可以在上次请求建立的TCP连接智商发送,连接可以复用(Connection:keep-alive).

补充: HTTPS >> S -> shorio提供加密, 是安全的(有认证的)

3.2 HTTP 协议的特点

  1. 支持浏览器/服务器模式.
  2. 简单快速 : HTTP本身既简单又能有效的处理大量请求.
  3. 灵活 : HTTP允许传输任意类型数据.有Content-Type 加以标记.
  4. 无状态 : Web浏览器和Web服务器之间不建立持久的连接.协议对于事务处理没有记忆能力.(eg:两次请求之间无关系)
  5. 在处理记忆登录用户名,记忆购物车多个条目信息环境,只有HTTP协议是不能实现的.

3.3 请求数据格式 (Request Headers)

3.3.1 请求行

请求方式 : GET
统一资源标识符(URL) : /login.jsp
协议版本号  : HTTP/1.1

请求方式: GET,POST,DELETE,PUT,TRACE,CONNECT,OPTIONS

常见请求方式:

GET:

1.请求参数在请求行中,在URL之后

2.请求的URL长度有限

3.不太安全

POST:

1.请求参数在请求体中

2.请求的URL长度没有限制

3.相对安全

3.3.2 请求头(消息报头)

客户端浏览器告诉服务器一些信息

请求修饰符
客户机信息

常见的请求头:
	User-Agent:浏览器告诉服务器,我访问你使用的浏览器的版本信息.  
		>>解决 :浏览器兼容问题
	Referer:告诉服务器,当前请求从哪里来
		>>作用: 1.防盗链 2.统计工作

3.3.3 请求体(正文/可能请求的内容)

封装POST请求消息的数据
 >>注:GET请求方式是没有请求体的.

3.4 响应数据格式(Response Headers)

服务器端发送给客户端的数据

3.4.1 响应行(状态行)

协议/版本号 : HTTP/1.1
响应状态 : 一个成功或错误的代码

响应状态码 : 由三维数字组成,第一个数字定义响应类别.

  • 1xx : 指示信息 >> 服务器接收客户端消息,但是没有接收完成,等待一段时间后,会发送1XX状态码.
  • 2xx : 成功 >>表示请求已被成功接收,理解 OK
  • 3xx : 重定向 >>要完成请求必须进行进一步的操作 302-重定向 , 304-访问缓存
  • 4xx : 客户端错误 >>请求有语法错误或请求无法实现 404-请求路径没有对应的资源 , 405-请求方式没有对应的doXxx方法.
  • 5xx : 服务器端错误 >>服务器未能实现合法的请求 500-服务器内部出现问题

3.4.2 响应头(消息报头)

服务器信息
字符编码
MIME类型

格式: 头名称 : 值
3.4.2.1 常见的响应头名称:
1.Content-Type : 服务器告诉客户端本次响应体数据格式以及编码格式
	2.Content-dispostion:服务器告诉客户端以什么格式打开响应体数据
3.4.2.2 常见的值:
1.in-line:默认值,在当前页面内打开
	2.attachment;filename=xxx:以附件的形式打开响应体,文件下载

3.4.3 响应体(响应正文)

传输的数据

第四章. Servlet

4.1 概述

Servlet [Server applet]: 是运行在服务器端的小程序.

Servlet是一个接口,定义了java类被浏览器访问到Tomcat的规则.

Servlet是一个基于java技术的动态网页技术,运行在服务器,由Servlet容器(Tomcat)管理,用于生成动态的内容,是JSP的前身.

Servlet不是由用户或程序员直接调用的,而是由容器(Tomcat)管理,没有main方法.

注意 : JSP和Servlet的关系

jsp的本质是.class文件,它的底层就是Servlet,所有的JSP 都要先翻译成Servlet然后再编译成class最后执行;

JSP执行过程 :

.jsp–翻译->.java(Servlet)–编译->.class–执行-

Servlet本质就是一个特殊的java类,编写Servlet实质上就是按照Servlet规范编写一个java类,它会在服务器编译成.class文件.

JSP是负责内容显示的,而Servlet是负责流程控制.

层次:

Servlet接口
	GenericServlet 实现类
		HttpServlet   类(继承了GenericServlet)

4.2 快速入门(需要使用web.xml)

  1. 创建javaEE项目
  2. 定义一个类,实现Servlet接口
  3. 实现接口中的抽象方法
  4. 配置Servlet(在web.xml文件中进行配置)
<!--配置Servlet-->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.lmx.Demo1Servlet</servlet-class>  <!--反射-->
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

4.3 Servlet执行原理

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

4.4 Servlet中的方法[生命周期]

Servlet的特点:单实例多线程

**类加载时机 : **

1.当用户第一次来访问Servlet时 (默认情况)

2.启动服务器时 >> 在web.xml文件中加0标签[数字越小,先加载]

URL-->/demo1 -->demo1 -->demo1-->cn.lmx.Demo1Servlet	
	
    1.类加载  >> 反射
		底层:Class cls = Class.forName("cn.lmx.Demo1Servlet");

	2.实例化-无参构造方法:只执行一次
        底层:Object obj = cls.newInstance();  >> 使用obj就可以调用方法了
        
	3.init():只执行一次--默认情况下,第一次被访问时,Servlet被创建时.  >>离不开反射
        
	4.service():执行多次--每次访问Servlet,该方法都会被执行一次.   >>离不开反射
        
	5.destroy():只有服务器正常关闭时,才会执行destroy方法--Servlet被销毁时执行,服务器关闭时,servlet被销毁   >>离不开反射
public class Demo1Servlet implements Servlet {

    /**
     * 默认情况下,第一次被访问时,Servlet被创建
     * init方法只执行1次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet被创建");
    }

    @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("Servlet被访问了!!!!");

    }

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

    /**
     * Servlet被销毁时执行,服务器关闭时,servlet被销毁
     * 只有服务器正常关闭时,才会执行destroy方法
     */
    @Override
    public void destroy() {
        System.out.println("Servlet被销毁了!!!");
    }
}