Java学习之Request篇

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

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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内容。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119941.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue组件注册可以是以下哪种方式_自定义vue组件分三个步骤

    vue组件注册可以是以下哪种方式_自定义vue组件分三个步骤组件的组织通常一个应用会以一棵嵌套的组件树的形式来组织:例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用,这些组件必须先注册以便

    2022年7月29日
  • 矩阵低秩

    矩阵低秩低秩矩阵还记得我们怎么手工求矩阵的秩吗?为了求矩阵A的秩,我们是通过矩阵初等变换把A化为阶梯型矩阵,若该阶梯型矩阵有r个非零行,那A的秩rank(A)就等于r。从物理意义上讲,矩阵的秩度量的就是矩阵的行列之间的相关性。如果矩阵的各行或列是线性无关的,矩阵就是满秩的,也就是秩等于行数。回到上面线性方程组来说吧,因为线性方程组可以用矩阵描述嘛。秩就表示了有多少个有用的方程了。上面的方程组有3个方程…

    2022年5月29日
  • leetcode 题解 || Valid Parentheses 问题[通俗易懂]

    leetcode 题解 || Valid Parentheses 问题

    2022年2月6日
  • 非满秩矩阵也能求逆矩阵吗_广义逆矩阵的性质

    非满秩矩阵也能求逆矩阵吗_广义逆矩阵的性质今天遇到一个很奇怪的问题:一个方阵,逆矩阵存在,但不是满秩。问题来源  在实际应用的时候,发现返回值都是0,于是跟踪到这里,发现了这个问题:JtJ不是满秩,因此JtJN保持初始化的零值。matJtJN=zeros(N,N);matResult=zeros(N,1);if(N==rank(JtJ)){JtJN=inv(JtJ);}for…

    2022年10月25日
  • LNMP详解(九)——Nginx虚拟IP实战

    LNMP详解(九)——Nginx虚拟IP实战今天继续给大家介绍Linux运维的相关知识,本文主要内容是Nginx的虚拟IP实战。一、实战背景二、虚拟IP配置三、效果检验

    2022年10月10日
  • 解决hash冲突的几种方法_hashmap hash冲突

    解决hash冲突的几种方法_hashmap hash冲突哈希表定义散列表(Hashtable,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。实现关键点hash函数hash冲突解决首先来说hash函数,java中对象都已一个hashCode()方法,那为什么还

    2022年8月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号