Java学习——Servlet服务器请求响应程序

news2025/7/14 12:59:45

Servlet服务器程序

1. Servlet的概念

Servlet(Server + Applet):运行在Web服务器端(Tomcat)的小程序。

Servlet的主要作用:接收客户端浏览器的请求,还可以为客户端浏览器做出响应。

  • 学习Servlet技术三大目的:

    • 让程序运行在服务器端

    • 接收客户端浏览器的请求参数

    • 用户需求,对客户端进行数据响应

JavaWeb技术有三大组件:Servlet,Filter,Listener

JavaWeb还有十三规范:Tomcat服务器支持其中的2个Servlet和jsp


2. Servlet程序快速入门

2.1 创建第一个Servlet项目(响应字符串)

① 创建Java EE(Java Enterprise),勾选Web Application(4.0)

② 在web目录下创建index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Servlet请求: 前端 --> 后台</h1>

<a href="helloServlet">访问helloServlet</a>

</body>
</html>

③ 在scr目录下创建目录,并创建HelloServlet类

④ HelloServlet类继承HttpServlet,重写service方法(有两个service方法,注意选择)

package com.aaa.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 HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet ---> 重写父类service方法");
    }
}

 ⑤ 在WEB-INF中选择web.xml配置标签 建立HelloServlet关联

<?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_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>hello</servlet-name><!--  name值自定义,要求同一组servlet和servlet-mapping和name值要相同  -->
        <servlet-class>com.aaa.servlet.HelloServlet</servlet-class><!--  关联的”类“的完整路径  -->
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/helloServlet</url-pattern><!--  (前端页面的)请求路径,这里一定要加/  -->
    </servlet-mapping>
    
</web-app>

⑥ 配置并启动Tomcat ,打开浏览器访问地址                配置Tomcat教程请见:idea配置tomcat

 

⑦ 点击超链接(重定向)标签,跳转至helloServlet页面,成功。

图解:

  • 请求路径必须加”/“原因:

在<url-pattern>/helloServlet</url-pattern>中,/代表web_Servlet

效果:        (gif动图建议放大观看)

2.2 标签方式&注解方式 

使用注解方式配置的优势: 代码更加简单

使用注解方式配置的劣势: 耦合度高

在上文提到配置web.xml文件<servlet>标签,在Java中提供更简单的注解方式,只需要在类上加上@WebServlet(value = "请求地址")

注意:

  • 注解方式和标签方式二选一即可,如使用注解方式 需要把web.xml中<servlet>标签注释或删除!

  • value的值等于原来的<url-pattern>中的值,简写 :  @WebServlet("请求地址")

@WebServlet(value = "/test")
public class TestServlet extends HttpServlet {}

一般更推荐使用配置文件方式配置Servlet,尤其是配置第三方框架中的Servlet:例如SpringMVC中的DispatcherServlet,只能够使用配置文件方式进行配置。 

2.3 响应跳转(sendRedirect)

① index.中新增超链接标签

<a href="testSend">使用sendRedirect</a>

② 新建success.html ,转发用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跳转页面</title>
</head>
<body>
<h1>跳转页面</h1>
</body>
</html>

② 新建TestSendRedirect测试类

package com.aaa.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//请求 -- 响应(跳转页面)
@WebServlet("/testSend")
public class TestSendRedirect extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service--->跳转success.html");
        resp.sendRedirect("success.html");
    }
}

执行查看效果:        (gif动图建议放大观看)


3. Servlet的生命周期和生命周期方法

① Servlet对象的创建:构造器

  • 默认情况下,Servlet容器第一次收到HTTP请求时创建对应Servlet对象。

  • 容器之所以能做到这一点是由于我们在注册Servlet时提供了全类名,容器使用反射技术创建了Servlet的对象。

② Servlet对象初始化:init()

  • Servlet容器创建Servlet对象之后,会调用init(ServletConfig config)方法。

  • 作用:是在Servlet对象创建后,执行一些初始化操作。例如,读取一些资源文件、配置文件,或建立某种连接(比如:数据库连接)

  • init()方法只在创建对象时执行一次,以后再接到请求时,就不执行了

  • 在javax.servlet.Servlet接口中,public void init(ServletConfig config)方法要求容器将ServletConfig的实例对象传入,这也是我们获取ServletConfig的实例对象的根本方法。

③ 处理请求:service()

  • 在javax.servlet.Servlet接口中,定义了service(ServletRequest req, ServletResponse res)方法处理HTTP请求。

  • 在每次接到请求后都会执行。

  • 上一节提到的Servlet的作用,主要在此方法中体现。

  • 同时要求容器将ServletRequest对象和ServletResponse对象传入。

④ Servlet对象销毁:destroy()

  • 服务器重启、服务器停止执行或Web应用卸载时会销毁Servlet对象,会调用public void destroy()方法。

  • 此方法用于销毁之前执行一些诸如释放缓存、关闭连接、保存内存数据持久化等操作。

代码解析:

① index.html 中新增超链接标签

<a href="testServlet">testServlet生命周期</a>

② 新建TestServlet测试类(使用注解方式) 

package com.aaa.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
    public TestServlet(){
        System.out.println("TestServlet--->无参构造器");
    }

    @Override
    public void destroy() {
        System.out.println("servlet--->destroy() 销毁方法");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("servlet--->init() 初始化方法");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("TestServlet--->重写service");
    }
}

执行查看效果:        (gif动图建议放大观看)

  • Tomcat服务器启动的时候,直接创建Servlet对象

  • service方法:

    • 接收浏览器请求的方法

    • 每次请求,都会调用service方法,对象生命周期的中间部分

    • 调用者是Tomcat引擎

  • Servlet对象的销毁时机

    • 关闭Tomcat服务器,对象就销毁,会调用方法destroy(),Tomcat引擎调用

    • 问题:destroy()方法,对象销毁之前调用

    • 销毁:没有引用变量,保存该类的对象,不是在内存中清理了

    • 将Web项目从服务器中移除


4. 相对路径的使用(不建议使用)

相对路径的概念:

相对路径是不以/开头的路径写法,编写相对路径的原则是以目标资源的uri路径相对当前资源的uri路径

5. 绝对路径的使用(建议使用)

绝对路径的概念:

绝对路径是以/开头的路径写法,编写绝对路径的原则是通过目标资源的uri访问目标资源,但是特殊情况是请求转发,如果是请求转发访问目标资源的话,那么绝对路径是在uri的基础之上省略/项目部署名

在请求转发的时候使用绝对路径的写法是: /资源名,其实就是在uri的基础上省略/项目部署名

相对路径&绝对路径代码解析:

① 新建目录 a-b-c-c.html

②  index.html 中新增超链接标签

<a href="testGoC">C.html</a>

③ 新建CtestServletTest测试类

package com.aaa.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("testGoC")
public class CtestServletTest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("跳转--- c.html");
        resp.sendRedirect("a/b/c/c.html");
    }
}

④ 新建c.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>C.html  ---> (web\a\b\c\c.html)</h1>
<a href="ctest111">ctest111--相对路径(默认拼接之前访问路径)</a>
<a href="/web_Servlet/a/b/c/ctest222">ctest222--绝对路径</a>


</body>
</html>

⑤ 新建 CtestServlet1&CtestServlet2测试类

package com.aaa.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(value = "/a/b/c/ctest111")      //相对路径
public class CtestServlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("CtestServlet1()--->>>相对路径");
    }
}
package com.aaa.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(value = "/a/b/c/ctest222")      //绝对路径
public class CtestServlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("CtestServlet2()--->>>绝对路径");
    }
}

图解:

对应关系: 

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

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

相关文章

戴尔笔记本重装系统按f几进入

有不少使用戴尔笔记本电脑的用户对于u盘重装系统中的按f几进入u盘启动的操作不熟悉&#xff0c;导致自己无法独立完成戴尔笔记本重装系统的步骤怎么办&#xff1f;其实相关的方法不难&#xff0c;下面小编就教下大家戴尔笔记本重装系统按f几进入u盘启动项安装。 工具/原料&…

【培训】MMEdu离线版的使用:实现石头剪刀布图像分类的检测

一、MMEdu离线版的使用 1.双击XEdu v1.0.exe解压缩到某个盘&#xff0c;会是一个文件夹XEdu 2.进入XEdu&#xff0c;双击运行“点我初始化.bat”&#xff0c;等待至运行结束命令提示符窗口自动关闭 3.双击运行“jupyter编辑器.bat”&#xff0c;将会打开一个网页版jupyter&…

第五站:操作符(第二幕)

在前面的文章中我们详细讲解了操作符的一些内容&#xff0c; 今天我们来继续了解操作符剩余的内容 操作符第一幕的传送门在这&#xff1a;第五站&#xff1a;操作符&#xff08;第一幕&#xff09; 目录 七、关系操作符 八、逻辑操作符 1.基础知识 2.几道经典的题目 九、条…

视频压缩软件哪个好?万兴优转:好用的视频无损压缩软件

如今&#xff0c;无论是学生党&#xff0c;上班族还是专业的视频制作者&#xff0c;都会遇到视频文件体量太大&#xff0c;需要对视频文件进行压缩的时候&#xff0c;但是又会担心视频压缩以后&#xff0c;画质受损&#xff0c;清晰度不如从前&#xff0c;所以一个好用的视频压…

机器学习笔记之高斯网络(三)高斯马尔可夫随机场

机器学习笔记之高斯网络——高斯马尔可夫随机场引言回顾&#xff1a;马尔可夫随机场——团、势函数高斯马尔可夫随机场点势函数关联的项边势函数相关的项关于多元高斯分布学习任务的核心思想关于条件独立性的总结引言 上一节介绍了高斯贝叶斯网络(Gaussian Bayesian Network,G…

c语言tips-带参main函数

0.写在最前 最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 1. main函数的两种表现形式 main函数是c/cpp语言的…

python破解wifi教程

目录 一、安装pywifi 二、构建wifi密码字典 三、python实现wifi破解 四、结果展示 4.1 选择要破解的wifi名称 4.2 获取字典 4.3 成功破解 一、安装pywifi pywifi是在python中一个用于操作无线接口的模块&#xff0c;可以跨平台使用&#xff0c;Windows和Linux都支持 …

Linux下Jenkins服务搭建及配置

一、简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;为软件的持续集成提供了一种便捷的方式。 二、Jenkins自动化部署实现原理 Jenkins的自动化部署实…

现代密码学导论-14-基于伪随机发生器的EAV安全

目录 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生器进行加密的图示 CONSTRUCTION 3.17 一种基于伪随机发生器的私钥加密方案 THEOREM 3.16 基于伪随机发生器的私钥加密方案的EAV安全 THEOREM 3.16 的证明 最后来理一下 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生…

pandas是什么以及pandas的三种数据结构Series、DataFrame、MultiIndex的创建方式函数代码

一、pandas概述 pandas是2008年WesMcKinney开发出的专门用于数据挖掘的开源python库&#xff0c;以Numpy为基础&#xff0c;借助numpy模块在计算方面性能高的优势&#xff0c;基于matplotlib&#xff0c;能够简便的画图&#xff0c;具有独特的数据结构 pandas特点 图表的可读…

深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)

需要源码请点赞收藏关注后评论区留下QQ~~~ 深度强化学习将深度学习的感知&#xff08;预测能力&#xff09;与强化学习的决策能力相结合&#xff0c;利用深度神经网络具有有效识别高维数据的能力&#xff0c;使得强化学习算法在处理高纬度状态空间任务中更加有效 一、DQN算法简…

牛客小白月赛62 幼稚园的树

2022.11.25 今晚闲来无事&#xff0c;在zhoj群中看到管理员发布的牛客小白月赛的通知&#xff0c;就和舍友一起参加了。 题目描述 来源&#xff1a;牛客网 牛牛在幼稚园做义工&#xff0c;幼稚园中共有 nnn 颗树&#xff0c;第 1 天中午时它们的高度分别为&#xff1a;h1,h2…

体系结构27_多处理机(1)

单处理机的发展正在走向尽头&#xff1f; 并行处理机在未来将会发挥更大的作用。 1.获得超过单处理器的性能&#xff0c;最直接的方法就是把多个处理器连在一起。 2.自1985年以来&#xff0c;体系结构的改进使性能迅速提高&#xff0c;这种改进的速度能否持续下去还不清楚&a…

Day11--首页-轮播图效果

1.创建 home 分支 我的操作&#xff1a; ************************************************** ************************************************** ******* 2.配置网络请求 博主文档&#xff1a; 我的操作&#xff1a; 1》.先初始化一个package.json文件。 2》根据博主的…

MyBatis-Plus 01入门

参考网站 官网&#xff1a;http://mp.baomidou.com 参考教程&#xff1a;http://mp.baomidou.com/guide/ 一、简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率…

测试用例设计方法之等效类,边界值

概念&#xff1a; 等价类划分是一种黑盒测试方法&#xff0c;把无限的测试变成有限的测试。把所有可能的输入数据,即程序的输入域划分成若干等价类,然后从每一个等价类中选取少数具有代表性的数据作为测试用例。依据需求将输入&#xff08;特殊情况下会考虑输出&#xff09;划分…

MySQL之InnoDB浅析

InnoDB是一个兼顾高可靠性和高性能的通用存储引擎。在 MySQL 5.7 中&#xff0c;InnoDB是默认的 MySQL 存储引擎。 InnoDB 的主要优势 支持事物&#xff0c;具备crash-safe的能力支持行锁以及MVCC&#xff0c;具备良好的多用户并发性和性能Buffer Pool&#xff0c;提升热点数…

Redis过期键及内存淘汰策略

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、Redis数据库的组织方式 Redis服务器将所有的数据库 都保存在src/server.h/redisServer结构中的db数组中。db数组的每个entry都是src/server.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库。Redis默认有16个…

测试用例设计方法之正交法

概念&#xff1a; 正交试验设计是研究多因素多水平的一种设计方法&#xff0c;它是根据正交性&#xff0c;由试验因素的全部水平组合中挑选出部分有代表性的点进行试验&#xff0c;通过对这部分试验结果的分析了解全面试验的情况&#xff0c;找出最优的水平组合。正交试验设计…

49 - 多态的概念和意义

---- 整理自狄泰软件唐佐林老师课程 1. 函数重写回顾 父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符&#xff08;::&#xff09;可以访问父类中的函数 p->print()不符合预期&#xff0c;期望调用子类中的print&#xff0c;实际调…