zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记6:什么是响应首部 & 快速搭建一个简单的测试环境

    搭建简单的测试环境

    什么是响应首部

    最简单的响应首部——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
  • 相关阅读:
    Binary Tree Level Order Traversal II
    图和图的遍历算法
    Remove Duplicates from Sorted List
    Binary Tree Preorder Traversal
    Merge Sorted Array
    [POJ2774][codevs3160]Long Long Message
    [BZOJ2251][2010Beijing Wc]外星联络
    [BZOJ1692][Usaco2007 Dec]队列变换
    [BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式
    [BZOJ1131][POI2008]Sta
  • 原文地址:https://www.cnblogs.com/xkxf/p/6928509.html
Copyright © 2011-2022 走看看