Javaweb(八)
  aH5iJNmqbh1v 2023年11月02日 148 0
1、Request:设置请求数据

1.1、Request的继承体系

image.png

1.2、Request获取请求数据

获取请求行里面的数据:

image.png

请求头和请求体:

image.png

POST方式获取请求体的方法如下所示:

	@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取字符输入流
        BufferedReader br = req.getReader();
        //读取数据
        String s = br.readLine();
        //输出读取的信息
        System.out.println(s);
    }

输出信息:

username=17744&password=45616541

1.3、Request通用方式获取请求参数

image.png

前端网页如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/test/demo1" method="post">
    姓名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <!-- 复选框   -->
    <input type="checkbox" name="hobby" value="1"> 爬山
    <input type="checkbox" name="hobby" value="2"> 游泳 <br>
    <input type="submit">
</form>

</body>
</html>

Java代码如下所示:

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.Map;

@WebServlet("/demo1")
public class Demo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get...");
        //获取Map集合
        Map<String, String[]> map = req.getParameterMap();
        //遍历Map集合
        for (String key : map.keySet()) {
            System.out.print(key + ":");
            //通过键获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        //根据Key获取参数值
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.print(hobby + " ");
        }
        System.out.println();

        //获取单个值
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("姓名为:" + username + "\t密码为:" + password );

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //这里的doPost方法可以直接调用上面的doGet方法,因为两个方法获取请求参数的方法都是一样的
        this.doGet(req,resp);
    }
}

1.4、请求参数中文乱码的问题:

POST解决方案:

在最开始写上:request.setCharacterEncoding("utf-8");用于设置字符输入流的编码。

GET方式的解决方案:==原因:编码和解码的方式不一样!!!!==

如下所示: image.png

==解决思路:先把数据转换为字节数组,然后再通过字节数组转换为字符串!!==

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@WebServlet("/demo2")
public class Demo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        //获取username的字节数组
        byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
        //然后通过字节数组转换为字符串
        username = new String(bytes,StandardCharsets.UTF_8);

        //上面的代码可以简写成如下形式
        String username1 = new String(request.getParameter("username").getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);

        //输出信息
        System.out.println(username);
        System.out.println(username1);
    }

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

==注意:上面解决GET方式中文乱码的解决方案同样适用于POST方法!!!!==

1.5、request的请求转发:一种在服务器内部的资源跳转方式。

image.png

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo3")
public class Demo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo3.....");
        request.getRequestDispatcher("/demo4").forward(request, response);
    }

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

上面的代码会输出:

demo3..... demo4......

操作共享数据的方法:

image.png

2、Response:设置响应数据

image.png

2.1、设置响应数据功能介绍

image.png

2.2、Response完成重定向:一种资源跳转的方式

image.png

使用如下所示:

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/responseDemo1")
public class Demo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo1......");
        //设置响应状态码
        response.setStatus(302);                                        //参数是一个固定值,302
        //设置响应头
        response.setHeader("Location", "/test/responseDemo2");    //参数一是一个固定值,参数二是重定向的资源路径,注意访问路径要添加项目名称

        //简写为
        response.sendRedirect("/test/responseDemo2");

    }

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

比较两种重定向和请求转发:

image.png

2.3、路径问题

明确路径是谁使用?

浏览器(发出)使用:需要加虚拟目录(项目访问路径) 服务端使用(发出):不需要加虚拟目录

常见的例子如下所示:

image.png

2.4、动态获取虚拟目录:

String contextPath = request.getContextPath();
System.out.println(contextPath);

2.5、Response响应字符数据

image.png

@WebServlet("/responseDemo3")
public class Demo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //让浏览器能够解析html标签,并且设置编码,让其能够正常识别中文
        response.setContentType("text/html;charset=utf-8");
        //获取字符输出流(这个流是不用关闭的,关闭可能会出问题)
        PrintWriter writer = response.getWriter();
        writer.write("aaa");
        //输出带html的字符串
        writer.write("aaaaa");
    }

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

2.6、Response响应字节数据

import org.apache.commons.io.IOUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.FileInputStream;
import java.io.IOException;

@WebServlet("/responseDemo4")
public class Demo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //读取文件
        FileInputStream fis = new FileInputStream("G:\\图片\\111.jpg");
        //获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //完成流的copy,从而实现在页面中显示图片(这里使用了工具类,需要在xml中配置依赖)
        IOUtils.copy(fis, os);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
aH5iJNmqbh1v
作者其他文章 更多

2023-11-13

2023-11-12

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02