【JavaEE】_Servlet程序的编写方法

目录

1. 创建项目

2. 引入依赖

3. 创建目录结构

3.1 在main目录下创建一个webapp目录

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

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

3.4 在web.xml中进行代码编写

4. 编写代码

4.1 在java目录下创建类

4.2 打印"hello world"

4.2.1 在服务器控制台上打印

4.2.2 在客户端打印

4.2.3 在新建类的首行添加注解

5. 打包程序

6. 部署程序

7. 验证


Servlet其实是较早的编写方式,当今Spring对Servlet进行了进一步封装,从而令编写网站更简单了。现在的Java商业级开发基本都以Spring为主。Spring是基于Servlet实现的,本篇介绍Servlet程序的编写方法,以Servlet的hello world程序为例

一个Servlet程序的编写需要以下7个步骤:

1. 创建项目

此处需要创建一个maven程序了,maven是一个Java中知名的构建工具,其主要作用如下:

① 规范目录结构; ② 管理依赖(如处理使用的第三方库);③ 构建;④ 打包;⑤ 测试;

idea已经集成了Maven,可以无需额外安装;

注意查看maven的项目结构:

2. 引入依赖

Servlet的API是tomcat提供的,而不是jdk提供的,即是一个第三方库。

引入依赖即引入servlet对应的jar包,首先进入maven仓库,搜索servlet:

maven仓库链接如下:

https://mvnrepository.com/

选中maven,复制代码将其粘贴至pom.xml文件中:

注意:

(1)复制粘贴的代码是不包含dependencies标签的,需要在project顶级标签下创建dependencies标签后,将复制来的代码粘贴至该标签内

<?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>org.example</groupId><artifactId>hello_servlet</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies></project>

也把这一段配置称为该依赖在maven仓库的坐标; 

(2)首次使用时字体颜色为红色,说明尚未下载完成,一般只要粘贴进来,idea的maven就会自动刚出发依赖下载,下载结束后则不再是红色字体,如果长时间红色字体仍未变更,可在右侧面板进行强制刷新

 

(3)servlet版本与tomcat版本对应表,请查看官网,链接如下:

Apache Tomcat® - Which Version Do I Want?

(4)此操作的jar包就被下载到了Maven本地仓库,如果本机安装了Maven,Maven就会在本机上创建一个目录保存下载好的jar包,可以在idea中查看本地Maven仓库路径:

根据该路径查看:

3. 创建目录结构

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

3.1 在main目录下创建一个webapp目录

(Directory)

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

(方法同上)(Directory)

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

(File)

创建完毕后的src目录结构如下:

3.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>

这段代码可以视为固定代码,当前不需要进行调整;

注:(1)servlet程序和以往的代码相比,有一个非常大的区别:没有main方法;

servlet程序类似没有发动机的车厢,想要运行就要靠车头有带动,而tomcat就是车头;

将写好的servlet程序复制粘贴至webapps目录下,就相当于是把车厢挂到车头后了。

tomcat识别其webapps目录下哪些车厢需要靠车头带动,哪些不需要带动,就是靠目录下的WEB-INF/web.xml;

即:web.xml文件的作用是让tomcat能够识别的当前代码为webapp,并进行加载

(2)pom.xml的标红才是插件下载问题,对于其他语言,如:xml,  html, js sql等语言的标红很有可能是idea的误判,判定代码是否正确的唯一方法是运行后查看结果;

4. 编写代码

4.1 在java目录下创建类

此处以HelloServlet为例:

注:(1) HttpServlet类是servlet jar包提供的类,故而如果前面引入依赖有问题,此处可能就无法正确提示甚至会报错。

写servlet代码一般都继承该类,继承的主要目的是可以令新建的类针对HttpServelt进行功能扩展,通过重写父类方法的方式实现;

(2) doGet方法就是一个根据请求计算响应的方法,我们写的这个doGet方法,不需要我们进行手动调用,而是交给tomcat调用,当tomcat收到get请求,就有可能执行到这个子类的方法

tomcat会构造好两个参数:req和resp,其中:

req就是TCP socket中读出的字符串按照HTTP协议解析得到的对象,这个对象中的属性与HTTP请求报文格式相对应,是tomcat针对请求已经解析好,构造好了的。

resp对象是一个空对象(不是null,只是new了个对象),程序员的任务就是在doGet方法内部实现:根据请求(req)计算响应(resp),resp本质上是一个输出型参数;

(3)在新类继承HttpServlet类后,输入doget并按下Tab键会自动生成一个默认格式,此时在方法内部有super.doGet(req,resp)语句,父类的doGet方法没有实际作用,只是返回了一个错误页面,故而这句需要注释掉

4.2 打印"hello world"

4.2.1 在服务器控制台上打印

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello world");}

4.2.2 在客户端打印

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("hello world");}

注:(1)此处的resp.getWriter会获取到一个writer对象,此处的writer对象是从属于resp对象的,此时进行的write操作其实是在往resp的body部分进行写入,等resp对象整个构造好了,tomcat会统一转成HTTP响应的格式,再写socket;

(2)java中分字节流与字符流两类,writer属于字符流的写操作。

流对象不一定要写入网卡或硬盘,也可以写入内存缓冲区,取决于代码实现的细节;

4.2.3 在新建类的首行添加注解

在新建类首行增加@WebServlet("/hello")注解;

整体编写完毕的完整代码如下:

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("/hello")
// 令当前的HelloServlet类继承自HttpServlet类:
public class HelloServlet extends HttpServlet {@Override
//    重写HttpServlet类的doGet方法:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 该语句只能实现在服务器的控制台中打印:System.out.println("hello world");// 在客户端实现打印:resp.getWriter().write("hello world");}
}

 注:(1)注解是java中的特殊类,注解可以针对一个类或方法进行额外的解释说明,赋予这个类或方法额外的功能或含义

(2)此处WebServlet注解的作用是:把当前的类和一个HTTP请求的路径关联起来

(3)之前“doGet是tomcat收到GET请求的时候就会调用”这种说法其实并不准确,具体是否要调用doGet,还是得看当前GET请求的路径,不同的路径可以触发不同的代码(即关联到不同的类上);

(4)一个Servlet程序中可以有很多Servlet类,每个Serlet类都可以关联到不同的路径(对应到不同资源),因此此处的多个Servlet就实现了不同的功能

(5)路径与Servlet之间是一一对应的;

5. 打包程序

(1)打包程序即:把程序编辑好,得到一些.class文件(此例中只有一个文件,一个.java文件对应一个.class文件),将这些.class文件打成压缩包即可;

注:jar就是一种.class构成的压缩包,但此处要打的是war包;

① jar包只是一个普通的java程序;

war则是tomcat专属的用来描述webapp的程序war包中不止有.class文件,还有一些tomcat要求的配置文件,如web.xml等,还有一些前端的代码,如html,css,js等;

(2)借助maven直接点击即可:

第一步:点击右侧maven展开maven面板选中package,直接双击或右键运行均可:

如果出现错误,则页面会显示具体的错误信息,如果运行一切顺利,则页面如下:

第二步:打包完毕后,包会生成在target目录下,可在左侧目录栏查看:

(3)默认情况下,maven打的是jar包,此处需要打war包,故而需要微调一下pom.xml:

点击pom.xml,在project顶级标签下,增加一个packaging标签和一个build标签

<?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>org.example</groupId><artifactId>hello_servlet</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies>
<!--以下内容至末尾project标签前均为新增内容--><packaging>war</packaging><build><finalName>hello_servlet</finalName></build></project>

其中,packaging标签就是描述打包的类型

build标签中嵌套一个finalName标签,该标签描述的是war包的名字,(可不指定,但默认生成的名字会较复杂);

此时重新操作maven的package选项,在左侧目录栏可见一个新生成的war包:

注:(1)如果打包失败,在控制台中也会显示一些出错原因:

① 打包操作依赖了一些第三方的jar包,maven就会自动下载,如果下载过程中网络不太顺畅,就容易出错;

② 代码的配置文件如pom.xml出现问题;

(2)这种手动打包和手动部署的操作也体现了开发与运行分离的思想,直接使用IDEA的三角符号进行运行是本地运行,而不是在另一个服务器上运行;

6. 部署程序

部署程序即:把刚打包好的war包拷贝到tomcat的webapps目录中即可

无论tomcat是在本机还是跨服务器,都是这样拷贝,拷贝完毕后启动tomcat即可;

注:(1)在windows环境下,如果tomcat正在运行,直接拷贝,tomcat也能识别,但是有可能存在bug。实际开发中,tomcat基本都是在linux上运行的,在linux上不存在bug。

(2)tomcat可以自动识别war包并进行解压缩

7. 验证

启动tomcat后,在浏览器中输入url,注意路径的写法:

访问成功后页面如图:

注:(1)在浏览器中输入url后,浏览器就构造了一个对应的HTTP GET请求,发给了tomcat,tomcat根据第一级路径,确定了具体的webapp,根据第二级路径,确定了调用哪个类,再通过GET / POST方法确定调用HelloServlet的哪个方法:doGet或doPost等等;

(2)也可以在服务器代码处看到日志(tomcat处):

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

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

相关文章

无人机精准定位技术,GPS差分技术基础,RTK原理技术详解

差分GPS的基本原理 差分GPS&#xff08;Differential GPS&#xff0c;简称DGPS&#xff09;的基本原理是利用一个或多个已知精确坐标的基准站&#xff0c;与用户&#xff08;移动站&#xff09;同时接收相同的GPS卫星信号。由于GPS定位时会受到诸如卫星星历误差、卫星钟差、大…

uniapp离线打包(使用Android studio打包)

一、准备工作 安装HbuilderX&#xff0c;记住版本号下载对应HbuilderX版本的Android离线SDK&#xff0c;如我使用3.6.18版本打包&#xff0c;则对应应下载3.6.18版本的SDK&#xff08;官网不提供旧版本的SDK&#xff0c;有些需要自己找&#xff09;官网下载地址&#xff1a;ht…

2、Web攻防-SQL注入-联合查询注入

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 声明&#xff1a;只用于学习交流&#xff0c;点到为止&#xff0c;请勿非法测试。 概念&#xff1a; 联合查询注入&#xff1a;联合注入是回显注入的一种&#xff0c;也就是说联合注入的前…

【Python如何求出水仙花数】

1、求水仙花数Python代码如下&#xff1a; # 求水仙花数&#xff1a;只需要个十百位的3次幂之和与原数相等 for i in range(100, 1000): # 循环100-999整数i1 i % 10 # 取个位 “%”表示除以后取余数i2 i // 10 % 10 # 取十位i3 i // 100 # 取百位 “//”表示除以后取整…

二十六、直方图均衡化

项目功能实现&#xff1a;对灰度图片进行直方图均衡化操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 histogram_equal.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class HISTOGRAM_EQUAL { public:void histogram_equal(Mat…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

抖音数据挖掘软件|视频内容提取

针对用户获取抖音视频的需求&#xff0c;我们开发了一款功能强大的工具&#xff0c;旨在解决用户在获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们希望用户能够通过简单的关键词搜索&#xff0c;实现自动批量抓取视频&#xff0c;并根据需要进行选择性批量下载。因此&a…

【Flink精讲】Flink任务调度机制

Graph 的概念 Flink 中的执行图可以分成四层&#xff1a; StreamGraph -> JobGraph -> ExecutionGraph -> 物理执 行图。 StreamGraph&#xff1a;是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。JobGraph&#xff1a; StreamGraph …

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式&#xff0c;现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&#xff08;插件&#xff09;&#xff0c;需要授权后才能使用&#xff1b; 本软件…

设计模式——抽象工厂模式

定义: 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;提供一个创建一系列或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 概述:一个工厂可以提供创建多种相关产品的接口&#xff0c;而无需像工厂方法一样&#xff0c;为每一个产品都提供一个具体…

open3d 连接两个点云

连接两个点云 一、连接两个点云二、代码三、结果1.coloud1点云2.cloud2点云3.cloud1 和 colud2 合并4.生成连接字段&#xff08;拼接颜色&#xff09; 四、相关链接五、问题与解决方案1.问题2.解决方案 一、连接两个点云 看代码吧。。。 二、代码 import numpy as np import…

数据结构-二叉树深度详解(附带源码)

目录 一、基本概念&#xff1a; 二、实现二叉树的数据结构&#xff1a; 三、二叉树性质&#xff1a; 四、相关计算 五、搜索二叉树&#xff1a;任何一颗树的左子树都比它小&#xff0c;右子树都比它大 六、二叉树的存储结构 七、二叉树基本操作 八、源码&#xff08;有需…

使用pytest和allure框架实现自动化测试报告优化

pytest&#xff1a; 需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法&#xff0c;比unittest更加严谨 unittest&#x…

【centos】【vsftpd】FTP本地用户登录配置

目录 ftp与sftp安装vsftpd和ftp本地用户登录-不限制访问目录本地用户登录-限制访问目录有可能影响连接的问题pam认证selinux策略被动模式防火墙ipv4和ipv6 报错1、 530 Login incorrect2、500 OOPS: vsftpd: refusing to run with writable root inside chroot()3、227 Enterin…

day41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

本章知识点&#xff1a; 1 、 XML&XXE- 原理 & 发现 & 利用 & 修复等 2 、 XML&XXE- 黑盒模式下的发现与利用 3 、 XML&XXE- 白盒模式下的审计与利用 4 、 XML&XXE- 无回显 & 伪协议 & 产生层面 配套资源&#xff08;百度网盘&#x…

飞天使-linux操作的一些技巧与知识点7-devops

文章目录 简述devopsCICD 简述devops 让技术团队&#xff0c;运维&#xff0c;测试等团队实现一体式流程自动化 进阶版图 CICD 持续集成&#xff0c; 从编译&#xff0c;测试&#xff0c;发布的完成自动化流程 持续交付&#xff0c;包含持续集成&#xff0c;并且将项目部署…

代码随想录Day60 | 647. 回文子串 647. 回文子串

代码随想录Day60 | 647. 回文子串 647. 回文子串 647.回文子串516.最长回文子序列 647.回文子串 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串 状态 dp数组 dp[i][j] 表示字符串…

有哪些适合程序员做的副业?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

泛微e-office系统敏感信息泄露漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 1、系统简介 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软…

01VScode开发stm32环境搭建

title: VScode开发stm32环境搭建 tags: STM32vscode 1.准备工作 1.下载并安装VSCODE 在百度上搜索vscode记住一定要是官方的 不然你自己就是在给自己下毒2345全来了 打红圈一定要有不然就是在垃圾网站上下的 VSCode下载链接 选一个适合你的      安装正常流程走就行不再…