【JavaWeb】Request对象详解

article/2025/8/30 8:27:58

HTTP之Request:接上一篇博文HTTP协议详细.

本文目录

    • 一.Request请求
      • 1.Request对象和Response对象的原理
      • 2.Request对象继承体系结构
      • 3.Request功能
        • 3.1 获取请求消息数据
        • 3.2 获取请求头数据
        • 3.3 获取请求体数据
      • 4.Request其它功能
        • 4.1 获取请求参数通用方式
          • 4.1.1 中文请求参数乱码问题
        • 4.2 请求转发
        • 4.3 共享数据
        • 4.4 获取ServletContext对象


一.Request请求

1.Request对象和Response对象的原理

  • request和response对象是由服务器创建的。我们来使用它们
  • request对象是来获取请求消息,response对象是来设置响应消息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBSeZsBR-1597939317911)(D:\文档存储\JAVA\技术路线\阶段2 JavaWeb+黑马旅游网\07 -Request和Respons\笔记图\request&response对象原理.bmp)]

2.Request对象继承体系结构

ServletRequest – 接口
| 继承
HttpServletRequest – 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat内部)


3.Request功能

3.1 获取请求消息数据

1.获取请求行数据

//请求行数据
GET /Http_war_exploded/RequestDemo1?name=dong HTTP/1.1

常用获取请求行数据的方法:通过request对象调用方法

  • String getMethod():获取请求方式get或post
  • String getContextPath():**(重点)**获取虚拟目录
  • String getServletPath():获取Servlet路径
  • String getQueryString():获取get方式所有请求参数
  • String getRequestURI():**(重点)**获取请求URI(统一资源标识符)
    例如:/Http_war_exploded/RequestDemo1、共和国,资源范围大
  • StringBuffer getRequestURL():获取请求URL(统一资源定位符)
    例如:http://localhost:8080/Http_war_exploded/RequestDemo1、中华人民共和国,资源范围小
  • String getProtocol():获取协议及版本
  • String getRemoteAddr():获取客户机的IP地址

代码演示:

先创建一个form表单用于提交数据

<form action="/Http_war_exploded/RequestDemo1" method="GET"><input name="username"><input type="submit" value="提交">
</form>

再创建访问的Servlet,在浏览器上访问创建的Servlet

@WebServlet(name = "RequestDemo1", urlPatterns = "/RequestDemo1")
public class RequestDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//1. 获取请求方式 :GETString method = request.getMethod();System.out.println(method);//2.(*)获取虚拟目录:/Http_war_explodedString contextPath = request.getContextPath();System.out.println(contextPath);//3. 获取Servlet路径: /RequestDemo1String servletPath = request.getServletPath();System.out.println(servletPath);//4. 获取get方式请求参数:username=dongString queryString = request.getQueryString();System.out.println(queryString);//5.(*)获取请求URI:/Http_war_exploded/RequestDemo1String requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println(requestURI);// /Http_war_exploded/RequestDemo1System.out.println(requestURL);// http://localhost:8080/Http_war_exploded/RequestDemo1//6. 获取协议及版本:HTTP/1.1String protocol = request.getProtocol();System.out.println(protocol);//7. 获取客户机的IP地址:0:0:0:0:0:0:0:1String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}
}

3.2 获取请求头数据

方法:

  • String getHeader(String name); (重点)通过请求头的名称获取请求头的值
  • Enumeration<String> getHeaderNames():获取所有的请求头名称的迭代器(与枚举类似)

代码演示1:获取所有请求头内容

@WebServlet(name = "RequestDemo2", urlPatterns = "/RequestDemo2")
public class RequestDemo2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 演示获取请求头数据*///1.获取所有请求头名称Enumeration<String> headerNames = request.getHeaderNames();//2.遍历while (headerNames.hasMoreElements()) {String name = headerNames.nextElement();//根据名称获取请求头的值String value = request.getHeader(name);System.out.println(name + "---" + value);}}
}

从浏览器访问http://localhost:8080/Http_war_exploded/RequestDemo2,控制台打印:

在这里插入图片描述

代码演示2:获取请求头数据中user-agent的内容,判断agent的浏览器版本

@WebServlet(name = "RequestDemo3", urlPatterns = "/RequestDemo3")
public class RequestDemo3 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 演示获取请求头数据中:user-agent* 如果请求头user-agent的内容中包含了谷歌的浏览器的关键字Chrome,就可以认为使用的是谷歌浏览器*/String agent = request.getHeader("user-agent");//判断agent的浏览器版本if(agent.contains("Chrome")){//谷歌System.out.println("谷歌来了...");}else if(agent.contains("Firefox")){//火狐System.out.println("火狐来了...");}}
}

代码演示3:获取请求头数据中referer的内容,防盗链应用,可以知道访问从哪里URL过来的。

比如我从一个login.html登录页面访问RequestDemo4,那么请求头中的referer的值就是:http://localhost:8080/Http_war_exploded/login.html,referer中包含正确的URI的内容/Http_war_exploded,就是正确访问。

如果从其它页面访问RequestDemo4referer中不会包含/Http_war_exploded,但是又能访问到RequestDemo4,这就属于盗链。我们要防止这种现象,防止山寨网站嘛。

referer的值为空的情况:比如直接在浏览器地址栏中直接输入http://localhost:8080/Http_war_exploded/RequestDemo4访问,referer的值就是null,因为它并没有从哪里来,直接访问,所以为null。

@WebServlet(name = "RequestDemo4", urlPatterns = "/RequestDemo4")
public class RequestDemo4 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 演示获取请求头数据中:referer*/String referer = request.getHeader("referer");System.out.println(referer);//http://localhost:8080/Http_war_exploded/login.html//防盗链if(referer != null ){//如果referer中包含正确的URI的内容,就是正确访问if(referer.contains("/Http_war_exploded")){//正常访问// System.out.println("播放电影....");response.setContentType("text/html;charset=utf-8");response.getWriter().write("播放电影....");}else{//盗链//System.out.println("想看电影吗?来优酷吧...");response.setContentType("text/html;charset=utf-8");response.getWriter().write("想看电影吗?来优酷吧...");}}}
}

在这里插入图片描述


3.3 获取请求体数据

请求体:只有POST请求方式,才有请求体,GET方式没有。在请求体中封装了POST请求的请求参数。

获取步骤

1.获取流对象

底层是通过IO流形式传递数据,方法有:

  • BufferedReader getReader():获取字符输入流,只能操作字符数据(包括中文)
  • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据(包括一些文件,图音视频),在文件上传知识点详细讲解。

2.再从流对象中拿数据

  • 读取数据使用读取相应IO流的方法即可

代码演示:

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/Http_war_exploded/RequestDemo5" method="post"><input name="username"><input type="submit" value="提交"></form><hr>
</body>
</html>

访问的Servlet类RequestDemo5

@WebServlet(name = "RequestDemo5", urlPatterns = "/RequestDemo5")
public class RequestDemo5 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 获取请求消息体中请求参数*///1.获取字符流BufferedReader br = request.getReader();//2.读取流中的数据String line =null;while ((line=br.readLine())!=null){System.out.println(line);}}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}
}

启动服务器,访问login.html,点击提交表单:

在这里插入图片描述

控制台打印
在这里插入图片描述



4.Request其它功能

4.1 获取请求参数通用方式

不论get还是post请求方式都可以使用下列方法来获取请求参数,所以get和post请求处理逻辑可以使用同一套代码:

  • String getParameter(String name):(重点)根据参数名称获取参数值,只能获取一个参数值。适合请求参数如:username=zs&password=123
  • String[] getParameterValues(String name):根据参数名称获取参数值的数组。 适合请求参数如:hobby=xx&hobby=game
  • Enumeration<String> getParameterNames():获取所有请求的参数名称
  • Map<String,String[]> getParameterMap(): (重点)获取所有参数的map集合

代码演示

register.html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/Http_war_exploded/RequestDemo6" method="post"><input type="text" placeholder="请输入用户名" name="username"><br><input type="text" placeholder="请输入密码" name="password"><br><input type="checkbox" name="hobby" value="game">游戏<input type="checkbox" name="hobby" value="study">学习<br><input type="submit" value="注册"></form>
</body>
</html>

访问的Servlet类

@WebServlet(name = "RequestDemo6", urlPatterns = "/RequestDemo6")
public class RequestDemo6 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** post 获取请求参数*///1.根据参数名称获取参数值String username = request.getParameter("username");//只能获取到一个参数值System.out.println("post");System.out.println(username);System.out.println("========================");//2.根据参数名称获取参数值的数组String[] hobbies = request.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}System.out.println("========================");//3.获取所有请求的参数名称Enumeration<String> parameterNames = request.getParameterNames();while (parameterNames.hasMoreElements()){String name = parameterNames.nextElement();String value = request.getParameter(name);System.out.println(name+"-->"+value);}System.out.println("========================");//4.获取所有参数的map集合//泛型是参数名称,参数值数组Map<String, String[]> parameterMap = request.getParameterMap();//遍历Set<String> keyset = parameterMap.keySet();for (String name : keyset) {//根据键获取值String[] values = parameterMap.get(name);System.out.println(name);for (String value : values) {System.out.println(value);}System.out.println("----------------");}}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** get获取请求参数*/this.doPost(request,response);}
}

启动服务器,访问register.html,点击注册提交表单:

在这里插入图片描述

控制台打印:

在这里插入图片描述


4.1.1 中文请求参数乱码问题

get方式:tomcat 8 内部已经将get方式乱码问题解决了,中文数据使用get请求方式不会乱码。

post方式:会乱码

  • 解决办法:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

代码演示

修改上面的register.html中表单,访问RequestDemo7。

@WebServlet(name = "RequestDemo7", urlPatterns = "/RequestDemo7")
public class RequestDemo7 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 设置流的编码* 需要与页面编码格式一致*///request.setCharacterEncoding("utf-8");//先注释掉,查看乱码问题//获取请求参数usernameString username = request.getParameter("username");System.out.println(username);}
}

点击注册,提交表单:

在这里插入图片描述

控制台出现乱码:

在这里插入图片描述

取消request.setCharacterEncoding("utf-8");的注释,重写启动服务器再次提交,乱码解决:

在这里插入图片描述


4.2 请求转发

请求转发:是一种在服务器内部的资源跳转方式。

在这里插入图片描述

请求包含

请求包含指的是使用include()方法将Servlet请求转发给其它Web资源进行处理,与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息。

从图中可以看出,当客户端访问Servlet1时,通过调用include()方法将其它Web资源包含了进来,这样,当请求处理完毕后,回送给客户端的响应结果既包含当Servlet的响应结果,也包含其它Web资源的响应结果。

使用步骤

  • 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  • 2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

请求转发的特点:

  • 1.浏览器地址栏路径不发生变化。
  • 2.只能转发到当前服务器内部资源中(静态和动态资源)。
  • 3.转发是一次请求。

代码演示

创建了两个Servlet类:RequestDemo8和RequestDemo9

现在从浏览器中访问RequestDemo8,服务器内部会请求转发到RequestDemo9。

@WebServlet(name = "RequestDemo8", urlPatterns = "/RequestDemo8")
public class RequestDemo8 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Demo8888被访问了。。。。");/*** 请求转发*///RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");//requestDispatcher.forward(request,response);//推荐使用链式编程,因为转发对象一般只使用一次request.getRequestDispatcher("/RequestDemo9").forward(request,response);}
}
@WebServlet(name = "RequestDem9", urlPatterns = "/RequestDemo9")
public class RequestDemo9 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 请求转发*/System.out.println("Demo9也被访问了。。。。");}
}

启动服务器,访问RequestDemo8:

在这里插入图片描述

控制台打印情况:

在这里插入图片描述


4.3 共享数据

概念:域对象和request域

域对象:一个有作用范围的对象,可以在范围内共享数据

request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

在这里插入图片描述

共享数据的方法

  • void setAttribute(String name,Object obj):存储数据,参数:
    String name:存储对象的名称,用于获取到存储的对象;
    Object obj:存储的对象;
  • Object getAttitude(String name):通过键获取值
  • void removeAttribute(String name):通过键移除键值对

代码演示

创建了两个Servlet类:RequestDemo8和RequestDemo9

现在从浏览器中访问RequestDemo8,服务器内部会请求转发到RequestDemo9。

在RequestDemo8中存储了数据到request域中,在RequestDemo9中获取存储的数据。

@WebServlet(name = "RequestDemo8", urlPatterns = "/RequestDemo8")
public class RequestDemo8 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Demo8888被访问了。。。。");/*** 共享数据* 存储数据到request域中*/request.setAttribute("msg","Hello");/*** 请求转发*///推荐使用链式编程,因为转发对象一般只使用一次request.getRequestDispatcher("/RequestDemo9").forward(request,response);}
}
@WebServlet(name = "RequestDem9", urlPatterns = "/RequestDemo9")
public class RequestDemo9 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 请求转发*/System.out.println("Demo9也被访问了。。。。");/*** 获取共享数据* 从request域中获取存储的数据*/Object msg = request.getAttribute("msg");System.out.println(msg);}
}

启动服务器,访问RequestDemo8,控制台打印情况:

在这里插入图片描述


4.4 获取ServletContext对象

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

获取方法

  • ServletContext getServletContext():获取servlet上下文对象

代码演示

@WebServlet(name = "RequestDemo10", urlPatterns = "/RequestDemo10")
public class RequestDemo10 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 获取ServletContext容器对象*/ServletContext servletContext = request.getServletContext();System.out.println(servletContext);//org.apache.catalina.core.ApplicationContextFacade@694468f2}
}

到这HTTP之Request对象细节结束,学无止境,每天都要全力以赴!

推荐阅读

  • HTTP协议详细.
  • HTTP之Request对象.
  • HTTP之Response对象.

欢迎点赞评论,指出不足,笔者由衷感谢哦!~


http://chatgpt.dhexx.cn/article/dGaMiEOU.shtml

相关文章

java基础教程:基础语法之术语和入口类(2)

我们上节课已经学会了如何安装java环境&#xff0c;编译和运行java代码。那么&#xff0c;java当中有哪些编程的语法规则呢&#xff1f; 我们会通过几节课来了解这部分内容。这几节课不会从面向对象的方向来解释java的语法&#xff0c;后面会单独介绍。 这节课我们了解如下两个…

【Java基础教程】(三十二)常用类库篇 · 第二讲:包装类 Wrapper Class——概念及用途, 自动装箱与拆箱,常用操作方法~

Java基础教程之常用类库 包装类 1️⃣ 概念2️⃣ 设计目的&#xff08;作用&#xff09;和用途3️⃣ 使用3.1 自动装箱与拆箱3.2 常用方法3.3 常用属性3.4 null和默认值 4️⃣ 注意事项&#x1f33e; 总结&#x1f4d1; 本文源码下载地址 1️⃣ 概念 在Java编程中&#xff0c…

java基础教程01讲:使用idea写第一个java程序

1、使用idea创建一个java、web项目&#xff0c;新安装的idea&#xff0c;第一次&#xff0c;打开如图下面的界面 选择第一个 2、如果不是第一次打开&#xff0c;就我们选择new---》project 3、点击下一步 再点击下一步 4、project name写项目名称、project location是代码存放…

grpc java 基础教程

1 RPC 框架原理RPC 框架的目标就是让远程服务调用更加简单、透明&#xff0c;RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#xff09;、序列化方式&#xff08;XML/Json/ 二进制&#xff09;和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者&a…

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇9、多线程篇10、IO篇11、网络编程篇12、集合体系篇13、JDBC篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01…

idea java 单元测试_Java基础教程:IDEA单元测试

Java基础教程&#xff1a;IDEA单元测试 环境配置 使用idea IDE 进行单元测试&#xff0c;首先需要安装JUnit 插件。 安装JUnit插件步骤 File-->settings-->Plguins-->Browse repositories-->输入JUnit-->选择JUnit Generator V2.0安装。 安装完成后需要重新启动…

【Java基础教程】标识符与关键字

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 标识符与关键字 标识符关键字…

【Java基础教程】用Java实现猜数字小游戏

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 &#x1f3c6;在本周获得了新…

【Java基础教程】详解Java三种流程控制语句

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker,新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点…

java基础教程:集合概述(27)

今天要讲的内容是集合。集合是我们编程时非常频繁的对象&#xff0c;必须花费大量时间学习。 我们还是从是什么和为什么两个角度进行引入。 集合是什么&#xff1f; 集合是存储和操作一组对象的对象。类似一个池子&#xff0c;可以存储操作一组元素。 为什么要有集合&#xf…

Java 零基础教程,看完就会,建议收藏

如果你不懂Java 并且想认真学习接触了解一下Java的语法&#xff0c;建议把这篇文章收藏了&#xff0c;多看几遍&#xff0c;应该可以初步掌握Java 大部分基础的语法 。 让我们出发吧&#xff01;ps:本文有点长&#xff0c;耐心阅读 。 〇&#xff0c;编程环境 工程项目推荐使…

找呀找呀找地铁

杭州地铁1号线据说2010年开通&#xff0c;还好下沙那边有地铁站&#xff0c;刚好在单位门口&#xff0c;不然在城区和这个鸟不生蛋的地方两头跑&#xff0c;可怎么活啊&#xff1f; 谁要以前不好好努力&#xff0c;多捞点钱呢&#xff1f;真是“老大徒伤悲”啊&#xff01;这个…

转载-高仙机器人落地北京杭州深圳多个城市地铁

你知道吗&#xff1f;世界上第一条地铁始建于1863年的伦敦&#xff0c;中国的地铁时代则在1969年的北京开启。 地铁作为黄金动脉&#xff0c;是衡量城市发展的关键指标之一。地铁不仅可以减少城市交通道路拥堵&#xff0c;带动周边地区发展&#xff0c;还可以减少环境污染&…

我国首个5G地铁站开通:TCL集团重组方案通过;苹果2019新品图泄露|雷锋早报...

我国首个5G地铁站在成都开通 近日&#xff0c;成都市政府新闻办发布消息称&#xff0c;全国首个5G地铁站&#xff08;地铁10号线太平园站&#xff09;已于1月5日在成都正式开通&#xff0c;该地铁站是全国第一个覆盖5G信号的地铁站&#xff0c;将成为四川移动对5G室内分布系统…

杭州治堵有“智慧” 阿里云数加激活城市大脑

城市车辆逐年增长&#xff0c;道路通行关系市民生活&#xff0c;也考验城市管理者智慧。除了加大基础设施投入&#xff0c;杭州对大数据的分析和应用成为治堵新发力点。在路网规划、精确治堵、科学调配资源等方面&#xff0c;都能看到“城市大脑”和大数据发挥的“智慧”作用。…

地铁一公里造价达7亿元,大部分城市无法回本,为何还抢着建?

最近几年我国各大城市兴起了一股地铁热&#xff0c;不管是大城市还是小城市&#xff0c;只要稍微符合条件的&#xff0c;很多城市都在纷纷规划建设地铁&#xff0c;目前包括已经有地铁在运营以及规划建设地铁的城市达到70个以上。 但是我们都知道&#xff0c;建地铁的成本是非常…

支付宝教会魔都地铁刷脸、扫码、懂人话

文/图 电商在线 朱婷 上午9点&#xff0c;小邵带着女朋友踏上了上海游玩的旅途。能顺利通过拥挤的地铁&#xff0c;是他们来到上海的第一个小愿望。 “我试一下宣传板上那个二维码。”看着高峰期买票的队伍&#xff0c;小邵不想让女朋友刚到&#xff0c;就在地铁口“罚站”。扫…

地铁与日本移动互联网

如果说中国的春运是每年全世界最大规模的人口迁徙&#xff0c;那么日本东京的上下班时间可能就是全球每天在发生的最大规模人口迁徙。 每天早上&#xff0c;日本人穿着整齐的西装&#xff0c;脚穿擦着发亮的皮鞋&#xff0c;提着公文包&#xff0c;整齐划一地挤上各种轨道交通工…

新华三:让地铁更智慧

当前&#xff0c;我国轨道交通正处于黄金发展期。国家发改委、交通运输部联合印发的《交通基础设施重大工程建设三年行动计划》指出&#xff1a;2016-2018年重点推进103个城市轨道交通项目前期工作&#xff0c;新建城市轨道交通2000公里以上&#xff0c;涉及投资约1.6万亿元。而…

云开发地铁路线图小程序源码和配置教程

☑️ 编号&#xff1a;ym415 ☑️ 品牌&#xff1a;无 ☑️ 语言&#xff1a;小程序 ☑️ 大小&#xff1a;580KB ☑️ 类型&#xff1a;地铁路线图 ☑️ 支持&#xff1a;小程序 &#x1f389; 欢迎关注(发消息才不限制)&#xff0c;私信&#xff0c;领取 &#x1f389; ✨ 源…