request和response学习

request和response学习,第1张

今天学习了request和respone,这是web基础刚开始学,最难理解的是他的执行流程也是最重要的,代码是次要的可以后期整理然后直接粘贴复制就好,主要是要弄懂其中的逻辑

时间: 20225/10
首先要理解什么是request和respone,也就是请求和相应,如图所示

接下来详细学习

Request对象

*Request对象代表客户端的请求,用户通过浏览器访问服务器时,HTTP请求中所有的信息都封装在这个对象中。
*Request对象是由Tomcat创建,开发者可以直接使用这个对象提供的方法获取客户端的请求信息(行 头 体)。

体系结构
ServletRequest 接口

HttpServletRequest 接口

org.apache.catalina.connector.RequestFacade 实现类(由tomcat提供的)

Request获取请求
请求行(了解)

  • 请求行例子:
    GET /day04/xxx.html HTTP/1.1
  • 方法:
  1. String getMethod() 获取请求方式
  2. String getRequestURL() 获取请求完整路径(URL)
  3. String getRequestURI() 获取请求资源部分(URI)
  4. String getContextPath() 获取项目虚拟目录 [记住]
@WebServlet("/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. String getMethod()       获取请求方式
        String method = request.getMethod();
        System.out.println("请求的方式" + method);

        // 2. String getRequestURL()   获取请求完整路径(URL)
        StringBuffer url = request.getRequestURL();
        System.out.println("完整请求路径:" + url);

        // 3. String getRequestURI()   获取请求资源部分(URI)
        String uri = request.getRequestURI();
        System.out.println("请求资源" + uri);

        // 4. String getContextPath()  获取项目(模块)虚拟目录 [记住]
        String contextPath = request.getContextPath();
        System.out.println("虚拟目录" + contextPath);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求头(了解)

  • 请求头例子:
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/78.0.3904.108

  • 重要方法:
    String getHeader(String name) 以String的形式返回指定请求头的值

使用一个案例说明请求头的使用: 判断发送请求的浏览器的类型

@WebServlet("/Demo02Servlet")
public class Demo02Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取User-agent的请求头,看看浏览器是什么浏览器
        //String getHeader(String name):获取请求头
        String header = request.getHeader("user-agent");
        //Chrome   Firefox

        if(header.contains("Chrome")){
            System.out.println("我知道你用的是谷歌浏览器!");
        }else if(header.contains("Firefox")){
            System.out.println("我知道你用的是火狐浏览器");
        }else{
            System.out.println("你用的是杂牌浏览器...");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求参数(重点)
这里的请求参数指的是浏览器访问时发来的请求参数

比如登录时候的用户名密码等…

  • 请求参数的位置:
    get请求: URL上
    post请求: 请求体中
    不管是哪个方式传来的请求参数,我们获取的写法是一样的

  • 重要方法:

    1. String getParameter(String name) 根据参数名获得参数值(单个)
    2. String[] getParameterValues(String name) 根据参数名获得参数值(数组)
    3. Map getParameterMap() 获得所有的参数,封装到Map集合
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

<form action="/day04/Demo03Servlet" method="get">
<table >
    <tr>
        <td>用户名td>
        <td>
            <input type="text" name="username">
        td>
    tr>
    <tr>
        <td>密码td>
        <td>
            <input type="password" name="password">
        td>
    tr>
    <tr>
        <td>性别td>
        <td>
            <input type="radio" name="sex" value=""><input type="radio" name="sex" value="">td>
    tr>
    <tr>
        <td>爱好td>
        <td>
            <input type="checkbox" name="hobby" value="唱跳">   唱跳
            <input type="checkbox" name="hobby" value="rap">   rap
            <input type="checkbox" name="hobby" value="篮球">   篮球
        td>
    tr>
    <tr>
        <td>td>
        <td>
            <input type="submit" value="注册">
        td>
    tr>
table>
form>
body>
html>
@WebServlet("/Demo03Servlet")
public class Demo03Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //?username=admin&password=123456&sex=男&hobby=唱跳

        //  1. getParameter(String name)根据参数名获得参数值(单个)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名是" + username);
        System.out.println("密码是" + password);
        System.out.println("-----------------------------------");

        // 2. getParameterValues(String name)根据参数名获得参数值(多个)
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println("爱好是");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        System.out.println("---------------------------------------------");
        // 3. getParameterMap()  获得所有的参数,封装到Map集合
        Map<String, String[]> map = request.getParameterMap();
        Set<String> set = map.keySet();
        for (String s : set) {
            //map根据键获取值
            String[] strs = map.get(s);
            System.out.println(s + "=" + Arrays.toString(strs));
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

将请求参数封装成实体

  • BeanUtils是apache提供的一个工具包

  • 它提供了一个方法:populate,使用这个方法可以请求的将Map转成一个实体对象
    BeanUtils.populate(Object obj,Map map);

  • 需要注意的是,map中的key要和实体类中的属性保持一致

请求参数中文乱码处理

  • 在请求参数传递过程中,会出现中文乱码的问题

  • get请求:
    tomcat8及以上的版本已经解决 (UTF-8)

  • post请求:
    需要手动解决
    乱码原因:
    浏览器编码(UTF-8) ------ 服务器解码(ISO-8859-1)
    解决方案:
    修改服务器的解码方式为UTF-8即可
    代码:
    request.setCharacterEncoding(“UTF-8”);
    注意要在接受参数之前设置编码

请求转发(重点)
请求转发: 一次请求在服务器项目内部资源之间跳转方式

req.getRequestDispatcher(“/xxxServlet”).forward(req, resp); //请求转发

请求转发的特点

  1. 地址栏不发生改变
  2. 只能转发到服务器当前模块的内部资源
  3. 转发是一次请求
  4. 转发时不需要指定虚拟目录

共享数据(重点)

  • Request是一个域对象,可以存储数据,用于在一次请求之间进行数据共享
  • 常见方法:
    void setAttribute(String name, Object value) 向request域放入数据
    Object getAttribute(String name) 根据name从向request域获取数据
    void removeAttribute(String name) 根据name从request域删除数据
@WebServlet("/Demo05Servlet")
public class Demo05Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //正确的用户名是 "admin"
        String u = "admin";

        //正确的密码是 "123456"
        String p = "123456";

        //把数据通过域对象传递
        //给域对象添加数据
        request.setAttribute("aaa",u);
        request.setAttribute("bbb",p);

        System.out.println("Demo05被调用了");

        //如果有人请求我,我就把请求转发给Demo06
        request.getRequestDispatcher("/Demo06Servlet").forward(request,response);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

--------------------------------------------------------

@WebServlet("/Demo06Servlet")
public class Demo06Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("Demo06被访问了");

        //获取域对象中的数据
        String u = (String)request.getAttribute("aaa");
        String p = (String)request.getAttribute("bbb");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

浏览器发请求的途径
资源包含静态资源和动态资源

目前只有form表单的method填写post时是属于post提交

其他的请求默认都属于get提交
比如:
图片
超链接
访问css文件
访问js文件
等等只要访问资源就都是请求

Response响应

返回响应(了解)

  • 响应行
    响应行格式例子:
    HTTP/1.1 200 OK

    常见状态码:
    200 成功
    302 重定向
    304 访问缓存
    404 找不到资源
    500 服务器内异常

    设置响应行:
    void setStatus(int sc)

  • 响应头
    响应头格式例子:
    Content-Type:text/html;charset=utf-8
    设置响应头:
    void setHeader(String name, String value)

  • 响应体
    响应体是服务器要发给浏览器的数据
    通过response获取输出流,使用输出流输出
    字符流:getWriter()
    字节流:getOutputStream()

    注意:在同一个servlet中,不能既使用字节流又使用字符流

响应重定向(重点)
响应重定向: 服务器通知浏览器去访问另一个地址,即让再发出另一个请求

response.sendRedirect(目标资源位置)
//request.getRequestDispatcher("/xxxServlet").forward(req, resp);  //请求转发

响应重定向的特点

  1. 地址栏发生改变
  2. 重定向是可以到当前模块之外的资源,也可以是网络资源
  3. 重定向是两次请求
  4. 重定向需要指定虚拟目录
@WebServlet("/Demo08Servlet")
public class Demo08Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo08被访问了");

        //request域对象
        request.setAttribute("aaa","123");

        //重定向
        response.sendRedirect("/day04/Demo09Servlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
@WebServlet("/Demo09Servlet")
public class Demo09Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo09被访问了");

        //获取数据
        Object aaa = request.getAttribute("aaa");
        System.out.println(aaa); //null
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

向浏览器输出字符

  • 使用字符流输出内容到浏览器
    PrintWriter writer = response.getWriter();
    writer.write(“字符串”);

解决中文乱码问题

统一设置服务器和浏览器编码格式

	response.setContentType("text/html;charset=utf-8");
 //request.setCharacterEncoding("UTF-8");

向浏览器输出字节

我们通过向浏览器输出验证码图片的功能演示字节流的返回

即: 在服务器端生成验证码图片,返回到浏览器; 浏览器点击验证码可以切换

总结
get请求和post请求的区别
	1.get请求参数在地址栏,post请求参数在请求体
	2.get请求不太安全,post请求相对安全
	3.get请求参数长度有限制,post请求参数长度没限制
	
	
转发和重定向的区别
	1.转发是一次请求,重定向包含两次请求
	2.转发地址栏不变,重定向地址栏会变化
	3.转发只能转发到当前项目的资源,重定向可以重定向到任何资源也可以是网络资源
	
	我们这里指的项目就是idea中的模块
	idea中叫模块,tomcat中就是叫项目

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/920482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存