搭建简单的测试环境

什么是响应首部

最简单的响应首部——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:什么是响应首部 & 快速搭建一个简单的测试环境的更多相关文章

  1. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  2. [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网:http://shiro.apache.org/ shi ...

  3. Electron入门笔记(一)-自己快速搭建一个app demo

    Electron学习-快速搭建app demo 作者: 狐狸家的鱼 Github: 八至 一.安装Node 1.从node官网下载 ,最好安装.msi后缀名的文件,新手可以查看安装教程进行安装. 2. ...

  4. PHP7 学习笔记(十一)使用phpstudy快速配置一个虚拟主机

    说明:为了windows本地开发php方便,这里推荐使用PHP集成环境phpstudy. 目的:使用域名访问项目(tinywan.test) 1.官网:http://www.phpstudy.net ...

  5. opengl学习笔记(五):组合变换,绘制一个简单的太阳系

    创建太阳系模型 描述的程序绘制一个简单的太阳系,其中有一颗行星和一颗太阳,用同一个函数绘制.需要使用glRotate*()函数让这颗行星绕太阳旋转,并且绕自身的轴旋转.还需要使用glTranslate ...

  6. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境(转)

    前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常 ...

  7. [转]Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    本文转自:http://www.blogjava.net/yongboy/archive/2013/12/12/407498.html 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 ...

  8. Python学习笔记之使用 python -m SimpleHTTPServer 快速搭建http服务

    0x00 概述 搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享.但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方.比如你想快速共享Linux系统的某 ...

  9. 【Head First Servlets and JSP】笔记21:从有脚本到无脚本

    可以建立多态的bean引用吗 使用type,但没有class scope属性默认为“page” 从有脚本到无脚本 1.快速搭建一个测试环境:输入用户名,返回“Hello, 用户名” index.htm ...

随机推荐

  1. 结构体成员管理AVClass AVOption之1AVClass

    AVOption用于描述结构体中的成员变量.它最主要的作用可以概括为两个字:“赋值”. 一个AVOption结构体包含了变量名称,简短的帮助,取值等信息. 所有和AVOption有关的数据都存储在AV ...

  2. SUSE10 SP4源码升级Python到2.6.6

    1.安装依赖包(CentOS可采用yum) zypper in gcc gcc-c++ openssl-devel-32bit openssl-devel readline-devel readlin ...

  3. VBA 字符串操作

    Trim(string) 去掉string左右两端空白 Ltrim(string) 去掉string左端空白 Rtrim(string) 去掉string右端空白 Len(string) 计算stri ...

  4. 电脑出现“损坏的图像”窗口提示dll没有被指定在Windows上运行如何解决

    电脑中出现了无法运行应用程序的情况,弹出一个“***.exe - 损坏的图像”的窗口,上面提示“***.dll没有被指定在Windows上运行……”,如果我们遇到这样的问题,应该要如何解决呢? 1.我 ...

  5. SEO前端需要注意的地方

    1 合理的title ,description ,keyswords 搜索引擎对这三项的权重逐渐减小,title 强调重点即可,重要的关键字不要超过两次,而且要靠前. 2 不同的tilte要有所不同, ...

  6. .net全局定时定期执行某些操作在Global.asax中具体实现

    全局定时定期执行某些操作看起来是多么自动化的一个问题不过在.net的Global.asax文件中稍微配置即可实现,详细配置如下,感兴趣的朋友可以参考下哈 <%@ Application Lang ...

  7. day17 内置函数

    一.内置函数接下来,我们就一起来看看python里的内置函数 分类图 1.作用域函数 基于字典的形式获取局部变量和全局变量 globals()——获取全局变量的字典 locals()——获取执行本方法 ...

  8. Linux命令之paste

    介绍 cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件.粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同. paste将按行将不同 ...

  9. python学习【第七篇】python文件操作

    一.文件操作过程 1. 打开文件,得到文件句柄并赋值给一个变量2. 通过句柄对文件进行操作3. 关闭文件 # 1.打开文件,得到文件句柄 f_handle = open('aa.txt', 'r', ...

  10. 《挑战程序设计竞赛》2.1 穷竭搜索 POJ2718 POJ3187 POJ3050 AOJ0525

    POJ2718 Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6509   Acce ...