2023年零基础Java网络应用程序开发完整教程:从入门到精通

Java Web应用程序用于创建动态网站。Java通过Servlet和JSP提供对Web应用程序的支持。我们可以创建静态HTML页面的网站,但当我们希望信息具有动态性时,我们需要Web应用程序。

Java Web应用程序

本文的目的是提供关于Web应用程序中不同组件的基本细节,以及如何使用Servlet和JSP来创建我们的第一个Java Web应用程序。

  1. 网页服务器和客户端
  2. HTML和HTTP
  3. 理解URL
  4. 为什么需要Servlet和JSP?
  5. 使用Servlet和JSP的第一个网页应用程序
  6. 网络容器
  7. 网页应用程序目录结构
  8. 部署描述符

网页服务器和客户端

Web服务器是一种能够处理客户端请求并将响应发送回客户端的软件。例如,Apache是最广泛使用的Web服务器之一。Web服务器运行在某个物理机器上,并在特定端口上监听客户端请求。Web客户端是一种帮助与服务器进行通信的软件。一些最常用的Web客户端包括Firefox、Google Chrome、Safari等。当我们通过URL向服务器请求某些内容时,Web客户端负责创建请求并将其发送到服务器,然后解析服务器响应并展示给用户。

HTML和HTTP

Web服务器和Web客户端是两个独立的软件,所以它们需要一种共同的沟通语言。HTML是服务器和客户端之间的共同语言,代表超文本标记语言。Web服务器和客户端需要一种共同的通信协议,HTTP(超文本传输协议)是服务器和客户端之间的通信协议。HTTP运行在TCP/IP通信协议之上。HTTP请求的一些重要部分包括:

  • HTTP方法 – 要执行的操作,通常是GET、POST、PUT等
  • URL – 要访问的页面
  • 表单参数 – 类似于Java方法中的参数,例如来自登录页面的用户名和密码详细信息

示例HTTP请求:

GET /FirstServletProject/jsps/hello.jsp HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

以下是HTTP响应中一些重要部分:

  • 状态码 – 一个整数,用于指示请求是否成功。一些知名的状态码有:200表示成功,404表示未找到,403表示禁止访问
  • 内容类型 – 文本、HTML、图像、PDF等。也称为MIME类型
  • 内容 – 由客户端渲染并显示给用户的实际数据

示例HTTP响应:

200 OK
Date: Wed, 07 Aug 2013 19:55:50 GMT
Server: Apache-Coyote/1.1
Content-Length: 309
Content-Type: text/html;charset=US-ASCII

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=Wed Aug 07 12:57:55 PDT 2013
</h3>
</body>
</html>

如果您查看上面的示例HTTP响应头,可以看到它包含了”Content-Type”标签。它也被称为MIME类型,服务器发送它给客户端,以让其知道发送的数据类型。它帮助客户端为用户呈现数据。一些最常用的MIME类型包括text/html、text/xml、application/xml等。

理解URL

URL是统一资源定位符的缩写,用于定位服务器和资源。网上的每个资源都有其独特的地址。让我们以一个例子来看URL的几个部分。https://localhost:8080/FirstServletProject/jsps/hello.jsp

  • https:// – 这是URL的第一部分,提供了服务器与客户端通信要使用的通信协议。
  • localhost – 服务器的唯一地址,大多数情况下是映射到唯一IP地址的主机名。有时多个主机名指向相同的IP地址,Web服务器虚拟主机会负责将请求发送到特定的服务器实例。
  • 8080 – 这是服务器侦听的端口,它是可选的,如果在URL中不提供它,则请求会发送到协议的默认端口。端口号0到1023是为知名服务保留的端口,例如HTTP的80端口,HTTPS的443端口,FTP的21端口等。
  • FirstServletProject/jsps/hello.jsp – 从服务器请求的资源。它可以是静态HTML、PDF、JSP、Servlet、PHP等。

为什么我们需要Servlet和JSP?

网络服务器适用于静态内容的HTML页面,但它们不知道如何生成动态内容或将数据保存到数据库中,所以我们需要另一种工具来生成动态内容。有几种编程语言用于生成动态内容,例如PHP、Python、Ruby on Rails、Java Servlet和JSP。Java Servlet和JSP是服务器端技术,通过提供对动态响应和数据持久化的支持来扩展网络服务器的功能。

Java 网页开发

第一个使用Servlet和JSP的网络应用程序

这是文章《Java网络应用程序初学者教程》的第2部分(共3部分)。

我们将使用”Eclipse IDE for Java EE Developers”来创建我们的第一个servlet应用程序。由于servlet是一种服务器端技术,我们需要一个支持Servlet技术的Web容器,因此我们将使用Apache Tomcat服务器。它非常容易设置,我将留给你自己来做这部分。为了方便开发,我们可以在Eclipse中配置Tomcat,这有助于方便部署和运行应用程序。进入Eclipse首选项,选择服务器运行环境,然后选择您的Tomcat服务器版本,我的是Tomcat 7。提供Apache Tomcat目录位置和JRE信息以添加运行时环境。现在进入Servers视图,并创建一个新的服务器,如下图所示,指向上面添加的运行时环境。注意:如果Servers选项卡不可见,您可以选择Window > Show View > Servers,以便在Eclipse窗口中可见。尝试停止和启动服务器,以确保它正常工作。如果您已经从终端启动了服务器,则必须先从终端停止它,然后再从Eclipse启动它,否则它不会完美工作。现在我们已经准备好了设置环境,以创建第一个servlet并在Tomcat服务器上运行它。选择File > New > Dynamic Web Project,并使用下图来提供运行时环境,即我们在上一步中添加的服务器,以及模块版本为3.0,以使用Servlet 3.0规范创建我们的servlet。您可以直接点击完成按钮来创建项目,或者您可以通过下一步按钮来检查其他选项。现在选择File > New > Servlet,并使用下图创建我们的第一个servlet。同样,我们可以点击完成,或者通过下一步按钮来检查其他选项。当我们点击完成按钮时,它会生成我们的servlet框架代码,因此我们不需要在servlet中键入所有不同的方法和导入内容,从而节省时间。现在我们将在doGet()方法中添加一些包含动态数据的HTML代码,该方法将用于处理HTTP GET请求。我们的第一个servlet如下所示。

package com.Olivia.first;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet实现类FirstServlet
 */
@WebServlet(description = "我的第一个Servlet", urlPatterns = { "/FirstServlet" , "/FirstServlet.do"}, initParams = {@WebInitParam(name="id",value="1"),@WebInitParam(name="name",value="scdev")})
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public static final String HTML_START="<html><body>";
	public static final String HTML_END="</body></html>";
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FirstServlet() {
        super();
        // TODO 自动生成的构造函数存根
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		Date date = new Date();
		out.println(HTML_START + "<h2>你好!</h2><br/><h3>日期="+date +"</h3>"+HTML_END);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO 自动生成的方法存根
	}

}

在Servlet 3之前,我们需要在网页应用部署描述符中提供URL模式信息,但Servlet 3.0使用了易于理解且错误几率较低的Java注解。现在从Servlet编辑器窗口中选择”运行” > “运行于服务器”选项,并使用下面的图像进行设置。点击完成后,浏览器将在Eclipse中打开,并且我们会得到以下的HTML页面。您可以进行刷新以检查日期是否是动态的并且不断变化,您也可以在Eclipse之外的其他浏览器中打开它。因此,Servlet用于生成HTML并将其作为响应发送。如果您查看doGet()方法的实现,实际上是在创建一个HTML文档并将其写入响应的PrintWriter对象中,并在需要的地方添加动态信息。这对于刚开始来说是不错的,但如果响应具有大量的动态数据,这样容易出错且难以阅读和维护。这是引入JSP的主要原因。JSP也是服务器端技术,它类似于HTML,具有额外的功能来添加动态内容。JSP对于呈现来说很好,因为它易于编写,就像HTML一样。这是我们的第一个JSP程序,与上述的Servlet执行相同的功能。

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>你好</title>
</head>
<body>
<h2>你好!</h2>
<br>
<h3>日期=<%= new Date() %>
</h3>
</body>
</html>

如果我们运行以上的JSP,我们会得到如下图像所示的输出结果。在Eclipse中,最终的项目层次结构看起来像下图一样。

下载FirstServlet项目

下载Servlet Hello World示例项目

在未来的教程中,我们将更详细地介绍Servlet和JSP,但在结束本篇教程之前,我们应该对Java Web应用的一些方面有很好的理解。

Web容器

Tomcat是一个Web容器,当客户端向Web服务器发送请求时,Web服务器会将请求传递给Web容器,Web容器负责找到正确的资源(servlet或JSP)来处理请求,然后使用资源生成的响应提供给Web服务器。接着,Web服务器将响应发送回客户端。当Web容器接收到针对servlet的请求时,容器会创建两个对象:HTTPServletRequest和HTTPServletResponse。然后,它基于URL找到正确的servlet,并为该请求创建一个线程。随后,容器调用servlet的service()方法,并根据HTTP请求方法(GET或POST)调用相应的doGet()或doPost()方法。Servlet方法生成动态页面内容,并将其写入响应中。一旦servlet线程完成处理,容器将响应转换为HTTP响应格式,并将其发送回客户端。Web容器执行的一些重要工作包括:

  • 通信支持 – 容器提供了Web服务器与servlet和JSP之间简便的通信方式。由于有了容器,我们不需要构建服务器套接字来监听来自Web服务器的请求,解析请求并生成响应。所有这些重要且复杂的任务都由容器完成,我们只需专注于应用程序的业务逻辑。
  • 生命周期和资源管理 – 容器负责管理servlet的生命周期。容器负责将servlet加载到内存中,初始化servlet,调用servlet方法以及销毁它们。容器还提供诸如JNDI之类的实用工具,用于资源池和管理。
  • 多线程支持 – 容器为每个对servlet的请求创建一个新线程,当请求处理完成后线程结束。因此,servlet不会为每个请求都进行初始化,从而节省了时间和内存。
  • JSP支持 – JSP看起来不像普通的Java类,Web容器提供了对JSP的支持。应用程序中的每个JSP都被容器编译并转换为Servlet,然后容器像管理其他servlet一样管理它们。
  • 其他任务 – Web容器管理资源池,进行内存优化,运行垃圾收集器,提供安全配置,支持多个应用程序,热部署以及在后台执行其他多项任务,使我们的工作更加轻松。

网络应用目录结构

Java Web应用程序被打包为Web归档(WAR)并具有定义好的结构。您可以将上述动态Web项目导出为WAR文件,并将其解压以检查层次结构。它会类似于下方的图片。

部署描述符

web.xml文件是Web应用程序的部署描述符,其中包含了Servlet的映射(3.0版本之前),欢迎页面、安全配置和会话超时设置等。这就是关于Java Web应用程序初学者教程的全部内容,我们将在未来的文章中进一步探索Servlet和JSP。更新:本系列的下一篇教程是Java Servlets教程。

bannerAds