当前位置: 首页 > news >正文

Request对象和response对象

 一、概念

       request对象和response对象是通过Servlet容器(如Tomcat)自动创建并传递给Servlet的。

Servlet容器负责接收客户端的请求,并将请求信息封装到request对象中,然后将request对象传

递给相应的Servlet进行处理。类似地,Servlet容器会创建一个response对象,并将其传递给

Servlet,用于生成响应并发送给客户端。

     总的来说,request对象是来获取请求消息,response对象是来设置响应消息

二、Request

        在Servlet的service()方法被调用时,Servlet容器会创建一个包含请求信息的HttpServletRequest对象,并将其作为参数传递给Servlet的service()方法。类似地,Servlet容器还会创建一个HttpServletResponse对象,并将其作为参数传递给Servlet的service()方法。

1、Request功能

(1)获取请求行数据

        请求行的数据有:请求方式  请求url 请求协议/协议版本号

             ①获取请求方式:getMethod()

             ②获取虚拟目录:getContextPath()

             ③获取servlet路径:getServletPath()

             ④获取get方式请求参数:getQueryString()

             ⑤获取请求URI:统一资源定位符:getRequestURI()

                                        统一资源标识符:getRequestURL()

             ⑥获取协议及版本: getProtocol()

             ⑦获取客户机的IP地址:getRemoteAddr()

  代码示例:

@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1获取请求方式String method=request.getMethod();System.out.println(method);//2获取虚拟目录String contextPath = request.getContextPath();System.out.println(contextPath);//3获取servlet路径String servletPath = request.getServletPath();System.out.println(servletPath);//4获取请求参数String queryString = request.getQueryString();System.out.println(queryString);//5获取请求URIString requestURI = request.getRequestURI();System.out.println(requestURI);StringBuffer requestURL = request.getRequestURL();System.out.println(requestURL);//6获取请求协议及版本号String protocol = request.getProtocol();System.out.println(protocol);//7获取客户机的ip地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

(2)获取请求头数据

     方法:getHeader(String name):通过请求头的名称获取请求头的值

                 getHeaderNames():获取所有的请求头名称

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据//获取所以请求头数据Enumeration<String> headerNames = request.getHeaderNames();//遍历while(headerNames.hasMoreElements()){String s = headerNames.nextElement();//根据名称获取请求头的值String header = request.getHeader(s);System.out.println(s+"......"+header);}//演示获取请求头数据:user-AgentString header = request.getHeader("user-agent");//判断agent的浏览器版本System.out.println(header);}

(3)获取请求体数据

      只有post请求有请求体

步骤:①获取流对象
                     BufferedReader getReader():获取字符输入流,只能操作字符数据
                    ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

           ② 再从流对象中拿数据

@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求消息体--请求参数//1、获取字符流BufferedReader reader = request.getReader();//2、读取数据String line=null;while((line=reader.readLine())!=null){System.out.println(line);}System.out.println("-------------------------------------");}

 2、其他功能

(1)获取请求参数(不区分post和get方法)

       ①根据参数名称获取参数值:getParameter(String name)

       ②根据参数名称获取参数值数组:getParameterValues(String name)

       ③获取所有请求的参数名称:getParameterNames()

       ④获取所有参数的map集合:getParameterMap()

@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决中文乱码问题request.setCharacterEncoding("utf-8");//根据请求参数的名称获取请求参数值String username = request.getParameter("username");System.out.println(username);System.out.println("post");System.out.println();//根据参数名称获取请求参数数组String[] parameterValues = request.getParameterValues("hobby");for (String hobby:parameterValues) {System.out.println(hobby);}System.out.println();//根据所以请求参数名称Enumeration<String> parameterNames = request.getParameterNames();while(parameterNames.hasMoreElements()){String s = parameterNames.nextElement();System.out.print(s);String parameter = request.getParameter(s);System.out.println(parameter);}System.out.println();//获取所以参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();Set<String> strings = parameterMap.keySet();for(String name:strings){String[] strings1 = parameterMap.get(name);System.out.print(name);for(String value:strings1){System.out.println(value);}}}
}

(2)请求转发

          在服务器内部的资源跳转方式

       步骤:

            通过request对象获取请求转发器对象:getRequestDispatcher(String path)。

            使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 。

      特点:

          浏览器地址栏不发生改变

          只能转发到当前服务器内部资源中

          转发是一次请求

(3)共享数据

         域对象:一个有作用范围的对象,可以在范围内共享数据
         request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
         方法:
                ①setAttribute(String name,Object obj):存储数据
                ②getAttitude(String name):通过键获取值
                ③ void removeAttribute(String name):通过键移除键值对
          注意:这个放于forward方法的上面,不然响应太快会导致无法获取信息!

   代码示例

@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo5被访问了");request.setAttribute("ttt","hhhh");//转发到demo6request.getRequestDispatcher("/requestDemo6").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Object ttt = request.getAttribute("ttt");System.out.println(ttt);System.out.println("demo6被访问了");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

(4)获取ServletContext对象 :getServletContext()

三、Response

 response:设置响应消息

1、设置响应行方法

(1)设置响应行状态码方法:setStatus();

(2)设置响应头:setHeader(String name,String value)

(3)设置响应体:

              使用步骤:

                         ①获取输出流
                                  字符输出流:PrintWriter getWriter()

                                 字节输出流:ServletOutputStream getOutputStream()

                        ② 使用输出流,将数据输出到客户端浏览器

2、重定向: 一种资源跳转的方式

      (1)方法:sendRedirect()

     (2) 重定向的特点:redirect
            ① 地址栏发生变化
            ② 重定向可以访问其他站点(服务器)的资源
            ③ 重定向是两次请求。不能使用request对象来共享数据

@WebServlet( "/responseDemo1")
public class responseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo1");//设置状态码为302response.setStatus(302);/* //设置响应头locationresponse.setHeader("location","/servlet/responseDemo2");*///获取当前应用程序的上下文路径String contextPath = request.getContextPath();//简单的重定向方法response.sendRedirect(contextPath+"/responseDemo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}@WebServlet("/responseDemo2")
public class responseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}

(3)服务器输出字符数据到浏览器

         步骤:
                 获取字符输出流
                 输出数据

@WebServlet("/responseDemo3")
public class responseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*//获取流对象之前,设置流的默认编码:ISO-8859-1设置为:浏览器默认编码response.setCharacterEncoding("utf-8");//告诉浏览器服务器发送的消息体数据的编码,建议浏览器使用改编码解码response.setHeader("content-type","text/html;charset=utf-8");*/response.setContentType("text/html;charset=utf-8");//解决乱码问题//获取字符输出流PrintWriter writer = response.getWriter();//输出数据writer.write("牛牛牛");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}

(4)服务器输出字节数据到浏览器
          步骤:
                 获取字节输出流
                 输出数据

@WebServlet("/responseDemo4")
public class responseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取字节输出流ServletOutputStream outputStream = response.getOutputStream();//输出数据outputStream.write("你好".getBytes());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}

三、ServletContext对象

1、概念

       ServletContext 实例代表了整个 Web 应用程序的上下文环境,可以在整个应用程序中访问和共享,可以和服务器来通信。

2、获取

      方式一:

              通过request对象获取:request.getServletContext();

     方式二:

              通过HttpServlet获取:this.getServletContext();

3、功能

(1)获取MIME类

             MIME类型:在互联网通信过程中定义的一种文件数据类型
             格式: 大类型/小类型   text/html        image/jpeg

        获取方法:getMimeType(String file)  

   代码示例

@WebServlet("/ContextDemo1")
public class ContextDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取Context对象的方式// ServletContext servletContext = request.getServletContext();ServletContext servletContext1 = this.getServletContext();//定义文件名称String filename="a.jpg";//获取MIME类型String mimeType = servletContext1.getMimeType(filename);System.out.println(mimeType  );}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}

(2)域对象:共享数据

        ① setAttribute(String name,Object value)
        ② getAttribute(String name)
        ③removeAttribute(String name)

         ServletContext对象范围:所有用户所有请求的数据


@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext1 = this.getServletContext();servletContext1.setAttribute("n","hello");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext1 = this.getServletContext();Object n = servletContext1.getAttribute("n");System.out.println(n);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}

(3) 获取文件的真实(服务器)路径

         方法:String getRealPath(String path)

http://www.lryc.cn/news/145836.html

相关文章:

  • 设计模式之桥接模式
  • pom.xml配置文件失效,显示已忽略的pom.xml --- 解决方案
  • 文本编辑器Vim常用操作和技巧
  • 【算法系列篇】位运算
  • 机器学习的测试和验证(Machine Learning 研习之五)
  • RNN循环神经网络
  • 安防视频监控/视频集中存储/云存储平台EasyCVR无法播放HLS协议该如何解决?
  • Docker技术--Docker的安装
  • 客户案例|MemFire Cloud助推应急管理业务,打造百万级数据可视化大屏
  • 蒲公英路由器如何设置远程打印?
  • 国产自主可控C++工业软件可视化图形架构源码
  • 【linux命令讲解大全】022.网络管理工具和命令概述
  • 应急响应流程及思路
  • 网页自适应
  • 什么是Sui Kiosk,它可以做什么,如何赋能创作者?
  • 【MySQL】mysql connect
  • 基于 vue2 发布 npm包
  • 基于Axios完成前后端分离项目数据交互
  • 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比
  • C# 生成唯一ID
  • python怎么提取视频中的音频
  • 学习设计模式之建造者模式,但是宝可梦
  • 数学建模:变异系数法
  • paddle.load与pandas.read_pickle的速度对比(分别在有gpu 何无gpu 对比)
  • 探讨uniapp的路由与页面栈及参数传递问题
  • 字节一面:你能讲一下跨域吗
  • leetcode 563.二叉树的坡度
  • 【第1章 数据结构概述】
  • 【附安装包】MyEclipse2019安装教程
  • poi-tl设置图片(通过word模板替换关键字,然后转pdf文件并下载)