我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java Servlet响应httpServletResponse过程是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java Servlet响应httpServletResponse过程是什么

本篇内容主要讲解“Java Servlet响应httpServletResponse过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Servlet响应httpServletResponse过程是什么”吧!

    一、核心方法

    1.setStatus

    设置响应状态码 如果没有调用这个方法,默认返回200状态码(前提:正常执行,没有异常) 如果出现异常,返回500

    前端代码:

    <body>    <h4>设置响应头</h4>    <input type="text" id="status">    <br>    <button onclick="setStatus()">提交</button></body><script>    function setStatus(){        //js中发送请求:(1)ajax(2)直接修改url        let status = document.querySelector("#status");        //后端会设置文本框输入的值为响应状态码:严格来做需要验证(省略)        window.location.href = "response?status="+status.value;    }</script>

    后端代码:

    @WebServlet("/response")public class ResponseStudyServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //获取请求发送的queryString数据:status=xxx        String status = req.getParameter("status");        resp.setStatus((Integer.parseInt(status)));        resp.getWriter().write("设置响应状态码成功");    }}

    前端显示:

    Java Servlet响应httpServletResponse过程是什么

    提交后fiddler抓包:

    Java Servlet响应httpServletResponse过程是什么

    2.setHeader(String name,String value)

    设置响应头

    响应头name键已有,会覆盖原有的键值对

    前端代码:

    <h4>设置响应头</h4><a href="response" rel="external nofollow" >设置</a>

    后端代码:

    //设置响应头的键值对,键可以是标准的http响应头的键,也可以是自定义的//响应状态码是301,302,307,响应头有Location字段,才是重定向resp.setHeader("Location","http://www.baidu.com");resp.setHeader("username","张三");

    fiddler抓包结果:

    Java Servlet响应httpServletResponse过程是什么

    3.addHeader(String name,String value)

    设置响应头

    响应头name键已有,不会影响,添加一个新的

    这两个了解即可

    4.setContentType(String type)

    设置响应头Content-Type的值,等同于setHeader(“Content-Type”,String type) 因为Content-Type是标识body的数据格式,所以还需要设置body的内容

    响应一个网页

    //响应html:设置响应的Content-Typeresp.setContentType("text/html; charset=utf-8");

    可以返回静态和动态网页

    两种方式展示:

    前端代码:

    <body>    <h4>返回响应正文为简单的html</h4>    <a href="html?type=1" rel="external nofollow" >查看</a>    <h4>返回响应正文为复杂的html(动态变化的)</h4>    <input type="text" id="username" placeholder="输入姓名">    <br>    <button onclick="toWelcome()">跳转</button></body><script>    function toWelcome(){        let username = document.querySelector("#username");        window.location.href = "html?type=2&username="+username.value;    }</script>

    后端代码:

    @WebServlet("/html")public class HTMLTypeServlet extends HttpServlet {    //html?type=...    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //响应html:设置响应的Content-Type        resp.setContentType("text/html; charset=utf-8");        PrintWriter pw = resp.getWriter();        //获取queryString中,type的值        String type = req.getParameter("type");        if("1".equals(type)){//返回简单的html            pw.println("<h4>获取网页成功</h4>");        }else if("2".equals(type)){//返回复杂的动态html            //html?type=2&username=xxx            String username = req.getParameter("username");            pw.println("<p>");            pw.println("欢迎你,"+username);            pw.println("</p>");        }    }}

    简单:

    前端显示:

    Java Servlet响应httpServletResponse过程是什么

    点击“查看”:

    Java Servlet响应httpServletResponse过程是什么

    动态:

    前端显式:

    Java Servlet响应httpServletResponse过程是什么

    点击“跳转”:

    Java Servlet响应httpServletResponse过程是什么

    关于动态网页:在Java的代码中,写很多html的代码

    耦合性太强(两个完全不同的编程语言,放在一起来开发)、维护性、扩展性很差

    解决方式:

    • 模板技术

    • 这种方式还存在一些问题,进一步发展就有了ajax技术的产生

    二、响应一个网页

    返回已有的一个网页

    (1)重定向:

    特点:url地址栏会变,发起两次请求

    原理:

    第一次返回301/302/307响应状态码,及响应头Location:网页的地址

    第二次:浏览器自动的跳转到Location设置的地址

    还是比较常用的:比如登录成功(其实也可以在js代码中跳转)后,跳转到某个首页

    (2)转发:

    特点:url地址栏不变,只有一次请求

    原理:当次请求Servlet时,由Servlet获取到转发路径的html,把这个路径的内容设置到响应正文

    前端代码:

    <h4>重定向到hello.html</h4><a href="goto?type=1" rel="external nofollow" >跳转</a><h4>转发到hello.html</h4><a href="goto?type=2" rel="external nofollow" >跳转</a>

    后端代码:

    @WebServlet("/goto")public class GoToServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //goto?type=xxx        String type = req.getParameter("type");        if("1".equals(type)){//重定向//            resp.setStatus(301);//            resp.setHeader("Location","hello.html");            //以上代码可以简化为sendRedirect            resp.sendRedirect("hello.html");        }else if("2".equals(type)){//转发            req.getRequestDispatcher("hello.html")                    .forward(req,resp);        }    }}

    三、返回一个文件

    设置一下Content-Type,然后把文件的二进制数据放在响应正文就可以

    前端代码:

    <h4>获取一个图片(渲染展示)</h4><img class="lazy" data-src="file?type=photo&show=1"><h4>获取一个音乐(渲染展示)</h4><audio class="lazy" data-src="file?type=music&show=1" controls></audio><h4>获取一个图片(下载)</h4><a href="file?type=photo&show=0" rel="external nofollow" >下载</a><h4>获取一个音乐(下载)</h4><audio class="lazy" data-src="file?type=music&show=0" controls></audio>

    后端代码:

    @WebServlet("/file")public class FileServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //<img class="lazy" data-src="file?type=photo&show=1">        //获取响应对象的字节输出流        OutputStream os = resp.getOutputStream();        //返回的文件类型:1.图片 2.音乐        String type = req.getParameter("type");        //返回时的操作:1.渲染 2.下载        String show = req.getParameter("show");        File file = null;        byte[] data = null;        //<img class="lazy" data-src="file?type=photo&show=1">        if("photo".equals(type)){//返回图片            if("1".equals(show)){                resp.setContentType("image/jpeg");//jpg格式            }else{                //这样只是没有设置下载的文件名,有兴趣可以自行扩展完成                resp.setContentType("application/octet-stream");            }            file =new File("D:\\java\\servlet-study\\class="lazy" data-src\\main\\resources\\cui.jpg");            //<audio class="lazy" data-src="file?type=music&show=1" controls></audio>        }else if("music".equals(type)){//返回音乐            if("1".equals(show)){                resp.setContentType("audio/mp3");//mp3格式            }else{                resp.setContentType("application/octet-stream");            }            file = new File("D:\\java\\servlet-study\\class="lazy" data-src\\main\\resources\\这世界有那么多人.mp3");        }//其他格式可以自行扩展完成        //返回一个文件类型:Content-Length,body        data = Files.readAllBytes(file.toPath());        resp.setContentLength(data.length);//setHeader("Content-Length",xxx)        os.write(data);    }}

    问题:图片、音乐、视频是静态文件,直接放在web应用webapp下,就可以直接访问,那还需要Servlet来返回么?是否多此一举?

    如果文件总的大小非常大,放在web应用的webapp下就不合适了:打包就比较费劲,使用Servlet去读取本地其他地方的文件,来返回,就比较适合

    四、返回json数据

    常用于ajax请求,返回一些数据,用于动态的填充网页

    前端代码:

    <body>    <h4>获取ajax响应数据,动态生成网页内容</h4>    <button onclick="gen()">试试</button>    <div id="content"></div></body><script>    function gen(){        let content = document.querySelector("#content");        ajax({            url: "ajax-response",            method: "get",            callback: function(status,resp){                console.log(resp);//resp是一个字符串                //转换为json对象                let array = JSON.parse(resp);                for(json of array){//遍历                    //每一个json对象,创建一个dom来保存信息                    let p = document.createElement("p");                    p.innerHTML = json.from+" 对 "+json.to+" 说:"+json.info;                    content.appendChild(p);                }            }        });    }    function ajax(args){//var ajax = function(){}        let xhr = new XMLHttpRequest();        //设置回调函数        xhr.onreadystatechange = function(){            //4:客户端接收到响应后回调            if(xhr.readyState == 4){                // 回调函数可能需要使用响应的内容,作为传入参数                args.callback(xhr.status,xhr.responseText);            }        }        xhr.open(args.method,args.url);        // 如果args中,Content-Type属性有内容,就设置Content-Type请求头        if(args.contentType){//js中,除了判断boolean值,还可以判断字符串,对象等,有值就为true            xhr.setRequestHeader("Content-Type",args.contentType);        }        //如果args中,设置了body请求正文,调用send(body)        if(args.body){            xhr.send(args.body);        }else{//如果没有设置,调用send()            xhr.send();        }    }</script>

    后端代码:

    @WebServlet("/ajax-response")public class AjaxJsonServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        List<Message> messages = new ArrayList<>();        Message m1 = new Message("汪汪","喵喵","我喜欢你");        Message m2 = new Message("喵喵","汪汪","我喜欢你");        messages.add(m1);        messages.add(m2);        ObjectMapper mapper = new ObjectMapper();        //把Java对象,转换为一个json字符串,list和数组会转换为[],一个对象{成员变量名:值}        String json = mapper.writeValueAsString(messages);        //[{"from":"汪汪","to":"喵喵","info":"我喜欢你"},{"from":"喵喵","to":"汪汪","info":"我喜欢你"}]        System.out.println("转换的json字符串"+json);        //设置json可以不设置Content-Length,tomcat会设置        resp.setContentType("application/json; charset=utf-8");        resp.getWriter().println(json);    }    static class Message{        private String from;//谁        private String to;//对谁        private String info;//说了什么        public Message(String from, String to, String info) {            this.from = from;            this.to = to;            this.info = info;        }        public String getFrom() {            return from;        }        public void setFrom(String from) {            this.from = from;        }        public String getTo() {            return to;        }        public void setTo(String to) {            this.to = to;        }        public String getInfo() {            return info;        }        public void setInfo(String info) {            this.info = info;        }    }}

    点击“试试”:

    Java Servlet响应httpServletResponse过程是什么

    Java Servlet响应httpServletResponse过程是什么

    具体过程:

    Java Servlet响应httpServletResponse过程是什么

    对应可以使用的数据格式:

    Java Servlet响应httpServletResponse过程是什么

    到此,相信大家对“Java Servlet响应httpServletResponse过程是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java Servlet响应httpServletResponse过程是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java Servlet响应httpServletResponse过程是什么

    本篇内容主要讲解“Java Servlet响应httpServletResponse过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Servlet响应httpServletRe
    2023-06-29

    springboot响应json null值过滤方式是什么

    本篇内容介绍了“springboot响应json null值过滤方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!springboot
    2023-06-21

    Project Reactor响应式编程是什么

    这篇文章主要介绍了Project Reactor响应式编程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Project Reactor响应式编程是什么文章都会有所收获,下面我们一起来看看吧。什么是响应式编
    2023-07-05

    Spring5的Reactive响应式编程是什么

    本篇内容介绍了“Spring5的Reactive响应式编程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 什么是响应式编程一句话总结
    2023-06-29

    android应用启动过程是什么

    Android应用的启动过程可以分为以下几个步骤:1. 用户点击应用图标:用户在设备上点击应用图标,触发应用的启动。2. 系统启动应用进程:Android系统根据应用的包名,启动对应的应用进程。3. 应用进程初始化:应用进程启动后,会进行一
    2023-09-09

    Vue响应式流程及原理是什么

    本文小编为大家详细介绍“Vue响应式流程及原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue响应式流程及原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、组件化流程1. 整个new Vue
    2023-07-02

    java程序的编译过程是什么

    Java程序的编译过程分为以下几个步骤:1. 编写源代码:首先需要编写Java程序的源代码,源代码是以.java文件的形式存在,可以使用任何文本编辑器来编写。2. 编译源代码:使用Java编译器将源代码编译成字节码,字节码是一种中间代码,它
    2023-09-28

    Java程序的运行过程是什么

    本篇内容主要讲解“Java程序的运行过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序的运行过程是什么”吧!Java程序运行过程运行一个Java程序的步骤1、编辑源代码xxx.
    2023-07-05

    Linux应用程序开发过程是什么

    Linux应用程序开发过程通常包括以下步骤:1. 确定需求:明确应用程序的功能和目标,并确定用户需求。2. 设计架构:确定应用程序的结构和模块,并设计相应的架构。3. 编写代码:根据设计的架构,使用适当的编程语言编写代码。4. 调试和测试:
    2023-09-01

    JAVA类的加载过程是什么

    JAVA类的加载过程主要分为加载、链接和初始化三个阶段。加载:类加载是指将类的.class文件从文件系统或网络加载到内存中,并为之创建一个Class对象。类加载器通过类的全限定名来定位并读取对应的.class文件,并将其转换为字节码流,然后
    2023-10-26

    Java中jvm的执行过程是什么

    这期内容当中小编将会给大家带来有关Java中jvm的执行过程是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2.
    2023-06-14

    java类的加载的过程是什么

    Java类的加载过程包括以下步骤:加载(Loading):将类的字节码文件加载到内存中。这个阶段由类加载器完成,类加载器将字节码文件从磁盘或网络读取到内存,并创建一个对应的Class对象。验证(Verification):验证字节码文件的合
    java类的加载的过程是什么
    2023-10-28

    Java类的初始化过程是什么

    Java类的初始化过程包括以下几个步骤:加载类:当程序中使用到某个类时,Java虚拟机会先通过类加载器将该类的字节码文件加载到内存中。链接:链接是将被加载的类合并到Java虚拟机的运行时环境中的过程,包括验证、准备和解析三个阶段。验证:验证
    2023-10-26

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录