Servlet中的Request和Response的请求和响应概述

来源:互联网 发布:nginx 动态服务器 编辑:程序博客网 时间:2024/04/29 03:07

============================================================================================
1.请求和响应描述:
    request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求
    response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应


2、response的简介
2.1 HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象
2.2 常用api
      (1)响应行
 * 设置状态码:setStatus(int sc) ,setStatus(int sc,String message) 
      (2)响应头
(1)是key-value结构,一个key可以有一个value,一个key也可以有多个value
(2)方法
= setHeader(java.lang.String name, java.lang.String value) :设置响应头
== 两个参数:第一个参数是响应名称;第二个参数值
== 针对一个key和一个value情况
== setHeader("aa","11");
  setHeader("aa","22");
  结果:名称 aa ,值 22

= 针对特殊的类型,设置头的方法
= setIntHeader(java.lang.String name, int value) :针对int类型值的方法
= setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(1970 1 1至今的毫秒数)


= addHeader(java.lang.String name, java.lang.String value) :设置响应头
== 两个参数:第一个参数是响应名称;第二个参数值
== 针对一个key和多个value的情况
== addHeader("bb","55");
  addHeader("bb","66");
  结果:名称 bb ,值 55,66

= 针对特殊的类型,设置头的方法
= addIntHeader(java.lang.String name, int value) :针对int类型值的方法
= addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数


      (3)响应体
(1)向页面显示的内容
(2)方法
= getWriter():使用字符流向页面输出内容
= getOutputStream():使用字节流向页面输出内容


2.3 重定向
  (1)需求的描述:
在登录页面中,输入用户名和密码,判断输入的用户名和密码是否正确;
如果用户名和密码都正确,登录成功,向页面输出内容;
如果用户名或者密码有一个是错误的,重定向到登录页面。


  (2)实现的步骤:
第一步:创建登录页面login.html,写表单,在表单里面写两个输入项,一个输入用户名,一个输入密码,提交到一个servlet里面
第二步:创建servlet,在这个servlet里面首先获取到输入的用户名和密码,根据用户名和密码进行判断(用户名如果是
admin,密码如果是123456表示正确的)
如果用户名和密码都正确,登录成功,向页面输出内容;
response.getWriter().write("login success");
否则重定向到登录页面
//设置状态码
response.setStatus(302);
//使用头Location完成重定向
response.setHeader("Location", "/day12_1/login.html");
简写方式:
       response.sendRedirect("重定向的路径");
2.4 定时刷新
   1.需求分析:注册成功,等待5秒以后,跳转到登陆页面。
     实现步骤:
1.注册成功,跳转到RefreshServlet,在这里实现定时跳转到登陆页面
 setHeader("Refresh","5;url=/要跳转的地址");
   2.倒计时效果:
      (1)直接在html页面中实现操作
  在html中使用meta标签实现页面的定时跳转
  <meta http-equiv="Refresh" content="3;url=/day08-1/login.html">
(2)定时器实现:
 /每一秒向span标签里面写内容
 //bom里面widow对象里面 setInterval方法
var m = 5;
function loadTime() {
//得到span标签
var span1 = document.getElementById("spanid");
//向span里面写内容
span1.innerHTML = m;
m--;
}
setInterval("loadTime();",1000);
2.5 设置响应体:
  *1.响应体:response把响应体(数据)给浏览器,显示在网页上。


  *2.字节流向浏览器响应数据:
     response.getOutputStream().write("内容".getBytes());
     字节流输出中文出现了乱码
    原因: 字节数组的编码格式和浏览器的编码格式不一致导致的。
    比如:字节编码是utf-8,浏览器的编码是GBK.
    response.getOutputStream().write("中文".getBytes("utf-8"));
    解决方案:把浏览器的编码和字节编码保持一致。
    设置浏览器的编码:response.setHeader("Content-Type","text/html;charset=UTF-8");


  *3.字符流向浏览器响应数据
     response.getWriter().write("内容");
     字符流出现中文乱码
    *首先会把内容放到response缓冲区里面,
 response缓冲区默认的编码是 iso8859-1,这个编码不支持中文,一定会有乱码

* 解决方法:
* 1、设置response缓冲区的编码:response.setCharacterEncoding("utf-8");
* 2、设置浏览器的编码:response.setHeader("Content-Type","text/html;charset=UTF-8");
* response缓冲区的编码和浏览器的编码一致
2.6 细节问题:
    1.处理字符流中文乱码问题:
      response.setContentType("text/html;charset=utf-8");
      等同于 设置浏览器和缓冲区的编码一致。
    2.字符流和字节流是互斥的,不能同时使用。
      报异常:IllegalStateException: getWriter() has already been called for this response
    3.字符流不能直接向页码输出数字:
      原因:输出数字时,数字根据指定的码表找对应的字符
================================================================
3.Request
3.1 HttpServletRequest:它是一个接口,代表请求对象。
3.2 常用api:
  (1)请求行
*请求方式:getMethod() 
*请求地址:getRequestURL()  getRequestURI() 
*请求协议:getProtocol
URL 和 URI区别:
URL: uniform resource location 统一资源定位符(完整的web路径)。
URI: uniform resource identify 统一资源标识符(缺少了协议和ip地址、端口号)
  (2)请求头:
       *请求头信息:getHeader(java.lang.String name),根据名称得到请求头的值
= 头信息 User-Agent:获取当前请求的浏览器的类型
= String agent = request.getHeader("User-Agent");
  (3)获取客户机信息:
       *项目名称:  getContextPath()
*主机地址: getRemoteAddr, getRemoteHost, 

   (4) 获取表单数据
       * 1.一个参数对应一个值:
 String value =  request.getParameter(String name);
 参数:表单输入项name属性对应的值,
 比如: <input type="text" name="username" />
       String username =  request.getParameter("username");
* 2.一个参数对应多个值:
 String[] values = request.getParameterValues();
 参数:表单输入项name属性对应的值,
* 3.没有参数,获取所有值:
  Map<String,String[]> map = request.getParamterMap();
  map的key: 表单中name属性的值。
  map的value:表单用户输入的值。
* 4.获取所有表单中name属性的值:
   Enumeration names = getParameterNames();
3.3 request请求的中文乱码:
    1.post请求出现中文乱码:
      原因:post提交数据时,会把数据存放到request缓冲区,默认编码是iso-8859-1,不支持中文,所以乱码。
      解决方案:
       ****设置request缓冲区的编码支持中文的编码格式即可:
      request.setCharacterEncoding("utf-8");

  
    2.get请求出现中文乱码:
      解决方案:
      ****1.修改tomcat的conf目录下的server.xml配置文件:
<Connector connectionTimeout="20000"
          port="80" protocol="HTTP/1.1" 
          redirectPort="8443"
  URIEncoding="utf-8"
  />
     ****2.String的构造函数解决:
           代码如下:
   String username = request.getParameter("username");
   username = new String(username.getBytes("iso-8859-1"),"utf-8");
3.4 request作为域对象
   (1)域对象:在一定的范围内,可以存值和取值。
   (2)request作用范围:一次请求。
        = void setAttribute(java.lang.String name, java.lang.Object o)
        = Object getAttribute(java.lang.String name) 
    (3)request域对象范围是一次请求,经常和转发一起使用
= 代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);
    (4)演示request域对象的作用范围:
       步骤:1.创建servlet1,在servlet1里面存值
     2.创建servlet2,在servlet2里面获取servlet1里面存的值。

    (5)重定向和转发的区别:


       *** 重定向:
1.两次请求,两次响应
2.浏览器的地址栏发生了变化,
3.浏览器行为,重定向地址需要携带项目名称
*** 转发: 
1.一次请求,一次响应,
2.浏览器的地址栏没有变化

3.服务器行为,转发的地址不需要携带项目名称





原创粉丝点击