HTTP Servlet基础

HTTP Basics

先了解下HTTP的基础。

Requests,Response,和Headers

HTTP是一种简单的、无状态的协议。一个客户端,比如浏览器,发起一个请求,web服务器会进行响应,然后一个传递就完成了。当一个客户端发起请求,它首先需要确认的是一个HTTP命令,称为method,这个命令告诉服务器,客户端需要的是什么类型的响应。这个请求的第一行指定了文档的地址(一个URL)和HTTP协议的版本呢。如:

GET /intro.html HTTP/1.0

这个请求使用了GET 方法请求了一个叫做intro.html的文档,使用了HTTP 1.0版本。
客户端还能够发送可选的头部信息告诉服务器关于请求的一些额外的信息,比如客户端运行的软件和哪种文本类型是它能解析的。比如:

User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)
Accept: image/gif, image/jpeg, text/*, */*

User-Agent说明客户端使用的软件,Accept指明了客户端能接受的文本类型。
在头部信息之后,客户端会发送一个空白行,表明头部section已经发送完了。
客户端发送完请求后,服务器会发送一个response,包括HTTP的版本、状态码以及状态码的描述。如:

HTTP/1.0 200 OK

状态行后面,服务器发送头部信息,告诉客户端服务器运行的软件和服务器的response的文本类型。如:

Date: Saturday, 23-May-00 03:25:12 GMT
Server: Tomcat Web Server/3.2
MIME-version: 1.0
Content-type: text/html
Content-length: 1029
Last-modified: Thursday, 7-May-00 12:15:35 GMT

GET和POST

以这种方式将额外的信息放在 URL 中可以使页面被书签或像其他任何邮件一样发送。由于获取请求理论上不需要发送大量信息, 有些服务器将 url 和查询字符串的长度限制为大约240个字符。
POST 方法使用不同的技术向服务器发送信息, 因为在某些情况下可能需要发送兆字节的信息。POST 请求将其所有数据 (不限长度) 直接通过套接字连接作为其 HTTP 请求正文的一部分。客户看不到 exchange。URL 一点也不会更改。因此, POST 请求不能被用作书签或通过电子邮件发送。这是设计是因为一些发送到服务器的信息, 如您的信用卡号码, 应该只发送一次。在发送敏感信息时, POST 还提供了一些额外的安全性, 因为记录所有 URL 访问的服务器访问日志不会记录提交的 POST 数据。

Servlet API

Servlet使用两个包的类和接口:javax.servlet和javax.servlet.http。
每个servlet必须实现javax.servlet.Servlet接口。大多数servlet实现这个接口,通过继承两个特殊的类中一个,javax.servlet.GenericServlet和javax.servlet.http.HttpServlet。一个与协议无关的servlet需要继承GenericServlet,一个HTTP的servlet需要继承HttpServlet,当然,HttpServlet是GenericServlet的子类,加入了一些HTTP特定的功能。
不像一般的Java程序,servlet像一个applet,它是没有main()方法的。servlet的某些方法是在服务器处理请求的过程中调用的。每次服务器分发一个请求给servlet,都会去调用servlet的service()方法。
service()方法接受两个参数,一个request对象和一个response对象。
相比之下,一个HTTP servlet经常不重写service()方法,而是重写doGet()来处理GET请求,doPost()处理POST请求。HttpServlet的service()方法处理这些设置并分配到所有doXXX()的方法,所以它不需要被重写。
service()方法分发GET和POST请求

生成页面

写一个Hello World

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

public class HelloWorld extends HttpServlet {

  public void doGet(HttpServletRequest req, HttpServletResponse res)
                               throws ServletException, IOException {

    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    out.println("<HTML>");
    out.println("<HEAD><TITLE>Hello World</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("<BIG>Hello World</BIG>");
    out.println("</BODY></HTML>");
  }
}

运行Hello World

开发servlet需要Servlet API文件和servlet容器。所有流行的 servlet 容器都提供了 servlet API 类文件, 因此可以通过一个下载满足这两个要求。
以Tomcat为例,我们需要将servlet源文件放在server_root/webapps/ROOT/WEB-INF/classes 路径下(server_root是容器安装目录)。
编译源文件,然后运行Tomcat容器。

Web Application

一个web application(web app)是许多servlet的集合,JSP、HTML、文档、图片等其他web资源通过这种方式被建立并能够移植到任何支持servlet的web服务器上。通过一定的web application标准和协议,这些文件被标准化地设置,能够在任何服务器上使用。
所有在server_root/webapps/root下面的文件属于一个单独的web application(就是root那个)。为了简化部署, 可以将这些文件打包到单个文件中, 并仅通过将文件放置到特定的目录中而部署到另一台服务器。这些打包文件的扩展名是.war,表示web application archive。WAR 文件实际上是 .jar 文件 (使用 jar 工具创建), 并以备用扩展名保存。使用 JAR 格式可使 WAR 文件以压缩形式存储, 并对其内容进行数字签名。选择.war文件扩展名而不是. jar,是为了让其他人和工具对它们进行区别对待。
Web Application内部的文件结构

此层次结构可以作为单独的文件保存在某个服务器目录下, 也可以被打包在一个 WAR 文件中。

WEB-INF目录

WEB-INF目录比较特殊。保存在里面的文件不是直接保存在客户端的。实际上,这个目录下保存的文件包括Java类和对web app的配置信息。
WEB-INF/classes目录下包含了web app的servlet和其他支撑类的class文件。WEB-INF/lib目录下包含了保存JAR文件形式的class文件。服务器类加载器会自动寻找WEB-INF/classes目录和WEB-INF/lib目录进行类的加载,不需要额外的步骤。
WEB-INF目录下的web.xml文件是deployment descriptor(配置描述符)。文件包含有关它所在的 web 应用程序的配置信息。它是一个DTD标准的XML文件。web.xml文件控制servlet的注册、URL映射、欢迎文件和MIME类型,以及其他高级特性,如页面安全等级限制和servlet在分布式环境中的表现。
web.xml的结构本身不是重点,重点在于该文件可以在与服务器无关的方式下来进行配置信息的确认,大大简化了实现过程,因此,不但servlet可移植,甚至可以在服务器之间传送网站的完整独立的部分。

配置描述符

下面是一个最简单的web.xml文件,应该放在server_root/webapps/ROOT/WEB-INFO/web.xml中。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
    <servlet>
        <servlet-name>
            hi
        </servlet-name>
        <servlet-class>
            HelloWorld
        </servlet-class>
    </servlet>
</web-app>

这里把HelloWorld servlet注册为hi(我们一般是把org.springframework.web.servlet.DispatcherServlet注册为某一个微服务的名字,如designsample)。注册之后,通过重启服务器,就可以通过URL http://server:8080/servlet/hi 来访问servlet。
当然,也可以建立一个特殊的URL模式来导入一个注册的servlet。

<web-app>
    <servlet>
        <servlet-name>
            hi
        </servlet-name>
        <servlet-class>
            HelloWorld
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>
            hi
        </servlet-name>
        <url-pattern>
            /hello.html
        </url-pattern>
    </servlet-mapping>
</web-app>

有四种匹配方式,完全匹配(如 /hello.html)、前缀匹配(如 /lilt/)、扩展名匹配(如 .jsp)、默认匹配(就是 /,等同于 /*)。
当多种映射匹配冲突时,完全匹配优先级最高,默认匹配最低。

发布了29 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u014730658/article/details/78384467
今日推荐