JavaWeb入门


JavaWeb入门

88bafcae5ff586b69385b15a48a36d63

JavaWeb入门1 概述1.1 web应用程序1.2 静态web1.3 动态web2 web服务器2.1 概述2.2 web服务器3 Tomcat3.1 Tomcat安装3.2 配置3.3 发布网站3.4 IDEA配置Tomcat4.1 概述5 Maven5.1 概述5.2 Maven项目架构管理工具5.3 安装Maven5.4 配置5.5 本地仓库5.6 IDEA使用Maven5.7 pom.xml配置5.8 web.xml配置5.9 Maven仓库使用6 Servlet6.1 概述6.2 HelloServlet程序6.3 Servlet的运行原理6.4 ServletContext对象7 Cookie、Session7.1 会话7.2 保存会话技术7.3 Cookie7.4 Session8 JSP8.1 简介8.2 JSP原理8.3 JSP基本语法8.4 JSP指令8.5 9大内置对象8.6 JSP、JSTL标签 EL表达式9 MVC三层架构

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

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

123

默认主机:

xxxxxxxxxx
212

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

xxxxxxxxxx
812345678

改为:

xxxxxxxxxx
6123456

5.5 本地仓库

建立仓库:

xxxxxxxxxx
11

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的核心配置文件

?x123456789101112161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

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

xxxxxxxxxx
201234567891011121314151617181920

5.8 web.xml配置

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

xxxxxxxxxx
812345678

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

xxxxxxxxxx
3123

子项目:

xxxxxxxxxx
512345

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

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

4.添加Java和Resources文件夹

5.编写程序

(1)源码分析:

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

servlet的方法

xxxxxxxxxx
512345

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

xxxxxxxxxx
3712345678910111213141516171819202122232425262728293031323334353637

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

xxxxxxxxxx
9123456789

(2)编写Servlet类

xxxxxxxxxx
1912345678910111213141516171819

(3)编写Servlet映射

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

xxxxxxxxxx
1012345678910

(4)启动Tomcat,运行程序

响应头:

image-20211209201446929

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

补充

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

xxxxxxxxxx
812345678
xxxxxxxxxx
171234567891011121314151617

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:

xxxxxxxxxx
24123456789101112131415161718192021222324

到ServletContext读取数据并显示:

xxxxxxxxxx
24123456789101112131415161718192021222324

web.xml

xxxxxxxxxx
1612345678910111213141516

运行结果:

image-20211210100046239

跳转页面:

image-20211210100209676

获取初始化参数

web.xml:

xxxxxxxxxx
41234

java:

xxxxxxxxxx
512345

结果:

image-20211210101702411

请求转发

java:

xxxxxxxxxx
71234567

结果:

image-20211210102912391

读取资源

properties:

xxxxxxxxxx
3123

maven打包之后的路径:

image-20211210105251261

通过getResourceAsStream获取资源:

xxxxxxxxxx
12123456789101112

结果:

image-20211210105344705

6.5 HttpServletResponse类

应用

  • 下载文件
xxxxxxxxxx
321234567891011121314151617181920212223242526272829303132

运行效果:

image-20211210170925182

  • 验证码

resp.setHeader参数:

xxxxxxxxxx
6123456

生成验证码图片的Servlet:

xxxxxxxxxx
3712345678910111213141516171819202122232425262728293031323334353637

运行结果:

image-20211210180141924

  • 重定向

请求重定向到其他页面

xxxxxxxxxx
3123

结果:

image-20211210180536617

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

xxxxxxxxxx
212

重定向和转发的区别:

  • 相同:

    • 页面跳转
  • 不同:

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

6.6 HttpServletRequest类

获取参数

登录首页:

xxxxxxxxxx
24123456789101112131415161718192021222324

servlet:

xxxxxxxxxx
231234567891011121314151617181920212223

运行结果:

登录页面:

image-20211210212453206

获取信息:

image-20211210212506812

7 Cookie、Session

7.1 会话

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

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

客户端 服务端

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

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

7.2 保存会话技术

cookie:客户端技术

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

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

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

2.服务器响应客户端cookie

xxxxxxxxxx
351234567891011121314151617181920212223242526272829303132333435

服务端响应客户端cookie

image-20220107201544002

服务端获取到客户端cookie

image-20220107201417094

设置cookie有效期:

xxxxxxxxxx
11

cookie有效时间与到期时间:

image-20220107201829303

Cookie细节问题

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

删除Cookie

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

编码解码

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

xxxxxxxxxx
212

7.4 Session

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

Session和Cookie的区别

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

获取Session,保存对象到Session

xxxxxxxxxx
201234567891011121314151617181920

可以看到SessionID会保存在cookie中

image-20220119120035033

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

session的应用:

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

获取Session的信息

xxxxxxxxxx
111234567891011

image-20220119120455860

注销Sesion

手动设置失效:

xxxxxxxxxx
3123

自动失效时间:

在web.xml设置:

xxxxxxxxxx
512345

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源码分析:

xxxxxxxxxx
6123456

内置对象:

xxxxxxxxxx
111234567891011

配置:

xxxxxxxxxx
9123456789

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

输出页面:

JSP:

xxxxxxxxxx
812345678

Servlet:

xxxxxxxxxx
9123456789

JSP

8.3 JSP基本语法

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

JSP表达式:

xxxxxxxxxx
512345

JSP脚本片段:

xxxxxxxxxx
812345678

image-20220120204246575

xxxxxxxxxx
71234567

image-20220120204925370

JSP声明:

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

xxxxxxxxxx
171234567891011121314151617

image-20220120205733602

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

8.4 JSP指令

1.设置页面信息

xxxxxxxxxx
812345678

设值页面错误:

xxxxxxxxxx
3123

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

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

xxxxxxxxxx
812345678

2.include包含

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

xxxxxxxxxx
3123

image-20220121000854724

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

xxxxxxxxxx
3123

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

8.5 9大内置对象

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

对象及作用域

xxxxxxxxxx
291234567891011121314151617181920212223242526272829

image-20220214144052778

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

在另一个页面中取出

xxxxxxxxxx
171234567891011121314151617

image-20220214144850237

对象及作用域:

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

8.6 JSP、JSTL标签 EL表达式

maven依赖:

xxxxxxxxxx
12123456789101112

JSP标签

包含

xxxxxxxxxx
11

设置转发与请求参数

xxxxxxxxxx
41234

取出参数,处理转发

xxxxxxxxxx
3123

image-20220214151229089

JSTL表达式

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

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

JSTL标签的使用

导入taglib:

xxxxxxxxxx
11

form表单:

xxxxxxxxxx
41234

JSTL标签:

xxxxxxxxxx
812345678

image-20220214155015769

判断的使用

xxxxxxxxxx
1612345678910111213141516

for遍历

xxxxxxxxxx
1312345678910111213

9 MVC三层架构

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

MVC(1)

  • View

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

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

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