Egoistic_Flowers

JavaWeb入门
JavaWeb入门

88bafcae5ff586b69385b15a48a36d63

JavaWeb入门

1 概述

web开发:

  • web,网页

  • 静态web

    • HTML,CSS
  • 动态web

    • 每个人不同时间看到信息都不同
    • Servlet/JSP、ASP、PHP
  • Java中,动态web资源开发技术统称为JavaWeb

1.1 web应用程序

可以提供浏览器的程序:

  • a.html,b.html...这些多个web资源可以被外界访问,对外界提供服务
  • 访问的资源都存在某一个计算机
  • 统一的web资源通过Tomcat服务器给用户访问

1.2 静态web

服务器上存放HTML文件,通过网络读取文件

  • 静态web:

    • Web无法更新,所有用户都是同一个页面
    • 数据无法持久化,用户无法交互

1.3 动态web

web页面展示效果

  • 可以动态更新,可以与数据库交互
  • 需要后台程序支持,停机维护

2 web服务器

2.1 概述

  • ASP:微软

    • 在HTML中嵌入VB的脚本
    • 维护成本高
  • PHP

    • 开发效率高,功能强,代码简单
    • 无法承载大访问量
  • JSP/Servlet

    • B/S:浏览器与服务器模型
    • 基于Java语言
    • 可以承载高并发,高可用,高性能

2.2 web服务器

服务器用来处理用户的请求,处理请求,给用户响应

  • IIS:微软,windows自带

  • Tomcat:

    • 技术先进,性能稳定,免费

3 Tomcat

3.1 Tomcat安装

官网下载

image-20211208153023076

启动/关闭Tomcat

打开bin目录下startup.bat文件

image-20211208153654210

用浏览器访问localhost:8080

image-20211208153743586

关闭bin目录下shutdown.bat文件

闪退问题:Tomcat需要Java环境,会读取JAVA_HOME或者JRE_HOME没有配置环境变量则会错误

Java环境变量配置:如果需要调整Java目录,如果Path变量存在一个C盘下的java path需要先删除这个地址

3.2 配置

打开conf/server.xml

默认端口配置,协议,超时:

默认主机:

DNS解析简介:

  • 1.输入域名
  • 2.检查主机Host
  • 3.没有则请求DNS服务器,返回IP地址

配置环境变量

3.3 发布网站

  • 将自己写的网站放到服务器(Tomcat)中指定的文件夹下(webapps):

  • webapps

    • ROOT

    • TestStaticWeb:网页目录名

      • WEB-INF

        • classes:java程序
        • lib:web应用依赖的Jar包
        • web.xml:网站的配置文件
      • index.html 默认首页

      • static

        • css
        • js
        • img
      • ......

通过8080端口访问自己发布的网站:

image-20211208160925223

3.4 IDEA配置Tomcat

1.右上角AddConfiguration打开,选择Tomcat

image-20211209103447099

2.配置Tomcat

image-20211209103851138

需要手动配置文件夹

image-20211209104112499

image-20211209104409850

3.启动Tomcat,点击右上角运行

image-20211209104756321

4 HTTP

4.1 概述

HTTP超文本传输协议

  • 文本:HTML,JSON...
  • 超文本:图片、音乐、视频、定位...

HTTP的版本

  • HTTP1.0

    • HTTP/1.0:客户端与web服务器连接后,只能获得一个web资源
    • 每一次请求和应答都会发一次TCP连接的建立和断开
  • HTTP2.0

    • HTTP/1.1:客户端与web服务器连接后,可以获得多个web资源
    • 允许在一次TCP连接上发送多次请求和应答

4.2 HTTP工作时序

先建立TCP连接,在TCP连接上进行请求和应答:

HTTP时序

访问自己发布的网站,启动抓包

HTTP通信的时序:

image-20211208165417589

HTTP请求

image-20211208165653876

1.请求行

  • 请求方法:GET方法

    • GET:请求能携带的参数较少,大小有限制,在URL显示数据,不安全
    • POST:请求能携带的参数没有限制,大小没有限制,安全,但不高效

2.消息头

  • URI:/TestStaticWeb/

    • 统一资源标志符 资源位置(这里不带协议和主机)
  • Version:HTTP/1.1

  • Host:localhost:8080

    • 主机
  • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8

    • 支持的数据类型
  • Accept-Encoding:gzip, deflate

    • 支持的编码格式 GBK UTF-8 GB2312 ISO8859-1
  • 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

    • 语言环境
  • Cache-Control max-age=0

    • 缓存控制
  • Cookie

  • Connection:keep-alive

    • 请求完成是断开还是保持连接(TCP)

HTTP响应

image-20211208170920209

这里进行了重定向304状态码,使用了缓存数据

使用浏览器的网格分析功能抓包:

image-20211208171545731

获取完HTML之后加载图片还会发送HTTP请求到指定URL请求图片

image-20211208171657644

响应头

响应状态码:

  • 1 信息提供

  • 2 肯定应答

    • 200 OK
    • 204 处理完成请求不返回信息
  • 3 重定向请求

    • 304 网页未修改(服务器返回此状态不返回内容,使用缓存内容,节省流量)
  • 4 客户端请求内容出现错误

    • 403 服务器拒绝请求
    • 404 请求内容不存在
    • 408 请求超时
  • 5 服务器错误

    • 502 网关错误,上游服务器无效响应
    • 504 网关超时,没有收到上游服务器的响应

5 Maven

5.1 概述

  • 在Javaweb开发中,需要用到大量的Jar包,需要手动导入,麻烦

  • 如何自带导入Jar包

    • Maven

5.2 Maven项目架构管理工具

目前用来导入Jar包

Maven的核心思想:约定大于配置

Maven会规定好如何去编写Java代码

5.3 安装Maven

Maven官网

5.4 配置

配置环境变量

  • M2_HOME maven下的bin目录
  • MAVEN_HOME maven目录
  • path %MAVEN_HOME%\bin

打开文件conf/settings.xml

改为:

5.5 本地仓库

建立仓库:

5.6 IDEA使用Maven

使用模板创建Maven项目

1.创建MavenWeb项目

image-20211208214146975

image-20211208214455218

image-20211208214935903

2.等待导入Jar包

image-20211208215417608

3.BUILD SUCCESS 搭建成功

自动导入的Jar包:

image-20211208215517076

4.IDEA中的Maven配置

image-20211208215939121

项目创建之后查看是否配置正确,IDEA可能改变目录

手动创建Maven项目

不使用模板:

image-20211208221415334

这里空模板不能设置Maven,果然IDEA使用了默认的Maven仓库,去设置里面改为自己配置的maven

创建好的文件:

image-20211208221823314

刚刚创建的JavaWeb模板项目:

image-20211208222120376

使用Web项目,在main文件夹下创建java文件夹和resources文件夹

标记文件夹为源码目录,资源目录:

image-20211208222445497

查看Jar包的目录树:

image-20211209111643614

5.7 pom.xml配置

Maven:

image-20211209105302132

pom.xml是Maven的核心配置文件

资源导出失败问题:Java文件夹可以包含配置文件,防止导出失败

5.8 web.xml配置

Tomcat的配置文件,通过IDEA模板生成的配置比较老,直接复制Tomcat自带案例的配置

5.9 Maven仓库使用

寻找HttpServlet的Jar包,Alt+Enter可以通过IDEA寻找Maven依赖,IDEA生成的依赖版本号很老而且有问题

image-20211209114721381

找到Maven仓库,地址

搜索Servlet:

image-20211209114956629

复制Maven依赖

image-20211209115241527

6 Servlet

6.1 概述

  • Servlet是sun公司开发动态Web的技术

  • Sun在这些API中提供一个接口叫:Servlet

    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到web服务器中
  • 实现了Servlet接口的Java程序叫做Servlet

6.2 HelloServlet程序

1.新建普通Maven项目删除原来的src目录

2.新建子模块,父项目中pom.xml会多一个module

子项目:

子项目如果没有生成parent标签,手动写入,否则无法继承父项目的依赖

3.将web.xml换成Tomcat最新的

4.添加Java和Resources文件夹

5.编写程序

(1)源码分析:

  • Servlet接口有两个默认实现类,HttpServlet,GenericServlet
  • 这两个类的继承关系:

servlet的方法

service在HttpServlet中实现了,service根据GET,POST...方法来调用doGet,doPost方法

而HttpServlet类中的这些方法只是返回错误码,所以需要我们重写这些方法

(2)编写Servlet类

(3)编写Servlet映射

在Web服务中注册Servlet服务,类似路由表的编写(需要URL)

(4)启动Tomcat,运行程序

响应头:

image-20211209201446929

ISO-8859-1是Java的默认编码,这里输出中文需要设置编码为UTF-8

补充

<url-pattern > 可以使用统配标识符*来表示任意字符,由于固有路径的优先级高,可以通过这种方式做一个404的页面(没有servlet映射就会进这个页面)

6.3 Servlet的运行原理

Tomcat是一个web容器,也叫web服务器,Tomcat只是实现了JSP 和 servlet 开发标准,编译好的servlet类只能运行在tomcat容器中,客户端浏览器不可以直接访问Servlet,需要在web.xml中配置

Servlet,它被设计为多线程的,当一个用户进行访问,就会创建一条线程运行此用户请求的响应,保证了在多用户访问网页的时候不会出现等待访问的情况。而且Servlet机制是有线程池支持的,在初始化阶段,线程就被创建好了

servlet在Tomcat中是以单例模式存在的,在使用实例变量时,会产生线程安全问题,当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类,此时它贮存于内存中。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类(单例模式),也就是有多个线程在使用这个实例。 这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致,所以尽量使用同步来保护被访问的资源

Servlet

Servlet生命周期

  • (1)加载和实例化

    • 当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。实力化会使Servlet类被类加载器加载,容器通过反射方式创建Servlet实例,默认调用无参构造,所以在编写Servlet类时不应该提供有参构造
  • (2)初始化

    • 在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。每一个Servlet实例init()方法只被调用一次,在初始化期间可以完成读取配置,建立数据库连接等操作。
    • 如果初始化发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器,ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例暂时或永久不可用。
  • (3)请求处理

    • Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。调用service()方法后判断请求的方法调用doGet()doPost()等方法处理请求,通过HttpServletRequest读取请求信息,HttpServletResponse返回处理请求结果。
    • 如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404响应。如果指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂时忙,不能处理请求)响应。
  • (4)服务终止

    • 当测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

6.4 ServletContext对象

web容器启动的时候,会为每个web程序创建对应的ServletContext对象,代表当前web应用

共享数据:在多个Servlet对象共享数据

程序编写:

创建一个Servlet获取Get参数,将参数写入到ServletContext:

到ServletContext读取数据并显示:

web.xml

运行结果:

image-20211210100046239

跳转页面:

image-20211210100209676

获取初始化参数

web.xml:

java:

结果:

image-20211210101702411

请求转发

java:

结果:

image-20211210102912391

读取资源

properties:

maven打包之后的路径:

image-20211210105251261

通过getResourceAsStream获取资源:

结果:

image-20211210105344705

6.5 HttpServletResponse类

应用

  • 下载文件

运行效果:

image-20211210170925182

  • 验证码

resp.setHeader参数:

生成验证码图片的Servlet:

运行结果:

image-20211210180141924

  • 重定向

请求重定向到其他页面

结果:

image-20211210180536617

重定向相当于设置Location位置和状态码302

重定向和转发的区别:

  • 相同:

    • 页面跳转
  • 不同:

    • 转发URL地址不变,相当于把req,resp交给其他的Servlet类处理(或是通过HTTP请求转发到其他进程)
    • 重定向URL地址改变,相当于发送请求到目标地址,该地址响应重定向状态,并返回一个地址,然后再次请求重定向返回的地址

6.6 HttpServletRequest类

获取参数

登录首页:

servlet:

运行结果:

登录页面:

image-20211210212453206

获取信息:

image-20211210212506812

7 Cookie、Session

7.1 会话

会话:用户打开浏览器,点击链接等操作,关闭浏览器,这个过程称之为会话

有状态会话:访问网页,下次访问记录曾经访问过

客户端 服务端

  1. 服务端给客户端一个Cookie,客户端下次访问带上Cookie

    1. 服务端登记客户端访问的记录,下次登录进行匹配(Session)

7.2 保存会话技术

cookie:客户端技术

session:服务器技术,保存用户的会话信息

常见场景:网站登录之后,下次打开网页自动登录

1.从客户端请求中获取Cookie

2.服务器响应客户端cookie

服务端响应客户端cookie

image-20220107201544002

服务端获取到客户端cookie

image-20220107201417094

设置cookie有效期:

cookie有效时间与到期时间:

image-20220107201829303

Cookie细节问题

  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小限制4kb
  • 浏览器存储上限300个cookie

删除Cookie

  • 不设置有效期,关闭浏览器,自动失效
  • 将有效期设为0

编码解码

如果Cookie储存中文出现乱码问题,进行utf-8编码

7.4 Session

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没关,Session存在

Session和Cookie的区别

  • Cookie把用户数据写给用户,在浏览器客户端保存
  • Session把用户数据写到Session(每次访问单独创建Session,通过SessionID保证用户唯一)中,由服务器保存

获取Session,保存对象到Session

可以看到SessionID会保存在cookie中

image-20220119120035033

服务器给用户的是SessionID,用户通过SessionID来识别唯一的session,session信息保存在服务端,用户通过SessionID来获取Session的信息。

session的应用:

  • 保存登录信息
  • 保存网站常用数据

获取Session的信息

image-20220119120455860

注销Sesion

手动设置失效:

自动失效时间:

在web.xml设置:

8 JSP

8.1 简介

Java Server Page: Java服务器页面

JSP与HTML区别:

  • HTML只给用户提供静态的数据(无法与服务端交互)
  • JSP页面可以嵌入JAVA代码,提供动态页面

8.2 JSP原理

Jsp会转换为Servlet类

在Tomcat文件夹下可以找到Jsp源码(在访问JSP页面才会生成)

image-20220120193204074

image-20220120193239579

image-20220120193633296

可以找到JSP继承Servlet类

JSP源码分析:

内置对象:

配置:

这些对象在JSP可以直接使用

输出页面:

JSP:

Servlet:

JSP

8.3 JSP基本语法

JSP中Java代码规范与Java语法相同,会扩充一些语法

JSP表达式:

JSP脚本片段:

image-20220120204246575

image-20220120204925370

JSP声明:

提高作用域,将代码放在类中,可以声明全局变量或定义方法

image-20220120205733602

注释:JSP注释在页面源代码看不到,HTML可以看到

8.4 JSP指令

1.设置页面信息

设值页面错误:

遇到500错误会直接转跳到500.jsp页面

也可以在web.xml设置错误转跳的页面:

2.include包含

header.jsp,footer.jsp中写入网站通用的头部和尾部,include指令就会把头部尾部拼接到网页中

image-20220121000854724

使用JSP标签也能实现一样的效果,但是不会拼接jsp而是调用

注意:一般使用JSP标签,使用上面的方式会拼接代码,如果在include的jsp文件与外面的jsp文件声明同名变量会导致栈错误,而下面的方式不会。

8.5 9大内置对象

  • PageContext
  • Request
  • Response
  • Session
  • Application
  • ServletConfig
  • out
  • page
  • exception

对象及作用域

image-20220214144052778

注:使用EL表达式不会在网站上显示null的结果 使用JSP表达式会显示null

在另一个页面中取出

image-20220214144850237

对象及作用域:

  • pageContext:保存的数据只在一个页面中有效
  • request:保存在一次请求中有效,转发会携带这个数据,用户用完就没用的数据
  • session:保存的数据在一次会话中有效,从打开浏览器到关闭浏览器,用户用完还有用的数据
  • application:保存的数据在服务器中,从打开服务器到关闭服务器,一个用户使用完其他用户还会使用的数据

8.6 JSP、JSTL标签 EL表达式

maven依赖:

JSP标签

包含

设置转发与请求参数

取出参数,处理转发

image-20220214151229089

JSTL表达式

JSTL标签库的使用弥补HTML标签的不足,标签的功能与Java代码相同

  • 核心标签
  • 格式化标签
  • SQL标签
  • XML标签

JSTL标签的使用

导入taglib:

form表单:

JSTL标签:

image-20220214155015769

判断的使用

for遍历

9 MVC三层架构

MVC: Model View Controller 模型、视图、控制器

MVC(1)

  • View

    • 展示数据
    • 提供发起Servlet请求的操作(a,form...)
  • Controller

    • 接收用户请求(req:请求参数,session)
    • 调用业务层处理请求
    • 控制视图跳转
  • Model

    • 处理业务 (Service)
    • 数据持久化: CRUD

 

 

 

posted on 2022-03-03 16:14  Egoistic_Flowers  阅读(98)  评论(0编辑  收藏  举报