软件设计之JavaWeb(2)

软件设计之JavaWeb(2)

此篇应在MySQL之后进行学习:
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷全新JavaWeb教程,企业主流javaweb技术栈
资料可以去尚硅谷官网免费领取
此章节最好学完JDBC观看

学习内容:

  1. HTTP简介
  2. Servlet

1、HTTP简介

交互的方式:
请求:永远都是客户端向服务端发送
响应:永远都是服务端向客户端返回

在这里插入图片描述

http、tcp、ip

HTTP、TCP、IP是网络通信中不同层次的协议,它们构成了从高层应用到低层网络传输的完整协议栈。
HTTP协议:应用层,HTTP协议是在TCP协议之上运行的应用层协议,专门用于在客户端(如浏览器)和服务器之间传输网页数据(HTML、CSS、JS等)。HTTP规定了客户端和服务器之间如何请求和响应数据。 HTTP是无状态的,每次请求都是独立的,无法保存连接状态(可以通过Cookies或Session等技术保持状态)。
TCP协议:传输层, TCP协议在IP协议之上,提供可靠的、面向连接的传输服务。它确保数据按顺序到达,并且没有丢失或重复。TCP通过建立连接(握手)、确认数据包、重传丢失的数据包等机制,实现了可靠的传输。TCP是面向连接的、可靠的传输协议,提供数据流的完整性和顺序性。
IP协议: 网络层,IP协议负责将数据包从一台设备传输到另一台设备,它处理数据的路由和寻址问题。IP协议根据目标IP地址,将数据包在不同网络之间进行传输。IP是无连接的,主要负责数据包的传输,不保证数据包的可靠送达或顺序(这由上层协议处理)。

HTTP长链接与短连接

HTTP长链接,也称为持久连接,是在HTTP/1.1协议中引入的一种连接方式。它允许在一个TCP连接中发送和接收多个HTTP请求和响应,而不需要为每个请求都建立一个新的连接。使用长链接的好处是减少了频繁建立和断开连接的开销,节省了网络资源和时间,从而提高了传输效率。
HTTP短链接,也称为非持久连接,是在HTTP/1.0协议中常用的一种连接方式。在短链接中,每次HTTP请求都会建立一个新的TCP连接,服务器处理完请求并返回响应后,立即关闭连接。这种方式简单易实现,但每次请求都需要重新建立连接,带来一定的开销。

请求报文

客户端发给服务端的报文
1、请求行包括:请求方法、请求URL、HTTP版本
请求方法:表示客户端希望服务器执行的操作,例如 GET、POST、PUT、DELETE 等。
请求URI:请求的资源路径,例如 /index.html 或 /api/v1/users
HTTP版本:请求使用的HTTP版本,例如 HTTP/1.1。
2、请求头:包含了请求的附加信息,如 Host(目标主机名)、User-Agent(客户端软件)、Accept(接受的数据类型)等。
请求体:在某些请求方法(如 POST、PUT)中,包含了要发送给服务器的数据。例如,表单数据或JSON数据
在这里插入图片描述

响应报文

响应报文是服务器向客户端返回的消息,表示服务器对客户端请求的处理结果。
状态行包括:HTTP版本、状态码、状态描述
状态码:表示请求处理结果的三位数代码,例如 200(成功)、404(未找到)、500(服务器内部错误)等。
状态描述:对状态码的简短描述,例如 OK、Not Found、Internal Server Error。
响应头:包含了响应的附加信息,如 Content-Type(返回数据的类型)、Content-Length(返回数据的长度)、Set-Cookie(设置的Cookie)等。
响应体:包含了服务器返回给客户端的数据,例如网页内容、图像、JSON数据等。

在这里插入图片描述

Servlet

动态资源与静态资源

静态资源是指内容固定、不需要服务器端处理、直接由服务器发送给客户端的文件。这类资源通常包括HTML文件、CSS文件、JavaScript文件、图像文件等
动态资源是指在服务器端生成并且会随着用户的请求而动态变化的内容。通常,这类资源在每次请求时都会经过服务器端逻辑处理,然后生成返回给客户端的内容。动态资源通常由诸如Servlet、JSP(JavaServer Pages)或其他基于Java的服务器端框架(如Spring MVC、Struts等)生成。

Servlet简介

1、 Servlet 是 Java 技术中用于开发动态 Web 应用程序的一种服务器端组件。它能够接收客户端(通常是浏览器)的请求、处理请求,并生成动态响应(如 HTML 页面、JSON 数据等),然后将响应发送回客户端。从代码层面,Servlet是一个接口
2、 Tomcat 是一个流行的开源 Servlet 容器(也称为应用服务器),用于运行 Java Web 应用程序。Servlet 是用来处理客户端请求和生成动态响应的服务器端组件,而 Tomcat 是执行和管理这些 Servlet 的平台。
3、 当客户端(如浏览器)向服务器发送 HTTP 请求时,Tomcat 作为 Servlet 容器,会解析请求并将其传递给相应的 Servlet 进行处理。Servlet 通过HttpServletRequestHttpServletResponse对象与客户端进行交互,处理请求并生成响应。

Servlet开发流程

项目:通过客户端向一个Servlet发送请求,携带username,如果用户名是’atguigu’则向客户端响应NO,其他响应YES
1、创建JavaWeb项目:在项目创建新模块->项目结构依赖项添加Tomcat->添加Webapplication框架支持(顺带回顾一下前文)
2、重写service方法 service(HttpServletRequest req, HttpServletResponse resp)
3、在service方法中,定义业务处理代码
4、在web.xml中,配置Servlet对应的请求映射路径

代码部分

创建UserServlet对象继承HttpServlet(该对象实现了Servlet接口)
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 从req对象中获取请求中的任何信息(username)
        //根据参数名获取参数值
        String username = req.getParameter("username");
        //2 处理业务的代码
        String info = "YES";
        if ("atguigu".equals(username)){
            info = "NO";
        }
        //3 将要响应的数据放入resp
        //该方法返回的是一个向响应体中打印字符串的打印流
        PrintWriter writer = resp.getWriter();
        writer.write(info);
    }
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--method 属性定义了表单提交时所使用的HTTP方法-->
<!--action 属性在 HTML 表单中用于指定表单数据提交时的目标 URL,也就是服务器接收和处理表单数据的地址-->

<form method="get" action="userCheck">
    用户名:<input type="text" name="username"> </br>
<!--  value 属性定义了 <input> 元素的初始值或显示文本-->
    <input type="submit" value="校验">
</form>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">


<!--
1 配置Servlet类,并起一个别名
    servlet-class 告诉Tomcat要实例化的Servlet类
    servlet-name 用于关联请求的映射路径
-->
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.atguigu.servlet.UserServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
<!--        设置路径名称-->
        <url-pattern>/userCheck</url-pattern>
    </servlet-mapping>
</web-app>

url-pattern

1、一个Servlet路径可以对应多个url-pattern
2、一个Servlet标签可以对应多个servlet-mapping标签
3、url-pattern除了精确匹配,还能模糊匹配
模糊匹配:
/ 匹配全部,不包含jsp文件
/* 匹配全部,包含jsp文件
/a/* 匹配前缀,后缀模糊。只要前面是/a/开头,就匹配上
*.action 匹配后缀,前缀模糊

注解方式配置Servlet

在web.xml内配置servlet类相对比较麻烦
1、在Servlet类前加上:@WebServlet("路径名称")

Servlet生命周期

不建议在service方法中修改成员变量,在并发请求时会引发线程安全问题
1、加载与实例化:当Servlet容器(如Tomcat)启动时,或者当第一次请求该Servlet时,容器会加载Servlet类并创建一个实例。默认情况下,Servlet实例是在第一次收到请求时才加载的。
2、初始化:加载Servlet后,容器会调用init()方法对Servlet进行初始化。在这个阶段,Servlet可以读取配置参数,进行必要的资源初始化。init()方法只会被调用一次,在Servlet的整个生命周期中不会重复调用。
3、请求处理:对每一个客户端请求,Servlet容器会创建一个新的线程并调用Servlet的service()方法。service()方法会根据HTTP请求的类型(GET、POST等)来调用相应的处理方法
4、销毁:当Servlet容器决定卸载Servlet或停止容器时,容器会调用destroy()方法来清理资源,如关闭数据库连接等。destroy()方法也只会被调用一次。
5、defaultServlet 是Servlet容器提供的一个默认Servlet,用于处理静态资源的请求,如HTML页面、图片、CSS文件等。在Tomcat中,defaultServlet负责处理对静态资源的访问。如果一个URL请求没有被任何用户定义的Servlet匹配到,容器就会把这个请求交给defaultServlet处理
6、 load-on-startup 是一个Servlet配置元素,用于指定Servlet的加载时机。默认情况下,Servlet是延迟加载的,即只有在收到第一次请求时才会加载。如果希望在容器启动时就加载Servlet,可以在web.xml中通过load-on-startup元素配置
具体而言: load-on-startup 的值是一个整数。正数值表示容器启动时会预加载Servlet,数字越小优先级越高。负数或不指定时,Servlet会按需加载(即延迟加载)

Servlet继承结构

Servlet接口

1、init(ServletConfig config):这个方法用于在Servlet被创建后初始化它。ServletConfig对象包含Servlet的配置信息,包括初始化参数和ServletContext。这个方法只会在Servlet的整个生命周期中调用一次。
2、service(ServletRequest req, ServletResponse res):service()方法是Servlet中最重要的方法,它负责处理每个客户端请求。Servlet容器会为每个请求调用service(),传递ServletRequest和ServletResponse对象。
3、destroy():该方法在Servlet被销毁前调用,用于释放Servlet占用的资源,例如关闭数据库连接、清理缓存等。这个方法也只会被调用一次。
4、getServletConfig():该方法返回一个ServletConfig对象,包含Servlet的配置信息。在init()方法中,ServletConfig对象被传递给Servlet,之后可以通过这个方法再次获取
5、getServletInfo():该方法返回Servlet的描述信息,通常用于描述Servlet的功能或版本。这是一个可选的方法,通常用于调试或文档目的。

GenericServlet抽象类

1、GenericServlet 是一个通用的 Servlet 基类,可以处理非 HTTP 请求,适合用于需要更多灵活性和不特定于某种协议的应用。
2、它实现了 Servlet 接口,并提供了对部分方法的默认实现,简化了开发者的工作。比如,init() 和 destroy() 方法可以根据需要重写,而不是必须实现所有的 Servlet 接口方法。
3、作为一个抽象类,GenericServlet 强制子类必须实现 service() 方法,用来处理请求和响应。这个方法接受 ServletRequest 和 ServletResponse 作为参数。

HttpServlet抽象类

1、HttpServlet 类继承自 GenericServlet,并提供了专门用于处理 HTTP 协议的功能。
2、HttpServlet 提供了封装好的 service() 方法,能够自动识别请求类型(如 GET、POST 等),并将其委托给相应的 doXxx() 方法(如 doGet()、doPost() 等),开发者只需要重写与业务相关的特定方法。
3、继承HttpServlet后,要么重写service方法,要么重写 doGet/doPost等方法

ServletConfig的使用

1、 ServletConfig 是 Java 中用于在 Servlet 中获取配置参数的接口,它允许开发者通过 web.xml 或注解为每个 Servlet 配置特定的初始化参数。
2、功能1:获取初始化参数,ServletConfig 提供了获取在 web.xml 文件中为特定 Servlet 定义的初始化参数的方法。
3、功能2:获取 ServletContext,通过 ServletConfig 对象可以访问 ServletContext,它代表整个 web 应用的上下文环境。

ServletContext

1、 ServletContext 是 Java 中用于在整个 Web 应用程序范围内共享信息的接口。它提供了一种与 Web 容器进行交互的机制,可以在多个 Servlet 之间共享数据、资源、以及访问应用的初始化参数等。
2、共享数据:在整个应用范围内共享属性信息,所有的 Servlet 和 JSP 页面都可以访问这些信息。
3、获取 Web 应用的初始化参数:可以从 web.xml 文件中获取全局的初始化参数。
4、getRealPath(String path) 是 ServletContext 中的一个方法,它用于将一个相对路径转换为服务器文件系统上的绝对路径。这意味着你可以使用该方法获取 Web 应用程序中的资源在服务器上的物理位置。
5、 getContextPath()方法用于获取当前 Web 应用的上下文路径,可以避免在代码中硬编码 URL 路径,从而提高应用的可移植性。例如,当应用的上下文路径在不同服务器或部署环境中有所变化时,代码不需要手动更新路径。
6、域对象是指在 Java Web 开发中,用于保存和共享数据的对象。域对象与 Web 应用程序的不同作用域(scope)相对应,它们可以在特定的范围内用于存储和共享信息。
其中getAttribute(String name)setAttribute(String name, Object object) removeAttribute(String name) 方法在 Java Web 开发中几乎所有的域对象中都有使用。这些方法用于管理数据在不同作用域内的存储、获取和删除。

URI 和 URL 的区别

URI统一资源标识符是用于标识某个资源的字符串,可以包括以下两部分:资源的名称(如路径)、可选的定位部分(如 URL 中的协议)
URL统一资源定位符是 URI 的一种特殊形式,不仅标识资源,还提供了如何定位该资源的信息。通常包括:协议(如 http 或 https)、主机名或 IP 地址、端口号(可选)、资源路径
总结:URI 用于标识一个资源;URL 是 URI 的一种,用于标识并定位资源。

HttpServletRequest

HttpServletRequest 是 Java Servlet 中用于表示客户端发出的 HTTP 请求的接口。它继承自 ServletRequest,并提供了专门用于处理 HTTP 请求的方法。开发者可以通过该接口获取请求头、请求参数、请求体等信息,以便处理客户端请求。

HttpServletResponse

HttpServletResponse 是 Java Servlet API 中用于表示服务器响应客户端请求的接口。它允许服务器向客户端(通常是浏览器)发送各种类型的响应数据,包括文本、HTML、文件、JSON 等。通过 HttpServletResponse,开发者可以控制响应状态码、响应头、响应内容等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值