-
request对象和response对象的原理
- request和response是由服务器创建的,我们来使用它们
- requset对象是用来获取请求消息的,response是用来设置响应消息的
- tomcat服务器会根据url中的资源路径,创建ServletDemo1对象
- tomcat服务器,会创建request和response对象,request对象中封装请求消息数据
- tomcat将request和response两个对象传递给service方法,并调用service方法。
- 程序员可以通过request对象来获取请求数据,可以通过response来设置相应消息数据
- 服务器在给浏览器做出响应之前,会从response中拿程序员设置的响应消息数据
-
request对象继承体系结构:
ServletRequest: --接口
|继承
HttpServletRequest: --接口
|实现
org.apach.catalina.connector.RequestFacade类(tomcat) -
request:获取请求消息
- 获取请求数据
- 获取请求行数据
*GET/day14/demo1?name=zhanggsan HTTP/1.1
*获取请求方法:GET,String getMethod()
*(重点)获取虚拟目录:/day14,String getContextPath()
*获取Servlet路径:/demo1,String getServletPath()
*获取请求参数:name=zhangsan,String getQueryString()
*(重点)获取请求的URI:/day14/demo1,getRequestURI(),getRequestURL():带有http协议
*获取协议以及版本:HTTP/1.1,String getProtocol()
*获取客户机的IP地址:String getRemoteAddr()
- 获取请求行数据
- 获取请求数据
package Request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* y演示Request获取请求行数据
* */
@WebServlet("/RequestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
1. 获取请求行数据
*GET/day14/demo1?name=zhanggsan HTTP/1.1
*获取请求方法:GET,`String getMethod()`
*(重点)获取虚拟目录:/day14,`String getContextPath()`
*获取Servlet路径:/demo1,`String getServletPath()`
*获取请求参数:name=zhangsan,`String getQueryString()`
*(重点)获取请求的URI:/day14/demo1,`getRequestURI(),getRequestURL():带有http协议`
*获取协议以及版本:HTTP/1.1,`String getProtocol()`
*获取客户机的IP地址:`String getRemoteAddr()`
*/
//获取请求方式,GET
String method = request.getMethod();
System.out.println(method);
//获取虚拟目录
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取Servlet路径
String servletPath = request.getServletPath();
System.out.println(servletPath);
//获取请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//获取请求的url
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//获取协议以及版本
String protocol = request.getProtocol();
System.out.println(protocol);
//获取客户机ip地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
}
-
- 获取请求头数据
*重点String getHeader(String name)
:通过请求头名称获取请求头的值
*Enumeration<String> getHeaderNames()
:获取所有的请求头名称
- 获取请求头数据
package Request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据
//获取所有的请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
//遍历
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
String header = request.getHeader(name);
System.out.println(name+"="+header);
}
}
}
根据头判断浏览器类型
package Request;
import javax.servlet.ServletException;
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("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String header = request.getHeader("user-agent");
if(header.contains("Chrome")){
System.out.println("google 来了");
}else if (header.contains("Firofox")){
System.out.println("火狐来了");
}
}
}
- 获取请求体数据
- 请求体:只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数
- 步骤:
- 获取流对象
*BufferedReader getReader():获取字符输入流,自己能操作字符数据
*ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据,在文件上传时使用 - 从流对象中获取数据
- 获取流对象
- 其他功能
-
获取请求参数通用方法(可以兼容GET和POST,都可以使用下列方法请求参数)
- String getParameter(String name):根据参数名称获取参数值,如username=zhangsan&password=123
- String[] getParameterValues(String name):根据参数名称获取参数值数组
- Enumeration<String> getParameterNames():获取所有参数名称
- Ma<String,String[]> getParameterMap():获取所有参数的map集合
*post中文乱码:设置一下流的编码:request.setCharacterEncoding("UTF-8");
-
请求转发:一种在服务器内部的资源跳转方式
- 步骤:1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用这个对象进行转发:forward(ServletRequest request,ServletResponse reponse)
- 特点:浏览器地址栏路径不发生变化,只能转发到当前的服务器内部资源中,转发是一次请求
-
共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求 ,一般用于请求转发的多个资源中共享数据
方法: setAttribute(String name,Object obj):存储数据,Object getAttribute(String name):通过键获取值,void removeAttribute(String):通过键移出键值对
- request域:代表一次请求 ,一般用于请求转发的多个资源中共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
-
获取servletContext对象
- ServletContext geteServletContext()
-