zoukankan      html  css  js  c++  java
  • HttpServletRequest

    HttpServletRequest

    我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

    service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest

    HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。

    request运行流程:

    因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请 求头和请求体

    通过request获得请求行

    ①获得客户端的请求方式:String getMethod()

    获得请求的资源:

      String getRequestURI()

      StringBuffer getRequestURL()

      String getContextPath() ---web应用的名称(很重要)

      String getQueryString() ---- get提交url地址后的参数字符串

      username=zhangsan&password=123

    注意:request可以获得客户机(客户端)的一些信息

      request.getRemoteAddr() --- 获得访问的客户端IP地址

    通过request获得请求头

      ①long getDateHeader(String name)

      ②String getHeader(String name)(很重要)

      ③Enumeration getHeaderNames()

      ④Enumeration getHeaders(String name)

      ⑤int getIntHeader(String name)

    举例:

    获取头部名称:

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取指定的头
        String header=request.getHeader("User-Agent");
        System.out.println(header);
        //获取所有头部名称
        Enumeration<String> headNames=request.getHeaderNames();
        while(headNames.hasMoreElements()){
            String headName=headNames.nextElement();
            String headerValue=request.getHeader(headName);
            System.out.println(headName+"...."+headerValue);
        }
    }

    referer头的作用:执行该此访问的的来源

    做防盗链

    演示:

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取refer的信息
        String refer=request.getHeader("referer");
        //对referer进行判断
        response.setContentType("text/html;charset=UTF-8");
        if(refer!=null&&refer.startsWith("http://localhost")){
        response.getWriter().write("站在痛苦之外规劝受苦的人,是件很容易的事。");
        }else{
            response.getWriter().write("盗链可耻");
        }
    }

    通过request获得请求体

    获得请求参数:

      ①String getParameter(String name)(很重要)

      ②String[] getParameterValues(String name)

      ③Enumeration getParameterNames()

      ④Map<String,String[]> getParameterMap()(很重要)

    注意:get请求方式的请求参数 上述的方法一样可以获得

      ①解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

          ②解决get提交的方式的乱码:

          parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

    演示:

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取单个值
        String username=request.getParameter("username");
        System.out.println(username);
        //获取指定元素的value值
        String[] hobbys=request.getParameterValues("hobby");
        for(String h:hobbys){
            System.out.println(h);
        }
        //获取所有参数,并封装到一个Map集合中
        request.setCharacterEncoding("UTF-8");
        Map<String,String[]> map=request.getParameterMap();
        for(Map.Entry<String,String[]> entry:map.entrySet()){
            System.out.println(entry.getKey());
            for(String str:entry.getValue()){
                System.out.println(str);
            }
            System.out.println("----------------");
        }
    }

    request是一个域对象

    request对象也是一个存储数据的区域对象,所以也具有如下方法:

      ①setAttribute(String name, Object o)

      ②getAttribute(String name)

      ③removeAttribute(String name)

    注意:request域的作用范围:一次请求中

    请求转发

    获得请求转发器----path是转发的地址

      RequestDispatcher getRequestDispatcher(String path)

    通过转发器对象转发

      requestDispathcer.forward(ServletRequest request, ServletResponse response)

    演示:

    servlet01
    public class servlet01 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setAttribute("name", "张三");
            request.getRequestDispatcher("/serlvet02").forward(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    serlvet02
    public class serlvet02 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            String name=(String)request.getAttribute("name");
            response.getWriter().write(name);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    ServletContext域与Request域的生命周期比较

    ServletContext:

    创建:服务器启动

    销毁:服务器关闭

    域的作用范围:整个web应用

    request:

    创建:访问时创建request

    销毁:响应结束request销毁

    域的作用范围:一次请求中

    转发与重定向的区别?

    1)重定向两次请求,转发一次请求

    2)重定向地址栏的地址变化,转发地址不变

    3)重新定向可以访问外部网站 转发只能访问内部资源

    4)转发的性能要优于重定向

  • 相关阅读:
    对文件的操作
    三级菜单优化
    三级菜单项目
    对字符串的操作(一些重要的方法)
    四、saltstack如何管理对象?
    三、saltstack证书管理
    二、saltstack基础配置
    一、saltstack简介和安装
    set集合
    异常处理语法
  • 原文地址:https://www.cnblogs.com/Ace-suiyuan008/p/9625724.html
Copyright © 2011-2022 走看看