提交 8161727a 编写于 作者: W wizardforcel

2020-06-12 20:35:40

上级 d6fe0c5a
# Python OrderedDict – 有序字典
# Python `OrderedDict` – 有序字典
> 原文: [https://howtodoinjava.com/python/ordereddict-ordered-dictionary/](https://howtodoinjava.com/python/ordereddict-ordered-dictionary/)
**OrderedDict** **维护添加到字典中的项目的插入顺序**。 项目的顺序在迭代或序列化时也会保留。
`OrderedDict`**维护添加到字典中的项目的插入顺序**。 项目的顺序在迭代或序列化时也会保留。
## 1\. Python OrderedDict 示例
## 1\. Python `OrderedDict`示例
`OrderedDict`是 python 集合模块的一部分。
......@@ -32,7 +32,7 @@ for key in d:
```
## 2.将 OrderedDict 转换为 JSON
## 2.将`OrderedDict`转换为 JSON
项目的顺序在序列化为 JSON 时也会保留。
......
......@@ -4,7 +4,7 @@
Python 示例,用于查找 2 个或更多词典之间的常见项目,即字典相交项目。
## 1.使用“ &”运算符的字典交集
## 1.使用“`&`”运算符的字典交集
最简单的方法是查找键,值或项的交集,即使用两个字典之间的 `&` 运算符。
......@@ -18,9 +18,9 @@ set( a.items() ) & set( b.items() ) # Output set([('y', 2), ('x', 1)])
```
## 2.设置交集()方法
## 2.`Set.intersection()`方法
Set `intersection()`方法返回一个 set,该 set 包含 set a 和 set b 中都存在的项。
`Set.intersection()`方法返回一个集合,该集合包含集合`a`和集合`b`中都存在的项。
```java
a = { 'x' : 1, 'y' : 2, 'z' : 3 }
......@@ -43,6 +43,6 @@ for item in setA.intersection(setB):
```
请问有关**的问题,检查两个字典在 python 中是否具有相同的键或值**
请问有关**检查两个字典在 python 中是否具有相同的键或值**的问题
学习愉快!
\ No newline at end of file
......@@ -10,18 +10,18 @@ RxJava 看起来也像[观察者设计模式](https://howtodoinjava.com/design-p
Table of Contents
1\. What is RxJava and Reactive Programming
2\. RxJava 2 Dependency
2\. RxJava2 Dependency
3\. Transformation
4\. Conclusion
```
## 1.什么是 RxJava 和应式编程
## 1.什么是 RxJava 和应式编程
**反应式编程**是一个通用的编程术语,着重于对诸如数据值或事件之类的变化做出反应。 回调是命令式完成反应式编程的一种方法。
例如,如果您有一个数据源(生产者)和一个数据目标(消费者); 然后,在将消费者连接到订阅者之后,反应式编程框架负责将生产者生成的数据推送到消费者。 请注意,一个可观察对象可以有任意数量的订阅者。
让我们看一个非常基本的 **RxJava hello world 示例**
让我们看一个非常基本的 **RxJava helloworld 示例**
```java
package com.howtodoinjava.app;
......@@ -46,13 +46,13 @@ public class RxJava2Example
```
在上面的示例中,`"how", "to", "do", "in", "java"`可被视为事件流。 为这些事件创建了`observable`。 然后,我们创建一个可以对这些单词起作用的`consumer`- 在这种情况下,它只是将它们打印出来以供控制台使用。 该消费者不过是`subscriber`
在上面的示例中,`"how", "to", "do", "in", "java"`可被视为事件流。 为这些事件创建了`observable`。 然后,我们创建一个可以对这些单词起作用的`consumer` - 在这种情况下,它只是将它们打印出来以供控制台使用。 该消费者不过是`subscriber`
最后,我们使用`subscribe()`将订阅者连接到消费者。 一旦我们将两者连接起来,单词/事件就开始流动,订阅者开始在控制台中打印它们。
在代码内部,当从可观察对象发出新单词时,将在每个订阅者上调用`onNext()`方法。 当可观察的单词成功完成或出现错误时,将在订阅者上调用`onComplete()``onError()`方法。
## 2\. RxJava 2 依赖项
## 2\. RxJava2 依赖项
要将 RxJava 2.0 包含到项目运行时中,可以在给定的 maven 配置,gradle 配置或 jar 文件添加到类路径中进行选择。
......@@ -83,9 +83,9 @@ compile group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.0'
在 RxJava 中,订阅者从可观察到的事件类型与订阅者发出的事件类型不需要相同。 它们可以包含的数据,数据类型或接收到的事件和发出的事件之间的任何其他主要差异是不同的。
这是为源和目标之间的事件的中间*转换提供支持的必要条件,以便两者都能按其设计的方式工作并且仍然兼容。 与[适配器设计模式](//howtodoinjava.com/2014/05/10/adapter-design-pattern-in-java/)非常相似。*
这是为源和目标之间的事件的中间*转换*提供支持的必要条件,以便两者都能按其设计的方式工作并且仍然兼容。 与[适配器设计模式](//howtodoinjava.com/2014/05/10/adapter-design-pattern-in-java/)非常相似。
让我们举个例子。 在我们的 hello world 示例中,我们要以大写形式打印单词。 这是一个简单的转换,但是您会明白的。
让我们举个例子。 在我们的 helloworld 示例中,我们要以大写形式打印单词。 这是一个简单的转换,但是您会明白的。
```java
Observable<String> observable = Observable.just("how", "to", "do", "in", "java");
......@@ -116,6 +116,6 @@ observable.map(w -> w.toUpperCase().hashCode()).subscribe(consumer);
另外,您无需同时考虑可观察者和订阅者。 您可以使用最佳设计选择独立地开发它们,然后使用转换概念将它们连接起来。 太好了!
**RxJava 教程**是 RxJava 的**简介。 我将在即将到来的 **rxjava 初学者教程**中更深入地介绍与**反应式编程教程**相关的重要概念。**
**RxJava 教程**是 RxJava 的**简介**。 我将在即将到来的 **rxjava 初学者教程**中更深入地介绍与**反应式编程教程**相关的重要概念。
学习愉快!
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/servlets/complete-java-servlets-tutorial/](https://howtodoinjava.com/servlets/complete-java-servlets-tutorial/)
Servlet 是符合 Java Servlet API 的 Java 类,该 Java Servlet API 允许 Java 类响应请求。 尽管 Servlet 可以响应任何类型的请求,但最常见的是将其编写为响应基于 Web 的请求。 必须将 servlet 部署到 Java servlet 容器中才能使用。 尽管许多开发人员都使用诸如 [**Java Server Pages(JSP)**](https://en.wikipedia.org/wiki/JavaServer_Pages "jsp")[**Java Server Faces(JSF)**](https://en.wikipedia.org/wiki/JavaServer_Faces "jsf") 之类的 servlet 框架,但这两种技术 通过 servlet 容器将页面编译为后台的 Java servlet。 也就是说,Java servlet 技术的**基础知识对于任何 Java Web 开发人员都可能非常有用。**
Servlet 是符合 Java Servlet API 的 Java 类,该 Java Servlet API 允许 Java 类响应请求。 尽管 Servlet 可以响应任何类型的请求,但最常见的是将其编写为响应基于 Web 的请求。 必须将 servlet 部署到 Java servlet 容器中才能使用。 尽管许多开发人员都使用诸如 [**Java Server Pages(JSP)**](https://en.wikipedia.org/wiki/JavaServer_Pages "jsp")[**Java Server Faces(JSF)**](https://en.wikipedia.org/wiki/JavaServer_Faces "jsf")之类的 servlet 框架,但这两种技术通过 servlet 容器将页面编译为后台的 Java servlet。 也就是说,Java servlet 技术的**基础知识**对于任何 Java Web 开发人员都可能非常有用。
在本教程中,我们将涵盖以下主题,以全面了解 Java Servlet 技术。
......@@ -80,7 +80,7 @@ public class MyFirstServlet extends HttpServlet {
```
**要在 Web 容器上方注册上述 Servlet,您将为您的应用创建一个入口 web.xml 文件。**
**要在 Web 容器上方注册上述 Servlet,您将为您的应用创建一个入口`web.xml`文件。**
```java
<?xml version="1.0"?>
......@@ -109,21 +109,20 @@ public class MyFirstServlet extends HttpServlet {
Servlet 上面没有做一些重要的事情,您可能需要学习。
1. **MyFirstServlet 扩展了 HttpServlet** 。 这是强制性的,因为所有 servlet 必须是扩展`javax.servlet.GenericServlet`的通用 servlet 或扩展`javax.servlet.http.HttpServlet`的 HTTP servlet。
2. 覆盖`doGet()``doPost()`方法。 这些方法在`HttpServlet`类中定义。 每当 GET 或 POST 请求到来时,都会将其映射到其相应的方法,例如,如果您发送
3. 对此 Servlet 发出 HTTP GET 请求,然后调用`doGet()`方法。
还有一些其他有用的方法,您可以重写它们以在运行时控制应用,例如 `getServletInfo()`
4. `HttpServletRequest``HttpServletResponse`是所有 doXXX()方法的默认参数。 我们将在后面的部分中了解有关这些对象的更多信息。
1. `MyFirstServlet`扩展了`HttpServlet`。 这是强制性的,因为所有 servlet 必须是扩展`javax.servlet.GenericServlet`的通用 servlet 或扩展`javax.servlet.http.HttpServlet`的 HTTP servlet。
2. 覆盖`doGet()``doPost()`方法。 这些方法在`HttpServlet`类中定义。 每当 GET 或 POST 请求到来时,都会将其映射到其相应的方法,例如,如果您对此 Servlet 发出 HTTP GET 请求,然后调用`doGet()`方法。
3. 还有一些其他有用的方法,您可以重写它们以在运行时控制应用,例如`getServletInfo()`
4. `HttpServletRequest``HttpServletResponse`是所有`doXXX()`方法的默认参数。 我们将在后面的部分中了解有关这些对象的更多信息。
这就是您应该知道的简单 servlet 的全部内容。
## Servlet 生命周期方法
无论何时在您的应用中,都会加载并使用一个 servlet。 在该 Servlet 的初始化和销毁​​过程中发生了一系列事件。 这些被称为 servlet 的**生命周期事件(或方法)。 让我们详细了解它们。**
无论何时在您的应用中,都会加载并使用一个 servlet。 在该 Servlet 的初始化和销毁​​过程中发生了一系列事件。 这些被称为 servlet 的**生命周期事件(或方法)**。 让我们详细了解它们。
三种方法对于 Servlet 的生命周期至关重要。 它们是`init()``service()``destroy()`。 它们由每个 servlet 实现,并在运行时在特定时间调用。
1)在 Servlet 生命周期的初始化阶段, **Web 容器通过调用 init()方法**并传递实现`javax.servlet.ServletConfig`接口的对象来初始化 Servlet 实例。 此配置对象允许 Servlet 访问 Web 应用的 web.xml 文件中定义的名称 - 值初始化参数。 该**在该 Servlet 实例**的生存期内仅被调用一次。
1)在 Servlet 生命周期的初始化阶段, **Web 容器通过调用`init()`方法**并传递实现`javax.servlet.ServletConfig`接口的对象来初始化 Servlet 实例。 此配置对象允许 Servlet 访问 Web 应用的`web.xml`文件中定义的名称 - 值初始化参数。 它**在该 Servlet 实例**的生存期内仅被调用一次。
初始化方法的定义如下所示:
......@@ -134,7 +133,7 @@ public void init() throws ServletException {
```
2)初始化后,Servlet 实例可以为客户端请求提供服务。 **Web 容器针对每个请求**调用 servlet 的 service()方法。 `service()`方法确定发出的请求的类型,并将其分派给适当的方法以处理该请求。 Servlet 的开发人员必须提供这些方法的实现。 如果对不是由 Servlet 实现的方法提出了请求,则将调用父类的方法,通常会导致将错误返回给请求者。
2)初始化后,Servlet 实例可以为客户端请求提供服务。 **Web 容器针对每个请求**调用 servlet 的`service()`方法。 `service()`方法确定发出的请求的类型,并将其分派给适当的方法以处理该请求。 Servlet 的开发人员必须提供这些方法的实现。 如果对不是由 Servlet 实现的方法提出了请求,则将调用父类的方法,通常会导致将错误返回给请求者。
几乎在所有情况下都无需覆盖此方法。
......@@ -200,7 +199,7 @@ if (method.equals(METHOD_GET)) {
```
3)最后, **Web 容器调用 destroy()方法,该方法使 Servlet 退出服务**。 如果要在 Servlet 超出范围之前关闭或销毁某些文件系统或网络资源,则应调用此方法。 像 init()一样,`destroy()`方法在 Servlet 的生命周期中仅被调用一次。
3)最后, **Web 容器调用`destroy()`方法,该方法使 Servlet 退出服务**。 如果要在 Servlet 超出范围之前关闭或销毁某些文件系统或网络资源,则应调用此方法。 像`init()`一样,`destroy()`方法在 Servlet 的生命周期中仅被调用一次。
```java
public void destroy() {
......@@ -213,9 +212,9 @@ public void destroy() {
> **阅读更多:** [Web 服务器如何工作?](//howtodoinjava.com/for-fun-only/a-birds-eye-view-on-how-web-servers-work/ "A birds-eye view on “how web servers work?”")
## 使用@WebServlet 注释开发 Servlet
## 使用`@WebServlet`注释开发 Servlet
如果您不太喜欢 xml 配置,而是特别喜欢注释,那么 Servlets API 也可以。 您可以使用[`@WebServlet`](https://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html "WebServlet")注释,如下例所示,然后您无需在 web.xml 中进行任何输入。 **容器将自动将您的 servlet 注册到运行时,并像往常一样处理它**
如果您不太喜欢 xml 配置,而是特别喜欢注释,那么 Servlets API 也可以。 您可以使用[`@WebServlet`](https://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html "WebServlet")注释,如下例所示,然后您无需在`web.xml`中进行任何输入。 **容器将自动将您的 servlet 注册到运行时,并像往常一样处理它**
```java
package com.howtodoinjava.servlets;
......@@ -256,7 +255,7 @@ public class MyFirstServlet extends HttpServlet {
如果您不使用任何 IDE,那么您需要做一些额外的工作,例如从命令提示符下编译应用,使用 ANT 创建 WAR 文件等。但是我非常相信当今的每个人都使用一些 IDE 进行开发,因此我将 不要在本节中浪费更多时间。
当您在 tomcat 中部署我们的第一个 servlet 并在浏览器中访问 URL“ *http:// localhost:8080 / servletexamples / MyFirstServlet* ”时,您将获得以下响应。
当您在 tomcat 中部署我们的第一个 servlet 并在浏览器中访问 URL“`http://localhost:8080/servletexamples/MyFirstServlet`”时,您将获得以下响应。
![servlet example](img/3d2f85d593519a8775a34d6178f0bb30.png)
......@@ -323,7 +322,7 @@ public class CalendarServlet extends HttpServlet {
```
当您在 tomcat 中的 servlet 上方运行并在浏览器中访问 URL“ *http:// localhost:8080 / servletexamples / CalendarServlet* ”时,将得到以下响应。
当您在 tomcat 中的 servlet 上方运行并在浏览器中访问 URL“`http://localhost:8080/servletexamples/CalendarServlet`”时,将得到以下响应。
![dynamic content in servlet](img/f1587c9576277355f3796da26d79564a.png)
......@@ -331,7 +330,7 @@ public class CalendarServlet extends HttpServlet {
Servlet 使创建符合请求和响应生命周期的 Web 应用变得容易。 它们具有提供 HTTP 响应的能力,并且还可以在同一代码体内处理业务逻辑。 处理业务逻辑的能力使 servlet 比标准 HTML 代码强大得多。
在实际的应用中,HTML Web 表单包含发送到 Servlet 的参数。 然后,该 Servlet 以某种方式处理这些参数,并发布客户端可以看到的响应。 对于 HttpServlet 对象,客户端是 Web 浏览器,响应是 Web 页面。 <表单>动作属性指出应使用该属性来处理表单中包含的值。
在实际的应用中,HTML Web 表单包含发送到 Servlet 的参数。 然后,该 Servlet 以某种方式处理这些参数,并发布客户端可以看到的响应。 对于`HttpServlet`对象,客户端是 Web 浏览器,响应是 Web 页面。 `<form>`动作属性指出应使用该属性来处理表单中包含的值。
要获取请求参数,请调用`HttpServletRequest`对象的`getParameter()`方法,并传递您要获取的输入参数的 ID。
......@@ -393,17 +392,19 @@ protected void doGet(HttpServletRequest request,
若要向容器注册监听器,可以使用以下技术之一:
1)使用`@WebListener`注解。
2)在 web.xml 应用部署描述符中注册监听器。
2)在`web.xml`应用部署描述符中注册监听器。
3)使用在`ServletContext`上定义的`addListener()`方法。
请注意,`ServletContextListener`不是 servlet API 中的唯一列表器。 还有更多例如:
* javax.servlet.ServletRequestListener
* javax.servlet.ServletRequestAttrbiteListener
* javax.servlet.ServletContextListener
* javax.servlet.ServletContextAttributeListener
* javax.servlet.HttpSessionListener
* javax.servlet.HttpSessionAttributeListener
* `javax.servlet.ServletRequestListener`
* `javax.servlet.ServletRequestAttrbiteListener`
* `javax.servlet.ServletContextListener`
* `javax.servlet.ServletContextAttributeListener`
* `javax.servlet.HttpSessionListener`
* `javax.servlet.HttpSessionAttributeListener`
可以由您的列表器类根据您想听所有事件的选择来实现它们; 例如,每当创建或销毁新的用户会话时,都会通知`HttpSessionListener`
......@@ -442,9 +443,9 @@ String value = getServletConfig().getInitParameter("name");
Web 过滤器对于预处理请求和访问给定 URL 时调用某些功能很有用。 与其直接调用在给定 URL 上存在的 servlet,否则将在 servlet 之前调用任何包含相同 URL 模式的过滤器。 这在许多情况下可能是有用的,这对于执行日志记录,身份验证或在没有用户交互的情况下在后台进行的其他服务而言可能是最有用的。
过滤器必须实现`javax.servlet.Filter`接口。 此接口中包含的方法包括 **init(),destroy()和 doFilter()**。 容器调用 init()和 destroy()方法。 doFilter()方法用于实现过滤器类的任务。 如果要链接过滤器,或者给定 URL 模式存在多个过滤器,则将按照在 web.xml 部署描述符中对其进行配置的顺序来调用它们。
过滤器必须实现`javax.servlet.Filter`接口。 此接口中包含的方法包括`init()``destroy()``doFilter()`。 容器调用`init()``destroy()`方法。 `doFilter()`方法用于实现过滤器类的任务。 如果要链接过滤器,或者给定 URL 模式存在多个过滤器,则将按照在`web.xml`部署描述符中对其进行配置的顺序来调用它们。
要将 web.xml 文件配置为包含过滤器,请使用<过滤器><过滤器映射> XML 元素及其关联的子元素标签。
要将`web.xml`文件配置为包含过滤器,请使用`<filter>``<filter-mapping>` XML 元素及其关联的子元素标签。
```java
<filter>
......@@ -458,7 +459,7 @@ Web 过滤器对于预处理请求和访问给定 URL 时调用某些功能很
```
If you want to use annotation to configure filters for specific servlets, you can use `@WebFilte`r annotation.
如果要使用注释为特定的 servlet 配置过滤器,则可以使用`@WebFilter`注释。
## 使用 Servlet 下载二进制文件
......@@ -471,7 +472,7 @@ response.setHeader( "Content-Disposition", "attachment; filename=\"" + fileToDow
```
您可以通过调用`ServletContext.getResourceAsStream()`方法并传递文件路径来获取对要下载(存储在文件系统中)文件的引用。 这将返回一个`InputStream`对象,该对象可用于读取文件的内容。 然后创建一个字节缓冲区,该缓冲区将在读取文件时用于从文件中获取数据块。 最后的实际任务是读取文件内容并将其复制到输出流。 这是使用 while 循环完成的,该循环将继续从`InputStream`读取,直到处理完所有内容为止。 使用循环将数据块读入并写入输出流。 之后,将调用`ServletOutputStream`对象的 flush 方法以清除内容并释放资源。
您可以通过调用`ServletContext.getResourceAsStream()`方法并传递文件路径来获取对要下载(存储在文件系统中)文件的引用。 这将返回一个`InputStream`对象,该对象可用于读取文件的内容。 然后创建一个字节缓冲区,该缓冲区将在读取文件时用于从文件中获取数据块。 最后的实际任务是读取文件内容并将其复制到输出流。 这是使用`while`循环完成的,该循环将继续从`InputStream`读取,直到处理完所有内容为止。 使用循环将数据块读入并写入输出流。 之后,将调用`ServletOutputStream`对象的`flush`方法以清除内容并释放资源。
让我们看一下示例代码
......@@ -502,11 +503,11 @@ private void downloadFile(HttpServletRequest request, HttpServletResponse respon
```
## 使用 RequestDispatcher.forward()将请求转发到另一个 servlet
## 使用`RequestDispatcher.forward()`将请求转发到另一个 servlet
有时,您的应用要求 servlet 应该将请求移交给其他 servlet,以完成需要完成的任务。 此外,应在不将客户端重定向到另一个 URL 的情况下移交请求,即浏览器中的 URL 不应更改。
这样做的功能直接内置在`ServletContext`中,因此一旦获得对`ServletContext`的引用,就可以简单地调用`getRequestDispatcher()`方法来获取一个 RequestDispatcher 对象,该对象可用于分派请求。 调用`getRequestDispatcher()`方法时,传递一个字符串,其中包含要将您的请求传递到的 servlet 的名称。 获得`RequestDispatcher`对象后,通过将`HttpServletRequest``HttpServletResponse`对象传递给它来调用其前向方法。 转发方法执行移交请求的任务。
这样做的功能直接内置在`ServletContext`中,因此一旦获得对`ServletContext`的引用,就可以简单地调用`getRequestDispatcher()`方法来获取一个`RequestDispatcher`对象,该对象可用于分派请求。 调用`getRequestDispatcher()`方法时,传递一个字符串,其中包含要将您的请求传递到的 servlet 的名称。 获得`RequestDispatcher`对象后,通过将`HttpServletRequest``HttpServletResponse`对象传递给它来调用其前向方法。 转发方法执行移交请求的任务。
```java
RequestDispatcher rd = servletContext.getRequestDispatcher("/NextServlet");
......@@ -514,18 +515,18 @@ rd.forward(request, response);
```
## 使用 HttpServletResponse.sendRedirect()将请求重定向到另一个 servlet
## 使用`HttpServletResponse.sendRedirect()`将请求重定向到另一个 servlet
尽管在某些情况下,您不希望像上一节中所看到的那样通知用户 servlet 重定向已发生,但是在某些情况下,我们实际上希望发生这种情况。 当您访问应用中的特定 URL 时,您想将浏览器重定向到另一个 URL。
为此,您将需要调用`HttpServletResponse`对象的 sendRedirect()方法。
为此,您将需要调用`HttpServletResponse`对象的`sendRedirect()`方法。
```java
httpServletResponse.sendRedirect("/anotherURL");
```
This simple redirect, as opposed to servlet chaining, does not pass the `HttpRequest` object along to the target address.
与 servlet 链接相反,这种简单的重定向不会将`HttpRequest`对象传递到目标地址。
## 使用 Servlet 编写和读取 Cookie
......@@ -533,7 +534,7 @@ This simple redirect, as opposed to servlet chaining, does not pass the `HttpReq
要创建 cookie,只需实例化一个新的`javax.servlet.http.Cookie`对象并为其分配名称和值。 一旦实例化了 cookie,就可以设置将有助于配置 cookie 的属性。 在此食谱的示例中,调用了 cookie 的`setMaxAge()``setHttpOnly()`方法,设置了 cookie 的生存时间,并确保防止客户端脚本编写。
Since Servlet 3.0 API, the ability to mark a cookie as HTTP only has become available. This allows the cookie to be safeguarded against client-side scripting attacks, making the cookie more secure.
从 Servlet 3.0 API 开始,将 cookie 标记为仅 HTTP 的功能已变得可用。 这样可以保护 cookie 免受客户端脚本攻击,从而使 cookie 更加安全。
```java
Cookie cookie = new Cookie("sessionId","123456789");
......@@ -543,7 +544,7 @@ response.addCookie(cookie);
```
这里的响应是传递给 *doXXX()*方法的`HttpServletResponse`的实例。
这里的响应是传递给`doXXX()`方法的`HttpServletResponse`的实例。
要回读服务器父项上的 cookie 信息,请使用以下代码:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册