面向初学者的 Java Web 应用程序教程
Java Web 应用程序用于创建动态网站。Java 通过Servlet和JSP为 Web 应用程序提供支持。我们可以用静态 HTML 页面创建网站,但是当我们希望信息动态化时,我们需要 Web 应用程序。
Java Web 应用程序
本文的目的是提供 Web 应用程序中不同组件的基本细节,以及如何使用 Servlet 和 JSP 来创建我们的第一个 Java Web 应用程序。
- Web 服务器和客户端
- HTML 和 HTTP
- 理解 URL
- 为什么我们需要 Servlet 和 JSP?
- 第一个使用 Servlet 和 JSP 的 Web 应用程序
- Web 容器
- Web 应用程序目录结构
- 部署描述符
Web 服务器和客户端
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>
MIME 类型或内容类型:如果您看到上面的示例 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 是为知名服务保留的端口,例如,80 表示 HTTP、443 表示 HTTPS、21 表示 FTP 等。FirstServletProject /jsps/hello.jsp - 从服务器请求的资源。它可以是静态 html、pdf、JSP、servlets、PHP 等。
为什么我们需要 Servlet 和 JSP?
Web 服务器适合处理静态内容 HTML 页面,但它们不知道如何生成动态内容或如何将数据保存到数据库中,因此我们需要另一个可用于生成动态内容的工具。有几种用于动态内容的编程语言,如 PHP、Python、Ruby on Rails、Java Servlet 和 JSP。Java Servlet 和 JSP 是服务器端技术,通过提供对动态响应和数据持久性的支持来扩展 Web 服务器的功能。
Java Web 开发
第一个使用 Servlet 和 JSP 的 Web 应用程序
我们将使用“Eclipse IDE for Java EE Developers”来创建我们的第一个 servlet 应用程序。由于 servlet 是一种服务器端技术,我们需要一个支持 Servlet 技术的 Web 容器,因此我们将使用 Apache Tomcat 服务器。设置起来非常简单,我将这部分留给您自己。为了便于开发,我们可以使用 Eclipse 添加配置 Tomcat,它有助于轻松部署和运行应用程序。转到 Eclipse 首选项并选择服务器运行时环境,然后选择您的 tomcat 服务器的版本,我的是 Tomcat 7。提供 apache tomcat 目录位置和 JRE 信息以添加运行时环境。现在转到服务器视图并创建一个新服务器,如下图所示,指向上面添加的运行时环境。注意:如果服务器选项卡不可见,则可以选择窗口 > 显示视图 > 服务器,以便它在 Eclipse 窗口中可见。尝试停止并启动服务器以确保它正常工作。如果您已经从终端启动了服务器,那么您将必须从终端停止它,然后从 Eclipse 启动它,否则它将无法正常工作。现在我们已准备好创建第一个 servlet 并在 tomcat 服务器上运行它。选择文件 > 新建 > 动态 Web 项目并使用下图提供运行时作为我们在上一步中添加的服务器和模块版本 3.0 以使用 Servlet 3.0 规范创建我们的 servlet。您可以直接单击完成按钮来创建项目,也可以单击下一步按钮来检查其他选项。现在选择文件 > 新建 > Servlet 并使用下图创建我们的第一个 servlet。我们可以再次单击完成,也可以通过下一步按钮检查其他选项。当我们单击完成按钮时,它会生成我们的 Servlet 骨架代码,因此我们不需要在 servlet 中输入所有不同的方法和导入,从而节省我们的时间。现在我们将在doGet()方法中添加一些带有动态数据代码的 HTML,该方法将在 HTTP GET 请求中调用。我们的第一个 servlet 如下所示。
package com.journaldev.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 implementation class FirstServlet
*/
@WebServlet(description = "My First Servlet", urlPatterns = { "/FirstServlet" , "/FirstServlet.do"}, initParams = {@WebInitParam(name="id",value="1"),@WebInitParam(name="name",value="pankaj")})
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 Auto-generated constructor stub
}
/**
* @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>Hi There!</h2><br/><h3>Date="+date +"</h3>"+HTML_END);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
在 Servlet 3 之前,我们需要在 Web 应用程序部署描述符中提供 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>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=<%= new Date() %>
</h3>
</body>
</html>
如果我们在 JSP 上面运行,我们会得到如下图所示的输出。最终的项目层次结构在 Eclipse 中如下图所示。
下载 FirstServlet 项目
下载 Servlet Hello World 示例项目
我们将在以后的文章中更详细地研究 Servlet 和 JSP,但在结束这篇文章之前,我们应该对 Java Web 应用程序的一些方面有充分的了解。
Web 容器
Tomcat 是一个 Web 容器,当客户端向 Web 服务器发出请求时,它会将请求传递给 Web 容器,Web 容器的任务是找到正确的资源来处理请求(servlet 或 JSP),然后使用资源的响应生成响应并将其提供给 Web 服务器。然后,Web 服务器将响应发送回客户端。当 Web 容器收到请求时,如果是针对 servlet 的,则容器会创建两个对象 HTTPServletRequest 和 HTTPServletResponse。然后,它会根据 URL 找到正确的 servlet,并为请求创建一个线程。然后,它会调用 servlet service() 方法,并根据 HTTP 方法 service() 方法调用 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 容器管理资源池、进行内存优化、运行垃圾收集器、提供安全配置、支持多个应用程序、热部署以及幕后其他一些使我们的生活更轻松的任务。
Web 应用程序目录结构
Java Web 应用程序打包为 Web 存档 (WAR),具有定义的结构。您可以将上述动态 Web 项目导出为 WAR 文件,然后解压缩以检查层次结构。它将类似于下图。
部署描述符
web.xml文件是 Web 应用程序的部署描述符,包含 servlet(3.0 之前)、欢迎页面、安全配置、会话超时设置等的映射。这就是 Java Web 应用程序启动教程的全部内容,我们将在以后的文章中进一步探讨 Servlet 和 JSP。更新:本系列的下一个教程是Java Servlet 教程