javaEE 初阶 — 第一个 servlet 程序

news2024/9/25 15:27:46

文章目录

  • Servlet 是什么
  • 第一个 Servlet 程序
    • 1 创建项目
    • 2 引入依赖
    • 3 创建目录结构
    • 4 代码编写
    • 5 打包程序
    • 6 部署
    • 7 验证
  • 如何使用 tomcat 插件打包及部署
    • 1 什么是插件
    • 2 插件的安装
    • 3 插件的使用
    • 4 可能会出现的问题

Servlet 是什么


Servlet 是一种实现 动态页面 的技术,是一组 Tomcat 提供给程序猿的 API,
帮助程序猿简单高效的开发一个 web app。

网页是分为两大类的:

1、静态页面:页面的内容始终是固定不变的,静态页面就只是单纯的 html ,例如搜狗主页。

2、动态页面:页面内容随着输入参数的不同而改变,动态页面则是 html + 数据,例如搜狗结构页。

第一个 Servlet 程序


先来实现一个 hello world ,预期写一个 servlet 程序,部署到 tomcat 上。
通过浏览器访问得到 hello world 字符串。


这里的操作一共分为 7 个步骤:

1、创建项目

2、引入依赖

3、创建目录结构

4、编写代码

5、打包程序

6、部署程序

7、验证

1 创建项目


选择 maven,不要选择左边的。



点击完成即可。


main 底下存放的是 业务代码java 目录底下存放的是 java 代码。
resources 里存放的是程序依赖的文件,此处再是不涉及。
test 目录下的 java 存放的是 测试代码,pom.xml 是 maven 项目的配置文件,后面会经常用到。




项目创建好以后,上面的代码是自带的。

2 引入依赖


搜索 https://mvnrepository.com/ 打开 maven 仓库。



需要先验证。

搜索 servlet 选择当前的圈出的。



点击进去,选择 3.1.0 版本。





选中当前的 maven,将上述的代码复制到 pom.xml 里,要复制到 dependencies 标签里。




为红色说明未下载完成。

3 创建目录结构


虽然 maven 已经帮我们自动的创建了一些目录,但是还是不够。
此处需要使用 maven 开发一个 web 程序,还需要别的目录。


1、在 main 目录下创建一个 webapp 目录



选择 Directory,创建 webapp 目录。


2、在 webapp 下创建一个 WEB-INF 目录



选择 Directory,创建 WEB-INF 目录。


3、在 WEB-INF 目录下创建一个 web.xml 文件



选择 File 创建文件。


4、给 web.xml 写点东西进去

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
    <display-name>Archetype Created Web Application</display-name>
</web-app>


直接将上面的这段代码复制到 web.xml 文件中。



圈出的部分可能会是红色的,但是不一定是错误的,可以使用 alt + enter 使使。

4 代码编写


创建一个 HelloServlet 类。

import javax.servlet.http.HttpServlet;

public class HelloWorld extends HttpServlet {

}


HttpServletservlet api 里提供的现成的类,一般写 servlet 代码一般都是继承 HttpServlet


这个类需要重写 doGet 方法,如果是一个 Post 请求,那就是重写一个 doPost 请求。

public class HelloWorld extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //super.doGet(req, resp);
    }
}

@Override 表示的是方法重写
HttpServletRequest request 这个参数表示一个 http 请求。
HttpServletResponse response 这个参数表示一个 http 响应。


doGet 方法的效果就是 根据请求计算响应Tomcat 收到 get 请求就会触发 doGet 方法,Tomcat 就会构造好两个参数,
一个是 rep一个是 resp

rep 是 TCP socket 中读出来的字符串,按照 http 协议解析得到的对象。
resp 则只是一个 空的对象。

super.doGet(req, resp); 这儿条语句一定要注释掉。


编写业务代码,也就是我们的 hello world 。

// 这是一个注解
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        System.out.println("Hello World"); // 这是控制台打印
        // 返回到客户端的打印
        // getWriter 会得到一个 Writer 对象
        resp.getWriter().write("Hello World");
    }
}


这里的注解类似于一个导购员,作用是针对一个类/方法,进行额外的 “解释说明”,
赋予这个类/方法额外的功能/含义。


需要注意的是,doGetTomcat 收到 GET 请求的时候就会调用。
具体要不要调用 doGet,还要看当前的 GET 请求的路径是什么,不同的路径可以触发不同的代码。
(关联到不同的类上)

举一个例子,比如说,我到饭店吃饭,向老板点了一份蛋炒饭,我的要求是葱要多放。
此时就是 http://ip:port/蛋炒饭?葱=多放
老板再收到请求的时候就需要按照 “制作蛋炒饭” 的流程来做饭,也就是根据请求计算响应。


如果我点的是一个多放辣椒的炒面,那就是 http://ip:port/炒面?辣椒=多放
此时老板收到的请求之后,就是按照 “制作炒面” 的流程来制作饭,也就是根据请求计算响应。

这很明显是两个不同的流程,相当于是两个不同的类/方法。


一个 Servlet 程序中,可以有很多的 Servlet 类,每个 Servlet 都可以关联到不同的路径,也就是对应到不同的资源,因此多个 Servlet 就实现了不同的功能,但是一个 Servlet 类是不可以对应多个路径的。对应的,一个路径也不能对应多个 Servlet,路径 和 Servlet 类之间是一对一之间的关系

5 打包程序


程序编译好之后,会得到一些.class 文件,此时要把这文件打成 war 包。
war 是 tomcat 专属的用来描述 webapp 的程序,一个 war 就是一个 webapp。


1、点击右侧的 maven ,打开面板



2、选中此时的 Lifecyle 下的 package



可以直接双击运行。



也可以右键选中上面的 Run 运行。


3、成功之后就会显示 build success



如果打包错误了,就会产生一个报错。

打完之后再左侧的 target 目录里就包含了 所打的包,默认情况下打的是一个 jar


4、修改 jar 包 为 war 包

先在 pom.xml 文件中的 project 标签里加入一个 packaging 标签。
在这标签里写下指定的包是哪一种,我们打的是 war 包,此处就写的是 war 包。

 <packaging>war</packaging>


还需要有一个 build 标签,在 这个 build 标签里也要有一个 finalName 标签。
此处的 finalName 标签里写的就是包的名字。

<build>
    <finalName>test01</finalName>
</build>




可以看到此时打的 war 包。


5、右键打开 war 包



打开之后,可以看到 target 目录下的 war 包。

6 部署


部署就是将之前的 war 文件 拷贝到 tomcat 的 webapps 目录即可,无论 tomcat 是不是在你的同一个电脑上,都是如此拷贝。

拷贝后,启动 tomcat。

如果 tomcat 正在运行,直接拷贝的时候 tomcat 也可以识别,但是在 windows 中可能存在 bug,
实际工作中,tomcat 基本都是在 linux 上运行的。




之后启动 tomcat 。



看到上面的即为启动成功。

7 验证


打开地址栏,输入 url ,测试写好的代码。



test01 是 第一级目路径,也叫做 context path / application path,这个目录就代表了一个 webapp,也就是一个网站。


/hello 是 第二级路径 也叫做 servlet path,如果这两个路径有一个出现了错误,就会出现 404






第一级路径对应的是 war 包名,第二级路径对应的是 注解 里的内容。





可以看到在服务器和客户端都打印出了 Hello World。


小结

在浏览器地址栏输入 url 之后,浏览器就构造了一个对应的 HTTP GET 请求,发给了 tomcat 。
tomcat 就根据第一级路径确定了具体的 webapp,根据第二级路径确定了是调用哪个类。
然后再通过 GET/POST 方法确定调用 HelloSevlet 类里的哪个方法,是 doGet、doPost,还是其他的方法。

如何使用 tomcat 插件打包及部署


打包部署 是可以使用 idea 的 tomcat 插件,把 tomcat 集成到 idea 中。
就可以省去手动打包和部署的过程,只需要按一下运行就会自动打包部署。

基于 tomcat 插件自动打包部署,适用于开发阶段,频繁修改代码,频繁验证的场景。
手动打包部署,适用于上线阶段,发布程序时使用。

1 什么是插件


插件就是对现有的功能进行的拓展,很多程序都是有插件功能的。



就比如上图中的 m4,射击是它的一个功能,但是说如果目标距离过远导致没有办法很容易的命中,
此时就可以装上一个瞄准镜,此时的瞄准镜就是一个插件,作用就是添加一个远距离瞄准的功能。

如果没有添加瞄准镜这个插件,它也是可以开火射击的,只是对于远距离目标就没有那么精准了。
相当于是没有了插件后,功能比以前更少了。


如果此时在夜间看不见目标,就可以在添加上一个夜视仪,这个插件就保证了夜间也可以命中目标。
夜视仪就是另外的一个插件,另外的一个功能。

2 插件的安装


1、打开左上角的 File 选择点击 Settings


2、点击 Plugins



在点击后出现的页面中,



Marketplace 表示的是插件市场,要在这里搜索下载插件。
Installed 页面表示的是已经装好了的插件。


3、搜索 smart tomcat



smart tomcat 就是我们要下载的插件,点击 Install 开始下载。
下载完成之后,重启 idea 即可。

3 插件的使用


首次使用 smart tomcat 的时候,需要配置一下,当然之后就不需要配置了。

1、新增一个运行配置

单击右上角的 Add Configuration…





在出现的页面中,点击圈出的部分。


2、在出现的页面中选择 smart tomcat





点击后出现的页面就是上图中的页面,我们只需要配置绿色圈出的部分,这部分默认即可。


3、设置一下 tomcat 所在的路径

第一次配置好了,以后就不需要再配置了。


4、运行 tomcat



点击右上角的 三角形 运行。



运行后发现报错了,此时报的错误是 地址已被占用。



可以发现此时的使用的端口是 8080。


此时就可以打开 cmd ,键入 netstat -ano | findstr 8080



此时就可以看到 16620 这个进程占用了 8080 这个 端口。


打开 任务资源管理器



可以看到 16620 这个进程就是我们的 tomcat 对应到的 java 进程,因此,关掉 tomcat 即可。


关掉之后,就可以发现此时 8080 不再被占用了。





可以发现此时,就运行成功了。


此时还需要再验证一下,在地址栏输入 http://127.0.0.1:8080/test01/hello



smart tomcat 的工作原理

smart tomcat 不是自动把 war 包拷贝了,也就是 webapps 里是不变的,
而是通过另一种方式来启动的 tomcat 的。

tomcat 支持启动时显示指定一个特定的 webapp 目录,相当于是让 tomcat 加载单个 webapp 运行。
idea 直接调用 tomcat 让 tomcat 加载当前项目中的目录。这个过程中其实并没有打 war 包,也没有拷贝,也没有解压缩。

4 可能会出现的问题


1、404

导致 404 出现的原因,可能是路径写错了。也有可能是 webapp 没有被正确部署
例如,web.xml 文件里的内容写错了、文件名写错了、文件路径写错了、文件位置错了…


此时就是一个 404 错误。



2、405

如果出现了 405,可能是浏览器发了一个 GET 请求,但是此时的代码里是没写 doGet 方法的。



如果 super.doGet(req, resp); 这条语句没有注释掉,也会报 405。



3、500

出现 500 ,本质上就是代码抛出异常了,抛出 500 的时候日志会明确的告诉你异常调用栈,
会告诉你哪一行代码出问题了。

String s = null;
System.out.println(s.length());


此时的代码肯定会报一个 空指针异常



可以看到在报 500 的同时,也报出了空指针异常,而且连出现问题的代码行数也报出来了。



4、出现空白页面

出现空白页面,是因为代码里没写 resp.getWriter().write() 这条语句。



5、出现无法访问网站

这表明 tomcat 未启动,此时就需要检查 tomcat 是否启动了,如果没启动,那就启动。





在这里插入图片描述

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

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

相关文章

DataX和MongoDB之间的数据导入导出案例

DataX和MongoDB之间的数据导入导出案例 文章目录DataX和MongoDB之间的数据导入导出案例0. 写在前面1. MongoDB前置知识1.1 基础概念详解1.1.1 数据库1.1.2 集合1.1.3 文档&#xff08;Document&#xff09;2. DataX 导入导出案例2.1 读取 MongoDB 的数据导入到 HDFS2.1.1 编写配…

模板的分离编译

目录 &#xff1a; 1.分离编译概念 2.模板是不支持分离编译的 3.报链接错误的原因 4.如何解决 ----------------------------------------------------------------------------------------------------------------------- 1.分离编译概念 一个程序由若干个源文件共同实现&a…

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

Eureka单机搭建

Eureka简介 Eureka Spring Cloud Eureka 是Netflix 开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力 Eureka3个角色 服务中心&#xff0c;服务提供者&#xff0c;服务消费者 Eureka Server&a…

(leetcode C语言)1. 两数之和 9. 回文数

目录 1. 两数之和 思路 代码 9. 回文数 思路 思路1 代码1 思路2 代码2 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只…

设计模式-创建型模式之建造者模式

5. 建造者模式5.1. 模式动机无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言&#xff0c;无须知道这些部件的装配细节&#…

linux系统安装和配置网关

Linux 目前国内 Linux 更多的是应用于服务器上&#xff0c;而桌面操作系统更多使用的是 Windows 安装linux虚拟机 网址 VMware下载网址 点击Workstation 16 Pro for Windows下载 安装CentOS centO下载网址 依次点击 7.6.1810/ isos/ x86_64/ CentOS-7-x86_64…

改善供应商关系的八种方法

与供应商保持良好关系的重要性有很多原因。最重要的是&#xff0c;它使每个人的日常工作更加愉快。它还可以为你获得更好的交易&#xff0c;有助于协作并增强商誉。 但是&#xff0c;每个供应商都是不同的&#xff0c;建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…

TypeScript(十二)模块

目录 引言 d.ts声明文件 declare关键字 全局声明 全局声明方式 全局声明一般用作 函数声明 在.ts中使用declare 外部模块&#xff08;文件模块&#xff09; 模块关键字module 声明模块 模块声明方式 模块通配符 模块导出 模块嵌套 模块的作用域 模块别名 内部…

机器学习:皮尔逊相关系数——影评相关性分析案例

机器学习&#xff1a;皮尔逊相关系数——影评相关性分析案例 文章目录机器学习&#xff1a;皮尔逊相关系数——影评相关性分析案例:rocket:1、皮尔逊相关系数概念及公式:rocket:2、案例代码部分皮尔逊&#xff08;pearson&#xff09;相关系数、 斯皮尔曼&#xff08;spearman&…

vue2 和 vue3 共存

1.共存的前置条件 1.1 之前全局安装的 vue2 或者 vue3 的脚手架进行卸载&#xff0c;使用 npm命令卸载vue2 npm uninstall vue-cli -g 再使用 vue -V 查看版本出现以下提示为卸载完成 vue3卸载要使用命令npm uninstall vue/cli -g 1.2 安装cnpm 在命令行中输入 npm install -…

java面试题(SpringBoot)

SpringBoot 1.什么是SpringBoot&#xff1f;有什么优点&#xff1f; springboot是spring的子项目&#xff0c;是spring组件的一站式解决方案&#xff0c;简化了使用的难度&#xff0c;简省了配置 优点&#xff1a; 容易上手&#xff0c;提升开发效率内置web容器管理第三方工…

第六章 物理层

数据通信基础 数据通信基本概念 消息与信息&#xff1b;消息是信息的载体 消息&#xff1a;人类能够感知的描述信息&#xff1a;抽象概念&#xff0c;可以理解为消息中所包含的有意义的内容 通信&#xff1a;一点精确或近似地再生另一点的信息信号&#xff1a;传递信息的载体…

提高客户忠诚度的 5 种方法

提高客户忠诚度是成功经营企业的最重要因素之一。忠诚的客户也更有可能向他们的朋友和家人推荐您的业务&#xff0c;从而开辟更多的收入来源。所以您需要将您的战略重点放在建立作为企业主的客户忠诚度上。 提高客户忠诚度的 5种方法 1.优先考虑客户服务 作为企业应该积极主动…

工赋开发者社区 | MES/MOM数据采集系统需求分析和总体设计

随着社会市场需求的不断变化&#xff0c;传统生产车间内的数据采集技术无法跟上市场变化的需求&#xff0c;容易出现数据记录滞后、实时监控困难等问题&#xff0c;造成了车间的生产效率低、产品质量低。在全球信息化的时代背景下&#xff0c;企业内的信息化管理可有效促进经济…

企业管理系统CRM与ERP有何区别

随着企业不断发展壮大&#xff0c;越来越多的企业引进管理系统&#xff0c;助力自身生产管理。目前市面上比较火热的企业管理系统软件有OA、CRM和ERP系统&#xff0c;关于企业OA管理系统&#xff0c;前面我们已经给出了很多介绍。今天主要带大家了解一下企业管理系统CRM和ERP系…

一文弄懂Python中的 if __name__ == __main__

1. 引言 在Python相关代码中&#xff0c;我们经常会遇到如下代码段&#xff1a; # stuff if __name__ "__main__":# do stuff本文将尽可能使用简单的样例来解释这里发生了什么&#xff0c;以及需要使用if __name__"__main__"的情形。请注意&#xff0c;…

m3u8视频文件破解爬取教程(请尊重知识产权,切勿违法),该方法需要基础开发知识

// UserScript // name media-source-extract // namespace https://github.com/Momo707577045/media-source-extract // version 0.8.2 // description https://github.com/Momo707577045/media-source-extract 配套插件 // author Momo707577045 // i…

ACL综合实验

拓扑结构&#xff1a; 要求 1、PC1可以Telnet R1&#xff0c;但是不能pingR1 2、PC1可以ping R2&#xff0c;但是不能Telnet R2 3、PC2的所有要求与PC1相反 使用的设备&#xff1a;4台路由器、1台交换机 解决网络拓扑&#xff1a; 1、确定广播域的个数 2、分配网段 3、配置…

【2023 · CANN训练营第一季】:AscendCL应用开发深入讲解 基础知识介绍

昇腾&#xff08;Ascend&#xff09;CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为推出的一款面向AI处理器的软件开发工具包&#xff0c;用于支持各种AI应用的开发和部署。它的深度神经网络应用开发流程可以分为以下几个主要步骤 AscendCL应用…