day29_Servlet

今日内容

零、 复习昨日
一、Servlet

零、 复习昨日

一、Servlet

1.1 Servlet介绍

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


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


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

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


总结Servlet的作用:

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

1.2 HTTP

Servlet主要做的事情:接收请求,做出响应

  • 接收请求
    • 请求是什么? 浏览器通过网络发出的一些请求资源动作
    • 哪里发出的请求? a标签href路径,form表单action路径
    • 请求都有什么东西可以接收?数据,协议,端口,ip等等
  • 做出响应
    • 什么是响应? 响应什么东西?服务器返回给浏览器的内容(html页面,json数据等等)
    • 响应给谁? 前端(浏览器)

1.2.1 在http请求中有请求报文

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

image-20221125172607680

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

image-20221125172859447

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

1.2.2 在http响应中有响应报文

image-20221125173053058

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

image-20221125173227397

1.3 GET和POST

HTTP中常见的请求方式

  • get
  • post

1.3.1 GET

GET请求特点:

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

什么时候用GET请求?

  • 一般用于查询数据

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

  • form表单指定method=get
  • a标签
  • 地址栏手动输入

1.3.2 POST


POST请求

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

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

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

  • form表单的method=post
  • ajax

二、第一个Servlet程序[重点]

2.1 创建web项目

image-20221125095804303

image-20221125095900779

手动补全目录结构

image-20221125100044388

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>

2.3 编写Servlet

  • 继承javax.servlet.HttpServlet类
  • 重写方法
    • 浏览器发出get请求,那么就重写doGet方法处理get请求
    • 浏览器发出post请求,那么就重写doPost方法处理post请求
  • 在核心方法doGet/doPost里面完成接收请求,做出响应
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;
import java.io.PrintWriter;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class MyServlet extends HttpServlet {

    // - 浏览器发出get请求,那么就重写doGet方法处理get请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 中文可能乱码,暂时不解决
        System.out.println("接收请求 - receive request" );
        String method = req.getMethod( ); // 获得请求方法
        System.out.println(method );


        // 通过响应获得输出流,向浏览器响应内容
        // 其实通过流写出内容
        PrintWriter out = resp.getWriter( );
        out.write("hello servlet");

    }

    // - 浏览器发出post请求,那么就重写doPost方法处理post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

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就可以执行doGet/doPost

2.5 部署项目

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

配置Tomcat

image-20221125103951611

部署项目

image-20221125104134483

image-20221125104144365

image-20221125104255911

2.6 启动

启动项目

image-20221125143816377

image-20221125104500192

2.7 访问

发出http请求进行访问

http://localhost:8080/day46/s1

image-20221125104906466

2.8 解决控制台中文乱码

image-20230324103136654

-Dfile.encoding=utf-8

2.9 解决JSP页面乱码

JSP页面头部加入如下代码即可

<%@ page contentType="text/html;charset=UTF-8" language="java"%>

三、 执行流程分析【理解】

  1. 启动服务器

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

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

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

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

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

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

  4. 浏览器发出请求

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

    http://localhost:8080

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

    http://localhost:8080/day29

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

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

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

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

  6. servlet执行doGet或者doPost方法,完成接收请求,和做出响应的动作

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

四、使用细节

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

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>

4.3 访问路径问题[重点]

现在的访问路径是

http://localhost:8080/day29/

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

image-20221125153714293 image-20221125153746569

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

image-20221125153823894

因为发请求时容易丢失项目名,索性在设置时直接不设置项目名

ps

<%--
    a标签,form等前端路径
    以/开头发请求的话,会从浏览器根路径,即从端口出发去请求,如果有项目名的话,就会丢失项目名
    ----------
    所以,建议在部署项目时,直接不要项目名
--%>
<a href="/a">/a-发/a请求</a><br>

image-20231116160223396

4.4 修改端口

启动项目时,idea报错

image-20231116160630472

提示端口占用

image-20221125154318886 image-20221125154344957

作业

1 整个创建-配置-部署-启动servlet过程
2 理解执行流程
3 画出javaweb开发图
4 前端如何发送请求? 浏览器a标签,form表单,手动地址栏输入路径回车
5 前端的请求方法有哪些? get,post
  地址栏手动输入 - get
  a标签是 get
  form指定method=get|post
6 后台有哪些处理不同请求方式的方法?
   doGet
   doPost
7 前端请求通过什么和后台服务器servlet关联?
  web.xml配置映射路径,后期使用注解

idea设置、IDEA+Maven-jdk版本

修改idea中java版本

image-20230324143837940

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>

tEb98idl-1700474261978)]

[外链图片转存中…(img-HvI47xQw-1700474261979)]

[外链图片转存中…(img-XcK17s2I-1700474261979)]

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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

端到端数据保护浅析

作为最重要的数据保护方式之一&#xff0c;NVMe端到端数据保护被众多企业用户所看重&#xff0c;它可以有效降低静默错误的发生&#xff0c;保护范围涵盖数据自Host端生成直至写入SSD NAND当中&#xff0c;以及从SSD NAND读取直至返回Host的全部流程。它使得数据不论是在SSD内部…

米哈游大数据云原生实践

云布道师 近年来&#xff0c;容器、微服务、Kubernetes 等各项云原生技术的日渐成熟&#xff0c;越来越多的公司开始选择拥抱云原生&#xff0c;并将企业应用部署运行在云原生之上。随着米哈游业务的高速发展&#xff0c;大数据离线数据存储量和计算任务量增长迅速&#xff0c…

Python之staticmethod:让你的代码更简洁高效

概要 在Python中&#xff0c;staticmethod是一种非常有用的装饰器&#xff0c;它可以将一个方法转换为静态方法&#xff0c;使得该方法可以通过类名或实例名直接调用&#xff0c;而不需要传入self参数。staticmethod的使用可以让代码更加简洁、高效&#xff0c;同时也可以提高…

如何分辨独享代理IP池?代理IP有独享的代理IP吗?

对于HTTP代理使用者而言&#xff0c;如果排除成本考虑&#xff0c;大家都更愿意是用独享IP&#xff0c;那在一众的HTTP代理厂商的产品中&#xff0c;我们要如何分辨什么样的才是独享IP呢&#xff1f;今天青果网络HTTP代理&#xff0c;就带大家一起来了解一下这其中的奥秘。 如何…

如何在AIX操作系统上修改Java环境变量

AIX操作系统是IBM的Unix操作系统&#xff0c;通常用于企业级应用和服务器环境。在AIX上配置Java环境变量是执行Java应用程序和开发Java代码的重要步骤。本文将详细介绍如何在AIX上修改Java环境变量&#xff0c;并提供具体示例来帮助你完成这个任务。 步骤1&#xff1a;确定Java…

SSM框架(二):AOP和事物

文章目录 一、AOP的介绍1.1 基本概念1.2 AOP入门1.3 AOP工作流程1.4 切入点表达式1.5 AOP的通知类型1.6 ProceedingJoinPoint1.7 AOP通知获取参数数据 二、事物2.1 基本介绍2.2 事物角色2.3 事物属性2.4 事物的传播行为 一、AOP的介绍 1.1 基本概念 1.2 AOP入门 导入坐标 <…

微信小程序开发学习——顺序、选择、循环、数学函数

1.条件语句 只需在js中写JavaScript的条件语句就行 math对象&#xff1a; 代码如下&#xff1a; <!--pages/tiaojian/tiaojian.wxml--> <view class"box"><view class"title">输入x&#xff0c;条件输出y</view><view><…

【FLink】水位线(Watermark)

目录 1、关于时间语义 1.1事件时间 1.2处理时间​编辑 2、什么是水位线 2.1 顺序流和乱序流 2.2乱序数据的处理 2.3 水位线的特性 3 、水位线的生成 3.1 生成水位线的总体原则 3.2 水位线生成策略 3.3 Flink内置水位线 3.3.1 有序流中内置水位线设置 3.4.2 断点式…

CANopen权威指南【CAN总线协议】

1这个总线定义是老外发明的。 想要使用&#xff0c;就必须按照协议去配置数据帧。 CIA301和cia402协议&#xff0c;实际就是寄存器地址上某一段的定义。 下载地址&#xff1a; CAN in Automation (CiA): Technical documents 注册下载也是非常快的。【没什么难度】 就是资…

数据结构之二叉树

前言&#xff1a;我们前面已经学习了数据结构的栈和队列&#xff0c;今天我们就来学习一下数据结构中的二叉树&#xff0c;那么作为二叉树我们就得先了解树的一些概念&#xff0c;还有二叉树一些特点。 树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它是由n&…

Linux网络驱动

Linux 网络设备驱动结构 网络协议接口层向网络层协议提供统一的数据包收发接口&#xff0c;这一层使得上层协议独立于具体的设备网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device&#xff0c;该结构体是设备驱动功能层中各函数的容器设备…

【Operating Systems:Three Easy Pieces 操作系统导论 】第28章 插叙:线程 API

【Operating Systems:Three Easy Pieces 操作系统导论 】 第28章 插叙&#xff1a;线程 API pthread 库介绍 线程创建 #include <pthread.h> // 头文件 int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void * (*start_routine)(void*),void *…

wsl安装ubuntu的问题点、处理及连接

WSL安装Ubuntu的参考链接 (41条消息) wsl报错&#xff1a;WslRegisterDistribution failed with error: 0x800701bc_yzpyzp的博客-CSDN博客_0x800701bc wsl (41条消息) 使用Ubuntu安装软件出现Unable to locate package错误解决办法_大灰狼学编程的博客-CSDN博客 手把手教你…

linux:查看文件前100行和后100行

查看文件中的前100行 head -n 100 文件名查看文件中的后100行 tail -n 100 文件名

【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于 JavaScript 中 JSON&#xff08;JavaScript Object Notation&#xff09;语法的入门指南。JSON 是一种轻量级的数据交换格式&#xff0c;广泛应用于前端开发中。通过这篇博客&#xff0c;我将带你深入了解 JSON 的语法…

【深度学习实验】注意力机制(四):点积注意力与缩放点积注意力之比较

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 理论介绍a. 认知神经学中的注意力b. 注意力机制 1. 注意力权重矩阵可视化&#xff08;矩阵热图&#xff09;2. 掩码Softmax 操作3. 打分函数——加性注意力模型3. 打分函数——点积注意力与缩放…

【GUI】-- 12 贪吃蛇小游戏之让小蛇动起来

GUI编程 04 贪吃蛇小游戏 4.3 第三步&#xff1a;让小蛇动起来(键盘控制) 首先&#xff0c;在构造器中要获取焦点事件、键盘监听事件并加入定时器(定时器定义需要实现ActionListener接口并重写actionPerformed方法)&#xff1a; //构造器public GamePanel() {init();this.s…

郎酒“掉队”,经销商们能等来春天吗?

文 | 螳螂观察&#xff08;TanglangFin&#xff09; 作者 | 渡过 有“六朵金花”之称的川酒品牌中&#xff0c;五粮液、泸州老窖、舍得、水井坊都已成功上市&#xff0c;只剩下郎酒和剑南春未上市。 与IPO的“掉队”相对应的&#xff0c;是郎酒在冲刺高端、内部管理、渠道管…

【LeetCode刷题-链表】--23.合并K个升序链表

23.合并K个升序链表 方法&#xff1a;顺序合并 在前面已经知道合并两个升序链表的前提下&#xff0c;用一个变量ans来维护以及合并的链表&#xff0c;第i次循环把第i个链表和ans合并&#xff0c;答案保存到ans中 /*** Definition for singly-linked list.* public class List…

SQL基础理论篇(八):视图

文章目录 简介创建视图修改视图删除视图总结参考文献 简介 视图&#xff0c;即VIEW&#xff0c;是SQL中的一个重要概念&#xff0c;它其实是一种虚拟表(非实体数据表&#xff0c;本身不存储数据)。 视图类似于编程中的函数&#xff0c;也可以理解成是一个访问数据的接口。 从…