http&requestv2.0

本文深入探讨了HTTP协议,包括谷歌浏览器抓包、HTTP请求的GET和POST格式。重点讲解了HttpServletRequest对象,涵盖其运行原理、获取请求信息及解决乱码问题。还介绍了请求转发的原理与实践,以及登录案例的实现,最后讨论了Servlet的默认配置和IDEA的发布原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(); 获取请求的方式    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值