Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。
Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet,并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求。
(HTTP通信机制相关资料:)

HTTP请求格式
HTTP请求信息由三部分组成:请求方法/URL/协议版本、请求头(Request Header)、正文

请求方法、URI、协议 :

Request URL:http://localhost:8080/servlet/demo/hello.do 表示资源URL
Request Method:POST 表示请求的方法
HTTP/1.1 目前HTTP协议的版本
在Intenet应用中常用的请求方法是GET和POST,当然还有其他的一些方法例如HEAD、PUT
URL完整的指定了要访问的网络资源。
上述中GET方法和POST方法由很大的区别,笔者会找个时间做一个总结。

当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的。

Servlet 客户端 HTTP 请求头信息:

信息

描述

Accept

这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。值 image/png 或 image/jpeg 是最常见的两种可能值。

Accept-Charset

这个头信息指定浏览器可以用来显示信息的字符集。例如 ISO-8859-1。

Accept-Encoding

这个头信息指定浏览器知道如何处理的编码类型。值 gzip 或 compress 是最常见的两种可能值。

Accept-Language

这个头信息指定客户端的首选语言,在这种情况下,Servlet 会产生多种语言的结果。例如,en、en-us、ru 等。

Authorization

这个头信息用于客户端在访问受密码保护的网页时识别自己的身份。

Connection

这个头信息指示客户端是否可以处理持久 HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求来检索多个文件。值 Keep-Alive 意味着使用了持续连接。

Content-Length

这个头信息只适用于 POST 请求,并给出 POST 数据的大小(以字节为单位)。

Cookie

这个头信息把之前发送到浏览器的 cookies 返回到服务器。

Host

这个头信息指定原始的 URL 中的主机和端口。

If-Modified-Since

这个头信息表示只有当页面在指定的日期后已更改时,客户端想要的页面。如果没有新的结果可以使用,服务器会发送一个 304 代码,表示 Not Modified 头信息。

If-Unmodified-Since

这个头信息是 If-Modified-Since 的对立面,它指定只有当文档早于指定日期时,操作才会成功。

Referer

这个头信息指示所指向的 Web 页的 URL。例如,如果您在网页 1,点击一个链接到网页 2,当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。

User-Agent

这个头信息识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。

读取 HTTP 头部信息的方法:

方法

描述

Cookie[] getCookies()

返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。

Enumeration getAttributeNames()

返回一个枚举,包含提供给该请求可用的属性名称。

Enumeration getHeaderNames()

返回一个枚举,包含在该请求中包含的所有的头名。

Enumeration getParameterNames()

返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。

HttpSession getSession()

返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。

HttpSession getSession(boolean create)

返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。

Locale getLocale()

基于 Accept-Language 头,返回客户端接受内容的首选的区域设置。

Object getAttribute(String name)

以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。

ServletInputStream getInputStream()

使用 ServletInputStream,以二进制数据形式检索请求的主体。

String getAuthType()

返回用于保护 Servlet 的身份验证方案的名称,例如,”BASIC” 或 “SSL”,如果JSP没有受到保护则返回 null。

String getCharacterEncoding()

返回请求主体中使用的字符编码的名称。

String getContentType()

返回请求主体的 MIME 类型,如果不知道类型则返回 null。

String getContextPath()

返回指示请求上下文的请求 URI 部分。

String getHeader(String name)

以字符串形式返回指定的请求头的值。

String getMethod()

返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。

String getParameter(String name)

以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。

String getPathInfo()

当请求发出时,返回与客户端发送的 URL 相关的任何额外的路径信息。

String getProtocol()

返回请求协议的名称和版本。

String getQueryString()

返回包含在路径后的请求 URL 中的查询字符串。

String getRemoteAddr()

返回发送请求的客户端的互联网协议(IP)地址。

String getRemoteHost()

返回发送请求的客户端的完全限定名称。

String getRemoteUser()

如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回 null。

String getRequestURI()

从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。

String getRequestedSessionId()

返回由客户端指定的 session 会话 ID。

String getServletPath()

返回调用 JSP 的请求的 URL 的一部分。

String[] getParameterValues(String name)

返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。

boolean isSecure()

返回一个布尔值,指示请求是否使用安全通道,如 HTTPS。

int getContentLength()

以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。

int getIntHeader(String name)

返回指定的请求头的值为一个 int 值。

int getServerPort()

返回接收到这个请求的端口号。

HTTP Header 获取请求头信息Demo:
做一个简单的小改动,直接使用service方法进行小案例代码演示:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        //获得访问路径
        System.out.println(req.getContextPath());//项目名
        System.out.println(req.getServletPath());//网名
        System.out.println(req.getRequestURI());//绝对路径
        System.out.println(req.getRequestURL());//完整路径
        System.out.println(req.getCharacterEncoding());//字符编码
        System.out.println(req.getContentType());//内容类型
        //若此处不做出响应,则服务器也会自动向浏览器做出响应,只是响应的内容为空

    }

}

Servlet 获取正文信息(表单数据)
很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序。浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法。

GET 方法
GET 方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔,如下所示:

http://www.test.com/hello?key1=value1&key2=value2

GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。如果您要向服务器传递的是密码或其他的敏感信息,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
这些信息使用 QUERY_STRING 头传递,并可以通过 QUERY_STRING 环境变量访问,Servlet 使用 doGet() 方法处理这种类型的请求。

POST 方法
另一个向后台程序传递信息的比较可靠的方法是 POST 方法。POST 方法打包信息的方式与 GET 方法基本相同,但是 POST 方法不是把信息作为 URL 中 ? 字符后的文本字符串进行发送,而是把这些信息作为一个单独的消息。消息以标准输出的形式传到后台程序,您可以解析和使用这些标准输出。Servlet 使用 doPost() 方法处理这种类型的请求。
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:

getParameter():使用request.getParameter() 方法来获取表单参数的值。
getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
getParameterNames():想要得到当前请求中的所有参数的完整列表,则调用该方法。

方法实例
同样直接使用service方法进行小案例代码演示:
下面是处理 Web 浏览器输入的 /项目名称/Hello.do Servlet 程序。我们将使用 getParameter() 方法,可以很容易地访问传递的信息:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ServletDemo extends javax.servlet.http.HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用servlet");
        String name=req.getParameter("name");
        String age =req.getParameter("age");
        resp.setContentType("text/html");
        PrintWriter pw=resp.getWriter();
        pw.println("<html>\n" +
                "  <head>\n" +
                "    <title>"+"调用servlet"+"</title>\n" +
                "  </head>\n" +
                "  <body>\n" +
                "      <h1>\n"+
                "       Name:"+ name +
                "      </h1>\n" +
                "      <h1>\n"+
                "      Age:"+ age +
                "      </h1>\n" +
                "  </body>\n" +
                "</html>");
    }
}

使用URL传递参数数据:
现在在浏览器的地址栏中输入 http://localhost:8080/项目名称/Hello.do?name=top&age=25,并在触发上述命令之前确保已经启动 Tomcat 服务器。如果一切顺利,您会得到下面的结果:

Name:top
Age:25

使用 HTML 表单和提交按钮传递两个值。我们将使用相同的 Servlet demo来处理输入:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="Hello.do" method="post">
    Name:<input type="text" name="name"/><br/>
    Age:<input type="text" name="age"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

保存这个 HTML 到 hello.html 文件中,并把它放在 ../webapps/ROOT 目录下。当您访问 http://localhost:8080/项目名称/Hello.html 时,下面是上面表单的实际输出:

ServletRequest 增加 header servlet中http_HTTP

尝试输入名字和姓氏,然后点击”提交”按钮,在您本机上查看输出结果。基于所提供的输入,它会产生与上一个实例类似的结果。