码迷,mamicode.com
首页 > Web开发 > 详细

【Head First Servlets and JSP】笔记6:什么是响应首部

时间:2017-06-01 23:38:17      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:.com   html5+   extends   extend   web.xml   用户   form   html5   mit   

搭建简单的测试环境

什么是响应首部

最简单的响应首部——Content-Type

设置响应首部

请求重定向与响应首部

在浏览器中查看Response Headers

 

1、先快速搭建一个简单的测试环境,以后的内容都将基于下面的这些代码,tomcat webapps:html5+web.xml+servlet

<!DOCTYPE html>
<html>
    <body>

        <form action="MyTest.do" method="get">
            Username:<br>
            <input type="text" name="username" value="">
            <br>
            Password:<br>
            <input type="text" name="passwd" value="">
            <br><br>
            <input type="submit" value="Submit">
        </form> 

        <p>this is simple test.</p>

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

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <servlet>
        <servlet-name>MyTest</servlet-name>
        <servlet-class>com.example.web.MyTest</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyTest</servlet-name>
        <url-pattern>/MyTest.do</url-pattern>
    </servlet-mapping>

</web-app>
package com.example.web;

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

public class MyTest extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.setContentType("text/html");

        PrintWriter out = resp.getWriter();
        out.println("Hello World<br />");
    }
}

 这个Servlet应该很好理解,就是点击submit后将跳出一个带有一行“Hello World”的页面。

 

2、什么是响应首部。

响应首部(Response Headers)属于HTTP首部中的一种。

首先,需要理解的是:响应首部并不包括用户想看到的信息、“多媒体”页面,也就是说,对于普通网民,不需要知道这些信息。

那么,响应首部是干嘛的呢?主要是用于协助客户端和服务器的通信,例如,服务器要在响应首部中告知客户端返回的内容是html,还是jar、zip,这样浏览器才能做出正确的响应:展示页面or提供下载。

 

3、最简单的响应首部——Content-Type

在响应首部中以Content-Type这个字段来表示报文主体的对象类型,可以做一个测试,如果修改servlet为:

package com.example.web;

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

public class MyTest extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.setContentType("text/html");
        resp.setHeader("Content-Type", "application/jar");
        // setHeader的效果:如果响应中已有同名的首部,则用这个值替换原来的值。否则,向响应首部添加一个新首部和值。

        PrintWriter out = resp.getWriter();
        out.println("Hello World<br />");
    }
}

修改之后,当我们在浏览器页面中点击submit的时候,得到的将不是一个Hello World的页面,而是直接下载MyTest.do这个文件,不过它的内容将是Hello World<br />。需要注意的是,如果你万一把Content-Type给打错了,那么setHeader并不会帮你指出错误,而是添加一个“错别字”首部!

 

4、可以设置响应首部,也可以增加响应首部。

继续修改servlet,把setHeader改为addHeader:

package com.example.web;

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

public class MyTest extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.setContentType("text/html");
        resp.addHeader("Content-Type", "application/jar");
        // addHeader的效果:向响应首部添加一个新首部和值,或者给现有的增加另一个值。

        PrintWriter out = resp.getWriter();
        out.println("Hello World<br />");
    }
}

很容易猜到运行结果:既提供下载又转到Hello World页面,然而这是错的,实际测试的结果是:只提供下载而不提供页面展示。

还有一个设置Header的方法为:setIntHeader,效果和setHeader类似,不过首部的值不再是String类型,而是int型。

其它设置Header的方法可以参看官方api,并不多。

 

5、把请求重定向到另外一个完全不同的URL,也就是把请求转发给另一个人来处理。可以使用形如下面的代码完成:

package com.example.web;

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

public class MyTest extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.sendRedirect("http://www.cnblogs.com/xkxf/");
    }
}

修改之后,当我们按下submit的时候,将会直接跳转至新的URL,(当然,在这里新跳转的URL并不处理请求)。

sendRedirect的用法不难理解,那么当resp.sendRedirect的时候,实质上发生了什么?

这个时候我们想,一定是改变了响应的首部,如果有一个方法可以直接查看HTTP报文就好了,那我们就可以确切的知道发生了什么。

 

6、那么如果查看Response Headers呢?

在谷歌浏览器下,按F12进入开发者页面,可以通过这个方法,来观察上面代码对响应首部(Response Headers)的实际影响。如下所示(点击可查看大图):

技术分享

 点开Network,可以观察到一个名为Loction的首部,内容正好是我们重定向的URL,那么如果把Servlet代码改为“resp.setHeader("Location", "http://www.cnblogs.com/xkxf/");”可以实现重定向吗?答案是不可以,不过再补充一句“resp.setStatus(302);”倒是可以实现这个效果。

 

7、最后,sendRedirect("另一个URL")到底意味着什么呢?书上的解释是:希望浏览器用“另一个URL”处理请求,它的真正用法是:

        if (worksForMe) {
            // some codes ...
        } else {
            resp.sendRedirect("Another URL");
        }

“另一个URL”也可使用相对URL,需要区分的是

  • sendRedirect("foo/hi.html");将重定向到相对于当前URL建立的完整URL
  • sendRedirect("/foo/hi.html");将重定向到相对于Web app根目录的完整URL

【Head First Servlets and JSP】笔记6:什么是响应首部

标签:.com   html5+   extends   extend   web.xml   用户   form   html5   mit   

原文地址:http://www.cnblogs.com/xkxf/p/6928509.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!