亲宝软件园·资讯

展开

IDEA创建servlet JavaWeb

小熊coder 人气:0

记录一下使用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。

学习顺序:

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 请求流程中的位置:

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 容器当做服务器使用后,上面的流程图就变成了下面的样子:

HTTP 请求流程

注意,Servlet 容器自带的 Web 服务器模块虽然没有传统的 Web 服务器强大,但是也足以应付大部分开发场景,对初学者来说是足够的。当然,您也可以将传统的 Web 服务器和 Servlet 容器组合起来,两者分工协作,各司其职,共同完成 HTTP 请求。

总结

Servlet 容器就是 Servlet 程序的运行环境,它主要包含以下几个功能:

背景知识-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 的目录结构如下图。

JavaWeb 结构图

下表中对 webapps 下各个目录进行了介绍。

 

目录描述是否必需
\servletDemoWeb 应用的根目录,属于该 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.xmlweb.xml 中包含应用程序的配置和部署信息。

下面我们一步一步开始这个过程:

1.新建一个java项目

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112160858255.png

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112160950817.png

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112161135332.png

先看一下默认建好的java项目的目录结构:

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112161220492.png

2.将普通java项目转换成JavaWeb项目

通过背景知识JavaWeb应用的目录结构,我们可以知道普通Java项目的目录结构和JavaWeb项目的目录结构差别是很大的,因此我们需要将普通项目转成JavaWeb项目。

在项目名上右键,选择 Add Framework Support

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112161551226.png

勾选Web Application

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112161650144.png

此时,我们可以看到项目的目录结构变成了如下所示情况

image-20220112161803477

可以看到,和之前JavaWeb应用的目录结构已经差不多了,但是在目录WEB-INF下,还缺少两个目录classes和lib,我们自己新建一下这两个目录即可。

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112162115120.png

新建好之后,项目目录结构如下图所示:

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112162155736.png

3.进行项目目录结构的设置

我们知道JavaWeb应用的目录结构中:

\servletDemo\WEB-INF\classes目录存放各种 .class 文件或者包含 .class 文件的目录,Servlet 类的 .class 文件也存放在此。

\servletDemo\WEB-INF\lib目录存放应用所需的各种 jar 包,例如 JDBC 驱动程序的 jar 包。

因此我们要对编译生成的字节码文件的路径进行一下更改。

点击File-Project Structure

image-20220112163341718

将Modules中的Paths改成你项目中的classes目录

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112163544140.png

继续,在Libraries中添加lib目录

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112163733267.png

选择 Jar Directory

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112163919526.png

4.引入Tomcat的jar包

此时我们想要新建一个servlet是新建不了的,因为JRE并没有包含这个包,这个包在Tomcat中存在,因此我们需要将这个包添加进来。

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112165104096.png

右键项目名,选择Open Module Settings

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112165231758.png

添加Tomcat安装目录下的servlet-api.jar包。

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112165642086.png

此时,我们新建文件即可发现servlet选项了!

在这里插入图片描述

设置类名和包名

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112165927729.png

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

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112170457720.png

点击加号

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112170602412.png

选择Tomcat server中的Local

image-20220112170653350

配置一下Tomcat安装目录,然后系统会自动识别出Tomcat的版本。

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112170820316.png

点击切换到Deployment下,点击下面的加号,选择Artifact。

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112170905313.png

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112170946201.png

https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20220112171036596.png

7.开启Tomcat

设置好Tomcat信息之后,菜单栏右上侧会出现如下按钮。

image-20220112171532583

点击绿色小三角,运行Tomcat。

在浏览器中输入下面网址:http://localhost:8080/blog_war_exploded/Servlet

为什么是这个地址呢?

前面Tomcat设置时,我们设置了一个路径/blog_war_exploded。Servlet是我们创建的类,因此通过这个地址就可以访问到我们的网页。

一切正常的话,我们可以看到如下画面

在这里插入图片描述

说明我们的servlet项目已经成功部署在本地运行的Tomcat上。

总结

其实上面的一个过程,是我们将一个非常简单的Servlet项目部署到Tomcat上,只是为了让大家了解这样一个过程,这样后面只需要专注于项目的开发。

加载全部内容

相关教程
猜你喜欢
用户评论