HTTP 请求概念:
Hyper Text Transfer Protocol 超文本传输协议
传输协议:对浏览器客户端 和 服务器端 之间数据传输的格式规范
特点:
1. 基于TCP/IP的高级协议
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
版本:
1.0:当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭
1.1:当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)
一、请求消息数据格式
1. 请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求方式:
HTTP协议有7中请求方式,常用的有2种
GET:
1. 地址栏会跟上参数数据,以?开头,多个参数之间以&分割
2. GET提交参数数据有限制,不超过1KB
3. GET方式不适合提交敏感数据
4. 浏览器直接访问的请求,默认提交方式是GET方式
POST:
1. 参数不会跟着地址栏后面,参数而是跟在请求的实体内容中
2. POST提交的参数数据没有限制
3. POST方式提交敏感数据相对安全
2. 请求头:
客户端浏览器告诉服务器一些信息
请求头名称: 请求头值
常见的请求头:
Accept: text/html,image/* —— 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 ——浏览器接受的编码格式
Accept-Encoding: gzip,compress ——浏览器接受的数据压缩格式
Accept-Language: en-us,zh ——浏览器接受的语言
Host: www.company.org:80 ——(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT ——浏览器最后的缓存时间
Referer: http://localhost/login.html ——当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) ——浏览器类型
Cookie:name=jack ——浏览器保存的cookie信息
Connection: close/Keep-Alive ——浏览器跟服务器连接状态。
close: 连接关闭 keep-alive:保持连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT ——请求发出的时间
3. 请求体:请求的内容
页面参数
request 请求
1.request对象和response对象的原理
1.request和response对象是由服务器创建的。我们来使用他们
2.request对象是来获取请求消息的,response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
3.request功能:获取请求消息数据
1.获取请求数据
request.getMethod(); 获取请求方式
request.getRequestURT() / request.getRequestURL() 请求资源
request.getProtocol() 请求http协议版本
URL: 统一资源定位符,只能定位互联网资源,是URI的子集。
URI: 统一资源标记符,用于标记任何资源,可以是本地文件系统,局域网的资源,也可以是互联网资源
比如:
URL:统一资源定位符 : http://localhost/day01/demo1 *
URI:统一资源标识符 : /day01/demo1 *
2.获取请求头数据
request.getHeader("名称") 根据请求头获取请求值
request.getHeaderName() 获取所有的请求头名称
package com.qf.servlettest;
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("/servletDome1")
public class ServletDome1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求行信息
String method = req.getMethod(); //获取请求方式
System.out.println("请求方式是:" + method);
/*
* URL: 统一资源定位符,只能定位互联网资源,是URI的子集。
URI: 统一资源标记符,用于标记任何资源,可以是本地文件系统,局域网的资源,也可以是互联网资源
比如:
URL:统一资源定位符 : http://localhost/day01/demo1 *
URI:统一资源标识符 : /day01/demo1 *
*/
StringBuffer requestURL = req.getRequestURL();
System.out.println("请求url:" + requestURL);
String requestURI = req.getRequestURI();
System.out.println("请求uri:" + requestURI);
int remotePort = req.getRemotePort();
System.out.println("ipv6的表现形式,对应ipv4来说相当于127.0.0.1:" + remotePort);
String servletPath = req.getServletPath();
System.out.println("servletPath:" + servletPath);
String protocol = req.getProtocol();
System.out.println("协议:" + protocol);
System.out.println("=====================================");
//请求头
//获取所有的请求头名称
Enumeration<String> headerNames = req.getHeaderNames(); //获取迭代器
//遍历
while (headerNames.hasMoreElements()){ //hasMoreElements() 方法返回布尔类型
//获取每个请求头的名称
String heaName = headerNames.nextElement();
//通过请求头名称,获取对应的值
String header = req.getHeader(heaName);
System.out.println(heaName + " : " + header);
}
System.out.println("----------------------");
//判断运行浏览器
if(req.getHeader("user-agent").contains("Firefox")){ //contains表示是否包含某一字符串
System.out.println("你正在使用的是火狐浏览器");
}else if(req.getHeader("user-agent").contains("Chrome")){
System.out.println("你正在使用的是谷歌浏览器");
}else {
System.out.println("你正在使用的是其他浏览器");
}
}
}
3.获取请求体数据
request.getInputStrieam() post方式
requset.getueryString() get方式
package com.qf.servlettest;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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("/servletdome3")
public class ServletDome3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//getQueryString获取页面所有内容(需要进一步解析),只适用与Get方式提交
// System.out.println(req.getQueryString());
ServletInputStream inputStream = req.getInputStream(); //只适用与pots方式
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
while (read!=-1){
System.out.println(new String(bytes));
read = inputStream.read(bytes);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
问题:以上两种不通用,而且获取到的参数还需要进一步的解析
所以可以使用统一方便的获取参数的方式:
核心的API:
request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数)
request.getparameterValuss("参数名"); 根据参数名获取参数值(可以获取多个值的参数)
request.getParameterName(); 获取所有参数名称列表
<!-- 表单 -->
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <form action="/servletDome2" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="userpassword"><br> 性别:<input type="radio" name="sex" value="man" checked>男 <input type="radio" name="sex" value="woman">女<br> 爱好:<input type="checkbox" name="hobby" value="basketball" >篮球 <input type="checkbox" name="hobby" value="football" >足球 <input type="checkbox" name="hobby" value="game" checked>游戏 <br> 城市:<select name="city"> <option value="zz">郑州</option> <option value="ny">南阳</option> <option value="xy">信阳</option> </select> <br> 日期:<input type="date" name="time"><br> <input type="hidden" name="id" value="giaoigaoigao"> <textarea name="inof" rows="20" cols="20"></textarea><br> <input type="submit" value="提交"> <input type="reset" value="重置"> </form> </body> </html>
package com.qf.servlettest;
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.Arrays;
import java.util.Enumeration;
@WebServlet("/servletDome2")
public class ServletDome2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取表单中name的属性值的集合
Enumeration<String> parameterNames = req.getParameterNames();
//遍历
while (parameterNames.hasMoreElements()){
//获取每个name值的属性
String parameterName = parameterNames.nextElement();
//根据name值属性,获取value
String parametervalue = req.getParameter(parameterName);
if("hobby".equals(parameterName)){
//根据name值,获取value数组
String[] parameterValues = req.getParameterValues(parameterName);
System.out.println(Arrays.toString(parameterValues));
}else {
System.out.println(parameterName + " : " + parametervalue);
}
}
}
}
4.其他
request.getContextPath() --得到当前web应用的路径
package com.qf.servlettest;
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("/servletdome4")
public class ServletDome4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//localhost:8080/xxx 获取到 xxx
String contextPath = req.getContextPath();
System.out.println(contextPath);
}
}
request.getRequestDispatcher(java.lang.String path).forward(request,response); --转发(类似于重定向)
package com.qf.servlettest;
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("/servletdome5")
public class ServletDome5 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//这里写对应的业务逻辑
//查询数据库,判断……
//转发:
req.getRequestDispatcher("/login.html").forward(req,resp);
}
}
中文乱码问题:tomcat 8 已经将乱码问题解决了
如果出现乱码:
get方式:String name = new String(name.getBytes("iso-8859-1"),"utf-8");
post方式:request.setCharacterEncoding("utf-8");