Request对象简析
Request定义:
request对象是Servlet中service的一个参数,当浏览器发出请求时,服务器会自动创建一个Reques对象,用来封装请求数据,然后在Servlet中调用service方法时,将Request对象依次传递到各个Servlet,请求数据进行处理。
Request的使用:
1,request:获取请求消息
*方法:
(1),获取请求行数据
//1,获取请求方式:GET
String getMethod()
//2,(*) 获取虚拟目录:/day14
String getContextPath
//3,获取Servlet路径:/demo1
Striing getServletPath()
//4,获取get方法请求参数:Username=zhangsan
String getQuerySstring()
//5,获取请求URI:/day14/demo1
String getRequestURI()
String Buffer getRequestURL()
//6,获取协议及版本:HTTP/1.1
String getProtocol()
//7,获取客户机的IP地址
String getRemoteAddr()
(2),获取请求头数据
*两个方法
//通过请求头的名称获取请求头的值
String getHeader(String name)
//获取所有的请求头名称
Enumeration<Sstring> getHeaderNames()
(3),获取请求体数据
*请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
//获取字节输入流,可以操作所有类型数据(文件类,类如文本,视频等)
ServletInputStream getInpuStream()
2,其他功能
//1,获取请求参数通用的方法 :(不论是get还是post请求方式都可以使用下列方法来获取请求参数)
//根据参数名称获取参数值
String getParameter(String name):根据参数名称获取参数值
//2,根据参数名称获取参数值的数组 hobby=xx&hobby=game
String getParameterValues(String name):
//3,获取所有请求的参数名称
Enumeration<String[]> getParameterMap()
//4,获取所有参数的map集合
Map<String,String[]> getParameterMap()
请求转发:
一种在服务器内部的资源跳转方式
(当浏览器发出请求,需要调用项目内的多个资源时,一个servlet文件无法完成请求,要调用多个servlet文件,需要从一个servlet文件跳转到另外一个servlet文件,请求转发相当于起了一个纽带作用,并联调动多个资源,可以有效的解决Servlet编辑代码冗余,职责不明确等问题)
1,实现步骤:
if (u!=null){
resp.getWriter().write("登录成功");
}else {
//当满足条件时跳转需要调用的Servlet
req.getRequestDispatcher("路径").forward(req,resp);
//路径,即需要调用的Servlet的相对路径名,可直接书写Servlet的别名
2,特点:
(1)浏览器地址栏将不发生任何变化(转发可能会调用多个资源,但地址栏内只会显示一个资源名称)
(2)只能转发到当前服务器内部的资源中。(转发所调用的方法必须是自己的服务器内存在的,不能调用别的服务器的资源)
(3)转发是一次请求。(转发整体上可能会调用多个资源,但网页只会发出一个请求)
Request对象作用域
原因:浏览器发出一个请求时,要完成最终目的可能需要经过几个Servlet对象的调用,对请求数据进行增加,修改删除等一系列处理,而怎么做到同一个Request对象可以被多个Servlet调用,就用到了Request对象作用域思想。
作用 :解决一次请求内,经过请求 转发后,的不同Servlet共同调用同一个Request对象
运行步骤:调用方法将Servlet对Request的修改转载进Request对象中,在进行下一个Servlet对Request对象进行操作时,将上一个Servlet对象的处理结果流转给它【有点小绕,望谅解】
原理:通过Request中的setAttribute和getAttribute 两个方法对Request的请求数据进行添加和取出,从而实现依次请求多次调用
前一个Servlet
if (u!=null){
resp.getWriter().write("登录成功");
}else {
//当满足条件时跳转需要调用的Servlet
//将前一个Servlet对Request的处理封装为键值对的形式装载到Request对象中去
req.setAttribute("str","用户名或密码错误");
req.getRequestDispatcher("路径").forward(req,resp);
//路径,即需要调用的Servlet的相对路径名,可直接书写Servlet的别名
下一个Servlet
//通过键名将键值提取出来,在Servlet需要时加以调用
String str= (String) req.getAttribute("str");
通过Request中的setAttribute和getAttribute