java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java HttpServletRequest

Java前端开发之HttpServletRequest的使用

作者:知奕奕

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

接口详解

搭设基本测试环境

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));
}

请求域与应用域

应用域对象

请求域对象

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

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

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

跳转与转发

转发一次请求

我们目前要实现的效果:

首先我们处理 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 请按两步走:

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文