微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,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,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,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,IOException {
        req.getRequestdispatcher("/demo00").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req,IOException {
        super.doPost(req,resp);
    }
}

servlet2代码

@WebServlet("/demo00")
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req,IOException {
        System.out.println("demo2被访问");
    }

    @Override
    protected void doPost(HttpServletRequest 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内容

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

相关推荐