JSP内置对象——Request

一、原理
在这里插入图片描述 1. request和response对象是由服务器创建的。我们来使用它们 (我们不创建,仅仅使用,做IDEA的搬运工)
2. request对象是来获取请求消息,response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest – 接口
继承 |
HttpServletRequest – 接口
实现 |
rg.apache.catalina.connector.RequestFacade 类(tomcat)

二、方法及功能

方法名 作用
isUserInRole 判断认证后的用户是否属于某一成员组
getAttribute 获取指定属性的值,如该属性值不存在返回Null
getAttributeNames 获取所有属性名的集合
getCookies 获取所有Cookie对象
getCharacterEncoding 获取请求的字符编码方式
getContentLength 返回请求正文的长度,如不确定返回-1
getHeader 获取指定名字报头值
getHeaders 获取指定名字报头的所有值,一个枚举
getHeaderNames 获取所有报头的名字,一个枚举
getInputStream 返回请求输入流,获取请求中的数据
getMethod 获取客户端向服务器端传送数据的方法
getParameter 获取指定名字参数值
getParameterNames 获取所有参数的名字,一个枚举
getParameterValues 获取指定名字参数的所有值
getProtocol 获取客户端向服务器端传送数据的协议名称
getQueryString 获取以get方法向服务器传送的查询字符串
getRequestURI 获取发出请求字符串的客户端地址
getRemoteAddr 获取客户端的IP地址
getRemoteHost 获取客户端的名字
getSession 获取和请求相关的会话
getServerName 获取服务器的名字
getServerPath 获取客户端请求文件的路径
getServerPort 获取服务器的端口号
removeAttribute 删除请求中的一个属性
setAttribute 设置指定名字参数值

1.获取请求行数据

  • GET /Http_Demo_war_exploded/demo1?name=zhangsan HTTP/1.1
  • 方法:
    ①. 获取请求方式 :GET
    * String getMethod()
    ② 获取虚拟目录:/Http_Demo_war_exploded
    * String getContextPath()
    ③. 获取Servlet路径: /demo1
    * String getServletPath()
    ④. 获取get方式请求参数:name=zhangsan
    * String getQueryString()
    ⑤ (*)获取请求URI:/day14/demo1
    * String getRequestURI(): /Http_Demo_war_exploded/demo1
    * StringBuffer getRequestURL() :http://localhost/day14/demo1
    * URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
    * URI:统一资源标识符 : /day14/demo1 共和国
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");


   String method = req.getMethod();   //获取请求方式 :GET
   System.out.println(method);


   String contextPath = req.getContextPath();    //(*)获取虚拟目录:/Http_Demo:war exploded
   System.out.println(contextPath);


   String servletPath = req.getServletPath();    //获取Servlet路径: /demo1
   System.out.println(servletPath);


   String queryString = req.getQueryString();    //获取get方式请求参数:name=zhangsan
   System.out.println(queryString);


   String requestURI = req.getRequestURI();      //(*)获取请求URI:/Http_Demo_war_exploded/demo1
   System.out.println(requestURI);


   StringBuffer requestURL = req.getRequestURL(); //(*)获取请求URI:http://localhost/Http_Demo_war_exploded/demo1
   System.out.println(requestURL);


   String protocol = req.getProtocol();         //获取协议及版本:HTTP/1.1
   System.out.println(protocol);


   String remoteAddr = req.getRemoteAddr();      //获取客户机的IP地址:0:0:0:0:0:0:0:1
   System.out.println(remoteAddr);
}

2.获取请求头数据

  • 方法:
    * String getHeader(String name):通过请求头的名称获取请求头的值
    * Enumeration getHeaderNames():获取所有的请求头名称
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");
   Enumeration<String> headerNames = req.getHeaderNames();    //获取所有的请求头名称
   while(headerNames.hasMoreElements()){
      String name = headerNames.nextElement();
      String value = req.getHeader(name);
      System.out.println(name+"---"+value);
   }
}

运行结果:
在这里插入图片描述获取浏览器型号:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");
   String agent = req.getHeader("user-agent");
   if(agent.contains("Firefox")){
      System.out.println("火狐来了");
   }else if(agent.contains("Chrome")){
      System.out.println("谷歌来了");
   }
}

假设我做了一个电影网站,我花了300W打广告,某度,某浪,和某狐各100W,但是我想知道哪里来的访问量最多,这个时候我们就可以通过referer来统计各个网站来的访客数量。
而作为优酷,我为了防止被盗取资源,所以要判断你是从哪个网站来的?如果不是从优酷首页进来的,我就不给你播放。
在这里插入图片描述
防盗链方法:防止其他网站盗取资源

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");
   String referer = req.getHeader("referer");
   if(referer.contains("/demo4")){
      System.out.println("正常播放");
   }else{
      System.out.println("想看吗?来优酷啊");
   }
}

3.获取请求体数据

  • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
  • 步骤:
    ①. 获取流对象
    * BufferedReader getReader():获取字符输入流,只能操作字符数据(高效)
    * ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
    * 在文件上传知识点后讲解
    ②. 再从流对象中拿数据
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doPost.......");
   BufferedReader reader = req.getReader();   //1.获取字符流
   String line = null;
   while((line = reader.readLine()) != null){    //2.读取数据
      System.out.println(line);
   }
}

4.其他功能
①. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数

  • String getParameter(String name):根据参数名称获取参数值 username=zs&- password=123
  • String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
  • Enumeration getParameterNames():获取所有请求的参数名称
  • Map<String,String[]> getParameterMap():获取所有参数的map集合

②请求转发:一种在服务器内部的资源跳转方式
浏览器访问AServlet,A发现没有浏览器找的资源,但是知道B那里有,所以转发给B
在这里插入图片描述步骤:

  • 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  • 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

特点:

  • 浏览器地址栏路径不发生变化
  • 只能转发到当前服务器内部资源中。
  • 转发是一次请求
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      System.out.println("Demo8被访问了");

/*    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo9");
      requestDispatcher.forward(req,resp);*/

        //转发
      req.getRequestDispatcher("/demo9").forward(req,resp);

   }
}

③共享数据:A完成后需要告知B已经完成到哪了

扫描二维码关注公众号,回复: 9458312 查看本文章
  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
  • 方法:
  • void setAttribute(String name,Object obj):存储数据
  • Object getAttitude(String name):通过键获取值
  • void removeAttribute(String name):通过键移除键值对
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


      System.out.println("Demo8被访问了");


      //存储数据到request中
      req.setAttribute("msg","hello");

      req.getRequestDispatcher("/demo9").forward(req,resp);
   }
}
@WebServlet("/demo9")
public class http_demo9 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //设置流的字符编码
      System.out.println("Demo9被访问了");


      //获取demo8的传送数据
      Object msg = req.getAttribute("msg");
      System.out.println(msg);
   }
}
发布了14 篇原创文章 · 获赞 0 · 访问量 329

猜你喜欢

转载自blog.csdn.net/Dnesity/article/details/104543926