Http:超文本传输协议request与response对象
request功能:获取请求消息数据
获取请求行数据获取请求头数据方法request获取请求体数据 request其他功能
通用方法获取请求参数请求转发共享数据获取ServletContext
Http:超文本传输协议定义了客户端和服务器端通信时,发送数据的格式。
特点:
是基于TCP/IP的高级协议。默认端口号是80。例如http://www.baidu.com:80.一次请求对应一次响应。无状态的协议:每次请求之间是相互独立的,不能交互数据。
请求消息的数据格式
1、请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1
2、请求头 键值对的格式
3、请求空行 就是区分请求头和请求体的空行
4、请求体 GET请求是没有请求体的。
HTTP协议有7种请求方式,常用的有GET和POST
GET方式的请求参数在请求行(url中)。POST方式的请求参数在请求体中。GET请求的url长度是有限制的,POST请求是没有限制的。GET请求不太安全,POST请求相对安全。 request与response对象
tomcat服务器会创建request与response对象,request对象中封装请求消息数据。tomcat将这两个对象传递给service方法,并且会调用service方法。
request对象是来获取请求消息的,response对象是来设置响应消息的。
有两个接口:ServletRequest与HttpServletRequest,后者继承了前者。
request功能:获取请求消息数据 获取请求行数据1、获取请求方式 getMethod()2、获取虚拟目录 getContextPath()3、获取servlet路径 getServletPath()4、获取get方式的请求参数 getQueryString()5、获取请求的uri getRequestURI()/ getRequestURL()6、获取协议和版本号 getProtocol()7、获取客户机的IP地址 getRemoteAddr()
在IDEA中,可以不用新建class,直接new一个servlet即可。
package com.example.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method = request.getMethod();
System.out.println(method);
String contextPath = request.getContextPath();
System.out.println(contextPath);
String requestURI = request.getRequestURI();
System.out.println(requestURI);
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
GET /demo_war_exploded /demo_war_exploded/Servlet http://localhost:9528/demo_war_exploded/Servlet获取请求头数据方法
1、getHeader(String name) 通过请求头的名称获取请求头的值2、getHeaderNames()获取所有的请求头名称。
package com.example.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration headerNames = request.getHeaderNames();
//遍历
while (headerNames.hasMoreElements()){
String element = headerNames.nextElement();
//根据名称获取请求请求头的值
String header = request.getHeader(element);
System.out.println(element+":"+header);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
host:localhost:9528 connection:keep-alive sec-ch-ua:" Not A;Brand";v="99", "Chromium";v="98", "Microsoft Edge";v="98" sec-ch-ua-mobile:?0 sec-ch-ua-platform:"Windows" upgrade-insecure-requests:1 user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43 accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 sec-fetch-site:none sec-fetch-mode:navigate sec-fetch-user:?1 sec-fetch-dest:document accept-encoding:gzip, deflate, br accept-language:zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6request获取请求体数据
只有post请求方式才有请求体。步骤:获取流对象,然后再从流对象中拿数据。getReader()获取字符输入流,只能操作字符数据。getInputStream()获取字节输入流,可以操作所有类型数据。
Title
package com.example.request_demo;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求体
BufferedReader reader = request.getReader();
String line = null;
while ((line = reader.readLine())!=null){
System.out.println(line);
}
}
}
username=2021110093&password=123456request其他功能 通用方法获取请求参数
get和post方法都是适用的。所以一般是在doPost里面,写业务逻辑代码,在doget里面调用方法。
package com.example.request_demo;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println("请求"+username);
}
}
getParameter(String name) 根据参数名称获取参数值
getParameterValues(String name) 根据参数名称获取参数值的数组,返回一个数组。
getParameterNames() 获取所有请求的参数名称,返回一个枚举,用遍历
getParameterMap()获取所有参数的map集合。
package com.example.request_demo;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取
Map parameterMap = request.getParameterMap();
//遍历
Set strings = parameterMap.keySet();
for (String name : strings) {
//根据name获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("--------");
}
}
}
请求参数时会有中文乱码的产生,get方式提交没有乱码,post方式提交有乱码。
只需在获取参数前,加上一行代码即可。
一种在服务器内部的资源跳转方式。
步骤:
1、通过request对象获取请求转发器对象 getRequestDispatcher(String path)
2、使用获取的对象来转发 forward。



