Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。其中HttpServletRequest封装HTTP请求消息,HttpServletResponse封装HTTP响应消息。需要注意的是,Web服务器运行过程中,每个Servlet都会只创建一个实例对象,不过每次请求都会调用Servlet实例的service(ServletRequest req, ServletResponse res)方法,这里HttpServletRequest是ServletRequest的子类,HttpServletResponse是ServletResponse的子类。

  HttpServletRequest和HttpServletResponse接口继承关系图如下所示:

1、HttpServletResponse

  HttpServletResponse接口继承自ServletResponse接口,由于HTTP响应消息分为状态行、响应消息体、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。虽然HttpServletResponse接口中的方法较多,但是我们常用的也就是那么几个,如果用到其他的方法了可以阅读响应的源码或者相关资料就行了。

发送状态码相关函数

方法 说明
public void setStatus(int sc) 设置响应消息状态码,Web服务器默认产生一个状态码为200的状态行
public void sendError(int sc) 发送表示错误信息的状态码,第二个方法还增加了一个用于提示说明的文本信息
public void sendError(int sc, String msg)

发送响应消息头相关函数

方法 说明
public void addHeader(String name, String value) 设置HTTP响应头字段,name指定字段名称,value指定字段值。addHeader可以增加同名的响应头字段,setHeader则会覆盖同名的头字段
public void setHeader(String name, String value)
public void setContentLength(int len)  设置响应消息的实体内容的大小,单位为字节,即设置Content-Length字段的值
public void setContentType(String type) 设置Servlet输出内容的MIME类型,即设置Content-Type字段的值 
public void setCharacterEncoding(String charset) 设置输出内容字符编码,即设置Content-Type字段的值,注意,该方法优先级比setContentType的高
public void sendRedirect(String location) Servlet请求重定向

发送响应消息体相关函数

方法 说明
public ServletOutputStream getOutputStream() 获取HttpServletResponse的字节输出流ServletOutputStram类型
public PrintWriter getWriter() 获取HttpServletResponse的字符输出流ServletWriter类型

中文输出乱码问题

  计算机中的数据都是以二进制形式存储的,因此,传输文本时,就会发生字符的字节之间的转换。字符与字节之间的转换时通过查码表完成的,字符转换为字节的过程称为编码,字节转换为字符的过程称为解码,如果编码和解码使用的码表不一样,则会出现乱码问题。

  注意:HttpServletResponse对象的字符输出流在编码时,默认采用的是ISO 8859-1编码,该编码方式不兼容中文,比如会将"中国"编码为"63 63"(在ISO 8959-1的码表中查不到的字符会显示63)。当浏览器对接收到的数据进行解码时,会默认采用GB2312,将"63"解码为"?",浏览器就将"中国"两个字符解码为"??"。

HttpServletResponse程序示例

package zzz;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置响应消息编码,注释后"中国"会显示"??"乱码
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); out.println("hello 中国");
} @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.doGet(request, response);
}
}

  有时会遇到定时跳转页面的问题,HTTP中Refresh头字段可以通知浏览器在指定的时间内自动刷新并跳转到其他页面,网页定时刷新并跳转到指定页面。

package zzz;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置响应消息编码
response.setContentType("text/html;charset=utf-8");
response.setHeader("Refresh", "2;url=http://www.baidu.com");
PrintWriter out = response.getWriter(); out.println("hello 中国,2秒后跳转到百度...");
} @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.doGet(request, response);
}
}

2、HttpServletRequest

  HttpServletRequest接口继承ServletRequest接口,专门用于封状HTTP请求消息。由于HTTP请求信息包括请求行、请求头和请求体三部分, 所以HttpServletRequest接口定义了获取请求行、请求头和请求体的相关方法。

获取请求行的相关方法

方法 说明
public String getMethod() 获取HTTP请求方式,POST、GET等
public String getRequestURI() 获取请求行中资源名称部分
public String getQueryString() 获取请求行中的参数部分
public String getProtocol() 获取请求行中协议名称和版本,如HTTP 1.1
public String getContextPath() 获取请求URL中属于Web应用程序的路径

  其实关于请求行的方法从方法名中就可以看出其作用,这里就不一一贴出来了。

获取请求消息头的相关方法

方法 说明
public String getHeader(String name) 获取指定字段的值,如果没有返回null,如果有多个返回第一个值
public Enumeration<String> getHeaders(String name) 返回一个指定字段的Enumeration集合对象
public Enumeration<String> getHeaderNames() 返回一个包含所有字段的Enumeration集合对象
public String getContentType() 获取Content-Type字段的值

打印请求消息头字段的所有值

package zzz;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置响应消息编码
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); Enumeration<String> names = request.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = request.getHeader(name);
out.println(name + ": " + value + "</br>");
}
} @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.doGet(request, response);
}
}

获取请求体的相关方法

方法 说明
public ServletInputStream getInputStream() 获取请求的ServletInputStream对象,如果实体内容为非文本,只能通过getInputStream方法获取请求体消息体
public BufferedReader getReader() 获取请求的BufferedReader对象,该对象会将实体内容字节数据转换为指定字符集编码的文本字符串

获取请求参数

方法 说明
public String getParameter(String name) 获取指定的参数值,没有该参数返回null
public Enumeration<String> getParameterNames() 返回一个包含所有参数名的Enumeration对象
public String[] getParameterValues(String name) HTTP请求中可能有多个相同的参数,获取同一个参数名对应的所有参数值

  获取请求参数实例见:http://www.cnblogs.com/xdp-gacl/p/3798347.html

 3、RequestDispatcher接口

  当一个Web资源受到客户端请求后,如果希望服务器通知另外一个资源如处理请求,除了使用功能sendRedirect()实现重定向外,还可以通过RequestDispatcher接口的实例对象来实现,在ServletRequest接口中定义了一个获取RequestDispatcher对象的方法--getRequestDispatcher(String path),它返回某个路径所指定资源的RequestDispatcher对象,参数path必须以"/"开头,用于表示当前Web应用的根目录,也就是path路径必须是在本Web程序中,否则会出现异常。

RequestDispatcher接口中方法

方法 功能
public void forward(ServletRequest request, ServletResponse response) 将一个Servlet传递给另外一个Web资源,将请求传递给其他资源进行响应
public void include(ServletRequest request, ServletResponse response) 用于将其他资源作为当前响应内容包含进来

4、参考资料

  1、javaweb学习总结(十)——HttpServletRequest对象(一)

  2、Java Web之Servlet技术

Java Web之请求和响应的更多相关文章

  1. java web中请求和响应中包含中文出现乱码解析

    说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码.而字符编码有多种不 ...

  2. 传统Web应用请求和响应特点【显示当前时间】

    (1)请求:浏览器以HTTP协议的方式提交请求到服务器 (2)响应:服务器以HTTP协议的方式响应内容到浏览器 注意:HTTP是WEB大众化非安全协议 HTTPS是WEB安全协议,是基于HTTP协议的 ...

  3. java web获取请求体内容

    Java Web中如何获取请求体内容呢? 我们知道请求方式分为两种:Get,Post. /*** * Compatible with GET and POST * * @param request * ...

  4. java web (sevlet)请求之get,post,forward,redirect

    [参考]web请求之get,post,forward,redirect 1,form表单:可以采用post或者get请求,客户端主动跳转,url地址会改变为提交后的地址 2,forward:forwa ...

  5. Web应用请求和响应 HTTP相关

    (1)请求:浏览器以HTTP协议的方式提交请求到服务器 (2)响应:服务器以HTTP协议的方式响应内容到浏览器 注意:HTTP是WEB大众化非安全协议 HTTPS是WEB安全协议,是基于HTTP协议的 ...

  6. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

  7. Java Web 修改请求参数

    方法一.继承 HttpServletRequestWrapper , 实现自定义 request 1.除了修改的参数,其他 Header 等参数不变, 等同于修改了请求参数 2.实质是另一个请求 /* ...

  8. 从零写Java Web框架——请求的处理DispatcherServlet

    大概思路 继承 HttpServlet,实现 DispatcherServlet,拦截所有请求: DispatchServlet 重写 init()方法,负责初始化框架: 重写 service()方法 ...

  9. 初学 Java Web 开发,请远离各种框架,从 Servlet 开发

    Web框架是开发者在使用某种语言编写Web应用服务端时关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处 理有关,形成一个基础,在开发别的应用项目的时候则可以从 ...

随机推荐

  1. C#利用SqlDataAdapte对DataTable进行批量数据操作

    C#利用SqlDataAdapte对DataTable进行批量数据操作,可以让我们大大简化操作数据的代码量,我们几乎不需要循环和不关心用户到底是新增还是修改,更不用编写新增和修改以及删除的SQL语句, ...

  2. Node.js Web 开发框架大全《中间件篇》

    这篇文章与大家分享优秀的 Node.js 中间件模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处 ...

  3. [deviceone开发]-do_Viewshower的动画效果示例

    一.简介 do_Viewshower组件也支持View之间的过场动画,支持大概12种,这个示例随机的切换12种动画中的一种,而且每次切换的动画时间不一样.直观的展示12种动画的效果.适合初学者. 二. ...

  4. 最近喜欢听的英文歌——Because Of You - Kelly Clarkson

    没了解过歌曲背景,总觉得像是一首女儿唱给母亲的歌= =也许是我的错觉 I will not make the same mistakes that you did 我不会重复你犯过的错误 I will ...

  5. .Net框架2.0和4.0版本对比

    .Net版本 2.0 SP2 4.0 操作系统 Windows 2000 SP4以上 Windows XP SP3以上 安装包大小 NetFx20SP2_x86.exe 23.8 MBNetFx20S ...

  6. C#联合Union的实现方式

    一.基础篇 C#不像C++,他本身是没有联合Union的,但是可以通过手动控制结构体每个元素的位置来实现,这需要结合使用StructLayoutAttribute.LayoutKind以及FieldO ...

  7. C/C++构建系统 CMake

    Cmake实践 Cmake Practice –Cjacker cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍 生品,最终形成体系,成为一个独立的开放源代码项目 ...

  8. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

  9. Ubuntu下使用Git和GitHub

    刚刚学习git和github,网上的知识太杂太乱.照着折腾了很长的时间,都没有搞出个结果,心里十分痒痒,最后终于在github上看到成果.本文适合刚刚接触github但是急于想看到效果的同学,当然gi ...

  10. Android自定义控件1

    概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了.自定义控件对于初学者总是感觉是一种复杂的技术.因为里面涉及到的知识点会 ...