JavaWeb——Response的学习与实例演示

本文详细介绍了JavaWeb中Response对象的功能,包括设置响应行、响应头和响应体。通过实例演示了如何实现重定向、向浏览器输出字符和字节数据,以及验证码的生成与显示。讨论了重定向与转发的区别,并讲解了路径的相对与绝对路径的使用规则。

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

Response介绍

功能:设置响应消息
        1.设置相应行
            1.格式:HTTP/1.1 200 OK
            2.设置状态码:setStatus(int sc)
        2.设置响应头:setHeader(String name,String value)
        3.设置响应体:
            使用步骤
                1.获取输入流
                    *字符输出流:PrintWriter getWriter()

                    *字节输出流:ServletOutputStream getOutputStream()
                2.使用输出流,将数据输出到浏览器端

response案例

1.完成重定向

重定向:资源跳转的方式
                方法一:
                    //目标:重定向访问demo02
                    //1设置状态码为302
                    System.out.println("我访问了demo01");
                    resp.setStatus(302);
                    resp.setHeader("location","/demo02");
                方法二:
                    resp.sendRedirect("/demo02");
重定向的特点
                1.转发地址栏发生变化
                2.重定向唯一访问其他资源
                3.重定向请求多次,不可以使用request共享数据
装发的特点
                1.转发地址栏路径不变
                2.转发只能访问当前路径的资源
                3.转发是请求一次,可以使用request共享数据
路径的写法:
                1.相对路径:通过相对路径不可以确定唯一资源
                    *如:./index.xml
                    *不已/开头,以.路径。./可以省略
                    *./表示当前目录
                    *../表示的是上一级目录
                    *规则:确认访问当前资源和目标资源的相对位置关系
                2.绝对路径:通过绝对路径可以确定唯一资源
                    *如:http://localhost/Respone/demo01
                    *以/开头的路径

                    *规则:判断定义的路径是给谁用的
                        *给客户端用的:需要加虚拟目录
                        *给服务器使用的:不需要加虚拟目录
                        *建议动态获取虚拟目录String contextPAth=req.getContextPath();

2.服务器输出字符数据到浏览器

        步骤:
                1.获取字符输出流
                2.输出数据
                3.中文乱码现象解决方式
                    //告诉浏览器,服务器发送信息体的编码,建议那边的解码格式
                    resp.setHeader("content-type","text/html;character=utf-8");
                    用下面的精简的
                    resp.setContentType("text/html;character=utf-8");


3.服务器输出字节数据到浏览器

        步骤:
                1.获取字符输出流
                2.输出数据
                    resp.setContentType("text/html;character=utf-8");
                    ServletOutputStream sos=resp.getOutputStream();
                    sos.write("hello".getBytes());
                    sos.write("你好".getBytes());

4.验证码生产与显示

          示例代码:

        生成验证码代码

package com.servelt.learm.demo;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet(urlPatterns = "/demo05checkcode")
public class demo05checkcode extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建一个对象,在内存中代表验证码图片
        int width=100;
        int height=50;
        BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        //2.美化图片
        //2.1填充背景色
        Graphics g=image.getGraphics();//获取画笔对象
        g.setColor(Color.pink);
        g.fillRect(0,0,width,height);
        //2.2话边框
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width-1,height-1);
        //2.3写验证码
        String str="ABCDEFGHIJKLMNOPQRSTUWXYZabcdefghijklmnopqrstuvwxyz123456789";//取值范围
        //生成随机角标
        Random ran=new Random();
        for(int i=1;i<=4;i++){
            int index=ran.nextInt(str.length());
            char ch=str.charAt(index);//随机字符
            g.drawString(ch+"",width/5*i,height/2);
        }
        //2.4画干扰线
        for (int i=0;i<10;i++)
        {
            g.setColor(Color.green);
            int x=ran.nextInt(width);
            int x2=ran.nextInt(width);
            int y1=ran.nextInt(width);
            int y2=ran.nextInt(width);
            g.drawLine(x,y1,x2,y2);

        }

        //3.输出图片
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

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

        html显示验证码及点击跟新代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*
        分析:
            1.点击超链接或图片,换一张
            2.重新设置图片的src值
        */
    </script>
</head>
<body>
<img src="/demo05checkcode" id="checkimg">
<a href="javascript:void(0)" id="change">看不清?换一种。</a>
<script>
    var img=document.getElementById("checkimg");

    img.onclick=function () {
        //加时间戳,欺骗缓存
        var date=new Date().getTime();

        img.src="/demo05checkcode?"+date;
    }
    var changed=document.getElementById("change")
    changed.onclick=function () {
        //加时间戳,欺骗缓存
        var date=new Date().getTime();

        img.src="/demo05checkcode?"+date;
    }
</script>
</body>
</html>

        结果演示:

 

### JavaWeb 中前端服务器之间的参数传递方法 在JavaWeb开发中,从前端向服务器传递参数主要通过HTTP请求完成。通常情况下,这些请求可以是GET或POST方法。 #### 使用表单提交数据 当使用HTML中的`<form>`标签时,可以通过设置其`method`属性来决定是以GET还是POST方式发送数据给服务器[^1]。例如: ```html <form action="/login" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="登录"> </form> ``` 此代码片段展示了如何创建一个简单的登录表单,并指定`/login`作为处理该表单的目标URL路径,同时采用POST方法传输用户名和密码字段的数据至服务端。 #### 获取请求参数 一旦接收到客户端发来的请求,在Servlet类里能够利用`HttpServletRequest`对象获取这些参数。对于上述例子而言,则可以在对应的Servlet内部这样操作以读取输入的信息: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 进一步逻辑处理... } ``` 这段代码说明了怎样从请求体中提取名为`username`和`password`的参数值。 #### 请求转发页面跳转携带参数 除了直接接收来自浏览器的原始请求外,有时还需要在一个Servlet处理完毕之后将控制权交给另一个资源继续执行——这便是所谓的“请求转发”。此时如果希望保留某些上下文信息供后续组件访问的话,就可以借助于`RequestDispatcher`接口所提供的功能来进行带有附加数据(即参数)的重定向[^2]: ```java request.setAttribute("message", "欢迎回来!"); RequestDispatcher dispatcher = request.getRequestDispatcher("/welcome.jsp"); dispatcher.forward(request, response); ``` 这里演示的是先设定好要共享的消息变量,再调用`forward()`函数实现转向目标视图的同时保持原有会话状态不变的效果。 另外一种常见场景是在不同页面间互相链接的时候附带查询字符串形式的额外负载;比如点击超链接触发导航动作时可构造形如`http://example.com/target?param=value&another=one`这样的地址栏指向新位置并捎带上必要的配置项[^5]。 #### 利用JSON格式交换复杂结构化资料 随着AJAX技术的发展及其广泛应用,越来越多的应用倾向于异步加载部分内容而非整页刷新整个界面。为了适应这种变化趋势下的需求特点,开发者往往会选择更灵活高效的序列化机制—JSON (JavaScript Object Notation),它允许把任意层次嵌套的对象转换成易于解析的文字串表示法以便在网络上传输[^4]。 ```javascript // 客户端 JavaScript 代码示例 let user = {name:"张三", age:28}; fetch('/api/user', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(user), }); ``` 以上脚本构建了一个包含姓名和年龄两个成员的小型实体模型实例并通过Fetch API发起一次跨域资源共享(CORS)兼容性的POST请求将其推送到了远程API终结点上等待回应。 综上所述,JavaWeb提供了多种途径让前后两端之间方便快捷地交互所需的各种类型的数据流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值