JavaWeb中,HttpServletRequest与HttpServletResponse几乎是处理各种请求与操作必备的参数,与原始的ServletRequest/ServletResponse相比,它们符合HTTP协议,所以首先从http协议入手,回顾一些基本的内容,而后根据协议来总结常用的知识点。

  首先来介绍一下dos环境下简单的http发送报文,接收报文的方法。运行输入cmd,打开命令提示符输入telnet 127.0.0.1 8080,回车后会出现一个输入界面,但此时输入的字符都无法显示,按住‘Ctrl+]’,出现Microsoft Telnet> 再按回车,进入到该界面后,可以看到输入的字符可以显示。

----------------------------------------------------------------------------------------------->

  http协议基本内容:

  版本:1.0一次链接,一次请求;1.1一次链接,多次请求获得不同的资源。

----------------------------------------------------------------------------------------------->

  请求分为请求行,请求头和请求体,根据请求方法的不同,可分为七种,常用的为GET, POST请求。请求行位于整个报文的第一行,包括"请求方式 资源路径 协议",如:GET /demo/1.html?username=jack&password=1234  HTTP/1.1。请求内容会根据请求方式的不同而差异巨大,如果是GET请求,会以url拼接的形式放在请求行中资源路径的后面,用"?"与"&"组合分割,如:http://localhost:8080/demo/1.html?username=jack&password=1234 ;如果是POST请求,则会单独讲请求内容放入请求体中。由于url的长度有限制,所以GET请求追加的内容也有限制,一般为1024字节(1k),但POST的请求体大小没有限制。

  请求头的常用内容:

  Accept: text/html,image/* --支持数据类型
  Accept-Charset: ISO-8859-1 --字符集
  Accept-Encoding: gzip --支持压缩格式
  Accept-Language:zh-cn --语言环境
  Host: www.itheima.com:80 --访问主机
  If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存时间
  Referer: http://www.itcast.com/index.jsp --来自哪个页面、防盗链 – 如果没有通过超链接访问2.html返回null
  User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 用户数据
  Cookie --表示cookie技术
  Connection: close/Keep-Alive --链接状态
  Date: Tue, 11 Jul 2000 18:23:51 GMT --时间

  另外,MIME表示Multipurpose Internet Mail Extensions(多用途互联网邮件扩展),包括以下常见内容:

  格式:大类型/小类型;参数
    大类型:分7类,表示互联网所有资源。
    Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
    Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
    Application:用于传输应用程序数据或者二进制数据;
    Message:用于包装一个E-mail消息;
    Image:用于传输静态图片数据;
    Audio:用于传输音频或者音声数据;
    Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
  例如:
    text/css css文件
    text/html html文件
    text/javascript js文件
    image/* 所有图片
    image/jpeg jpg图片

----------------------------------------------------------------------------------------------->

  请求的响应也分为响应行,响应头以及响应体。格式为:"协议/版本 状态码 状态码对应描述信息"。

  状态码:

1xx: 服务器响应浏览器,数据正在发送中。一般使用很少。
2xx: 服务器响应浏览器已经正常结束。  常用:200 表示正常。
3xx: 服务器响应浏览器,请求还没有完成,需要浏览器进一步操作,来完成整个请求。
  常用状态码:
  302 (307):与响应头location 结合完成页面重新跳转。
  304:页面读取缓存
4xx: 服务器响应浏览器,浏览器操作有误。
  常见:404 页面找不到。(一般请求页面找不到表示用户URL写错)
5xx: 服务器响应浏览器,服务器异常

  响应头:

Location: http://www.it315.org/index.jsp --跳转方向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Language: zh-cn --语言环境
Content-Type: text/html; charset=GB2312 --数据类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间
Refresh: 1;url=http://www.it315.org --定时刷新
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1 --缓存
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
Connection: close/Keep-Alive --连接
Date: Tue, 11 Jul 2000 18:23:51 GMT --时间

----------------------------------------------------------------------------------------------->

  以上属于http的一些基本内容,在web服务中,两个最常用到的参数HttpServletRequest以及HttpServletResponse都需要在深刻理解该协议的基础上才能灵活运用。此处我们主要讨论请求转发的实现,理清重定向、页面跳转以及页面刷新的过程。

  重定向时,浏览器的请求到达服务器,服务器响应中有两个必备的元素,一个是状态码:302,一个是重定向的地址,浏览器收到报文后,根据这两个信息重新发送请求,到指定的Location;而页面刷新是指,服务器在发送报文时,头信息中包含了"refresh",使浏览器可以按照延时刷新本页面或者跳转到指定URL;请求转发,是浏览器请求服务器时,服务器内部跳转到新的URL获取到资源并在原来的页面展示给浏览器的过程,根据转发方法的不同分为请求转发与请求包含两种。

  两种重定向的方式:

/** *方式一:更接近服务器响应浏览器的过程 */ response.setStatus(302) response.setHeader("location","http://www.changjiang.com/TestServlet"); /** *方式二:更为简便 */ response.sendRedirect("http://www.changjiang.com/TestServlet");

  页面刷新所需要携带的报文内容,其实这个使用的场景也是蛮多的:

/** * 跳转 --两次都是200 (有可能第二个304 读取浏览器缓存) * 格式:秒 --> 指定秒数刷新当前页面 * 格式:秒;url="" --> 指定秒之后跳转到指定的url */ response.setHeader("refresh", "2"); response.setHeader("refresh", "0;url=1.html");

来看一些用到页面刷新的实例:

private void test1(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3"); String data = new Random().nextInt(100000)+""; response.getWriter().write(data); } private void test2(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3;url='/day06/index.jsp'"); response.setContentType("text/html;charset=GB2312"); response.getWriter().write("登录成功,将在3秒后跳转,如果没有,请点<a href='xxx'>超链接</a>"); }

  最后看下服务器内部进行的请求转发,首选要获得转发的RequestDispatcher,

当前servlet路径:  http://localhost:8080/day08/a/b/Demo01Servlet
另一个servlet路径:http://localhost:8080/day08/a/b/Demo02Servlet
ServletRequest (常用) request.getRequestDispatcher("Demo02Servlet") request.getRequestDispatcher("/a/b/Demo02Servlet") --注意:没有day08 , (扩展:对比重定向) ServletContext this.getServletContext().getRequestDispatcher("/a/b/Demo02Servlet ")

接着需要指定请求转发还是请求包含:

forward(ServletRequest request, ServletResponse response) 请求转发 A 转发 B,只输出B内容到浏览器。(如果A没有数据发送 response.isComitted = false,将清空缓存) 请求转发只输出最后一个servlet内容 如果 isCommitted = true ,在进行forward将抛异常。一般情况如果输出少量的数据,认为isCommitted=falseinclude(ServletRequest request, ServletResponse response) 请求包含 A 包含 B,先输出A内容到浏览器,在输出B的内容到浏览器。 请求包含,输出所有servlet 汇总后的内容。

在使用请求转发时,一个request涉及到了多个servlet的资源,属于跨域操作,需要特别注意各个资源内的编码一致性,所以一般servlet中需要加入以下两行代码,保证资源编码一致:

request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");

  最后总结一下请求转发的特点:

  • 请求路径没有改变,但可以涉及服务器端多个资源
  • 可以在一次请求中,共享request作用域的数据
  • 一次请求,使用请求转发,tomcat将创建两个request和一个response对象,两个request对象数据相同的(可以理解成对象被克隆了)

HTTP协议基础与web服务的重定向,跳转以及请求转发的更多相关文章

  1. J2EE基础之Web服务简介

    J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...

  2. 小白日记27:kali渗透测试之Web渗透-Http协议基础,WEB

    Http协议基础 Web技术发展[http://www.cnblogs.com/ProgrammerGE/articles/1824657.html] 静态WEB[网页] 动态WEB 属于一种应用程序 ...

  3. java基础76 web服务器之Tomcat服务器

    (注:本文是以“压缩版Tomcat”为例,展开描述的) 一.Tomcat服务器的介绍 1.服务器 1.1.服务器的种类 从物理上讲:服务器就是一台pc机器.至少8核/8G以上.内存至少用T来计算.宽带 ...

  4. linux web服务基础知识,dns

    #web服务基础知识c/s 客户端/服务器b/s 浏览器/服务器 nginx   >   web  server  服务端浏览器  >    web  client  客户端 #dns解析 ...

  5. 【转】简述什么是Web服务(Web Service)技术?

          Web Service 是在 Internet 上进行分布式计算的基本构造块,是组件对象技术在 Internet 中的延伸,是一种部署在Web 上的组件.它融合了以组件为基础的开发模式和 ...

  6. Web服务,XFire的一个例子

    Web服务优点 互操作性:实现不同系统间的相互调用(语言无关.平台无关) Web服务是什么 Web 服务是一类应用程序,是能够用编程的方法通过Web调用来实现某个功能的应用程序 Web服务的体系结构 ...

  7. web服务本质

    目录 django 框架引入: web框架本质 HTTP协议 多功能web服务 封装,分发处理 django 框架引入: web框架本质 web框架本质: 软件开发架构: c / s ; b/ s - ...

  8. WEB服务动静结合

    基本介绍 1)WEB服务仅能处理静态请求,如果处理动态请求则需要对应的动态资源服务软件,即:应用程序服务软件 2)常见的应用服务软件有:PHP.Java.Python等 3)问题:WEB服务如何与外部 ...

  9. Django基础一Web框架的本质

    我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求, ...

随机推荐

  1. Linux文件和目录的粘滞位(sticky bit)

    今天维护系统时发现一个非常诡异的问题:AAA用户和BBB用户同属AAA组,但用AAA用户创建的文件,权限设置为777后,还是不能用BBB用户删除.诡异! 几经周转,发现AAA用户创建文件位置的上层目录 ...

  2. nginx配置基于域名、端口、IP的虚拟主机

    1.基于域名的虚拟主机: 绝大多数企业对外提供服务的网站使用的都是基于域名的主机,通过不同的域名区分不同的虚拟主机. 首先我们进入安装nginxd的目录下:/application/nginx-1.6 ...

  3. 使用LogPhoneUtil工具类在Android手机保存APP运行日志

    最近公司的测试老是提出这样那样的bug,当然也怪自己代码写的烂,所以测试总是会把app搞崩溃,而他们那边崩溃的时候还没有日志打印,自己回来再重现有的时候还真不好复现出来,因此麻烦事就来了.为了方便查看 ...

  4. Python读取PE文件(exe/dll)中的时间戳

    代码原文地址: https://www.snip2code.com/Snippet/144008/Read-the-PE-Timestamp-from-a-Windows-Exe https://gi ...

  5. mybatis隐藏不用的sql

    在mybatis的xml中,选中了不用的sql语句,使用ctrl + shift + / 隐去,,结果是 <where> <if test="dto.startTime ! ...

  6. leetcode 5. Longest Palindromic Substring [java]

    public String longestPalindrome(String s) { String rs = ""; int res = 0; for(int i = 0; i& ...

  7. SpringMVC: web.xml中声明DispatcherServlet时一定要添加load-on-startup标签

    游历SpringMVC源码后发现,在web.xml中注册的ContextLoaderListener监听器只是初始化了一个根上下文,仅仅完成了组件扫描和与容器初始化相关的一些工作,并没有探测到具体每个 ...

  8. BugFree设置邮箱通知(这里以163邮箱为例)

    公司用bugfree在进行新建Bug指派抄送给同事的时候,总是有人不及时登录BugFree去查看指派给自己的,所以要加一个邮箱通知,这样可以及时通知到被指派的同事. 百度上很多用的是QQ邮箱来实现的, ...

  9. linux连接iscsi存储方法

    当前存储openfiler   IP为 192.168.221.99  端口为3260 安装.启动iscsi rpm包  并改为开机自动运行 探测存储服务器 iscsiadm -m discovery ...

  10. highchart 对于顶端刻度丢失问题

    title: { text: '', align: 'center' }, labels: { overflow: 'justify', formatter: function () { return ...