Java网络02 Servlet开胃酒

简介: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   在Tomcat初次尝试中,我们搭建了用于测试Servlet和JSP的基本环境。

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

Tomcat初次尝试中,我们搭建了用于测试Servlet和JSP的基本环境。我们现在要转向网络应用的具体开发。

 

厨师

Web服务器的基本工作方式是请求-处理-回复。请求和回复是在网络上,以HTTP协议为基础的通信(参考HTTP协议)。请求是客户点菜,回复像是服务员上菜,而处理则是在后厨中,厨师根据请求的菜单,准备菜品的过程。

厨师通常是服务器上的一个应用程序。这个应用程序可以提取请求中的信息,并根据这些信息准备回复。这样的应用程序可以是许多中语言写成的,比如C, C++, Perl, Ruby, Python, Ruby, PHP等等。由于不同语言的设计理念和编译器特征的不同,这些语言写成的应用程序也有不同的特点(各种各样的厨师)。比如C和C++语言会有比较高的运行效率,PHP的Web应用广泛,Ruby和Python开发方便等等。

(在语言之争中,Web服务器的“后厨”是一块兵家必争之地)

Servlet是Java语言提供的的“厨师”。在Java中,“一切皆对象”。Servlet是一类特殊的Java对象。Java语言利用Servlet对象,来实现对HTTP请求的处理。

 

样例

下面是一个简单的Servlet例子,源文件为TestPage.java:

package foo;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class TestPage extends HttpServlet {

    public void doGet(HttpServletRequest request,
                     HttpServletResponse response)
                throws IOException, ServletException
    {
        PrintWriter out = response.getWriter();
        out.println("<html><body>" +
           "<p>Hello World!</p>" + "</body></html>");
    }
}

这个Servlet的功能是回复字符串"<html><body><p>Hello World!</p></body></html>"。这一段字符串实际上是一个HTML文本。它将作为HTTP回复的主体部分,发回给客户端。

这里定义了一个TestPage类,该类继承HttpServlet抽象类(参考HttpServlet)。我们覆盖了doGet()方法。doGet()方法处理GET方法的HTTP请求。如果HTTP请求的方法为POST,则应该覆盖doPost()方法。每个Servlet都应该覆盖doGet()和doPost()之一。doGet()和doPost()方法接收两个参数request和response,分别为HttpServletRequest类型HttpServletResponse类型。这两个参数分别代表该次HTTP通信的请求和回复。

HttpServletRequest和HttpServletResponse为两个接口。在方法的内部,我们可以操作request和response对象。比如,通过response的getWriter方法,来获得Writer,从而写入HTML文本。这些写入的文本将作为HTTP回复的主体传递回客户端。再比如,我们可以使用request的getMethod()方法来获知HTTP请求的方法。可以参考下面的官方文档:

HttpServletRequest的更多方法

HttpServletResponse的更多方法

 

此外,PrintWriter类来自java.io包。参考Java IO

 

doGet()是真正的工作室。我们通过定义该方法(或者doPost())方法,来让厨师做特定的事情。Servlet编写的关键在于写出一个符合需求的doGet()方法或者doPost()方法。

 

doGet()与doPost()

正如第一行package语句所说明的(参考Java包),TestPage类被放入到foo包中。我们还import了其他的Java包。Servlet是基于Java的,所以它可以借助Java语言所提供的丰富的工具。

 

编译

使用下面命令编译TestPage.java

$javac -classpath /path-to-tomcat/lib/servlet-api.jar:classes:. TestPage.java

上面的path-to-tomcat是Tomcat的安装路径。我们需要包括servlet-api.jar,原因是,javax.servlet包属于J2EE,它并不属于JSE。

 

将编译生成的TestPage.class文件放入到下面的文件夹中。(如果文件夹不存在,需要自行创建):

/path-to-tomcat/webapps/test/WEB-INF/classes/foo

(在TesPage.java中,利用package语句,说明该类在foo包中。这里的路径符合之前的package定义。)

 

修改或者新建/path-to-tomcat/webapps/test/WEB-INFO/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

  <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>foo.TestPage</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping> 

</web-app>

这样的一个xml文件被称作部署描述(DD, Deployment Descriptor)。DD告诉Container如何运行Servlet和JSP。

上面的<servlet>标签是将该Servlet(foo.TestPage.class)命名为Test。

在<servlet-mapping>标签中,我们将Test这个Servlet对应于URL: /MyServlet。这说明,当有请求访问该URL时,则将请求传递给Test这个Servlet处理。

上面修改的主要目的,是说明Servlet与URL的对应关系

 

随后,可以访问localhost:8080/test/MyServlet,来查看访问页面。

 

过程

看一下Servlet完成一次请求处理的过程:

从客户端(Guest)向服务器发送HTTP请求,该HTTP请求传递给Servlet Container。该Container负责:

  • 分析HTTP请求的信息,并新建request对象,将HTTP请求中的信息放入request对象
  • 新建response对象
  • 根据web.xml,查找URL对应的Servlet对象。如果Servlet对象不存在,则新建相应Servlet对象。
  • 创建新的线程,用于处理本次请求。线程拥有指向request和response对象的引用。

 

线程将调用Servlet的doGet()或者doPost()方法。线程运行结束后,response对象将传回给Container。Container根据response对象中的信息,生成一个符合HTTP协议的回复,传回给客户端。

注意,即使是新建的Servlet对象,它也不会随着线程的结束而结束。Servlet将继续存在。下次相同的URL访问将不必新建Servlet。

 

总结

上面制作了一个简单的Servlet,主要用于说明制作Servlet的过程。Servlet的许多强大功能还有待以后展开。

每个Servlet就像是后厨的一个厨师。我们可以用不同的URL对应来选择不同的厨师。一个复杂的网站往往需要许多个不同功能的Servlet。

 

欢迎继续阅读“Java快速教程”系列文章

 

目录
相关文章
|
7天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
30 9
|
7天前
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
28 7
|
3月前
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
51 1
|
3月前
|
XML JSON 搜索推荐
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
64 0
|
7天前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
26 11
|
7天前
|
安全 Java API
深入探索Java网络编程中的HttpURLConnection:从基础到进阶
本文介绍了Java网络编程中HttpURLConnection的高级特性,包括灵活使用不同HTTP方法、处理重定向、管理Cookie、优化安全性以及处理大文件上传和下载。通过解答五个常见问题,帮助开发者提升网络编程的效率和安全性。
|
7天前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
35 9
|
7天前
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
26 5
|
11天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
13 1
|
1月前
|
安全 网络协议 Java
Java 网络编程详解
《Java网络编程详解》深入浅出地讲解了使用Java进行网络编程的技术和方法。从基础的网络协议介绍到核心的Socket编程,以及高级的NIO与多线程应用,帮助读者全面掌握Java网络编程技能,是Java开发者不可或缺的学习指南。