Java Servlet_HTTP

news2024/10/7 7:32:49

今日内容

零、 复习昨日
一、Servlet
二、HTTP
三、HttpServlet

零、 复习昨日

见晨考

一、Servlet

1.1 介绍

javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应.


我们要想在服务器中写java代码来接收请求,做出响应,我们的java代码就得遵循tomcat开发规范


因此Tomcat提供了开发的规范,就是servlet.

Servlet就是运行在服务器上的程序,可交互式的接收服务器的请求,并可以做出响应


总结Servlet的作用:

  • 运行在服务器,是一个服务器端的程序
  • 接收客户端请求,向客户端做出响应
  • 动态网页(jsp)

1.2 第一个Servlet程序

1.2.1 创建web项目

image-20221125095804303

image-20221125095900779

手动补全目录结构

image-20221125100044388

1.2.2 pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.qf</groupId>
  <artifactId>day46_servlet</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!-- java项目打包方式是jar包 -->
  <!-- web项目打包方式是war包 -->
  <packaging>war</packaging>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- 引入servlet依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <!-- 引入jsp依赖 -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
    </dependency>
  </dependencies>
</project>

1.2.3 编写Servlet

  • 实现javax.servlet.Servlet接口
  • 重写方法
  • 在核心方法service()里面完成接收请求,做出响应
package com.qf.servlet;

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

public class MyServlet1 implements Servlet {
    @Override
    public void init(ServletConfig config) throws ServletException {}

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

    /**
     * 核心方法,服务,在这个方法中可以完成接收请求,做出响应
     * @param req 用来处理请求的对象
     * @param res 用来处理响应的对象
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // 通过请求对象,可以获得请求的ip
        String ip = req.getRemoteAddr( );
        System.out.println("ip = "+ip );

        // 响应
        // res.getWriter()获得字符输出流
        // .writer() 写出到浏览器字符(中文可能乱码)
        res.getWriter().write("i'm Response,Hello");
    }

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

    @Override
    public void destroy() {}
}

1.2.4 配置Servlet

因为服务器中会有很多servlet,浏览器发请求如何确定访问哪一个servlet类?

此时就需要做一个映射: 请求路径和servlet类的映射,即发出的请求由哪个servlet类来处理


配置需要写在webapp/WEB-INF/web.xml中

<?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_3_1.xsd"
version="3.1">
    <!-- 在这里写路径和servlet映射 -->
    <servlet>
        <!-- servlet的名字,任意 -->
        <servlet-name>servlet1</servlet-name>
        <!-- servlet的路径 -->
        <servlet-class>com.qf.servlet.MyServlet1</servlet-class>
    </servlet>

    <!-- 请求路径映射 -->
    <servlet-mapping>
        <!-- 该路径映射的servlet名 -->
        <servlet-name>servlet1</servlet-name>
        <!-- 请求路径的模板,一定要/开头 -->
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
</web-app>

浏览器发出请求,经过web.xml中配置的信息,

  • 匹配url-pattern>/s1</url-pattern,有该路径则正常访问,无该路径报404
  • 通过servlet-name找到servlet类
  • 再通过servlet-class,找到servlet类路径
  • 该servlet就可以执行service()

1.2.5 部署项目

web项目已经开发完毕,将项目部署到服务器Tomcat

配置Tomcat

image-20221125103951611

部署项目

image-20221125104134483

image-20221125104144365

image-20221125104255911

1.2.6 启动访问

启动项目

image-20221125143816377

访问发出请求

http://localhost:8080/day46/s1

image-20221125104500192

image-20221125104906466

image-20230324103136654

-Dfile.encoding=utf-8

1.3 执行流程分析【理解】

  1. 启动服务器

    如果启动失败,要及时查看控制台日志

  2. 立即加载解析web.xml文件

    1)服务器内就会知道当前服务器能接收哪些请求路径

    2)也知道请求路径被哪个servlet处理

    3)如果web.xml中有错,启动会失败,要及时查看控制台日志

    4)常见的错误就是url-partten写错了

  3. 启动成功,跳转至index.jsp页面(如果没有该页面,报错404)

  4. 浏览器发出请求

    1)发出请求路径,根据ip找到服务器,再根据8080找到服务器中的程序htttp://localhost:8080

    2)然后再通过名字找到服务器中的项目,默认访问首页(index.jsp),找不到报错404

    htttp://localhost:8080/day46

    3)然后发出具体的请求路径 http://localhost:8080/day46/a

  5. 发出的请求会经过web.xml中配置的路径去匹配

    1)web.xml中没有匹配到路径,报错404

    2)web.xml中有匹配的路径,就找对应的servlet让其执行

  6. servlet执行service()方法,完成接收请求,和做出响应的动作

    如果后台出问题,主要是指java代码报错,页面会报错500

1.4 使用细节

1.4.1 web.xml中url-partten写错

  <!-- 请求路径映射 -->
    <servlet-mapping>
        <!-- 该路径映射的servlet名 -->
        <servlet-name>servlet1</servlet-name>
        <!-- 请求路径的模板,一定要/开头 -->
        <!-- 没有/开头,启动报错 -->
        <url-pattern>s1</url-pattern>
    </servlet-mapping>
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> s1 in servlet mapping

1.4.2 首页问题

项目启动,默认访问webapp/index.jsp页面

没有该页面,启动报404

也可以通过web.xml文件来修改默认启动访问页面

<?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_3_1.xsd"
version="3.1">

    
    <!-- 设置欢迎页 -->
    <welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>
    
     <!-- ... -->
</web-app>

1.4.3 访问路径问题

现在的访问路径是

http://localhost:8080/day46/

这个访问路径,是在配置Tomcat时给设置的

image-20221125153714293 image-20221125153746569

再访问就是http://localhost:8080/java2217

image-20221125153823894

1.4.4 修改端口

image-20221125154318886 image-20221125154344957

1.4.5 web.xml标签有顺序

有些web.xml上方的约束文件不同,即web.xml内容的顺序不同.如果有报错,鼠标悬浮查看错误信息,就会发现,标签有顺序要求!! 顺序如下

image-20230324111952985

1.5 映射细节

映射细节就是浏览器发出请求,访问servlet时的一些操作

1.5.1 映射路径模板

第一种: 固定路径

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <!-- 该请求就是固定,只能访问/s1才能请求成功 -->
    <url-pattern>/s1</url-pattern>
</servlet-mapping>

第二种: 模糊匹配路径

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <!-- 该请求就是模糊匹配,*代表任意,所有请求都会成功!! -->
    <url-pattern>/*</url-pattern>
</servlet-mapping>

第三种: 多层路径

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <!-- 该请求只能访问/a/b请求才能成功 -->
    <!-- <url-pattern>/a/b</url-pattern> -->
    <url-pattern>/a/*</url-pattern>
</servlet-mapping>

第四种: 后缀匹配

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <!-- 该请求只能后缀为.do请求才能成功,前缀任意【此时前面不要加/】 -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

1.5.2 多个请求到同一个Servlet

一个Servlet可以处理多个请求

多个映射路径映射可以到同一个Servlet,比如设置url-partten为/*,那么就可以任何请求都就可以找到MyServlet1执行


也可以这么设置,让/s1 /s11 /s111都可以访问到MyServlet1

</servlet-mapping>     
<servlet-name>servlet1</servlet-name>
<url-pattern>/s1</url-pattern>
<url-pattern>/s11</url-pattern>
<url-pattern>/s111</url-pattern>  
</servlet-mapping>

或者这么写

    <servlet-mapping>
        <servlet-name>servlet1</servlet-name>
        <url-pattern>s1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>servlet1</servlet-name>
        <url-pattern>s2</url-pattern>
    </servlet-mapping>

1.5.3 一个请求到多个Servlet

一个请求不能到多个Servlet!!! 不能这样配置!!!

1.6 Servlet生命周期【理解】

  • 创建
    • 请求到达该Servlet时才创建
    • 且只创建一次,单例对象
  • 初始化
    • 创建完对象,立即初始化
    • 也就初始化一次
  • 服务
    • 请求到达该类,对象创建完毕,初始化完毕后就执行service干活
    • 后续,每次请求到达该类,service()都会执行
  • 死亡
    • 服务器关闭时销毁

二、HTTP

浏览器和服务器之间是通过http协议在传输数据.


超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状态的、应用层的协议,运行于TCP协议基础之上。


课下查询书籍<<网络通信>> <<计算机组成原理>>

2.1 在http请求中有请求报文

通过浏览器的开发者工具(F12)监听任何一个网站的请求响应过程,就可以看到请求报文和响应报文

image-20221125172607680

请求行内有请求方式(GET),和请求路径(/s?wd=java)

image-20221125172859447

ps: 后续就可以通过servlet获得这些数据

2.2 在http响应中有响应报文

image-20221125173053058

响应行中有协议(http/1.1) ,响应状态码(200) ,响应信息(OK)

image-20221125173227397

2.3 GET和POST

HTTP中常见的请求方式

  • get
  • post

GET请求

  • 数据会通过浏览器地址栏发送
  • 数据量大小有限制,最多4kb
  • 请求数据不安全
  • 效率相对较高

开发中建议,通过服务器查询数据使用get请求,比如findOne,findAll等信息

前端技术中,如何发送一个get请求?

  • form表单指定method=get
  • a标签
  • ajax
  • window.location.href = “/day46/index/html”
  • 地址栏手动输入

POST请求

  • 数据是隐藏的,在地址栏看不见,但是是在请求体中
  • 数据量大小不限
  • 数据相对安全
  • 效率相对较低

开发中建议,使用POST向服务器发送数据,登录,注册,更新,上传文件等

前端技术中,如何发送一个POST请求?

  • form表单的method=post
  • ajax

三、HttpServlet

之前Servlet程序,需要实现Servlet接口,有不好之处

  • 实现接口,重写所有方法,但是只关心如何接收请求和做出响应
  • service()方法可以处理各种各样的请求,不够专一

基于以上问题,服务器就提供一个专业用于处理HTTP请求和响应的一个Servlet类,HttpServlet,该类是抽象类,内部提供一些方法,供选择重写

image-20221125193802252

  • 浏览器发出get请求,那么就重写doGet方法处理get请求
  • 浏览器发出post请求,那么就重写doPost方法处理post请求
package com.qf.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 MyServlet3 extends HttpServlet {


    /**
     * 重写doGet,处理get请求
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("接收get请求" );

    }

    /**
     * 重写doPost,处理post请求
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("接收post请求" );
    }
}
    <servlet>
        <servlet-name>servlet3</servlet-name>
        <servlet-class>com.qf.servlet.MyServlet3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet3</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>
    <form action="/day46/s3" method="post">
        <input type="submit" value="登录post">
    </form>
    <hr>
    <form action="/day46/s3" method="get">
        <input type="submit" value="登录get">
    </form

作业/总结/掌握

1 整个创建配置部署启动servlet过程
2 理解执行流程
3 画出javaweb开发图
4 前端如何发送请求?
5 前端的请求方法有哪些?
6 后台有哪些处理不同请求方式的方法?
   doGet
   doPost
7 前端请求通过什么和后台服务器关联?
  web.xml配置映射路径

四、IDEA+Maven-jdk版本

修改idea中java版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3T8VIsc-1679657703981)(C:/Users/Administrator/Desktop/image-20230324143837940.png)]

image-20230324143857147

image-20230324143916445

image-20230324144045656

Maven-POM文件中设置编译版本

 <build>
    <plugins>
      <!-- 编码和编译和JDK版本 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

l配置映射路径


# 四、IDEA+Maven-jdk版本

修改idea中java版本

[外链图片转存中...(img-m3T8VIsc-1679657703981)]

[外链图片转存中...(img-we29Zlbd-1679657703982)]

[外链图片转存中...(img-NHZx6YE6-1679657703983)]

[外链图片转存中...(img-MriJlzgL-1679657703983)]

> Maven-POM文件中设置编译版本

```xml
 <build>
    <plugins>
      <!-- 编码和编译和JDK版本 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SignOff Criteria——AOCV(Advanced OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. A O C V P r i n c i p l e I n t r o d u c t i o n AOCV\ Principle\ Introduction AOCV Principle Introduction2.1 G B A − A O C V GBA-AOCV GBA−AOCV2.1.1 A b o u t L o g i c a l D e p t h About\ Logical\ De…

第六章 Iptables与Firewalld防火墙

第六章 Iptables与Firewalld防火墙 一、Iptables 1、策略与规则链 &#xff08;1&#xff09;、防火墙策略规则的设置 一种是“通”即放行&#xff0c;另一种是“堵”即阻止。 当防火墙的默认策略为拒绝时&#xff08;堵&#xff09;&#xff0c;就要设置允许规则通&#x…

NECCS|全国大学生英语竞赛C类|听力|短对话|14:20~15:30

目录 一、短对话 1. 定位词 2. 场景词汇 &#xff08;1&#xff09;餐馆用餐 &#xff08;2&#xff09;商场用语 &#xff08;3&#xff09;校园用语 &#xff08;4&#xff09;图书馆用语 二、题目类型 1. 人物类 考点聚焦 2. 地点类 主要涉及 3. 数字类 4. 主题…

【数据库】JDBC编程

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 什么是JDBC&#xff1f; JDBC工…

sql注入(三)绕过方法及防御手段

一、sql注入的绕过方法 1.注释符过滤绕过 常用的注释符有&#xff1a; 1&#xff09;-- 注释内容 2&#xff09;# 注释内容 3&#xff09;/* 注释内容 */ 绕过方法 构造闭合&#xff1a; ?id1 and sql语句 and 11 这样接收源码前面的引号被 id1 中的后引号所闭合&…

关于MPU的笔记

MPU&#xff08;memory protection unit&#xff09;内存保护单元。这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作。即要防止系统资源和其他一些任务不受非法访问。嵌入式系统有专门的硬件来检测和限制系统资源的访问。它能保证资源的所有权&#xff0c;任…

unity 性能优化之画质分级

如果你的游戏兼容多平台&#xff0c;或者当前平台的设备也有硬件差距&#xff0c;比如低端设备就是带不动你的画质&#xff0c;无论如何你如何优化就是带不动。这种情况下&#xff0c;我们可以考虑对画质进行分级&#xff0c;减少一些特性&#xff0c;来提高运行质量。接下来我…

JavaWeb《HTML基础标签》

本笔记学习于Acwing平台 MDN官方文档https://developer.mozilla.org/zh-CN/ 目录 1. html文件结构 2. 文本标签 3. 图片 4. 音频和视频 5. 超链接 6. 表单 7. 列表 8. 表格 9. 语义标签 10. 特殊符号 1. html文件结构 文档结构 html的所有标签为树形结构&#xff…

AI模型推理(3)——ModelMesh使用

参考&#xff1a; ModelMesh installation - KServe Documentation Website ModelMesh Overview - KServe Documentation Website 前言 Kserve提供了“Serverless”和“ModelMesh”两种安装模式。其中Serverless是通过Knative组件实现动态扩缩容等功能。而ModelMesh则是另一…

华南X99F8D开不了机——主板出现错误码67的解决方案

华南X99F8D开不了机——主板出现错误码67的解决方案 前言 笔者的双路e5&#xff1a;大数据双路e5主机搭建&#xff1a;2696v3256g内存 配置&#xff1a; 主板&#xff1a;x99f8d CPU&#xff1a;e5 2696v3 *2 【36核72线程】 内存条&#xff1a;DDR4 ECC 32G *8 【256G】 显…

Nginx + LVS + KeepAlived实现高可用集群

文章目录 一、名词解释1、高可用集群2、LVS3、Keepalived 二、搭建流程1、安装Docker2、安装Nginx3、安装Keepalived4、编写nginx_check.sh脚本 一、名词解释 1、高可用集群 对于中小型互联网公司&#xff0c;产品所承受的请求量还是比较低的&#xff0c;所以一般使用单节点N…

碳中和专题:智慧城市建设能否提高碳生产率?—基于中国智慧城市试点的准自然实验

一.研究内容 目前&#xff0c;中国面临着如何在保证经济增长的前提下实现减排目标的困境。智能城市建设作为一种新型的城市发展模式&#xff0c;有可能成为解决这一问题的关键。本文使用多周期双重差分DID模型进行实证分析&#xff0c;旨在评估智能城市试点政策对碳生产率的影响…

论文笔记:Model-Contrastive Federated Learning

0 简介 论文&#xff1a;Model-Contrastive Federated Learning 代码&#xff1a;https://github.com/QinbinLi/MOON 相关链接&#xff1a;本文主要是将SimCLR对比学习的思想迁移到联邦学习中&#xff0c;关于SimCLR的介绍见https://blog.csdn.net/search_129_hr/article/deta…

最好的物联网教程:软硬结合——从零打造物联网

在大学里不同专业有着不同的追求&#xff1a;机械类与强电类专业学生追求的是 “机电合一” &#xff0c;既懂机械又懂电气&#xff0c;整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” &#xff0c;既懂硬件又懂软件&#xff0c;整个电子产品便能打通。我作…

唱作音乐人朱卫明新歌全网首发,当初恋遇到《龙仙街》

今年唱作音乐人朱卫明正式出道25周年了&#xff01;为纪念这个生涯里程碑&#xff0c;朱卫明近日在酷狗音乐首发全新单曲《龙仙街》&#xff0c;上酷狗搜索“朱卫明”&#xff0c;即可抢先收听。 这首歌是继《酒吧情歌》《不爱她》《只要陪着你》《有缘无分》《断了吧》《疯狂爱…

Linux——基础IO

目录 C语言文件操作 fprintf​编辑 Linux下的文件操作(文件的系统调用接口) open open的第三个参数 open的第二个参数 write read 文件描述符fd 进程与被打开文件的关系(理解的关键) 见见猪跑 fd文件描述符的分配规则 结论 重定向 输入重定向原理 输出重…

Linux线程:互斥锁mutex的使用

1. 同步 & 互斥 &#xff08;1&#xff09;同步 多个进程或线程按照一定的执行顺序完成某一任务&#xff1b;如B任务依赖A任务产生的数据。 &#xff08;2&#xff09;互斥 临界资源同一时刻只能被一个进程或线程使用。 2. 临界资源 和 临界区 &#xff08;1&#xff…

feign远程调用原理

目录 一、简介 二、调用流程分析 2.1 添加注解 2.2 Import(FeignClientsRegistrar.class)&#xff0c; 2.3 代理创建流程 2.4 代理调用 一、简介 feign是springCloud全家桶中的远程调用组件&#xff0c;其底层主要依赖于Java的动态代理机制&#xff0c;然后基于http client…

【软件测试】全网火爆,实战Web项目前后台的bug定位(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 系统整体架构 Se…

【Java入门合集】第二章Java语言基础(三)

【Java入门合集】第二章Java语言基础&#xff08;三&#xff09; 博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结…