使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署的实现
作者:小熊coder 发布时间:2023-09-11 06:04:09
记录一下使用IDEA创建servlet并使用Tomcat本地部署的过程。
需要安装好的软件
首先IDEA社区版不支持Java EE,因此要使用Ultimate版本。
Tomcat版本是Tomcat9。Tomcat教程地址:Tomcat下载和安装(图解)
在安装好IDEA Ultimate版本和Tomcat9之后,我们还需要了解一些背景知识,以便我们更好的进行这个过程。
背景知识-Servlet是什么?
Servlet 是 Server Applet 的缩写,译为“服务器端小程序”,是一种使用 Java 语言来开发 * 站的技术。
Servlet 虽然被称作“小程序”,但是它的功能却异常强大,因为它是基于 Java 的,几乎可以使用所有的 Java API,Java 能做的事情,Servlet 也能做。
Java 是一种功能强大的通用型编程语言,可以处理 HTTP 请求,可以访问数据库,可以生成 HTML 代码,您完全可以使用原生 Java 来开发 * 站。但是,使用原生 Java 开发 * 站非常麻烦,需要自己解析 HTTP 请求的报头,需要自己分析用户的请求参数,需要自己加载数据库组件……种种原因导致使用原生 Java 开发 * 站几乎是一件不能被接受的事情。正是基于这种原因,Java 官方后来推出了 Servlet 技术,它对开发 * 站需要使用的原生 Java API 进行了封装,形成了一套新的 API,称为 Servlet API。
使用 Servlet 开发 * 站非常方便,程序员只需要集中精力处理业务逻辑,不需要再为那些基础性的、通用性的功能编写代码,这使得 Servlet 在 * 站开发领域具备了很高的实用性。
Servlet 基于 Java,可以使用几乎全部的 Java API,所以它的功能异常强大,完全可以胜任企业级开发,能够处理那些高并发、大吞吐量、业务逻辑复杂的应用场景。
您可以这样理解,Servlet 是 Sun 公司推出的一种基于 Java 的 * 站开发技术。编写 Servlet 代码需要遵循 Java 语法,一个 Servlet 程序其实就是一个按照 Servlet 规范编写的 Java 类。Servlet 程序需要先编译成字节码文件(.class
文件),然后再部署到服务器运行。
Servlet 是一种规范
严格来说,Servlet 只是一套 Java Web 开发的规范,或者说是一套 Java Web 开发的技术标准。只有规范并不能做任何事情,必须要有人去实现它。所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等。
Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。Servlet 容器用来管理程序员编写的 Servlet 类。
Servlet 接口
所有的 Servlet 功能都是通过一个名为Servlet
的接口(Interface)向外暴露的,编写 Servlet 代码,可以从实现 Servlet 接口开始,就像下面这样:
public class ServletDemo implements Servlet { //TODO:}
直接实现 Servlet 接口比较麻烦,需要实现很多方法,所以 Servlet 规范又提供了两个抽象类,分别是 GenericServlet 类和 HttpServlet 类,它们都实现了 Servlet 接口的很多常用功能。和 GenericServlet 类相比,HttpServlet 类更加方便,所以实际开发中一般都继承自 HttpServlet 类。
JSP
Servlet 是第一代 Java Web 开发技术,它将 HTML 代码以字符串的形式向外输出,编写 HTML 文档就是在拼接字符串,非常麻烦,所以 Java 官方又推出了第二代 Web 开发技术——JSP。
JSP 才是现代化的 Web 开发技术,它允许 HTML 代码和 JSP 代码分离,让程序员能够在 HTML 文档中直接嵌入 JSP 代码。
现在没有人直接使用 Servlet 开发 * 站,大家都转向了 JSP 阵营。但是 JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,HTML 代码还是以字符串的形式向外输出的。您看,JSP 只是在 Servlet 的基础上做了进一步封装。
JSP 代码可以调用 Servlet 类,程序员可以将部分功能在 Servlet 中实现,然后在 JSP 中调用即可。
总之,Servlet 是 JSP 的基础,Servlet 虽然不直接面向用户,但是它依然是 JSP 的后台支撑,想玩转 JSP,必须先玩转 Servlet。
学习顺序:
学习 Servlet 的正确顺序是:Java --> Servlet。
学习 JSP 的正确顺序是:Java --> Servlet --> JSP。
Web 容器
我们知道,Servlet 是基于 Java 语言的,运行 Servlet 必然少不了 JRE 的支持,它负责解析和执行字节码文件(.class
文件)。然而 JRE 只包含了 Java 虚拟机(JVM)、Java 核心类库和一些辅助性性文件,它并不支持 Servlet 规范。要想运行 Servlet 代码,还需要一种额外的部件,该部件必须支持 Servlet 规范,实现了 Servlet 接口和一些基础类,这种部件就是 Servlet 容器。
Servlet 容器就是 Servlet 代码的运行环境(运行时),它除了实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持,还需要管理由用户编写的 Servlet 类,比如实例化类(创建对象)、调用方法、销毁类等。
Servlet 中的容器和生活中的容器是类似的概念:生活中容器用来装水、装粮食,Servlet 中的容器用来装类,装对象。
读者可能会提出疑问,我们自己编写的 Servlet 类为什么需要 Servlet 容器来管理呢?这是因为我们编写的 Servlet 类没有 main() 函数,不能独立运行,只能作为一个模块被载入到 Servlet 容器,然后由 Servlet 容器来实例化,并调用其中的方法。
一个动态页面对应一个 Servlet 类,开发一个动态页面就是编写一个 Servlet 类,当用户请求到达时,Servlet 容器会根据配置文件(web.xml)来决定调用哪个类。
下图演示了 Servlet 容器在整个 HTTP 请求流程中的位置:
您看,Web 服务器是整个 * 站的“大门”,用户的 HTTP 请求首先到达 Web 服务器,Web 服务器判断该请求是静态资源还是动态资源:如果是静态资源就直接返回,此时相当于用户下载了一个服务器上的文件;如果是动态资源将无法处理,必须将该请求转发给 Servlet 容器。
Servlet 容器接收到请求以后,会根据配置文件(web.xml)找到对应的 Servlet 类,将它加载并实例化,然后调用其中的方法来处理用户请求;处理结束后,Servlet 容器将处理结果再转交给 Web 服务器,由 Web 服务器将处理结果进行封装,以 HTTP 响应的形式发送给最终的用户。
常用的 Web 容器有 Tomcat、Jboss、Jetty、WebLogic 等,其中 Tomcat 由 Java 官方提供,是初学者最常使用的。
为了简化部署流程,Web 容器往往也会自带 Web 服务器模块,提供基本的 HTTP 服务,所以您可以不用再安装 Apache、IIS、Nginx 等传统意义上的服务器,只需要安装一款 Web 容器,就能部署 Servlet 网站了。正是由于这个原因,有的教材将 Tomcat 称为 Web 容器,有的教材又将 Tomcat 称为 Web 服务器,两者的概念已经非常模糊了。
将 Web 容器当做服务器使用后,上面的流程图就变成了下面的样子:
注意,Servlet 容器自带的 Web 服务器模块虽然没有传统的 Web 服务器强大,但是也足以应付大部分开发场景,对初学者来说是足够的。当然,您也可以将传统的 Web 服务器和 Servlet 容器组合起来,两者分工协作,各司其职,共同完成 HTTP 请求。
总结
Servlet 容器就是 Servlet 程序的运行环境,它主要包含以下几个功能:
实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持;
管理用户编写的 Servlet 类,以及实例化以后的对象;
提供 HTTP 服务,相当于一个简化的服务器。
背景知识-JavaWeb应用的目录结构
JavaWeb 应用由一组 Servlet/JSP、HTML 文件、相关 Java 类、以及其他的资源组成,它可以在由各种供应商提供的 Servlet 容器中运行。由 JavaWeb 应用的定义可知, Servlet 是 JavaWeb 应用的一个组件。
为了让 Servlet 容器顺利地找到 JavaWeb 应用的各个组件,Servlet 规范规定,JavaWeb 应用必须采用固定的目录结构,即每种组件在 JavaWeb 应用中都有固定的存放目录。
以 Tomcat 为例,通常将 JavaWeb 应用存放到 Tomcat 的 webapps 目录下。在 webapps 下,每一个子目录都是一个独立的 Web 应用,子目录的名字就是 Web 应用的名字,也被称为 Web 应用的上下文根。用户可以通过这个上下文根来访问 JavaWeb 应用中的资源。
webapps 的目录结构如下图。
下表中对 webapps 下各个目录进行了介绍。
目录 | 描述 | 是否必需 |
---|---|---|
\servletDemo | Web 应用的根目录,属于该 Web 应用的所有资源都存放在这个目录下。 | 是 |
\servletDemo\WEB-INF | 存放 web.xml、lib 目录以及 classes 目录等。 | 是 |
\servletDemo\WEB-INF\classes | 存放各种 .class 文件或者包含 .class 文件的目录,Servlet 类的 .class 文件也存放在此。 | 否 |
\servletDemo\WEB-INF\lib | 存放应用所需的各种 jar 包,例如 JDBC 驱动程序的 jar 包。 | 否 |
\servletDemo\WEB-INF\web.xml | web.xml 中包含应用程序的配置和部署信息。 | 是 |
下面我们一步一步开始这个过程:
1.新建一个java项目
先看一下默认建好的java项目的目录结构:
2.将普通java项目转换成JavaWeb项目
通过背景知识JavaWeb应用的目录结构,我们可以知道普通Java项目的目录结构和JavaWeb项目的目录结构差别是很大的,因此我们需要将普通项目转成JavaWeb项目。
在项目名上右键,选择 Add Framework Support
勾选Web Application
此时,我们可以看到项目的目录结构变成了如下所示情况
可以看到,和之前JavaWeb应用的目录结构已经差不多了,但是在目录WEB-INF下,还缺少两个目录classes和lib,我们自己新建一下这两个目录即可。
新建好之后,项目目录结构如下图所示:
3.进行项目目录结构的设置
我们知道JavaWeb应用的目录结构中:
\servletDemo\WEB-INF\classes目录存放各种 .class 文件或者包含 .class 文件的目录,Servlet 类的 .class 文件也存放在此。
\servletDemo\WEB-INF\lib目录存放应用所需的各种 jar 包,例如 JDBC 驱动程序的 jar 包。
因此我们要对编译生成的字节码文件的路径进行一下更改。
点击File-Project Structure
将Modules中的Paths改成你项目中的classes目录
继续,在Libraries中添加lib目录
选择 Jar Directory
4.引入Tomcat的jar包
此时我们想要新建一个servlet是新建不了的,因为JRE并没有包含这个包,这个包在Tomcat中存在,因此我们需要将这个包添加进来。
右键项目名,选择Open Module Settings
添加Tomcat安装目录下的servlet-api.jar包。
此时,我们新建文件即可发现servlet选项了!
设置类名和包名
5.简单写一些代码用来测试
此时我的Servlet.java文件内容如下:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用PrintWriter.write()方法向前台页面输出内容
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("good good study, learn to change");
writer.close();
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用PrintWriter.write()方法gaifang向前台页面输出内容
PrintWriter writer = resp.getWriter();
writer.write("good good study, learn to change");
writer.close();
doGet(req, resp);
}
}
6.设置Tomcat
因为我们是需要在IDEA中启动Tomcat,并把我们的项目部署上去。因此我们需要对Tomcat进行设置。
点击菜单栏上的Run-Edit Configuration
点击加号
选择Tomcat server中的Local
配置一下Tomcat安装目录,然后系统会自动识别出Tomcat的版本。
点击切换到Deployment下,点击下面的加号,选择Artifact。
7.开启Tomcat
设置好Tomcat信息之后,菜单栏右上侧会出现如下按钮。
点击绿色小三角,运行Tomcat。
在浏览器中输入下面网址:http://localhost:8080/blog_war_exploded/Servlet
为什么是这个地址呢?
前面Tomcat设置时,我们设置了一个路径/blog_war_exploded。Servlet是我们创建的类,因此通过这个地址就可以访问到我们的网页。
一切正常的话,我们可以看到如下画面
说明我们的servlet项目已经成功部署在本地运行的Tomcat上。
来源:https://blog.csdn.net/qq_41854911/article/details/122460601


猜你喜欢
- 本文实例讲述了Java中的 * 、过滤器、 * 用法。分享给大家供大家参考,具体如下:一、 * :是在面向切面编程的就是在你的servic
- 一、什么是热部署?热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。二、什么是SpringBoot热部署?SpringBoot
- 此篇文章是我一个小白对委托的理解和总结,请高手多多评判指教。委托就是一种后期绑定机制,说的直白点就是在调用的时候才去传递业务逻辑的一种算法。
- 面试题1:你了解线程池么?简单介绍一下。java提供的一个java.util.concurrent.Executor接口的实现用于创建线程池
- 啥都不说先上效果图,这个是我项目里的效果:下面的是我抽取出来的 demo 适配啥的我基本上都做好了没做其他的ok 下面 说一下思路把首先 说
- 在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。举例:把订阅报纸的人看作是观察者,把报纸
- 1. 出故障了没办法,干it这一行,就得天天面对故障,大家就是传说中的消防员,到处救火。不过,这次的故障范围有点大,宿主机都打不开了。好在监
- 本文实例为大家分享了java批量解析微信dat文件的具体代码,供大家参考,具体内容如下微信图片默认路径:C:\Users\b-eet\Doc
- 上一篇文章实现了微信登录的移动端功能,下面继续完善功能,实现微信登录服务端功能服务端登录功能实现在以往文章里已经实现了服务端mvc框架,而登
- java自定义切面增强写代码时会遇到一些有些重复机械的工作, 这个时候就可以运用切面技术来帮我们节约时间介绍如何使用自定义注解增强方法, 实
- 1.pom文件导入依赖<!-- kafka --><dependency> <groupId>
- java 中同步、异步、阻塞和非阻塞区别详解简单点说:阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; 非阻塞就是你先干,我
- 目录什么是树形结构数据效果用法源码总结什么是树形结构数据效果用法String jsonStr = "{\"name\&q
- @ApiModel使用场景在实体类上边使用,标记类时swagger的解析类概述提供有关swagger模型的其它信息,类将在操作中用作类型时自
- 前言:在我们使用C# WinForm中,我们有时候是需要或者自己本机的IP地址进行处理,今天我们学习一下如何使用C# Winform获取主机
- 昨天弄了一天的Android Studio svn,感觉没有eclipse的svn好装,中间遇到很多的麻烦问题。这里来记录下吧下载下来的时候
- 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变
- 或是将Datagrid或是Gridview的输出导出,实现大体上又分为调用COM+组件或是利用Response(当然是B/S架构的项目)的输
- 前言想象一下生活中哪些是和线程沾边的?饭店炒菜就是一个很好的例子首先客人要吃菜,前提是厨师要炒好,也就是说,厨师不炒好的话客人是没有饭菜的。
- init_output_stream() 是一个公共的函数,无论是音频,还是视频的输出流的初始化,都是通过它来完成的。init_o