zoukankan      html  css  js  c++  java
  • Java学习之Request篇

    Java学习之Request篇

    0x00 前言

    在b/s架构里面,请求和响应是必不可少的。访问网页时,会发出一个request请求,服务器接收到请求后,根据设定代码,给我们响应对应的内容。

    0x01 Request和Response概念

    Request和Response:

    request对象和response对象的原理
    1. request和response对象是由服务器创建的。我们来使用它们

    1. request对象是来获取请求消息,response对象是来设置响应消息

    request继承体系:

    
     ServletRequest      --接口
                  丨继承
           HttpServlet      --接口
                  丨实现
           org.apache.catalina.connector.RequestFacade 类(tomcat)
    

    0x02 Request请求

    常用方法:

    String getMethod()              获取请求方式
    String getContextPath()         获取虚拟路径
    String getServletPath()         获取Servlet路径
    String getQueryString()         获取get请求方式参数
    String getRequestURI()          获取请求uri
    StringBuffer getRequestURL()    获取URL
    String getProtocol()            获取协议版本
    String getRemoteAddr()          获取客户端ip
    String getHeader(String name)   通过请求头的名称获取请求头的值
    Enumeration<String> getHeaderNames(): 获取所有的请求头名称
    
    

    代码:

    package it.Test.servlet;
    
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebServlet(urlPatterns = "/demo")
    public class servelet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String header = req.getHeader("user-agent");//获取ua
            System.out.println(header);
            String method = req.getMethod();//获取请求方式
            System.out.println(method);
            String contextPath = req.getContextPath();  //获取虚拟路径
            System.out.println(contextPath);
            String servletPath = req.getServletPath(); //获取servlet路径
            System.out.println(servletPath);
            String queryString = req.getQueryString();//获取get请求参数
            System.out.println(queryString);
            String requestURI = req.getRequestURI();//获取uri路径
            System.out.println(requestURI);
            StringBuffer requestURL = req.getRequestURL();//获取完整url路径
            System.out.println(requestURL);
    
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post请求");
        }
    }
    

    获取post请求数据:

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

    为了演示post请求,这里写一段html代码提交post数据。

    读取post请求代码:

    
    
    
    
     BufferedReader reader = req.getReader();
            String line = null;
            while ((line = reader.readLine())!=null){
                System.out.println(line);
    
    
    

    通用方式:

    
    String getParameter(String name):根据参数名称获取参数值
    String[] getParameterValues(String name):根据参数名称获取参数值的数组
    Enumeration<String> getParameterNames():获取所有请求的参数名称
     Map<String,String[]> getParameterMap():获取所有参数的map集合
    

    代码实例:

    package it.Test.servlet;
    
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.Enumeration;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.util.Enumeration;
    import java.util.Map;
    import java.util.Set;
    
    @WebServlet(urlPatterns = "/demo")
    public class servelet extends HttpServlet {
        private Object Enumeration;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");  //设置编码
            //getParameter方法
            String username = req.getParameter("username");//获取提交的username的值
            System.out.println(username);
    
            //getParameterValues方法
            String[] usernames = req.getParameterValues("username");//根据参数获取参数值爆出为数值
            for (String s : usernames) {
                System.out.println(s);
            }
    
            //getHeaderNames()方法
            Enumeration<String> headerNames = req.getHeaderNames();//获取所有参数名
            while (headerNames.hasMoreElements()){
                String s = headerNames.nextElement();  //遍历参数名
                System.out.println(s);
                String value = req.getParameter(s); //使用getParameter遍历参数的值
                System.out.println(value);
    
    
            }
    
            //parameterMap方法
            Map<String, String[]> parameterMap = req.getParameterMap();
            Set<String> strings = parameterMap.keySet();  //获取所有键名
            for (String name : strings) {
                String[] strings1 = parameterMap.get(name);  //使用get方法,获取所有键的值
                System.out.println(name);
                for (String value : strings1) {
                    System.out.println(value);
                }
            }
    
    
    
        }
    
    
    
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           this.doGet(req,resp);
        }
    }
    
    
    

    tomcat8版本后,get请求方式乱码已解决,但是在post里面需要手工去设置。

    请求转发

    在一个servlet里面可能功能比较单一,我们可以定义2个servlet将该请求转发到另一个servlet里面去进行处理。

    常用方法:

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

    servlet1代码:

    @WebServlet("/demo12")
    public class ServletDemo extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getRequestDispatcher("/demo00").forward(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    

    servlet2代码:

    @WebServlet("/demo00")
    public class ServletDemo2 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo2被访问");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    

    该方法只能访问服务器内部资源,而且请求被转发时url不会进行跳转。

    共享数据

    域对象:一个有作用范围的对象,可以在范围内共享数据
    
    request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    

    方法:

    1. void setAttribute(String name,Object obj):存储数据
    2. Object getAttitude(String name):通过键获取值
    3. void removeAttribute(String name):通过键移除键值对
    

    servelet1代码:

    req.setAttribute("name","abc");  //存储数据到request域里面
            req.getRequestDispatcher("/demo00").forward(req,resp);
    

    在servelet1转发前先进行域数据的存储,然后再进行转发。

    servelet2代码:

      Object name = req.getAttribute("name");
            System.out.println(name);
    

    使用getAttribute方法获取request域共享数据。

    0x03 结尾

    request大致内容就这么多,主要还得多敲代码,不然容易忘。下篇文章更新Response内容。

  • 相关阅读:
    [LeetCode]Interleaving String关于遍历和动态规划
    [LeetCode]Power
    [LeetCode]Two Sum
    [LeetCode]wildcard matching通配符实现之贪心法
    [LeetCode]wildcard matching通配符实现之动态规划
    [LeetCode]wildcard matching通配符实现之递归
    回文分割
    iOS开发之应用内检测手机锁屏,解锁状态
    iOS 拨打电话
    iOS 中文转拼音
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13527094.html
Copyright © 2011-2022 走看看