Web核心技术之Request

response.getWriter().write(“

”+name+“,欢迎您!

”);

}

@Override

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

System.out.println(“Post…”);

}

}

启动成功后就可以通过浏览器来访问,并且根据传入参数的不同就可以在页面上展示不同的内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKdsPJdp-1642599677126)(assets/1628738273049.png)]

小结

在这节中,我们主要认识了下request对象和reponse对象:

  • request对象是用来封装请求数据的对象

  • response对象是用来封装响应数据的对象

目前我们只知道这两个对象是用来干什么的,那么它们具体是如何实现的,就需要我们继续深入的学习。接下来,就先从Request对象来学习,主要学习下面这些内容:

  • request继承体系

  • request获取请求参数

  • request请求转发

2,Request对象


2.1 Request继承体系

在学习这节内容之前,我们先思考一个问题,前面在介绍Request和Reponse对象的时候,比较细心的同学可能已经发现:

  • 当我们的Servlet类实现的是Servlet接口的时候,service方法中的参数是ServletRequest和ServletResponse

  • 当我们的Servlet类继承的是HttpServlet类的时候,doGet和doPost方法中的参数就变成HttpServletRequest和HttpServletReponse

那么,

  • ServletRequest和HttpServletRequest的关系是什么?

  • request对象是有谁来创建的?

  • request提供了哪些API,这些API从哪里查?

首先,我们先来看下Request的继承体系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtHAtj6v-1642599677126)(assets/1628740441008.png)]

从上图中可以看出,ServletRequest和HttpServletRequest都是Java提供的,所以我们可以打开JavaEE提供的API文档[参考: 资料/JavaEE7-api.chm],打开后可以看到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arDJXnPc-1642599677127)(assets/1628741839475.png)]

所以ServletRequest和HttpServletRequest是继承关系,并且两个都是接口,接口是无法创建对象,这个时候就引发了下面这个问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6jjueHfR-1642599677127)(assets/1628742224589.png)]

这个时候,我们就需要用到Request继承体系中的RequestFacade:

  • 该类实现了HttpServletRequest接口,也间接实现了ServletRequest接口。

  • Servlet类中的service方法、doGet方法或者是doPost方法最终都是由Web服务器[Tomcat]来调用的,所以Tomcat提供了方法参数接口的具体实现类,并完成了对象的创建

  • 要想了解RequestFacade中都提供了哪些方法,我们可以直接查看JavaEE的API文档中关于ServletRequest和HttpServletRequest的接口文档,因为RequestFacade实现了其接口就需要重写接口中的方法

对于上述结论,要想验证,可以编写一个Servlet,在方法中把request对象打印下,就能看到最终的对象是不是RequestFacade,代码如下:

@WebServlet(“/demo2”)

public class ServletDemo2 extends HttpServlet {

@Override

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

System.out.println(request);

}

@Override

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

}

}

启动服务器,运行访问http://localhost:8080/request-demo/demo2,得到运行结果:

在这里插入图片描述

小结

  • Request的继承体系为ServletRequest–>HttpServletRequest–>RequestFacade

  • Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法

  • 使用request对象,可以查阅JavaEE API文档的HttpServletRequest接口中方法说明

2.2 Request获取请求数据

HTTP请求数据总共分为三部分内容,分别是请求行、请求头、请求体,对于这三部分内容的数据,分别该如何获取,首先我们先来学习请求行数据如何获取?

2.2.1 获取请求行数据

请求行包含三块内容,分别是请求方式请求资源路径HTTP协议及版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v68HSyUF-1642599677128)(assets/1628748240075.png)]

对于这三部分内容,request对象都提供了对应的API方法来获取,具体如下:

  • 获取请求方式: GET

String getMethod()

  • 获取虚拟目录(项目访问路径): /request-demo

String getContextPath()

  • 获取URL(统一资源定位符): http://localhost:8080/request-demo/req1

StringBuffer getRequestURL()

  • 获取URI(统一资源标识符): /request-demo/req1

String getRequestURI()

  • 获取请求参数(GET方式): username=zhangsan&password=123

String getQueryString()

介绍完上述方法后,咱们通过代码把上述方法都使用下:

/**

  • request 获取请求数据

*/

@WebServlet(“/req1”)

public class RequestDemo1 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// String getMethod():获取请求方式: GET

String method = req.getMethod();

System.out.println(method);//GET

// String getContextPath():获取虚拟目录(项目访问路径):/request-demo

String contextPath = req.getContextPath();

System.out.println(contextPath);

// StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1

StringBuffer url = req.getRequestURL();

System.out.println(url.toString());

// String getRequestURI():获取URI(统一资源标识符): /request-demo/req1

String uri = req.getRequestURI();

System.out.println(uri);

// String getQueryString():获取请求参数(GET方式): username=zhangsan

String queryString &#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值