http&requestv2.0
1.http协议
1.1 谷歌浏览器抓包
1.form表单发送请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demoServlet" method="get">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
爱好:<input type="checkbox" name="hobby" value="smoking"/> 抽烟
<input type="checkbox" name="hobby" value="drinking"/> 喝酒
<input type="checkbox" name="hobby" value="tangtou"/> 烫头 <br/>
学历:<select name="education">
<option value="gaozhong">高中</option>
<option value="dazhuan">大专</option>
<option value="benke">本科</option>
</select><br>
<input type="submit" value="post提交"/>
</form>
</body>
</html>
2.服务器接受请求
@WebServlet(urlPatterns = "/demoServlet")
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收到请求了...");
}
}
3.浏览器抓包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apZ3hpOy-1594194058413)(assets/1593997952115.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R64QW3td-1594194058415)(assets/1593997968507.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teX14SOq-1594194058420)(assets/1593997980825.png)]
1.2 http协议的请求格式
get请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6GXFcPR-1594194058424)(assets/1593998934184.png)]
post请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCH2H0xh-1594194058426)(assets/1593998946166.png)]
小结:
http请求的格式:
请求行 请求的方式 请求的地址 氢气的协议
请求头 很多,都是key:value格式,都有固定含义
请求体 只有post才有才有请求体,get请求没有请求体.get请求提交的参数跟在请求行中的地址的后面
2.HttpServletRequest对象(重点)
2.1 request运行的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzijGEyI-1594194058427)(assets/1594000435993.png)]
2.2 获取请求行信息(了解)
package com.itheima.servlet;
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
public class LineServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String remoteAddr = request.getRemoteAddr();
if("fe80:0:0:0:900b:45a5:3c91:153d%26".equals(remoteAddr)){
response.getWriter().write("you are so boring");
return;
}
System.out.println("发出请求的客户端远程地址:"+remoteAddr);
/**
* 请求行 请求的方式i 请求的地址 请求的协议
* 了解知道:
* getMethod(): 获取请求的方式
* getRequestURI() 请求的地址
* getProtocol(); 获取请求的协议
* getRemoteAddr(); 获取客户端的远程地址
*
*/
String method = request.getMethod();
System.out.println("请求的方式:"+method);
String requestURI = request.getRequestURI();
System.out.println("请求的地址:"+requestURI);
String protocol = request.getProtocol();
System.out.println("请求的协议:"+protocol);
}
}
2.3 获取请求头(了解)
package com.itheima.servlet;
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
public class HeaderServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 了解知道
* getHeader(headerName); 获取指定请求头的值
* getHeaderNames(); 获取所有的请求头名字,
*/
String header = request.getHeader("user-agent");
System.out.println("浏览器客户端信息:"+header);
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println("请求头:"+headerName+":"+headerValue);
}
}
}
2.4获取请求中的参数(重点)
package com.itheima.servlet;
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.Map;
@WebServlet(urlPatterns = "/parameterServlet")
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 重点掌握:
* getParameter(key); 获取表单提交的值,key就是表单标签的name的属性值,获取的是单个值
* getParameterValues(key); 适用于一个key提交多个value的情况,例如,爱好
* getParameterMap(); 获取请求中所有的参数,并且封装成map集合
* map.key:就是表单提交的key
* map.value:就是表单提交的值
*
*/
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
//获取爱好
//String hobby = request.getParameter("hobby");
String[] hobbies = request.getParameterValues("hobby");
System.out.println("爱好:"+ Arrays.toString(hobbies));
//获取请求中提交的所有参数
Map<String, String[]> parameterMap = request.getParameterMap();
for(Map.Entry<String,String[]> entry:parameterMap.entrySet()){
String key = entry.getKey();
String[] value = entry.getValue();
System.out.println(key+":"+Arrays.toString(value));
}
}
}
2.5 请求中的乱码问题(重要)
1.tomcat8.0之后get请求没有乱码,post请求有乱码
2.针对post请求,只需要设置tomcat的解码格式为utf-8即可
3.request.setCharacterEncoding("utf-8");
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qp3mD79Y-1594194058429)(assets/1594003760845.png)]
4.请求的转发
4.1 request对象的生命周期
存在于一次请求,一次响应
4.2 请求的转发
案例1
Demo1Servlet
package com.itheima.forward;
import javax.servlet.RequestDispatcher;
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(urlPatterns = "/Demo1Servlet")
public class Demo1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo1Servlet先处理请求");
//请求转发到Demo2Servlet
//1.获取请求的转发器
RequestDispatcher disapatcher = request.getRequestDispatcher("/Demo2Servlet");
//2.进行请求的转发,传递request对象和response对象,提供给下一个servlet的service方法
disapatcher.forward(request,response);
}
}
Demo2Servlet
package com.itheima.forward;
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(urlPatterns = "/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo2Servlet接着处理请求...");
}
}
案例2:
package com.itheima.forward;
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(urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("登录失败,需要跳转到错误页面");
//转发到错误页面(转发到缺省servlet,缺省servlet将静态资源做成响应)
request.getRequestDispatcher("/error.html").forward(request,response);
}
}
4.3 request域对象的功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d94u6Gr8-1594194058434)(assets/1594019876812.png)]
自定义request模拟request域功能(了解)
MyTomcat
package com.itheima.Person;
public class MyTomcat {
public static void main(String[] args) {
//tomcat接受到请求,创建request独享
Request request = new Request();
//调用servlet的service方法
Servlet servlet = new Servlet();
servlet.service(request);
}
}
Request
package com.itheima.Person;
import java.util.HashMap;
import java.util.Map;
public class Request {
String qingqiuhang;
String qingqiuti;
String qingqiudecanshu;
//添加一个属性,用于保存其他数据
Map<String,Object> map = new HashMap<String, Object>();
public void setAttribute(String key,Object value){
map.put(key,value);
}
public Object getAttribute(String key){
return map.get(key);
}
public String getQingqiuhang() {
return qingqiuhang;
}
public void setQingqiuhang(String qingqiuhang) {
this.qingqiuhang = qingqiuhang;
}
public String getQingqiuti() {
return qingqiuti;
}
public void setQingqiuti(String qingqiuti) {
this.qingqiuti = qingqiuti;
}
public String getQingqiudecanshu() {
return qingqiudecanshu;
}
public void setQingqiudecanshu(String qingqiudecanshu) {
this.qingqiudecanshu = qingqiudecanshu;
}
}
Servlet1
package com.itheima.Person;
public class Servlet {
public void service(Request request){
//调用另外一个servlet
String msg = "你哈";
Servlet2 servlet2 = new Servlet2();
request.setAttribute("msg",msg);
servlet2.service(request);
}
}
Servlet2
package com.itheima.Person;
public class Servlet2 {
public void service(Request request){
Object msg = request.getAttribute("msg");
System.out.println("获取到借助request对象传递过来的数据:"+msg);
}
}
4.4 reqeust域功能的代码
request.setAttribute(String key,Object value); 向request域中保存数据
request.getAttribute(key); 获取request域中的数据
request.removeAttribute(key); 移除request域中的数据
5.登录案例
5.1 案例环境搭建
1.拷贝资料中的页面
2.数据库装备
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `t_user` VALUES ('1', 'zhangsan', '123');
5.2 登录案例的流程分析
注意: web工程的jar包必须放在WEB-INF的lib目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6y6BCwfP-1594194058439)(assets/1594022648356.png)]
3.扩展
3.1 servlet的缺省(默认)配置
路径的优先级
全路径 > /* > *.do > 缺省servlet
前置知识:一个请求必须由一个servlet来处理,所以是谁处理了/a.html静态资源的请求呢?答案:缺省的servlet
缺省servlet:当一个请求找不到与之对应的servlet的时候,那么这个请求就由缺省的servlet来处理.
缺省的servlet的配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWhJ5p3t-1594194058442)(assets/1594004862600.png)]
如果我们没有配置:tomcat自带缺省的servlet,可以处理静态资源的请求
如果找不到资源,浏览器会出现404, (404一定是找不到资源)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R85jhGxH-1594194058445)(assets/1594004921169.png)]
只要看到404: 肯定是路径有问题.
3.2 idea工具的发布原理
idea采用的是单独xml配置
xml位置和名字 ,名字叫ROOT是因为访问时不需要加项目名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VFLoVVqr-1594194058446)(assets/1594005374592.png)]
最终发布的资源位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uSuJXm6J-1594194058448)(assets/1594005551043.png)]
如果不显示out目录:如下设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G15R1loe-1594194058450)(assets/1594005944132.png)]
总结
掌握
1.理解Http协议中请求的数据格式
请求行 请求的方式 请求的地址 请求的协议
请求头 key:value格式,
请求体 请求的参数,但是只有post有,get没有,因为get提交的参数在地址的后面
2. 获取请求的参数
request.getParameter(key); 获取表单提交的值
request.getParameterValues(key); 适用于一个key提交多个值的情况.例如爱好
request.getParameterMap(); 获取请求中所有的参数,封装成map集合
map.key就是提交数据的key
map.value就是提交的数据
post乱码问题
request.setCharacterEncoding("utf-8");解决请求中乱码问题
3. request.getMethod(); 获取请求的方式