servlet中请求和响应,转发和重定向

Java知识点总结:想看的可以从这里进入

3.7、请求和响应

在servlet API中有两个接口ServletRequest、ServletResponse,分别用来处理请求和响应。其子接口javax.servlet.http.HttpServletRequest用来处理HTTP请求、javax.servlet.http.HttpServletResponse用来处理HTTP响应。
在这里插入图片描述

  1. Servlet 容器接收到来自客户端的 HTTP 请求后,容器会针对该请求分别创建一个 HttpServletRequest 对象和 HttpServletReponse 对象。
  2. 容器将 HttpServletRequest 对象和 HttpServletReponse 对象以参数的形式传入 service() 方法内,并调用该方法。
  3. 在 service() 方法中 Servlet 通过 HttpServletRequest 对象获取客户端信息以及请求的相关信息。
  4. 对 HTTP 请求进行处理。
  5. 请求处理完成后,将响应信息封装到 HttpServletReponse 对象中。
  6. Servlet 容器将响应信息返回给客户端。
  7. 当 Servlet 容器将响应信息返回给客户端后,HttpServletRequest 对象和 HttpServletReponse 对象被销毁。
3.7.1、请求request

来源于javax.servlet.http.HttpServletRequest。代表客户端的请求,主要用来处理 HTTP 请求。

通过Http协议访问服务器时,HTTP请求中的所有信息被封装到HttpServletRequest中,通过其中的提供的一些方法,获取所请求的数据。

在这里插入图片描述

  1. 获取请求行信息:

    1、得到客户端请求方式(post、get..):getMethod()
    2、返回客户端发出请求时的完整URL(主机端口之后、参数之前的路径):getRequestURI()
    3、获取请求行中的参数部分(?之后的参数):String getQueryString()
    4、返回请求行中所使用的协议名和版本(如:HTTP/1.0):getProtocol()
    5、获取请求中有关程序的路径部分:String getContextPath() 
    6、返回servlet的映射路径或名称:getServletPath()
    7、返回客户端的IP地址:getRemoteAddr()
    8、返回客户端的完整主机名:getRemoteHost()
    9、返回客户端所使用的网络端口号:getRemotePort()
    10、获取Web服务器上接收当前请求网络连接的IP地址:getLocalAddr()
    11、返回客户端所使用的网络端口号:getRemotePor()
    12、返回WEB服务器的主机名:getLocalName()
    13、获取服务器的名字:getServerName()
    14、返回服务器端口号:int getServerPort()
    15、获取请求的协议名,例如http、https或ftp:Sring getScheme()
    16、获得完整的请求路径(不包括参数部分):StringBuffer getRequestURL()
    

在这里插入图片描述

在这里插入图片描述

  1. 获取请求头信息

    1、返回指定的信息头(没有返回null、多个返回第一个):getHeader(String name)
    2、返回所有的请求头名称集合:Enumeration getHeaderNames()
    3、返回自定名字的头信息集合:Enumeration getHeaders(String name)
    4、返回指定名称的request信息头的值:int getIntHeader(String name)
    5、获取Content-Type头字段的值:String getContentType()
    6、返回request主体所包含的字节数,若未知的返回-1:int getContentLength()
    7、返回request的字符编码集名称:String getCharacterEncoding()
    8、返回客户端所有的Cookie的数组:Cookie[]  getCookies()
    

在这里插入图片描述

在这里插入图片描述

  1. 获得请求中的参数,并将数据保存在request中

    获取请求中的参数
    1、根据name获得value值,name重复获得第一个name对应的value中:String getParameter(String name)
    2、可以获得name重复的所有value值:String[] getParameterValues(String name)
    3、获得所有的name值:Enumeration getParameterNames();
    4、将请求中的name值和value值装入Map对象中并返回map:Map getParameterMap()
    
    将参数保存到request中
    1、在request中保存数据:void setAttribute(String key,Object value)
    2、根据key获取request中保存的数据:request.getAttribute(key)
    3、获取所有的key:Enumeration getAttributeNames()  
    

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 获取其他的对象

    1、返回请求的输入流:ServletInputStream getInputStream()
    2、返回request对应的session对象,如果没有,则创建一个:HttpSession getSession()
    
3.7.2、响应response

来源于javax.servlet.http.HttpServletResponse。response对象用于把取得的数据返回到客户端,即响应。

由于 HTTP 响应消息由响应行、响应头、消息体三部分组成,所以 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应头、响应体的方法

  1. 设置状态码

    1、设置响应的状态码 :void setStatus(int sc)
    2、使用状态码和状态返回一个错误,并清空缓冲区:void sendError(int)
    3、使用状态码返回一个错误,并清空缓冲区:void sendError(int)
    
  2. 设置响应头

    1、设定ContentType响应头:setContentType(String)
    2、设定ContentLenght响应头:setContentLenght(String)
    3、添加指定名称的响应头和日期值:void addDateHeader(String, long)
    4、添加指定名称的响应头和值:void addHeader(String, String)
    5、添加指定名称的响应头和int值:void addIntHeader(String, int)
    6、查看指定的响应头是否存在:boolean containsHeader(String)
    7、使用指定名称和值设置响应头的名称和内容:void setHeader(String, String)
    8、使用指定名称和值设置响应头的名称和内容:void setDateHeader(String, long)
    9、设置编码:setContentType("text/html;charset=utf=8");
    
  3. 获取流,可以向客户端发送数据

    OutputStream流向客户端发送如图片、文件等内容: ServletOutputStream out = response.getOutputStream();
    PrintWriter流向客户端写入字符文本:PrintWriter out = response.getWriter();
    

在这里插入图片描述

在这里插入图片描述

  1. 重定向

    重定向:response.sendRedirect("/项目名/重定向的路径");
    

3.8、转发、重定向

3.8.1 转发

​ 一次请求一次响应
在这里插入图片描述

//转发
request.getRequestDispatcher("/需要转发到的路径").forward(request,response);
3.8.2 重定向

​ 两次请求两次响应

在这里插入图片描述

因为两者的request的对象不是同一个,所以重定向之间不能用request保存数据

//重定向
response.sendRedirect("/项目名/重定向的路径");

重定向和转发的区别:

1、重定向

浏览器地址栏发生改变
​ 重定向是浏览器的行为,通过响应对象HttpServletResponse来执行
​ 两次请求,两次响应
​ 不能访问WEB-INF目录下的资源
​ 不共享Request中数据
​ 可以访问工程外的资源

2、转发

浏览器地址栏不发生改变,不会变为目标地址,是从一个资源跳转到另一个资源。
​ 请求转发是服务器的行为,整个转发的过程在服务器中完成
​ 一次请求,一次响应
​ 共享Request中的数据
​ 可以转发到WEB-INF目录下
​ 不可以访问工程以外的资源

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值