【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
时间: 2024-12-08 12:05:17

【Head First Servlets and JSP】笔记6:什么是响应首部的相关文章

【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略

基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 EL隐式对象汇总 pageContext使用参考 EL表达式的基本规则 关于EL的一些细节 通过EL获得request参数 从request得到更多信息 获得Request Method? xxxxScope有意义吗? 通过EL调用函数 EL与数学运算 1.EL隐式对象汇总.如下所示: 更详细的内容可以参考 

【Head First Servlets and JSP】实践记录01:从有脚本到无脚本

试图章节式的阅读<Head First Servlets and JSP>总感觉不对劲,这本书前后的联系性很强,有点类似于“连续剧”,而不是通常的“知识清单”. 可以建立多态的bean引用吗 使用type,但没有class scope属性默认为“page” 从有脚本到无脚本 1.快速搭建一个测试环境:输入用户名,返回“Hello, 用户名” index.html <!DOCTYPE html> <html lang="en"> <head>

[ajax 学习笔记] ajax 的服务器响应

在上一篇[ajax 学习笔记] ajax初试中,简单了解了一下ajax. 我是参考AJAX详解.chm学习的,资源已上传.参考链接:Ajax 专题 今天又学习了ajax中关于服务器响应的一些知识. ajax中服务器的响应是通过响应函数将服务器返回的数据呈现到页面的.服务器的响应体现在服务器响应回调函数中. 在上一篇的例子中,响应函数为: function updatePage(){ if(xmlHttp.readyState == 4){ //http就绪状态 if(xmlHttp.status

【Head First Servlets and JSP】笔记16:JSP隐式对象(内置对象)

接笔记15. 1.不管是JSP中的<%%>还是<%\=%>最终都将处于servlet的方法体中,那么有没有一种元素可以声明成类的成员呢? ——答案是有,而且非常非常简单,这个元素就是<%!%>,我们用它来解决笔记15中的问题,只需要在原基础上加一个感叹号就可以了. <%@ page import="Sample.Counter" %> <%@ page contentType="text/html;charset=UTF-

【Head First Servlets and JSP】笔记 26: web 应用部署

[须知] 物理目录结构与虚拟目录结构的差异 WAR 实际上就是 JAR 什么东西应该放在 WEB-INF 文件夹下? [了解] <mime-mapping> 相关 <env-entry> 相关 [传统 web.xml 参考] <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

【Head First Servlets and JSP】笔记21:EL以及&lt;jsp:useBean ....&gt;的补充

1.EL的英文是Expression Language,译成中文就是“表达式语言”.这是一种给前端程序员使用的脚本语言,EL与Java表达式相比并没有什么“天壤之别”,在后端程序员看来多少有点“多此一举”. 2.然而,我们不能强求每一个前端程序员都去学习JAVA,EL相对于JAVA来说学习成本更低,更容易理解. 3.在以前写的代码上实践测试一下,首先把Scriptlet给禁了,(El也是可以禁的) <?xml version="1.0" encoding="UTF-8&

【Head First Servlets and JSP】笔记13:session &amp; cookie

session的接口 杀死会话 cookie的性质 cookie的接口 再总结——cookie.session的前世今生 简单的定制cookie示例 1.session的接口,配合一些代码来理解. 2.杀死会话——杀死的含义是使session无效化(在JVM中清除??). 立刻杀死,已知方式有两种, 在DD中设定“默认期限” 在代码中对具体session设定“期限” 3.cookie的特性 4.cookie的接口 从客户请求得到cookie——稍微现代点的方法是这样的: Cookie[] coo

Head First Servlets and JSP】笔记9:属性的作用域、线程安全

什么是属性? 属性和参数 属性的3个作用域 属性API 属性不好的一面 1.到底什么是属性(Attribute)? 属性就是一个对象,可以被设置(bound,也可以叫绑定)到另外三个servlet API对象ServletContext.HttpSession.HttpServletRequest中.可以把它简单地认为是一个名/值对,名是String.值是object.在实际中,我们并不知道也不关心它具体如何实现,我们关心的只是属性所在的作用域. 2.属性不是参数(Parameter)! 笔记1

【Head First Servlets and JSP】笔记7:如何创建一个全局的dog?

重定向与请求分派 “局部”参数——ServletConfig——servlet初始化参数 “全局”参数——ServletContext——上下文初始化参数 Web app的“构造器”——ServletContextListener 实战:如何创建一个全局的dog? 1.重定向与请求分派. resp.sendRedirect("http://www.cnblogs.com/xkxf/"); RequestDispatcher view = req.getRequestDispatcher

【Head First Servlets and JSP】笔记5

[HttpServletResponse resp] 1.一般可以用通过resp获得一个输出流(writer),然后通过输出流将HTML写入响应.例如: resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("Beer Selection Advice<br>"); 2.常用的一些方法. 3.有时还会用到..... 4.当然,更通常的是用JSP返