day29_Servlet

news2024/10/7 12:29:38

今日内容

零、 复习昨日
一、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>

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

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

相关文章

图像分类(三) 全面解读复现VGGNet

解读一 Abstract-摘要 翻译 在这项工作中&#xff0c;我们研究了卷积网络深度在大规模图像识别环境下对其精度的影响。我们的主要贡献是使用具有非常小(33)卷积滤波器的体系结构对增加深度的网络进行了彻底的评估&#xff0c;这表明通过将深度推进到16-19个权重层&#xff0…

报错注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1"&#xff0c;页面均回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…

php字符串处理函数的使用

php字符串处理函数的使用 trim() trim()函数的功能用于去除字符串首尾的空白字符(包括空格、制表符、换行符等&#xff09;。它可以用于清理用户输入的数据或去除字符串中的多余空格。 <?php $char" holle world! ";echo trim($char) ?>str_repl…

IvorySQL3.0:基于PG16.0最新内核,实现兼容Oracle数据库再升级

Oracle作为全球最大的数据库厂商之一&#xff0c;具有较高的市场知名度和份额。但随着数据处理需求日益增长&#xff0c;使用Oracle的企业可能面临一些挑战&#xff0c;如数据库复杂性、高昂维护成本、数据迁移和集成问题等&#xff0c;难以满足企业实时数据处理需求&#xff0…

C++11新特性 变参模板、完美转发和emplace

#include <iostream> #include <vector> #include <deque> #include <list> #include <algorithm> using namespace std;class student { public:student() {cout << "无参构造函数被调用!" << endl;}student(int age, st…

如何使用rclone将腾讯云COS桶中的数据同步到华为云OBS

在多云策略与数据迁移趋势下&#xff0c;企业往往需要将数据在不同云服务提供商之间进行迁移。本文介绍如何使用rclone工具同步腾讯云COS&#xff08;Cloud Object Storage&#xff09;桶中的数据到华为云OBS&#xff08;Object Storage Service&#xff09;。先决条件是您已经…

【MATLAB基础绘图第17棒】绘制玫瑰图

MATLAB绘制玫瑰图 玫瑰图&#xff08;Nightingale Rose Chart&#xff09;风玫瑰图&#xff08;WindRose&#xff09;准备工作&#xff1a;WindRose工具包下载案例案例1&#xff1a;基础绘图 参考 玫瑰图&#xff08;Nightingale Rose Chart&#xff09; 玫瑰图&#xff08;Ni…

入行IC | 从小白助理级,到总监专家级,到底要经历怎样的成长阶段呢?

《中国集成电路产业人才发展报告》是业内和IC设计、IC人才都息息相关的一份报告。 &#xff08;文末可领全部报告资料&#xff09; * 从报告数据来看&#xff0c;无论在半导体产业的哪个环节&#xff0c;个人发展路径和年薪待遇都是逐级攀升的趋势。 那么从小白助理级&a…

Unity下载资源且保存

UnityWebRequest(WWW——已过时) 替代&#xff1a;Unity不再支持WWW后&#xff0c;使用UnityWebRequest完成web请求。 Unity - Scripting API: UnityWebRequest (unity3d.com)https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html if (www.isNetworkEr…

如何理解低代码开发工具?

目录 一、低代码平台是什么 1. 数据输入 2. 数据流转 3. 数据加工 4. 数据输出 &#xff08;1&#xff09;视图&#xff1a;单表的数据的简单展示 &#xff08;2&#xff09;看板&#xff1a;提供单表、多表数据的多种图表组合展示 二、低代码能力 ➪ 全栈可视化编程&#xff1…

企业怎么进行人事管理?一篇文章带你了解!

阅读本文你将了解企业如何运用数字化工具进行人事管理&#xff1a;一、数字化、线上化&#xff0c;解放人力&#xff1b;二、规范管理流程&#xff0c;提升处理效率&#xff1b;三、数据分析可视化&#xff0c;支持并优化决策&#xff1b;四、个性化定制&#xff0c;灵活适应需…

太累了,是时候让AI数字人来帮我干活了(走,上教程)

阿酷TONY&#xff0c;原创文章&#xff0c;长沙&#xff0c;2023.11.21 关 键 词&#xff1a;AI数字人&#xff0c;生成式AI&#xff0c;智能数字分身适用场景&#xff1a;培训数字人&#xff0c;演讲授课数字人&#xff0c;直播带货数字人特别说明&#xff1a;教程用的是国内…

部署Kubernetes Dashboard

Dashboard简介 Dashboard 是基于网页的 Kubernetes 用户界面。 可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 Dashboard创建 #创建pods kubectl apply -f https://raw.githubusercontent.com/kub…

全栈程序员太难了,这个报表工具别再错过了!!

打开百度百科&#xff0c;全栈工程师的解释&#xff1a;是指掌握多种技能&#xff0c;可以胜任前端和后端&#xff0c;能用多种技能独立完成产品的人。 对于这个答案我是保持观望的态度。如果说能同时开发前端和后端&#xff0c;还能独立完成产品&#xff0c;它就是全栈工程师…

spark内置数据类型

在用scala编写spark的时候&#xff0c;假如我现在需要将我spark读的数据源的字段&#xff0c;做一个类型转换&#xff0c;因 为需求中要拼接出sql的create table语句&#xff0c;需要每个字段的sql中的类型&#xff0c;那么就需要去和sparksql 中的内置数据类型去比对。 写s…

去除IDEA中代码的波浪线(黄色警示线)

去除IDEA中代码的波浪线 首先是点击File—>Settings 操作如下图所示: 然后点击Editor—>Inspections—>General—>Duplicated code fragment(去掉勾选)—>Apply—>OK 即可,详情请看下图所示:

Mysql数据库管理-Innodb 内存优化分析

MySql数据库内存分析优化 1 Innodb重做日志 redo log是Innodb保障事务ACID属性的重要机制。工作原理图如下&#xff1a; 2 增加缓冲池数量&#xff0c;减少内部对缓冲池结构争用。 mysql内部线程对innodb缓存池的访问在某个阶段是互斥的&#xff0c;这种内部竞争也会产生性能…

【Java】多线程-单例模式/volatile-指令重排序

单例模式即代码中只有一个实例的模式 适用场景&#xff1a;有些场景下&#xff0c;有的类只能有一个对象&#xff0c;不能有多个 要注意&#xff1a;在单例模式下&#xff0c;要保证不能产生多个实例 1、饿汉模式 class Singleton{private static Singleton instance new …

捷诚管理信息系统 SQL注入漏洞复现

0x01 产品简介 捷诚管理信息系统是一款功能全面&#xff0c;可以支持自营、联营到外柜租赁的管理&#xff0c;其自身带工作流管理工具&#xff0c;能够帮助企业有效的开展内部审批工作。 0x02 漏洞概述 捷诚管理信息系统CWSFinanceCommon.asmx接口存在SQL注入漏洞。未经身份认…

金蝶云星空套打设计

文章目录 金蝶云星空套打设计下载登录打开需要创建套打的单据新建套打模板数据中心-发货通知单-设置预览 金蝶云星空套打设计 下载 登录 打开需要创建套打的单据 KD开头&#xff0c;是标准产品预设。 新建套打模板 默认A4纸 默认插入三行三列。 拖入文本&#xff0c;填写内容…