Request
HttpServletRequest
- 组成部分
- 请求行 方法 URL 协议版本
- 请求头 Host:虚拟主机名称/域名
- 空行
- 主题内容 请求参数
客户端API
localhost虚拟主机/day09-reqres虚拟路径,也是web应用的名字/RequestDemo1资源名称
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("/RequestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StringBuffer requestURL = request.getRequestURL();//返回客户端发出的请求中的URL
System.out.println("url"+requestURL);
String requestURI = request.getRequestURI();//返回请求行中资源名称,统一资源标识符
System.out.println("uri"+requestURI);
String qs = request.getQueryString();//返回请求行参数部分 ?uername=root&password=123456 这就是参数
System.out.println("qs"+qs);
String ip = request.getRemoteAddr();//返回请求的客户机的IP地址
System.out.println("ip"+ip);
String method = request.getMethod();//返回客户机请求方式
System.out.println("method"+method);
String contextPath = request.getContextPath();
System.out.println("path"+contextPath);//返回虚拟路径名称
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
请求头API
- getHeader
- getHeaders
- getHeaderNames 获取全部请求头的名称
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 {
//获取请求头中包含的值
String host = request.getHeader("Host");
System.out.println("host:"+host);
Enumeration<String> hosts = request.getHeaders("Host");
while (hosts.hasMoreElements()) {
//迭代器
//同一个Servlet 支持热部署,新创建Servlet 要重启服务
System.out.println("hosts:"+hosts.nextElement());
Enumeration<String> header = request.getHeaderNames();
while (header.hasMoreElements()){
System.out.println("headerName: "+header.nextElement());
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- getIntHeader
- getDateHeader
请求参数相关API
- getParameter
String username = request.getParameter("username");
System.out.println("username: "+username);
form表单例子
- 要复制到web目录下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h1>GET提交</h1>
<!---/web应用目录/资源名-->
<form action="/day09-reqres/RequestDemo3" method="GET">
用户名: <input type="text" name="username" />
昵称: <input type="text" name="nickname" />
<input type="submit" value="提交" />
</form>
<h1>POST提交</h1>
<form action="/day09-reqres/RequestDemo3" method="POST">
用户名: <input type="text" name="username" />
昵称: <input type="text" name="nickname" />
爱好: <input type="checkbox" name="like" value="lanqiu" />篮球
<input type="checkbox" name="like" value="zuqiu" />足球
<input type="checkbox" name="like" value="taiqiu" />台球
<input type="submit" value="提交" />
</form>
</body>
</html>
乱码问题
原因:编码,解码字符集不统一。
方法1设置服务器解码字符集
- 浏览器发送数据,是编码数据的位置;浏览器使用何种字符集打开页面,就会使用何种字符集发送数据,utf-8。 服务器接收数据,是解码数据的位置;tomcat8.5 及其以上 utf-8,7.0是iso8859-1,这个字符集没中文。所以,可以通知服务器接收数据时用utf-8解码。
//只在post生效(请求实体内容中),中文以get方式提交,仍然是乱码
//post提交方式下,请求参数都会涵盖在请求实体内容中
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println("username: "+username);
方法2 解码乱码 Get方式
字符C(浏览器:输入)→二进制数据B(浏览器:用utf-8编码)→乱码D(服务器:用iso解码)→二进制数据B(服务器:用iso编码)→字符C(服务器:用utf-8解码)
String username = request.getParameter("username");
byte[] bytes = username.getBytes("iso8859-1");//编码
username = new String(bytes, "utf-8");//解码
System.out.println("username"+username);
- getParameterValues
获取多值参数
String[] likes = request.getParameterValues("like");
System.out.println(Arrays.toString(likes));
//数组打印,不需要遍历
- getParameterMap
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println(parameterMap);
- getParameterName
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();//获取请求参数名称
String value = request.getParameter(name);//根据参数名获取值,获取多值时只能获取第一个值
//可以改用parameterValues
System.out.println(name+"----"+Arrays.toString(value));
}