Java Web应用程序教程(初学者)

Java Web Application 用于创建动态网站。Java 通过 ServletsJSPs 提供对 web 应用程序的支持。我们可以使用静态 HTML 页面创建网站,但是当我们希望信息是动态的时候,就需要使用 web 应用程序。

Java Web Application

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

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

Web 服务器和客户端

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

HTML和HTTP

Web服务器和Web客户端是两个独立的软件,因此它们需要一些共同的通信语言。HTML是服务器和客户端之间的共同语言,代表HyperText Markup Language。Web服务器和客户端需要一种常见的通信协议,HTTP(HyperText Transfer Protocol)是服务器和客户端之间的通信协议。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是Universal Resource Locator的缩写,用于定位服务器和资源。Web上的每个资源都有其自己独特的地址。让我们通过一个例子看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、Servlets、PHP等。

为什么我们需要Servlet和JSP?

Web服务器适用于静态内容的HTML页面,但它们不知道如何生成动态内容或将数据保存到数据库中,因此我们需要另一个工具来生成动态内容。有几种用于动态内容的编程语言,如PHP、Python、Ruby on Rails、Java Servlets和JSPs。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信息以添加运行时环境。现在转到Servers视图,并创建一个新服务器,如下图所示,指向上面添加的运行时环境。 注意: 如果Servers选项卡不可见,您可以选择Window> Show View> Servers,以使其在Eclipse窗口中可见。尝试停止和启动服务器以确保它正常工作。如果您已经从终端启动了服务器,那么您将不得不在终端中停止它,然后从Eclipse中启动它,否则它将无法正常工作。现在,我们已经准备好创建第一个Servlet并在Tomcat服务器上运行了。选择File> New> Dynamic Web Project,并使用下图提供的运行时作为我们在上一步中添加的服务器,将模块版本设置为3.0以使用Servlet 3.0规范创建我们的Servlet。 您可以直接单击Finish按钮创建项目,或者您可以单击下一步按钮查看其他选项。现在选择File> New> 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="";
	public static final String HTML_END="";
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FirstServlet() {
        super();
        // 未完成:自动生成的构造函数存根
    }

	/**
	 * @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 + "

Hi There!


Date="+date +"

"+HTML_END); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 未完成:自动生成的方法存根 } }

在 Servlet 3 之前,我们需要在 Web 应用程序部署描述符中提供 URL 模式信息,但 Servlet 3.0 使用了 Java 注解,这样做更容易理解,出错的机会更少。现在从 Servlet 编辑器窗口中选择 Run > Run on Server 选项,并使用下面的图像选项。 单击完成后,浏览器将在 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方法调用doGet()或doPost()方法。Servlet方法生成动态页面并将其写入响应中。一旦servlet线程完成,容器将响应转换为HTTP响应并发送回客户端。Web容器执行的一些重要工作包括:

  • 通信支持 – 容器提供了在Web服务器和servlets、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 Servlets教程

Source:
https://www.digitalocean.com/community/tutorials/java-web-application-tutorial-for-beginners