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

Java前端开发之HttpServletRequest的使用

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Java前端开发之HttpServletRequest的使用

接口详解

搭设基本测试环境

web 下新建 reg.html 文件,用作注册网页;

这里使用了 form 表单,注意提交的 action 是 根目录 + servlet的url;

请求方式我们使用 post

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
    />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <h1>用户注册</h1>
    <form action="/05/rds" method="post">
      username: <input type="text" name="username" /><br />
      password: <input type="password" name="password" /><br />
      <input type="submit" value="reg" />
    </form>
  </body>
</html>

在 web.xml 中把注册页面设置为欢迎页

<welcome-file-list>
    <welcome-file>reg.html</welcome-file>
</welcome-file-list>

新建测试 servlet,然后记得在 web.xml 中注册

package com.zhiyiyi.javaweb.servlet;
...
// 依旧使用HttpServlet接口
public class RequestDemoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <!-- 注册servlet -->
    <servlet>
        <servlet-name>requestDemoServlet</servlet-name>
        <servlet-class>com.zhiyiyi.javaweb.servlet.RequestDemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>requestDemoServlet</servlet-name>
        <url-pattern>/rds</url-pattern>
    </servlet-mapping>
    ...
</web-app>

取回 keys

因为我们在 reg.html 中使用 post 请求后端,携带的参数将以键值对的形式存在;

后端我们仅需重写 doPost 方法即可对前端请求作出响应;

代码内容和之前所学的一致,使用 getParameterNames 获取所有参数的 keys;

之后遍历以下输出所有 keys

public class RequestDemoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Enumeration<String> names = req.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            System.out.println(name);
        }
    }
}

取回 values

因为绝大多数情况下,我们均会知晓前端传入参数的 keys,即可以直接使用 key 获取对应的 value;

getParameter 如果一个 key 仅对应一个 value,使用此方法;

getParameterValues 若一个 key 对应多个 values,使用此方法返回一个字符串数组;

注意:无论你在前端传入的是什么样的数据类型,在后端所有的 keys 和 values 均为字符串形式!

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String username = req.getParameter("username");
    String[] password = req.getParameterValues("password");
    System.out.println(username);
    System.out.println(Arrays.toString(password));
}

请求域与应用域

应用域对象

  • servletcontext 对象
  • 缓存技术,如常量池、线程池、链接池

请求域对象

请求域的生命周期很短,作用范围仅一次请求;

请求结束后,请求域就会销毁;

请尽量控制对象的大小,以便适配请求域和应用域;

跳转与转发

转发一次请求

我们目前要实现的效果:

  • AServlet 把当前时间封装到 request 内并发送给 BServlet
  • BServlet 获取 AServlet 传递过来的 request,那到时间并输出

首先我们处理 BServlet 的代码:

使用 getAttribute 方法获取到 request 中存储的参数

public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取传递过来的参数
        Object time = req.getAttribute("systime");
        // 打印出来
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.println(time);
    }
}

之后处理 AServlet:

想要把当前 Servlet 中的 request 传递给下一个 Servlet 请按两步走:

  • 获取下一 Servlet 请求转发器对象 RequestDispatcher(getRequestDispatcher 中的参数填写下一 Servlet 的 url)
  • 调用 RequestDispatcher 的 forward 方法将 request 传递下去
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Date time = new Date();
        // 按照键值对的方式设置存储到request中的参数值
        req.setAttribute("systime", time);
        // 第一步:获取请求转发器对象RequestDispatcher
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/bs");
        // 第二步:调用forward方法将request传递下去
        requestDispatcher.forward(req, resp);
    }
}

一般我们会把转发过程浓缩为一行代码:

req.getRequestDispatcher("/bs").forward(req, resp);

事实上,你可以吧 AServlet 理解为一个中间件,而 forward 方法可以等同于 express.js 中的 next 方法

转发要求

转发目标不一定是 servlet,他可以是任意一个 tomcat 所承认的资源(譬如 html);

但请注意转发路径不可以包含项目名称!

譬如我在 web 下新建 login.html ,那么转发路径就是 /login.html

转发区别

getParameter 方法,获取的是由浏览器提交的表单的数据;

getAttribute 方法,获取的是请求域中绑定的数据;

request 常见方法

设置字符集

在 tomcat10 之前,默认字符集并非 UTF-8,直接使用 GET 或者 POST 获取到的数据都是乱码,所以需要手动设置;

修改请求 request 乱码问题:

req.setCharacterEncoding("UTF-8");

修改响应 response 乱码问题:

resp.setContentType("text/html;charset=UTF-8");

几种常见属性获取方式

// 动态获取应用根路径
String contextPath = req.getContextPath();
// 获取请求方式
String method = req.getMethod();
// 获取请求的URI
String requestURI = req.getRequestURI();
// 获取servlet路径
String servletPath = req.getServletPath();

到此这篇关于Java前端开发之HttpServletRequest的使用的文章就介绍到这了,更多相关Java HttpServletRequest内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

Java前端开发之HttpServletRequest的使用

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

下载Word文档

猜你喜欢

Java前端开发之HttpServletRequest的使用

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大
2023-01-05

从PHP后端到前端开发的转变之路

从PHP后端到前端开发的转变之路随着互联网技术的不断发展,前端开发在整个软件开发领域中的重要性日益凸显。许多从事PHP后端开发的工程师开始意识到学习前端开发的重要性,因此开始转变自己的技能方向。本文将深入探讨一个PHP后端开发工程师如何顺
从PHP后端到前端开发的转变之路
2024-03-12

前端开发中11个JS使用技巧

这篇“前端开发中11个JS使用技巧”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“前端开发中11个JS使用技巧”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入
2023-06-06

编程热搜

  • 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动态编译

目录