Java网络应用程序初学者教程

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

Java Web应用程序

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

    1. 网页服务器和客户端

 

    1. HTML和HTTP

 

    1. 理解URL

 

    1. 为什么需要Servlet和JSP?

 

    1. 使用Servlet和JSP的第一个网页应用程序

 

    1. 网络容器

 

    1. 网页应用程序目录结构

 

    部署描述符

网页服务器和客户端

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

HTML和HTTP

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

  • HTTP Method – action to be performed, usually GET, POST, PUT etc.
  • URL – Page to access
  • Form Parameters – similar to arguments in a java method, for example user,password details from login page.

示例HTTP请求:

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

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

  • Status Code – an integer to indicate whether the request was success or not. Some of the well known status codes are 200 for success, 404 for Not Found and 403 for Access Forbidden.
  • Content Type – text, html, image, pdf etc. Also known as MIME type
  • Content – actual data that is rendered by client and shown to user.

示例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 Servlets和JSPs。Java Servlet和JSP是服务器端技术,通过提供对动态响应和数据持久化的支持来扩展网络服务器的功能。

Java 网页开发

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

我们将使用“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 implementation class FirstServlet
 */
@WebServlet(description = "My First 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 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之前,我们需要在网页应用部署描述符中提供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示例项目

在未来的帖子中,我们将更详细地介绍Servlets和JSPs,但在结束本篇帖子之前,我们应该对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容器执行的一些重要工作包括:

  • Communication Support – Container provides easy way of communication between web server and the servlets and JSPs. Because of the container, we don’t need to build a server socket to listen for any request from the webserver, parse the request and generate a response. All these important and complex tasks are done by container and all we need to focus is on our business logic for our applications.
  • Lifecycle and Resource Management – Container takes care of managing the life cycle of servlet. The container takes care of loading the servlets into memory, initializing servlets, invoking servlet methods and destroying them. The container also provides utility like JNDI for resource pooling and management.
  • Multithreading Support – Container creates a new thread for every request to the servlet and when it’s processed the thread dies. So servlets are not initialized for each request and save time and memory.
  • JSP Support – JSPs doesn’t look like normal java classes and web container provides support for JSP. Every JSP in the application is compiled by container and converted to Servlet and then container manages them like other servlets.
  • Miscellaneous Task – Web container manages the resource pool, does memory optimizations, run garbage collector, provides security configurations, support for multiple applications, hot deployment and several other tasks behind the scene that makes our life easier.

网络应用目录结构

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

部署描述符

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

广告
将在 10 秒后关闭
bannerAds