JavaWeb:1.HttpServletRequest;2.HttpServletResponse

1.HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
1.1 常用方法
getRequestURL():获取客户端发出请求时的完整URL
getHeader(String name):获取客户机请求头
getParameter(String):获取客户机请求参数
1.2 案例:获取前端请求参数
(1)参数提交页面index.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>

<html>
<body>
<div style="text-align: center">
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        爱好:
        <input type="checkbox" name="hobbies" value=""><input type="checkbox" name="hobbies" value=""><input type="checkbox" name="hobbies" value="rap">rap
        <input type="checkbox" name="hobbies" value="篮球">篮球
        <br>
        <input type="submit">
    </form>
</div>
</body>
</html>

(2)提交成功页面success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
<h1>登录成功!</h1>
</body>
</html>

(3)Servlet代码

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobbies");


        System.out.println("=========");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbies));

        System.out.println("=========");
        System.out.println(req.getContextPath());
        req.getRequestDispatcher("success.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

运行结果如图:
在这里插入图片描述
勾选信息
在这里插入图片描述
提交后跳转到success页面
在这里插入图片描述
Tomcat服务器后台显示
在这里插入图片描述
这里会显示乱码,试了多种方法无法解决

2.HttpServletResponse

Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest对象,从客户端取数据找HttpServletRequest,向客户端发送数据就是HttpServletResponse。
2.1 响应数据类型
(1)响应头
(2)状态码
状态码主要有:
SC_OK = 200
表示服务器已经成功接受请求,并将返回客户端所请求的最终结果
SC_NOT_FOUND = 404
表示查找的资源不存在
SC_INTERNAL_SERVER_ERROR = 500
表示服务器遇到未知的错误,导致无法完成客户端的请求
(3)数据
2.2 常用方法
(1)负责向客户端(浏览器)发送数据的相关方法
getOutputStream()
getWriter()
(2)负责向客户端(浏览器)发送响应头的方法
addDateHeader(String name, long date)
addHeader(String name, String value)
addIntHeader(String name, int value)
containsHeader(String name)
setDateHeader(String name, long date)
setHeader(String name, String value)
setIntHeader(String name, int value)
(3)负责向客户端(浏览器)发送响应状态码的相关方法
setStatus(int sc, String sm)(已不推荐使用)
2.3 下载文件

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取下载文件的路径
        String realPath = "D:\\IdeaProjects\\javaweb-02-servlet\\response\\src\\main\\rescourse\\千与千寻.jpg";
        System.out.println("文件路径" + realPath);
        //2.截取下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //3.通过浏览器下载文件,URLEncoder.encode()可防止文件名乱码
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //4.文件输入流
        FileInputStream in = new FileInputStream(realPath);
        //5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //6.获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
        //7.将FileInputStream流写入buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.4 验证码功能的实现

public class ImageServlet extends HttpServlet {
    private String makeNum() {
        Random random = new Random();
        String num = random.nextInt(9999999) + "";
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < 7 - num.length(); i++) {
            buffer.append("0");
        }
        num = buffer.toString() + num;
        return num;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.让浏览器每3秒自动刷新一次
        resp.setHeader("refresh", "3");
        //2.在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //3.得到图片,笔
        Graphics graphics = image.getGraphics();
        //4.设置图片的背景颜色
        graphics.setColor(Color.white);
        graphics.fillRect(0, 0, 80, 20);
        //5.给图片写数据
        graphics.setColor(Color.blue);
        graphics.setFont(new Font(null, Font.BOLD, 20));
        graphics.drawString(makeNum(), 0, 20);
        //6.让浏览器将这个请求通过图片的方式打开
        resp.setContentType("image/jpg");
        //7.禁止浏览器缓存
        resp.setDateHeader("expires", -1);
        resp.setHeader("Cache-Control", "no-cache");
        //8.把图片写给浏览器
        ImageIO.write(image, "jpg", resp.getOutputStream());

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

效果如图:
在这里插入图片描述
2.5 重定向
重定向是一个客户端行为,用户请求到达服务器之后,服务返回响应,HTTP状态码为302,并将转发的页面保存在响应头中的location属性里,通知客户端向该地址发出请求。
在这里插入图片描述

public class ServletRedirect extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("image");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

请求转发后,页面会跳转到image页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值