Servlet_Response(响应)

Response

响应对象:与状态码有关

HTTP响应格式有三个组成
  1. 响应行(状态行)
    1. HTTP/1.1 协议和版本
    2. 200 状态码
    3. OK 状态信息
  2. 响应头:由键值对组成
  3. 响应体:字符输出流和字节输出流

什么是HttpServletResponse对象

这是一个接口,它的父接口ServletResponse

  1. 由谁实现:Tomcat

  2. 由谁创建:Tomcat通过反射来实例化

设置状态码的方法

状态码的方法描述
setStatus(int status)设置状态码
sendError(int sc)发送错误码,也可以指定错误的信息

代码

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("/demo05")
public class Demo05Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置状态码为202,每个状态码都是有自己的定义
        //response.setStatus(202);
        //设置状态码的错误提示
        response.sendError(411,"长度不够");

    }

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

效果

在这里插入图片描述

响应对象:响应头相关方法

响应头的方法
响应头的方法描述
void setHeader(String name, String value)设置指定响应头的键和值
void setContentType(String type)相当于setHeader(“content-type”, “text/html;charset=utf-8”) 设置响应头指定内容类型和编码 如:setContentType(“text/html;charset=utf-8”)

案例:设置响应头过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.io.PrintWriter;

@WebServlet("/demo06")
public class Demo06Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("3秒后跳转");
        response.setHeader("refresh","3;url=https://www.baidu.com");
    }

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

案例:使用location实现页面跳转

步骤
  1. 只设置location响应头
  2. 同时设置302状态码
  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.io.PrintWriter;

@WebServlet("/demo07")
public class Demo07Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   /*     //设置状态响应码
        response.setStatus(302);
        //设置响应头location的  需要配合状态码一起来使用,单独使用时无法跳转。
        response.setHeader("location","http://www.baidu.com");*/

        //重定向也是通过这样的方式来实现
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

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

小结
响应头的方法描述
void setHeader(String name, String value)设置指定响应头的键和值
void setContentType(String type)设置响应内容的类型,相当于: setHeader(“content-type”,“text/html;charset=utf-8”)

响应体:处理响应乱码的问题

响应体的两种数据
  1. 字符数据,使用字符流来处理
  2. 字节数据,使用字节流来处理
response对象的方法描述
OutputStream getOutputStream()获取响应对象的字节输出流,用于处理字节类型的数据,如:图片
PrintWriter getWriter()获取响应对象的字符输出流,用于处理字符类型的数据,如:网页
打印流的一些疑问

字符数据都是有汉字编码,如果使用不同的编码就有可能出现乱码的问题

测试:直接使用打印输出流,输出汉字的结果是什么?

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.io.PrintWriter;

@WebServlet("/demo08")
public class Demo08Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //直接输出
        PrintWriter out = response.getWriter();
        out.print("时间管理大师");
    }

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

效果

在这里插入图片描述

原因
  1. 浏览器默认采用的iso—8859-1的编码,不支持中文

  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;
import java.io.PrintWriter;

@WebServlet("/demo08")
public class Demo08Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 这是一个网页
        //2. 告诉浏览器,服务器端使用的编码是什么
        //3. 设置响应体编码,代替了 response.setCharacterEncoding("utf-8")
        response.setContentType("text/html;charset=utf-8");
        //直接输出
        PrintWriter out = response.getWriter();
        out.print("时间管理大师");
    }

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

URL的编码和解码

为什么需要URL编码和解码

表单中提交汉字,使用GET提交,查看请求行的数据

username=%E5%BC%A0%E4%B8%89 使用的UTF-8编码,一个汉字占3个汉字
有关的方法
URL编码和解码有关的方法功能
URLEncoder.encode(“字符串”,“urf-8”)静态方法通过类名直接调用
URL编码
参数1:要编码的字符串
参数2:固定写成utf-8
URLDecoder.decode(“字符串”,“utf-8”)URL解码
参数1:要解码的字符串
参数2:固定写成utf-8
代码

package com.itheima.url;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class TestCode {

    public static void main(String[] args) throws UnsupportedEncodingException {
        //源字符串
        String str = "张三";
        //使用URL编码
        String encode = URLEncoder.encode(str, "utf-8");
        System.out.println("编码以后:" + encode);

        //使用URL解码
        String decode = URLDecoder.decode(encode, "utf-8");
        System.out.println("解码以后:" + decode);
    }

}

使用Servlet下载文件

下载设置的响应头

技术点,需要设置以下响应头才可以实现下载

设置响应头参数说明
Content-Disposition:
attachment; filename=文件名
Content-Disposition: 浏览器打开资源的方式
attachment: 表示以附件的方式下载,而不是打开
filename: 下载到浏览器端使用的文件名
步骤
  1. 从链接上得到文件名
  2. 设置content-disposition头
  3. 得到文件的输入流
  4. 得到response的输出流
  5. 写出到浏览器端
汉字乱码原理

在这里插入图片描述
注:IE、Chrome下载中文采用的是URL编码,注:FireFox不能采用这种方式。

下载的Servlet代码
package com.itheima.servlet;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.io.InputStream;
import java.net.URLEncoder;

@WebServlet("/down")
public class DownServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0.读取浏览器发送的请求数据
        String filename = request.getParameter("filename");
        System.out.println(filename);
        //1.获得上下文对象
        ServletContext application = getServletContext();
        //2.获取web-inf下目录的资源
        InputStream inputStream = application.getResourceAsStream("/WEB-INF/down/" + filename);
        //3.得到一个响应字节流
        ServletOutputStream outputStream = response.getOutputStream();
        //4,设置响应体中下载的格式
        response.setHeader("Content-Disposition","attachment; filename="+ URLEncoder.encode(filename,"utf-8"));
        //5.将得到的输入流,传入到输出流中
        IOUtils.copy(inputStream,outputStream);
        //6.关流
        inputStream.close();
        outputStream.close();

    }

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

    //5.将得到的输入流,传入到输出流中
    IOUtils.copy(inputStream,outputStream);
    //6.关流
    inputStream.close();
    outputStream.close();

}

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

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
servletresponse response 时间不一致可能是由于以下原因引起的。 首先,可能是由于服务器本身的性能或负载问题导致的。当服务器的负载较高或资源有限时,响应时间可能会增加。这可能会导致客户端与服务器之间的通信延迟,从而导致响应时间不一致。 其次,网络传输延迟也可能是造成响应时间不一致的原因之一。网络速度较慢或网络连接不稳定时,从服务器到客户端的响应时间可能会有所差异。这可能是由于网络拥塞、信号干扰或其他网络问题所致。 还有一种可能性是浏览器的差异性。不同的浏览器对相同的响应可能会有不同的处理方式,可能会影响响应时间的表现。这可能是由于浏览器的性能、缓存机制或其他相关因素所致。 最后,代码实现中的问题也可能导致响应时间不一致。例如,如果在处理请求时有耗时的操作,或者代码逻辑中存在缓存不一致或错误处理问题,都可能导致响应时间的不一致性。 为解决这个问题,可以采取以下措施: 1. 优化服务器性能,增加服务器资源,以减少服务器负载,提高响应时间的一致性。 2. 确保网络连接的稳定性,尽量选择较快速度和稳定性较好的网络环境。 3. 在代码实现中尽量避免耗时的操作,优化代码逻辑,减少响应时间的差异。 4. 提供兼容性考虑,针对不同的浏览器进行测试和优化。 5. 使用缓存技术,尽量减少请求的数据量和服务器端的处理操作,从而提高响应时间的一致性。 综上所述,servletresponse response 时间不一致可能是由于服务器性能、网络传输延迟、浏览器的差异性和代码实现的问题所致。通过优化服务器性能、提高网络连接稳定性、优化代码逻辑和考虑兼容性等措施,可以提高响应时间的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值