Web 服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest 和 HttpServletReponse 对象,response用于向客户端发送数据,request用于从客户端请求数据。

  1 HttpServletRequest

HttpServletRequest 继承自ServletRequest,客户端浏览器发出的请求被封装成一个HttpServletRequest 对象。对象包含的信息主要为:请求的地址,请求的参数,提交的数据,上传文件客户端IP地址等信息。

① 获取客户机信息方法

getRequestURL() :返回客户端发出请求时的完整URL

getRequestURI() :返回请求行中的资源名部分

getQueryString() :返回请求行中的参数部分

getRemoteAddr() :返回发出请求的客户机的IP地址

getRemoteHost() :返回发出请求的客户机的完整主机名

getRemotePort() :返回客户机所使用的网络端口号

getLocalAddr() :返回WEB服务器的IP地址

getLocalName() :返回WEB服务器的主机名

getMethod() :得到客户机请求方式

getServerPath() :获取请求的文件的路径

② 获取客户机请求头方法

getHeader(string name)
getHeaders(String name) 
getHeaderNames()
 
③ 获取客户机请求参数
getParameter(name): 获取请求中的参数,该参数是由name指定的
getParameterValues(String name): 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
getParameterNames(): 返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。
getCharacterEncoding() :返回请求的字符编码方式
getAttributeNames():返回当前请求的所有属性的名字集合赋值:setAttribute()
getAttribute(String name) :返回name指定的属性值
getsession():返回和客户端相关的session,如果没有给客户端分配session,则返回null
getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组
RequestDispatcher.forward(HttpServletRequest request, HttpServletResponse response):请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为
request.setCharacterEncoding("utf-8"):设置请求数据的编码格式
getReader(): 获取请求体的数据流
getInputStream() :获取请求的输入流中的数据

④ 案例1:html表单提交实例

  

 提交页面
out.println("<html></br>"); out.println("<head></br>");
out.println("<title></br>MyInfoForm</title></br>");
out.println("</head></br>"); out.println("<body></br>");
out.println("<form action=\"/RequestProject/RegisterVeri\" method=\"post\">");
out.println("用户名:<input type=\"text\" name=\"username\"/> <br/>");
out.println("密码: <input type=\"password\" name=\"password\"/> <br/>");
out.println("性别: <input type=\"radio\" name=\"sex\" value='男'/>男 <input type=\"radio\" name=\"sex\" value='女'/>女<br/>");
out.println("爱好: <input type=\"checkbox\" name=\"hobby\" value='体育'/>体育 <input type=\"checkbox\" name=\"hobby\" value='编程'/>编程<br/>"+
"<input type=\"checkbox\" name=\"hobby\" value='旅行'/>旅行<br/>"); out.println("所在城市:<select name='city'><option value='成都'>成都</opiton> <option value='北京'>北京</opiton> <option value='贵阳'>贵阳</opiton></select><br/>");
out.println("自我介绍:<br/>");
out.println("<textarea cols='20' rows='10' name='introd'> </textarea> <br/>");
out.println("提交照片:<input type='file' name='subPoto'> <br/>");
//什么时候使用hidden传输数据,1不希望用户看到的数据 2提交的数据不影响界面
out.println("Hidden:<input type='hidden' name='hidden1' value='abc'> <br/>");
out.println("<input type=\"submit\" value=\"提交\">");
out.println("</form>");
out.println("</body></br>"); out.println("</html></br>");
 获取数据页面
String user=request.getParameter("username");
String passw=request.getParameter("password");
String sex = request.getParameter("sex");
String[] hobby = request.getParameterValues("hobby");
String city=request.getParameter("city");
String introd = request.getParameter("introd");
String hidden = request.getParameter("hidden1"); out.println("用户名:"+user+"<br/>");
out.println("密码:"+passw+"<br/>");
out.println("性别:"+sex+"<br/>");
out.println("兴趣:");
for(String ho:hobby)
{
out.println(ho+" ");
}
out.println("<br/>");
out.println("城市:"+city+"<br/>");
out.println("自我介绍:"+introd+"<br/>");
out.println("hidden:"+hidden+"<br/>");

  ⑤ 案例2:请求转发

//将传递的数据放入到request域中
request.setAttribute("user", username); //request请求转向方法
request.getRequestDispatcher("/Servlet2").forward(request, response);
接受页面
String user =(String)request.getAttribute("user");
out.println(user+"<br/>");

  ⑥ sendRedirectforward区别

sendRedirect(请求重定向):一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源(任意的)。

forward(请求转发):一个web资源收到客户端请求后,通知服务器去访问同一个web应用下的web资源。

(1) sendRedirect转发,forward转向

(2) 发生的位置不同

sendRedirect 发生在浏览器

forward 发生在web服务器

(3) 用法不一样

request.getRequestDispatcher("/Servlet2").forward(request, response)

response.sendRedirect("/RequestProject/Servlet2");

(4) 跳转的范围不一样

sendRedirect 可以跳转到任何url

forward 只能跳转到当前web应用下的某个资源

  

  2 HttpServletResponse

HttpServletResponse 继承了ServletReponse 接口,并提供了与Http 协议有关的方法,这些方法主要功能是设置HTTP状态码和管理cookie。HttpServletResponse 对象代表服务器的响应 。这个对象中封装了向客户端发送数据,发送响应头,发送状态码的方法。

① 主要方法

  addHeader(String name,String value) :将指定的名字和值加入到响应的头信息中

  encodeURL(String url) :编码指定的URL

  sendError(int sc): 使用指定状态码发送一个错误到客户端

  setDateHeader(String name,long date): 将给出的名字和日期设置响应的头部

  setHeader(String name,String value) :将给出的名字和值设置响应的头部

  setStatus(int sc) :给当前响应设置状态码

HttpServletResponse.sendRedirect("/uri") :方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

response.setContentType("text/html;charset=utf-8"):设置response对象信息的中文编码格式

setContentType(String ContentType):设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。输出流的 HTTP MIME 类型。默认值为“text/html”。

MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

② 消息实体内容通过输出流对象进行设置有以下两个方法:

getWriter():字符的输出流对象,用于向客户机回送字符数据

getOutputStream() :字节输出流对象,返回的对象可以回送字符数据,也可以回送字节数据(二进制数据)

getOutputStream() 和 getWriter() 这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。要不会出现错误java.lang.IllegalStateException

getOutputStream() 和 getWriter() 区别

(1) PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。

(2) 使用ServletOutputStream 对象也能输出内容全为文本字符的网页文档,但是如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。

(3) 如果一个网页文档内容全部为字符文本,但是这些内容可以直接从一个字节输入流中读取出来,然后再原封不动地输出到客户端,那么就应该使用ServletOutputStream对象直接进行输出,而不要使用PrintWriter对象进行输出。

③ 案例:使用response 对象下载文件

  (1) 获取要下载的文件的绝对路径

  (2) 获取要下载的文件名

  (3) 设置content-disposition响应头控制浏览器以下载的形式打开文件

  (4) 获取要下载的文件输入流

  (5) 创建数据缓冲区

  (6) 通过response对象获取OutputStream流

  (7) 将FileInputStream流写入到buffer缓冲区

  (8) 使用OutputStream将缓冲区的数据输出到客户端浏览器

  

      //1 获取要下载文件的全路径
String path = this.getServletContext().getRealPath("images/2.png"); //2 获取文件名
String filename= path.substring(path.lastIndexOf("\\")+1);
//3 需要对文件名进行转码
String encodeFileName= URLEncoder.encode(filename, "UTF-8");
response.setHeader("content-disposition", "attachment;filename=" + encodeFileName); //4 创建文件输入流
FileInputStream fis = new FileInputStream(path);
//5 做一个缓冲字节数组
byte buff[] = new byte[1024];
//实际每次读取了多少个字节
int len=0;
//6 创建输出流对象
OutputStream os = response.getOutputStream();
while((len=fis.read(buff))>0)
{
os.write(buff,0,len);
} //关闭文件流
if(fis!=null)
{
fis.close();
} if(os!=null)
{
os.close();
}

4 HttpServletResponse 与 HttpServletRequest的更多相关文章

  1. Servlet之HttpServletResponse和HttpServletRequest

    HttpServletResponse 1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码 response.setHeader("content-type&quo ...

  2. HttpServletResponse和HttpServletRequest

    1.相关的接口   HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletReq ...

  3. Java Web之路(二)Servlet之HttpServletResponse和HttpServletRequest

    HttpServletResponse 1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码 response.setHeader("content-type&quo ...

  4. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)

    HttpServletRequest获取请求头信息  (1)获取客户机请求头 String getHeader(String name) Enumeration<String> getHe ...

  5. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)

    HttpServletResponse简介 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和re ...

  6. HttpServletResponse和HttpServletRequest详解.RP

    HttpServletResponse,HttpServletRequest详解 1.相关的接口   HttpServletRequest HttpServletRequest接口最常用的方法就是获得 ...

  7. HttpServletResponse和HttpServletRequest的简单实用

    1.HttpServletResponse web服务器接收到客户端的http请求,针对这个请求,分别创建一一个代表请求的HttpServletRequest 对象,代表响应的- -个HttpServ ...

  8. 14SpringMvc_在业务控制方法中写入HttpServletRequest,HttpServletResponse等传统web参数(这个知识点知道就好了,不推荐这么去做)

    这篇文章解决的问题是怎么在业务方法里面引入我们熟悉的HttpServletRequest和HttpServletRespon? 答案:这种引入传统的web参数的做法不推荐去做,因为这么做会实行高度耦合 ...

  9. HttpServletResponse工具类和HttpServletRequest工具类,前台参数接收方式和后台返回(JSON)数据格式

    RequestUtils.java 操作类 package cn.utils; import org.apache.commons.lang3.StringUtils; import org.slf4 ...

随机推荐

  1. 谱聚类算法(Spectral Clustering)

        谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的 ...

  2. Python打包—Pyinstaller

    2018-09-27 21:12:05   一 前言 在windows平台学习python的过程中,你肯定会遇到需要把.py脚本打包成.exe的情形,如此,至少有两方面的好处:第一,你的代码保密性更好 ...

  3. 【转】FFmpeg 基本用法

    FFmpeg FFmpeg 基本用法 本课要解决的问题 1.FFmpeg的转码流程是什么? 2.常见的视频格式包含哪些内容吗? 3.如何把这些内容从视频文件中抽取出来? 4.如何从一种格式转换为另一种 ...

  4. JS(1) JavaScript 用法

    HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 <head> 部分 ...

  5. pytorch学习-AUTOGRAD: AUTOMATIC DIFFERENTIATION自动微分

    参考:https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autog ...

  6. tomcat 启动慢问题

    主要原因: 生成随机数的时候卡住了,导致tomcat启动不了. 是否有足够的熵来用于产生随机数,可以通过如下命令来查看 [root@oldboy tools]# cat /proc/sys/kerne ...

  7. 20175329 2018-2019-3《Java程序设计》第五周学习总结

    学号 20175329 2018-2019-3<Java程序设计>第五周学习总结 教材学习内容总结 第六章 接口与实现 使用关键字interface来定义一个接口.接口定义和类的定义十分相 ...

  8. HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)

    以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位 一.对象的创建 1)类加载:虚拟机遇到一条new指令时,先检测这个指令的参数能否在常量池中定位到 ...

  9. linux内存源码分析 - 内存回收(lru链表)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的收缩,所以 ...

  10. day91-redis

    Redis数据库 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset ...