Servlet请求和响应

Canoe Panel基础功能介绍 CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值 阅读详情

Servlet请求

Servlet请求对应的是ServletRequest对象,它有一个子类HttpServletRequet基于Http协议的规则对请求数据进行了封装。我们可以使用HttpServletRequet对象的方法来获取请求数据,来完成功能的开发。

1.获取路径的方法

public String getContextPath()
    获取虚拟目录路径
public String getServletPath()
    获取Servlet的映射路径
public String getRemoteAddr()
    获取访问者的ip地址
public String getQueryString()
    获取请求的消息数据
public String getRequestURI()
    获取统一资源标识符
public String getRequestURL()
    获取统一资源定位符
@WebServlet("/servletRequestDemo1")
public class ServletRequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取虚拟目录
        String contextPath = req.getContextPath();
        System.out.println("虚拟目录:"+contextPath); 

        //获取Servlet映射路径
        String servletPath = req.getServletPath();
        System.out.println("servlet访问路径:"+servletPath);

        //获取访问者ip地址: 
        String remoteAddr = req.getRemoteAddr();
        System.out.println("访问者ip:"+remoteAddr);

        //获取统一资源标识符
        String requestURI = req.getRequestURI();
        System.out.println("资源标识符:"+requestURI);

        //获取统一资源定位符
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("统一资源定位符:"+requestURL);
    }

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

2.获取请求头信息

请求头是浏览器告诉服务器的一些请求配置信息,以键值对的形式存在。

public String getHeader(String name)
    获取一个请求头的值
public Enumeration<String> getHeaders(String name)
    获取一个请求头的多个值
public Enumeration<String> getHeadNames()
    获取所有请求头名称
@WebServlet("/servletRequestDemo2")
public class ServletRequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取一个请求头
        String connection = req.getHeader("connection");
        System.out.println(connection);
        System.out.println("----------------");

        //获取一个请求头的多个值
        Enumeration<String> values = req.getHeaders("accept-encoding");
        while (values.hasMoreElements()) {
            String value = values.nextElement();
            System.out.println(value);
        }

        System.out.println("------------");

        //获取所有的请求头名称
        Enumeration<String> headerNames = req.getHeaderNames();
        //遍历请求头名称,根据名称获取值
        while (headerNames.hasMoreElements()) {
            String headName = headerNames.nextElement();
            String headValue = req.getHeader(headName);
            System.out.println(headName+"="+headValue);
        }
    }

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

3.获取请求参数信息

public String getParameter(String name)
    根据参数名获取一个参数值
public String[] getParameterValues(String name)
    根据参数名获取多个参数值
public Enumeration<String> getParameterNames()
    获取所有的参数名称
public Map<String,String[]> getParameterMap()
    获取所有的参数名和参数值,并封装为Map集合

创建一个regist.html页面(参考源代码),然后使用Servlet获取参数信息

@WebServlet("/servletRequestDemo3")
public class ServletRequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //根据参数名获取参数指
        String username = req.getParameter("username");
        System.out.println("姓名:"+username);

        //根据参数名获取多个值
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println("爱好:"+ Arrays.toString(hobbies));
        System.out.println("---------");
        
        //获取所有的参数名称
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            String[] values = req.getParameterValues(parameterName);
            System.out.println(parameterName+":"+Arrays.toString(values));
        }
        System.out.println("----------");

        //获取所有的参数名和参数指,存入一个Map集合
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<String> keys = parameterMap.keySet();
        for (String key : keys) {
            String[] values = parameterMap.get(key);
            System.out.println(key+"="+Arrays.toString(values));
        }
    }

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

4.请求数据封装对象

需要用到beanutils工具类,把jar包复制到web/WEB-INF/libs目录下

@WebServlet("/servletRequestDemo5")
public class ServletRequestDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取所有的参数名和参数指,存入一个Map集合
        Map<String, String[]> parameterMap = req.getParameterMap();
        Student stu=new Student();
        try {
            BeanUtils.populate(stu,parameterMap);
            System.out.println(stu);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

5.请求数据乱码解决

//设置请求字符编码
req.setCharacterEncoding("utf-8");

6.请求转发-请求域

当客户端请求一个Servlet1时,Servlet1可以将请求转发给Servlet2,同时可以转发过程中共享数据。多次转发形成的一条请求链,叫做请求域。可以在请求域访问内共享数据。

在Servlet7中设置共享数据

@WebServlet("/servletRequestDemo7")
public class ServletRequestDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");

        //设置请求参数
        req.setAttribute("user","李四");
        req.getRequestDispatcher("/servletRequestDemo8").forward(req,resp);
    }

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

在Servlet8中获取共享数据

@WebServlet("/servletRequestDemo8")
public class ServletRequestDemo8 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");

        //获取请求共享数据
        Object user = req.getAttribute("user");
        System.out.println(user);
    }

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

Servlet响应

浏览器访问服务器后,服务器给客户端响应的数据会封装为ServletResponse对象,它有一个子类叫HttpServletResponse对象,用于封装按照Http协议封装的响应数据。

1.响应状态码

状态码状态
100只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求
200请求成功
302重定向,所请求的页面已经临时转移到一个新的 URL
304访问缓存,所请求的页面已经临时转移到一个新的 URL
404客户端错误,请求路径服务器没有对应的资源
405客户端错误,请求方式找不到对应的方法
500服务端错误,可能服务器内部有异常

2.响应数据乱码解决

//设置响应编码
resp.setContentType("text/html;charset=utf-8");

使用字符流响应数据

@WebServlet("/servletResponseDemo1")
public class ServletResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");
        //输出响应数据
        resp.getWriter().println("<h1>你好,这是一个响应消息</h1>");
    }

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

使用字节流响应数据

@WebServlet("/servletResponseDemo2")
public class ServletResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");
        //输出响应数据
        ServletOutputStream outputStream = resp.getOutputStream();
        outputStream.write("你好世界".getBytes("utf-8"));
    }

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

3.响应图片

在web/img目录下放一张a.jpeg图片,把图片中所有的字节响应给客户端。

@WebServlet("/servletResponseDemo3")
public class ServletResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取输出流对象
        ServletOutputStream out = resp.getOutputStream();
        //获取文件的绝对路径
        String imgPath = getServletContext().getRealPath("img/a.jpeg");
        //获取输入流对象
        FileInputStream fis = new FileInputStream(imgPath);
        byte[] bs=new byte[1024];
        int len;
        while ((len=fis.read(bs))!=-1){
            out.write(bs,0,len);
        }
        fis.close();
    }

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

5.设置定时刷新

@WebServlet("/servletResponseDemo5")
public class ServletResponseDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Refresh","3;url=/day03_Servlet/login.html");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("你好世界 三秒钟跳转到登录页面");
    }

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

6.重定向

重定向和请求转发不太一样,请求转发是只有一个请求,而重定向有两次请求。所以重定向不能通过请求域共享数据,只有在同一个请求链中才能通过请求域中心数据。

@WebServlet("/servletResponseDemo6")
public class ServletResponseDemo6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //重定向到servletResponseDemo5
        //resp.sendRedirect(req.getContextPath()+"/servletResponseDemo5");

        //也可以使用下面两个方法,完成重定向;302表示重定向的状态码
        resp.setStatus(302);
        resp.setHeader("location",req.getContextPath()+"/servletResponseDemo5");
    }

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

7.文件下载

写一个html页面,点击图片开始下载

<a href="/day03_Servlet/servletResponseDemo7">点击下载图片</a> 

写以Servlet处理下载的请求,给客户端响应一张图片

@WebServlet("/servletResponseDemo7")
public class ServletResponseDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //准备要下载的图片
        File file=new File("img/a.jpeg");

        //设置响应头,告诉浏览器以附件形式接受
        resp.setHeader("content-disposition","attachment;filename="+file.getName());

        //获取输出流对象
        ServletOutputStream out = resp.getOutputStream();
        //获取文件的绝对路径
        String imgPath = getServletContext().getRealPath(file.getPath());
        //获取输入流对象
        FileInputStream fis = new FileInputStream(imgPath);
        byte[] bs=new byte[1024];
        int len;
        while ((len=fis.read(bs))!=-1){
            out.write(bs,0,len);
        }
        fis.close();
    }

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

2025年5月架构设计师论文真题回顾,附写作技巧、所涉知识点及参考范文(三) 本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试下午论文的题目,同时附带写作技巧、所涉知识点及参考范文。试题三:多模型数据库及应用。 阅读详情

相关推荐

Springboot项目中使用邮箱验证码注册登录的代码实现

本文介绍了在Spring Boot应用中实现邮箱验证码注册和登录功能的完整方案。文章首先概述了三种用户认证方式(邮箱验证码注册/登录和传统密码登录),然后详细说明了实现所需的技术栈(Spring Boot、Spring Security、JWT等)。重点阐述了邮件服务配置、验证码生成与存储的核心实现,包括QQ邮箱授权码获取、Thymeleaf邮件模板处理以及验证码缓存管理。最后展示了发送验证码和用户注册的API实现,为开发者提供了完整的参考方案。该方案兼顾安全性和用户体验,适合现代Web应用的用户认证需求。

BXCQ_xuan的技术专栏 | 实战干货·实践教程·学习笔记 1339

Servlet请求响应

转发与重定向是实现页面跳转的2种不同方式;这两种方式分别对应 request 对象和 response 对象;请求转发:request.getRequestDipachter(“页面/请求”).forward(req,resp);重定向: response.sendRedirect(“url”);① 发生的位置不同,重定向是浏览器行为,请求转发时服务器行为② 请求转发浏览器的地址栏不会发生变化,不管服务器转发多少次;重定向浏览器地址栏会发生变化,最终显示为最后一次重定向的地址;

qq_54525448的博客 1201

SiC MOSFET驱动设计实战:从特性解析到电路优化

本文深入解析SiC MOSFET的核心特性及其驱动电路设计要点,涵盖高温稳定性、快速开关能力等关键特性,并提供驱动电压配置、电流能力计算、布局优化等实用方案。特别针对第三代电力电子半导体SiC MOSFET的驱动要求,分享STGAP1AS等典型驱动方案的应用技巧,助力工程师解决高频应用中的EMI和热管理挑战。

weixin_29230865的博客 365

Servlet也能响应图片了,快来看看吧

但是图片的加载,并没有存放在前端代码中,而是通过后端代码,从本地读取图片。write()方法是可以接收字节数组的,创建字节数组,可以使每次循环加载时,都加载1000个字节数,提高加载效率。resp.getOutputStream()方法,用于输出字符流数据或者二进制的字节流数据。此时图片会在页面上响应出来,但是效果是从上往下逐帧加载的,并不是一下子显示出来。不一样的只是图片的地址,我们如果将图片地址修改为参数,那么就可以封装成一个工具类。通过上诉代码的编写,已经可以发现,图片加载的流程都是一样的。

m0_61096949的博客 726

IDEA 导入 jbolt项目(实验室非公开项目)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录准备一、准备数据库二、IDEA导入jbolt项目 准备 在实验室群文件中下载jbolt.zip和mysql.sql两个文件 将其解压到自己的目录下 一、准备数据库 打开Navicat新建一个jbolt数据库(字符集为utf8) 导入mysql.sql文件 数据库导入完毕 二、IDEA导入jbolt项目 点击打开一个项目 选择jbolt文件夹 以Maven形式打开 打开pom.xml 在里面添加jetty-server依赖

weixin_44094842的博客 973

MTK PE+2.0介绍

  PE+2.0介绍:   1.      PE+2.0的状态机: 2.      升压波形协议及编码规则: PE+2.0软件设计:   在充电器类型为标充且底层电量SOC在1%—95%之间时,开始PE+2.0升压充电器的检测:首先将VBUSreset至5V,之后发送8.5的current pattern再获取此时VBUS电压和8.5V比较,若其与8.5的差值绝对值在0.5之...

raydom07的博客 1万+

POST和GET

比较 GET 与 POST 下面的表格比较了两种 HTTP 方法:GET 和 POST。 GET POST 后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 书签 可收藏为书签 不可收藏为书签 缓存 能被缓存 不能缓存 编码类型 application/x-www-form-urlencoded application/x-w

u011163372的博客 451

Transformer实战(33)——高效自注意力机制

在本节中,我们学习了如何在硬件资源受限的情况下减轻运行大模型的负担,介绍了高效的稀疏 Transformer 模型,通过近似技术(如 Linformer、BigBird 和 Performer) 用稀疏矩阵替代全自注意力矩阵。并观察它们在各种基准测试中的表现,例如计算复杂度和内存复杂度。结果表明,这些方法可以在不牺牲性能的情况下将平方级复杂度降低到线性复杂度。

盼小辉丶的博客 3025

Servlet接口中的方法及说明

Servlet接口中的方法及说明

ice_cream__的博客 1764

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A错误码

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A DC报错 ///////////////////////////////////////////////////////////////////////////////////////// /** \brief Checks communication and synchronisation variables and update AL status / AL status code if an error has occurr

PI_sunyang的博客 5304

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2336

Servlet的请求和响应

1、Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。 针对Servlet的每次请求,Web服务器在调用service()方法之前,都会创建两个对象: HttpServletRequest用于封装HTTP请求消息,简称request对象。 HttpServletResponse用于封装HTTP响应消息,简称response对象。 request对象和response对象在请求Servlet过程中至关重要。 2、HttpServletResponse接口 (1)HttpServletRe

qq_43575044的博客 3155

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Servlet及Servlet处理HTTP请求和响应的方法

Servlet Java Servlet 是运行在Web 服务器或应用服务器上的程序. 其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,我们将Servlet理解为后者。 Servlet常用API(了解): javax.servlet:其中包含定义Servl...

长不大的大灰狼 6838

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

servlet的请求转发和响应重定向

请求转发(Request Forwarding):请求转发是指服务器端将请求从一个 Servlet 转发到另一个 Servlet、JSP 页面或 HTML 页面,整个过程在服务器内部进行,对于客户端来说,只发送了一次请求,地址栏的 URL 不会发生改变。 响应重定向(Response Redirect):响应重定向是指服务器向客户端发送一个特殊的响应,告诉客户端重新发送一个新的请求到另一个 URL,客户端收到这个响应后,会自动向新的 URL 发送请求,这会导致地址栏的 URL 发生改变

weixin_51395608的博客 1604

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

servlet中请求和响应,转发和重定向

HttpServletRequest对象、HttpServletResponse对象、转发、重定向、请求、响应

yu的博客 1113

Servlet入门——详解Servlet和Servlet的请求与响应

本文需要先在IDEA中集成Maven,本文需要使用Maven构建web项目,并且需要Maven导入依赖坐标来便捷地导包。同时需要自行配置Tomcat9(目前官网下载的最低版本已经是9了)或者在Maven中构建Tomcat7的插件,推荐直接使用插件,亲测Tomcat9可能会导致编码异常问题(即使用UTF-8编码后解码也会出现中文乱码)。如果对于Maven的配置出现加载缓慢或者无法创建的情况,创建web项目时Tomcat出现配置时没有工件可供选择,请查看文章:关于用Maven创建web项目极其缓慢,IDEA新版

Rookiebird829的博客 890

Servlet的请求和响应对象

Servlet req.setAttribute() 在request域中存储数据 re

weixin_61006312的博客 447

【java web篇】Servlet处理请求和响应

web开发最重要的之一不就是处理请求与响应吗,那么这节就来总结Servlet是如何处理的,在请求与响应这块基本都差不多,浅浅的过一下!

阿牛的博客 4976

Servlet之请求转发和响应重定向

多个servlet之间的跳转有两种方式: - 请求转发:request.getRequestDispatcher("转发路径").forward(request, response); - 响应重定向:response.sendRedirect("转发路径 ");

想好了就去做吧 即便失败了 至少这条路上留下了你的脚印 1035

Servlet技术,请求和响应

简介 servle是一个Sun公司提供的接口。servlet是一种实现了servlet接口的类,它是由Web容器负责创建并使用,用于接收和响应用户的请求。servlet中有五个抽象方法。 Servlet public class DemoServlet implements Servlet { @Override public void init(ServletConfig ser...

Voldemorts的博客 529

Servlet+JSP(八):Servlet的请求和响应处理

Servlet+JSP(八):Servlet的请求和响应处理 通过前面的学习我们能够创建并运行一个简单的Servlet 程序,完成浏览器和服务器的简单交互,但是我们编写的 Servlet代码是没有对浏览器的请求进行处理的。现在我们开始学习 如何使用Servlet进行浏览器请求的处理。 Request对象: 问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。 那么服务...

樊凯的博客 897

简单的Servlet请求和响应

简单的Servlet请求和响应 登录服务LoginServletJava代码 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.servlet.ServletException; import

weixin_45750969的博客 381
上一篇: Servlet基本使用
下一篇: Cookie和Session
Figure_TheKeyboard
博客等级 码龄5年 6粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值