Servlet中的request对象概述及相关API

Request和Response生成过程

回顾一下Servlet的调用过程,我们创建一个MyServlet类,并且定义了相关方法处理最初来自客户端浏览器的http请求,在方法中将"hello"写入response中,代码如下:

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("hello");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

最终我们打开浏览器,输入http://localhost:8080/demo/myServlet就可以在页面上看到可爱的hello。

在这里插入图片描述

事实上,当我们输入网址,到看到页面的hello,短短的时间内,浏览器,服务器以及Servlet三者之间的交互如下

在这里插入图片描述
这张图网上有,因为字体太小了,我就想把里面的字画大个一些,并结合这个例子分析一下。

我们之前分析过:服务器生成req和res对象,调用HttpServlet的service方法时,将会转化成HttpServletRequest和HttpServletResponse对象,处理数据之后,response对象返回给服务器,服务器将response对象作为响应返回给浏览器。


因此,request和response是啥,也就一目了然了,一个代表请求,一个代表响应,他们与HTTP协议都有着密不可分的协议。当然这两个对象也会有相关的方法,去设置响应的内容,或者获取请求的内容。

继承结构

ServletRequest:request顶级接口,定义了request应该具有的基本方法。

HttpServletRequest:继承于ServletRequest的接口,增加了关于http协议相关的API

常用方法

浏览器输入:http://localhost/demo/requestDemo1?username=summerday&gender=male

一、和客户端相关的信息

/**
 * @auther Summerday
 *
 * 请求客户端参数API
 */
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取客户端发出请求的完整URL:http://localhost/demo/requestDemo1
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("请求完整URL:"+requestURL.toString());

        //获取资源名URI :/demo/requestDemo1
        String requestURI = request.getRequestURI();
        System.out.println("请求资源URI:"+requestURI);

        //返回请求行中的参数部分:username=summerday&gender=male
        String queryString = request.getQueryString();
        System.out.println("请求参数:"+queryString);

        //返回发出请求的客户机IP地址:ipv6地址 0:0:0:0:0:0:0:1
        String remoteAddr = request.getRemoteAddr();
        System.out.println("客户机IP:"+remoteAddr);

        //获取客户端的请求方式:GET
        String method = request.getMethod();
        System.out.println("请求方式:"+method);

        //获取当前web应用虚拟目录的名称:/demo
        String contextPath = request.getContextPath();
        System.out.println("虚拟目录:"+contextPath);//画个重点!
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

二、获取请求头信息

/**
 * @auther Summerday
 *
 * 获取请求头信息
 */
@WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //getHeader(name) 根据传入的name获取对应的值
        String header = request.getHeader("Host");
        System.out.println("Host的值为:"+header);

        //getHerders(String name) 根据传入的name,获取所有的值
        Enumeration<String> hosts = request.getHeaders("Host");
        while (hosts.hasMoreElements()){
            String s = hosts.nextElement();
            System.out.println("host:"+s);
        }
        //getHeaderNames() --- Enumeration<String> 获取所有HeaderNames
        Enumeration<String> headerNames = request.getHeaderNames();

        while(headerNames.hasMoreElements()){
            String s = headerNames.nextElement();
            System.out.println("headerNames:"+s);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

三、获取请求参数

/**
 * @auther Summerday
 *
 * 获取请求参数
 */
@WebServlet("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置POST方式提交解码方式
        request.setCharacterEncoding("utf-8");

        //获取参数名为"username"的值
        String username = request.getParameter("username");
        String nickname = request.getParameter("nickname");
        System.out.println("username:"+username+", nickname:"+nickname);

        //获取名为hobby的多个值(多选框的应用,一个name,多个value)
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

        //获取全部请求参数的名称
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println("names:"+s);
        }

        //将全部参数名及参数值传入map  String name:String[] values
        Map<String, String[]> map = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : map.entrySet()) {
            System.out.println(entry.getKey()+":"+ Arrays.toString(entry.getValue()));
        }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

可以发现,这些获取请求参数的方法,离不开form表单中各项的name属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值