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. hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations)

    关键字:hdfs fsck.block.locations 在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态.获取文件的block信息和位置信息等. fsck命令必须由HDFS ...

  2. 数据合并处理concat

    var data = [ {name: '海门', value: 9}, {name: '鄂尔多斯', value: 12}, {name: '招远', value: 12}, {name: '舟山' ...

  3. dp P1103 书本整理 洛谷

    题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发现,由于很多书的宽度不同,所 ...

  4. 看Linux 之父是如何定义 Linux?

    看Linux 之父是如何定义 Linux? LINUX是什么? LINUX是一个免费类unix内核,适用于386-AT计算机,附带完整源代码.主要让黑客.计算机科学学生使用,学习和享受.它大部分用C编 ...

  5. 将逗号分隔的字符串转换为Python中的列表

    给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符串转换为列表? mStr = ['192.168. ...

  6. SharePoint 2010 在同意匿名訪问的站点中隐藏登陆链接

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/37565787 SharePoint 2010 ...

  7. [国家集训队]happiness

    嘟嘟嘟 就这么建. --- #include<cstdio> #include<iostream> #include<cmath> #include<algo ...

  8. jquery懒加载插件 jquery_lazyload 下载

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code https://pan.baidu.com/s/1UbOeyL_AaSNN_KMA4M ...

  9. P2678 跳石头(二分+模拟)

    思路: 我觉得我现在有一个非常不好的习惯,那就是不爱画图.当我把这个题的检验函数用图来表示出来.感觉就非常好理解了. 直接说检验函数吧.就是非常简单的模拟,我现在换成角度来说:假设你最小能跳x(不能跳 ...

  10. java 在实例化异常的时候做的事情

    new Exception 这段代码,会调用父类ThrowAble的构建方法,在构造方法中会调用fillInstackTrace这个native方法. 会把当前线程异常发生的信息,上下文记录在栈调用指 ...