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请求@Overrideprotected 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请求@Overrideprotected 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地址栏手动输入 - geta标签是 getform指定method=get|post
6 后台有哪些处理不同请求方式的方法?doGetdoPost
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>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旋极携手西班牙SoC-e公司,为中国客户提供高效可靠TSN通讯解决方案

2023年2月&#xff0c;旋极信息与西班牙SoC-e公司正式签订战略合作协议&#xff0c;成为其在中国区重要合作伙伴。 SoC-e是一家世界领先的基于FPGA技术的以太网通讯解决方案供应商&#xff0c;是一系列IP核开发领域的先锋&#xff0c;为关键任务实施网络化、同步性和安全性提供…

深入理解 synchronized 原理

目录 一. 前言 二. Java对象的内存布局 2.1. 对象头 2.2. Mark Word 2.3. Class Metadata Pointer 2.4. Length 三. 偏向锁 3.1. 偏向锁的工作流程 3.2. 偏向失效 3.2.1. 误区一 3.3. 偏向撤销 3.3.1. 误区一 3.4. 偏向撤销的底层实现 3.5. HashCode与偏向撤销 …

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

动态库符号抢占问题分析

背景 前段时间在北汽项目中&#xff0c;遇到了一个奇怪现象&#xff0c;困扰了大家较长时间。最终在和同事的不懈努力下&#xff0c;从根因上解决了该问题&#xff0c;过程中也学习到了很多。在此&#xff0c;记录并分享&#xff0c;希望能够帮助大家。 问题描述 作为OTA服务的…

客户管理系统大盘点!推荐这五款

客户管理系统大盘点&#xff01;推荐这五款。 客户管理系统也就是CRM&#xff0c;可以说是企业刚需&#xff0c;国内外的客户管理系统也是数不胜数&#xff0c;到底有哪些是真正好用&#xff0c;值得推荐的呢&#xff1f;本文将为大家推荐这5款好用的客户管理系统&#xff1a;…

R语言:利用biomod2进行生态位建模

在这里主要是分享一个不错的代码&#xff0c;喜欢的可以慢慢研究。我看了一遍&#xff0c;觉得里面有很多有意思的东西&#xff0c;供大家学习和参考。 利用PCA轴总结的70个环境变量&#xff0c;利用biomod2进行生态位建模&#xff1a; #------------------------------------…

elasticsearch 概述

初识elasticsearch 了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索代码 在电商网站搜索商品 ELK技术栈 elasticsearc…

基于FPGA的五子棋(论文+源码)

1.系统设计 在本次设计中&#xff0c;整个系统硬件框图如下图所示&#xff0c;以ALTERA的FPGA作为硬件载体&#xff0c;VGA接口&#xff0c;PS/2鼠标来完成设计&#xff0c;整个系统可以完成人人对战&#xff0c;人机对战的功能。系统通过软件编程来实现上述功能。将在硬件设计…

centos的root密码忘记或失效的解决办法

目录 前言1 单机维护模式2 利用具有管理员权限的用户切换到root用户3 救援模式 前言 在Linux系统中&#xff0c;root用户是最高权限的用户&#xff0c;可以执行任何命令和操作。但是&#xff0c;如果我们忘记了root用户的密码&#xff0c;或者需要修改root用户的密码&#xff…

Spring Boot 项目部署方案!打包 + Shell 脚本部署详解

文章目录 概要一 、profiles指定不同环境的配置二、maven-assembly-plugin打发布压缩包三、 分享shenniu_publish.sh程序启动工具四、linux上使用shenniu_publish.sh启动程序 概要 本篇和大家分享的是springboot打包并结合shell脚本命令部署&#xff0c;重点在分享一个shell程…

万户OA upload任意文件上传漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品&#xff0c;统一的基础管理平台&#xff0c;实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台&#xff0c;将外网信息…

rabbitmq默认交换机锁绑定的routingkey-待研究

例如这个是我的一个消息队列&#xff0c;它默认绑定的交换机是 什么类型呢? 看到这个图&#xff0c;感觉应该是一个默认的交换机&#xff0c;因为是default exchange 于是来到交换机来看看其他默认的交换机&#xff1a; 这里可以看到默认的交换机是direct&#xff08;应该没…

【Redis】渐进式遍历数据库管理

文章目录 渐进式遍历scan 数据库管理切换数据库清除数据库 获取当前数据库key的个数 渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&…

特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)

特征缩放和转换 您需要应用于数据的最重要的转换之一是功能扩展。除了少数例外&#xff0c;机器学习算法在输入数值属性具有非常不同的尺度时表现不佳。住房数据就是这种情况:房间总数约为6至39320间&#xff0c;而收入中位数仅为0至15间。如果没有任何缩放&#xff0c;大多数…

Axure RP Pro 8 mac/win中文版:打造无限可能的原型设计工具

在如今的数字化时代&#xff0c;原型设计工具越来越受到设计师和产品经理们的重视。而Axure RP Pro8作为一款强大的原型设计工具&#xff0c;成为了众多专业人士的首选。 首先&#xff0c;Axure RP Pro8具备丰富的功能。它提供了多种交互元素和动画效果&#xff0c;使得用户可…

scapy No such device exists (No such device exists)

使用python编写一个小的网络程序时&#xff0c;程序如下&#xff1a; import scapy.all as scapydef scan(ip):arp_request ARP(pdstip)arp_request.show()broadcast scapy.Ether(dst "ff:ff:ff:ff:ff:ff")arq_request_broadcast broadcast/arp_requestanswered,…

DGL创建异构图

利用DGL创建具有3种节点类型和3种边类型的异构图 graph_data {# (src_type, edge_type, dst_type)(drug, interacts, drug): (th.tensor([0, 1]), th.tensor([1, 2])),(drug, interacts,, disease): (th.tensor([1]), th.tensor([2])) }g dgl.heterograph(graph_data)上述代…

cmake+OpenCV4.8.0+contrib4.8.0+cuda 12.2编译踩坑

cmakeOpenCV4.8.0contrib4.8.0cuda 12.2编译踩坑 准备工具 cmake &#xff08;去官网下载&#xff09;OpenCV 我下载的是官网发布最新的稳定版本对应的源码&#xff0c;官网目前是4.8.0&#xff0c;github下一个&#xff08;连不上的可以网上找找资源或者科学上网&#xff09…

wpf devexpress Property Grid创建属性定义

WPF Property Grid控件使用属性定义定义如何做和显示 本教程示范如何绑定WP Property Grid控件到数据和创建属性定义。 执行如下步骤 第一步-创建属性定义 添加PropertyGridControl组件到项目。 打开工具箱在vs&#xff0c;定位到DX.23.1: Data 面板&#xff0c;选择Prope…