Java-Jsp-JSTL 痛定思痛。 2023-10-02 18:58 33阅读 0赞 学习JSTL前 必须会 EL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。 根据JSTL标签所提供的功能,可以将其分为5个类别。 ● 核心标签 ● 格式化标签 ● SQL 标签 ● XML 标签 ● JSTL 函数 #### JSTL 库安装 #### 需要的Maven <!-- jstl--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> 或者你手动配置jar jstl.jar 链接:https://pan.baidu.com/s/1GRDc4MdPn942DCAYei8K-w 提取码:1234 standard.jar 链接:https://pan.baidu.com/s/1Q3SY\_5kaZVrQlb4d9NdpXQ 提取码:1234 #### 核心标签 #### **使用任何库,你必须在每个JSP文件中的头部 包含对应的标签库。 否则JSTL失效** 核心标签是最常用的JSTL标签。引用核心标签库的语法如下: 需要导入 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 常用方法: <table> <thead> <tr> <th>标签</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><c:out></td> <td>用于在JSP中显示数据,就像<%= … ></td> </tr> <tr> <td><c:set></td> <td>用于保存数据</td> </tr> <tr> <td><c:remove></td> <td>用于删除数据</td> </tr> <tr> <td><c:catch></td> <td>用来处理产生错误的异常状况,并且将错误信息储存起来</td> </tr> <tr> <td><c:if></td> <td>与我们在一般程序中用的if一样</td> </tr> <tr> <td><c:choose></td> <td>本身只当做<c:when>和<c:otherwise>的父标签</td> </tr> <tr> <td><c:when></td> <td><c:choose>的子标签,用来判断条件是否成立</td> </tr> <tr> <td><c:otherwise></td> <td><c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行</td> </tr> <tr> <td><c:import></td> <td>检索一个绝对或相对 URL,然后将其内容暴露给页面</td> </tr> <tr> <td><c:forEach></td> <td>基础迭代标签,接受多种集合类型</td> </tr> <tr> <td><c:forTokens></td> <td>根据指定的分隔符来分隔内容并迭代输出</td> </tr> <tr> <td><c:param></td> <td>用来给包含或重定向的页面传递参数</td> </tr> <tr> <td><c:redirect></td> <td>重定向至一个新的URL.</td> </tr> <tr> <td><c:url></td> <td>使用可选的查询参数来创造一个URL</td> </tr> </tbody> </table> ##### <c:out> ##### <c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。举例来说,如果想要访问customer.address.street,只需要这样写:<c:out value=“customer.address.street”>。 <c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。 **语法格式** <c:out value="<string>" default="<string>" escapeXml="<true|false>"/> **属性** <c:out>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>value</td> <td>要输出的内容</td> <td>是</td> <td>无</td> </tr> <tr> <td>default</td> <td>输出的默认值</td> <td>否</td> <td>主体中的内容</td> </tr> <tr> <td>escapeXml</td> <td>解析xml</td> <td>否</td> <td>true</td> </tr> </tbody> </table> **程序示例** <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%--必须添加 否则 jstl标签失效--%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--开启EL 表达式--%> <%@page isELIgnored="false" %> <html> <head> <title></title> </head> <body> <c:out value="<a href='https://www.baidu.com/'>百度</a>" escapeXml="true" /><br/> <c:out value="<a href='https://www.baidu.com/'>百度</a>" escapeXml="false" /><br/> <c:out value="${null}" escapeXml="false" default="使用的表达式结果为null,则输出该默认值"/><br/> <c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/> </body> </html> 注意: default 添加默认值 当value为null时 必须使用EL表达式结果返回的值为null才会调用默认值 $\{null\} 有default 的情况下 标签的文本之间就 不能 写入<c:out >文本 </c:out> 否则报错 如果没有default value 为空的情况下 自动读取 标签文本 ##### <c:set> ##### <c:set>标签用于设置变量值和对象属性。 <c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。 这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。 **语法格式** <c:set var="<string>" value="<string>" target="<string>" property="<string>" scope="<string>"/> **属性** <c:set>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>value</td> <td>要存储的值</td> <td>否</td> <td>主体的内容</td> </tr> <tr> <td>target</td> <td>要修改的属性所属的对象</td> <td>否</td> <td>无</td> </tr> <tr> <td>property</td> <td>要修改的属性</td> <td>否</td> <td>无</td> </tr> <tr> <td>var</td> <td>存储信息的变量</td> <td>否</td> <td>无</td> </tr> <tr> <td>scope</td> <td>var属性的作用域</td> <td>否</td> <td>Page</td> </tr> </tbody> </table> 如果指定了target属性,那么property属性也需要被指定。 演示: 设置变量 <c:set var="name" value="hu" scope="page"/> <c:out value="${name}" escapeXml="false"/> 设置对象 <% javaBean bean=new javaBean(); request.setAttribute("bean",bean); %> <c:set target="${requestScope.bean}" property="name" value="胡"></c:set> target 对象 必须使用EL获取 (此对象必须在4大作用域里) property 对象内的属性名 自动会调用 set value 向 property 里的属性 赋值 <c:out value="${requestScope.bean.name}"></c:out> //胡 ##### <c:remove> ##### 删除指定作用域内的变量 如果没有指定作用域那么自动查找所有作用域 删除第一次出现的此变量这个标签不是特别有用,不过可以用来确保JSP完成清理工作。 **语法格式** <c:remove var="<string>" scope="<string>"/> **属性** <c:remove>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>var</td> <td>要移除的变量名称</td> <td>是</td> <td>无</td> </tr> <tr> <td>scope</td> <td>变量所属的作用域</td> <td>否</td> <td>所有作用域</td> </tr> </tbody> </table> 演示: <c:set var="salary" scope="session" value="${2000*2}"/> <p>salary 变量值: <c:out value="${salary}"/></p> <c:remove var="salary"/> <p>删除 salary 变量后的值: <c:out value="${salary}"/></p> ##### <c:catch> ##### <c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。 用的不多 因为一般异常都在后端处理完了 **语法格式** <c:catch var="<string>"> ... </c:catch> **属性** <c:catch>标签有如下属性: <table> <thead> <tr> <th>属性</th> <th>描述</th> <th>是否必要</th> <th>默认值</th> </tr> </thead> <tbody> <tr> <td>var</td> <td>用来储存错误信息的变量</td> <td>否</td> <td>None</td> </tr> </tbody> </table> 实例演示 <c:catch var ="catchException"> <% int x = 5/0;%> </c:catch> <c:if test = "${catchException != null}"> <p>异常为 : ${catchException} <br /> 发生了异常: ${catchException.message}</p> </c:if> ##### <c:if> ##### <c:if>标签判断表达式的值,如果表达式的值为真则执行其主体内容。 和 java if一样 **语法格式** <c:if test="<boolean>" var="<string>" scope="<string>"> ... </c:if> **属性** <c:if>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>test</td> <td>条件</td> <td>是</td> <td>无</td> </tr> <tr> <td>var</td> <td>用于存储条件结果的变量</td> <td>否</td> <td>无</td> </tr> <tr> <td>scope</td> <td>var属性的作用域</td> <td>否</td> <td>page</td> </tr> </tbody> </table> **演示实例** <c:set var="salary" scope="session" value="${2000*2}"/> <c:if test="${salary > 2000}"> <p>我的工资为: <c:out value="${salary}"/><p> </c:if> ##### <c:choose> <c:when> <c:otherwise> ##### 就和java中的 if else if … else 效果一样 <c:when> 如果都不满足那么就执行 <c:otherwise> **语法格式** <c:choose> <c:when test="<boolean>"/> ... </c:when> <c:when test="<boolean>"/> ... </c:when> ... ... <c:otherwise> ... </c:otherwise> </c:choose> 必须使用 <c:choose> 包裹 when 和 otherwise **属性** * <c:choose>标签没有属性。 * <c:when>标签只有一个属性,在下表中有给出。 * <c:otherwise>标签没有属性。 <c:when>标签的属性如下: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>test</td> <td>条件</td> <td>是</td> <td>无</td> </tr> </tbody> </table> **实例演示** <c:set var="salary" scope="session" value="${2000*2}"/> <p>你的工资为 : <c:out value="${salary}"/></p> <c:choose> <c:when test="${salary <= 2000}"> 太惨了。 </c:when> <c:when test="${salary >= 4000}"> 不错的薪水,还能生活。 </c:when> <c:otherwise> 什么都没有。 </c:otherwise> </c:choose> ##### <c:import> ##### <c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL。 举例来说,使用<c:import>标签可以读取同一个服务器下 任意站点的资源 。 但是返回的是文本类型 如果是页面那么就是源码 **语法格式** <c:import url="<string>" var="<string>" scope="<string>" varRender="<string>" context="<string>" charEncoding="<string>"/> **属性** <c:import>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>url</td> <td>需要检索和引入的页面的URL</td> <td>是</td> <td>无</td> </tr> <tr> <td>context</td> <td>/ 紧接着一个本地网络应用程序的名称</td> <td>否</td> <td>当前应用程序</td> </tr> <tr> <td>charEncoding</td> <td>所引入的数据的字符编码集</td> <td>否</td> <td>ISO-8859-1</td> </tr> <tr> <td>var</td> <td>用于存储所引入的文本的变量</td> <td>否</td> <td>Print to page</td> </tr> <tr> <td>scope</td> <td>var属性的作用域</td> <td>否</td> <td>Page</td> </tr> <tr> <td>varReader</td> <td>可选的用于提供java.io.Reader对象的变量</td> <td>否</td> <td>无</td> </tr> </tbody> </table> **实例演示** <c:import var="data" url="http://localhost:8081/java_Web/app.txt"/> <c:out value="${data}" escapeXml="true"/> ##### <c:forEach> <c:forTokens> ##### 区别就是 <c:forEach> 处理数组集合 <c:forTokens>处理字符串 这些标签封装了Java中的for,while,do-while循环。相比而言, <c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。 <c:forTokens>标签将字符串分隔为一个子串数组然后迭代它们。 **forEach 语法格式** <c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> ... </c:forEach> forTokens 语法格式 <c:forTokens items="<string>" delims="<string>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> ... </c:forTokens> **属性** <c:forEach>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>items</td> <td>要被循环的信息</td> <td>否</td> <td>无</td> </tr> <tr> <td>begin</td> <td>开始的元素(0=第一个元素,1=第二个元素)</td> <td>否</td> <td>0</td> </tr> <tr> <td>end</td> <td>最后一个元素(0=第一个元素,1=第二个元素)</td> <td>否</td> <td>Last element</td> </tr> <tr> <td>step</td> <td>每一次迭代的步长</td> <td>否</td> <td>1</td> </tr> <tr> <td>var</td> <td>代表当前条目的变量名称</td> <td>否</td> <td>无</td> </tr> <tr> <td>varStatus</td> <td>代表循环状态的变量名称</td> <td>否</td> <td>无</td> </tr> </tbody> </table> <c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>delims</td> <td>分隔符</td> <td>是</td> <td>无</td> </tr> </tbody> </table> **<c:forEach>实例演示** <c:forEach var="i" begin="1" end="5"> <c:out value="${i}"/><p> </c:forEach> 结果 1 2 3 4 5 遍历 集合 数组 <% String[] str={"a","b","c","d"}; request.setAttribute("str",str); %> <c:forEach var="i" items="${str}"> <c:out value="${i}"/><p> </c:forEach> **<c:forTokens>演示实例** <c:forTokens items="google,baidu,taobao" delims="," var="name"> <c:out value="${name}"/><p> </c:forTokens> ##### <c:url> <c:param> ##### <c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。 这个标签在需要的时候会自动重写URL。 var属性用于存储格式化后的URL。 <c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。 语法 <c:url var="<string>" scope="<string>" value="<string>" context="<string>"/> **属性** <c:url>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>value</td> <td>基础URL</td> <td>是</td> <td>无</td> </tr> <tr> <td>context</td> <td>本地网络应用程序的名称</td> <td>否</td> <td>当前应用程序</td> </tr> <tr> <td>var</td> <td>代表URL的变量名</td> <td>否</td> <td>Print to page</td> </tr> <tr> <td>scope</td> <td>var属性的作用域</td> <td>否</td> <td>Page</td> </tr> </tbody> </table> 演示 <a href="<c:url value="http://www.baidu.com"/>"> 这个链接通过 <c:url> 标签生成。 </a> <c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。 在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。 **语法格式** <c:param name="<string>" value="<string>"/> **属性** <c:param>标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>name</td> <td>URL中要设置的参数的名称</td> <td>是</td> <td>无</td> </tr> <tr> <td>value</td> <td>参数的值</td> <td>否</td> <td>Body</td> </tr> </tbody> </table> **程序示例** <c:url var="myURL" value="http://www.baidu.com"> <c:param name="name" value="hu"/> <c:param name="pass" value="123"/> </c:url> <a href="<c:out value="${myURL}"/>"> 使用 <c:param> 为指定URL发送两个参数。 </a> 结果 `https://www.baidu.com/?name=hu&pass=123` ##### <c:redirect> ##### <c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。 **语法格式** <c:redirect url="<string>" context="<string>"/> **属性** c:redirect标签有如下属性: <table> <thead> <tr> <th><strong>属性</strong></th> <th><strong>描述</strong></th> <th><strong>是否必要</strong></th> <th><strong>默认值</strong></th> </tr> </thead> <tbody> <tr> <td>url</td> <td>目标URL</td> <td>是</td> <td>无</td> </tr> <tr> <td>context</td> <td>紧接着一个本地网络应用程序的名称</td> <td>否</td> <td>当前应用程序</td> </tr> </tbody> </table> **实例演示** <c:redirect url="https://www.baidu.com/"/> #### 格式化标签 #### 需要导入 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 常用方法: <table> <thead> <tr> <th>标签</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><fmt:formatNumber></td> <td>使用指定的格式或精度格式化数字</td> </tr> <tr> <td><fmt:parseNumber></td> <td>解析一个代表着数字,货币或百分比的字符串</td> </tr> <tr> <td><fmt:formatDate></td> <td>使用指定的风格或模式格式化日期和时间</td> </tr> <tr> <td><fmt:parseDate></td> <td>解析一个代表着日期或时间的字符串</td> </tr> <tr> <td><fmt:bundle></td> <td>绑定资源</td> </tr> <tr> <td><fmt:setLocale></td> <td>指定地区</td> </tr> <tr> <td><fmt:setBundle></td> <td>绑定资源</td> </tr> <tr> <td><fmt:timeZone></td> <td>指定时区</td> </tr> <tr> <td><fmt:setTimeZone></td> <td>指定时区</td> </tr> <tr> <td><fmt:message></td> <td>显示资源配置文件信息</td> </tr> <tr> <td><fmt:requestEncoding></td> <td>设置request的字符编码</td> </tr> </tbody> </table> #### SQL标签 #### JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下: <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> 常用方法: <table> <thead> <tr> <th>标签</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><sql:setDataSource></td> <td>指定数据源</td> </tr> <tr> <td><sql:query></td> <td>运行SQL查询语句</td> </tr> <tr> <td><sql:update></td> <td>运行SQL更新语句</td> </tr> <tr> <td><sql:param></td> <td>将SQL语句中的参数设为指定值</td> </tr> <tr> <td><sql:dateParam></td> <td>将SQL语句中的日期参数设为指定的java.util.Date 对象值</td> </tr> <tr> <td><sql:transaction></td> <td>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行</td> </tr> </tbody> </table> #### XML 标签 #### JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下: <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> 在使用xml标签前,你必须将XML 和 XPath 的相关jar包也引入项目 需要映入Maven依赖 <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>xalan</groupId> <artifactId>xalan</artifactId> <version>2.7.1</version> </dependency> xercesImpl-2.11.0.jar 链接:https://pan.baidu.com/s/14khlmObKCV5dhVvaWaA4bg 提取码:1234 xalan-2.6.0.jar 链接:https://pan.baidu.com/s/17cN86\_epsNrxJq-N7ysEnA 提取码:1234 复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V4的分享 <table> <thead> <tr> <th>标签</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><x:out></td> <td>,与<%= … >,类似,不过只用于XPath表达式</td> </tr> <tr> <td><x:parse></td> <td>解析 XML 数据</td> </tr> <tr> <td><x:set></td> <td>设置XPath表达式</td> </tr> <tr> <td><x:if></td> <td>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体</td> </tr> <tr> <td><x:forEach></td> <td>迭代XML文档中的节点</td> </tr> <tr> <td><x:choose></td> <td><x:when>和<x:otherwise>的父标签</td> </tr> <tr> <td><x:when></td> <td><x:choose>的子标签,用来进行条件判断</td> </tr> <tr> <td><x:otherwise></td> <td><x:choose>的子标签,当<x:when>判断为false时被执行</td> </tr> <tr> <td><x:transform></td> <td>将XSL转换应用在XML文档中</td> </tr> <tr> <td><x:param></td> <td>与<x:transform>共同使用,用于设置XSL样式表</td> </tr> </tbody> </table> #### JSTL函数 #### JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <table> <thead> <tr> <th>函数</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>fn:contains()</td> <td>测试输入的字符串是否包含指定的子串</td> </tr> <tr> <td>fn:containsIgnoreCase()</td> <td>测试输入的字符串是否包含指定的子串,大小写不敏感</td> </tr> <tr> <td>fn:endsWith()</td> <td>测试输入的字符串是否以指定的后缀结尾</td> </tr> <tr> <td>fn:escapeXml()</td> <td>跳过可以作为XML标记的字符</td> </tr> <tr> <td>fn:indexOf()</td> <td>返回指定字符串在输入字符串中出现的位置</td> </tr> <tr> <td>fn:join()</td> <td>将数组中的元素合成一个字符串然后输出</td> </tr> <tr> <td>fn:length()</td> <td>返回字符串长度</td> </tr> <tr> <td>fn:replace()</td> <td>将输入字符串中指定的位置替换为指定的字符串然后返回</td> </tr> <tr> <td>fn:split()</td> <td>将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回</td> </tr> <tr> <td>fn:startsWith()</td> <td>测试输入字符串是否以指定的前缀开始</td> </tr> <tr> <td>fn:substring()</td> <td>返回字符串的子集</td> </tr> <tr> <td>fn:substringAfter()</td> <td>返回字符串在指定子串之后的子集</td> </tr> <tr> <td>fn:substringBefore()</td> <td>返回字符串在指定子串之前的子集</td> </tr> <tr> <td>fn:toLowerCase()</td> <td>将字符串中的字符转为小写</td> </tr> <tr> <td>fn:toUpperCase()</td> <td>将字符串中的字符转为大写</td> </tr> <tr> <td>fn:trim()</td> <td>移除首位的空白符</td> </tr> </tbody> </table> ![在这里插入图片描述][e2af4607da624cff9e7bf546663eaa91.gif] 点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^\_^ ![ceaefc422a4745479fc1e8cfd2bdb74e.jpg][] [e2af4607da624cff9e7bf546663eaa91.gif]: https://img-blog.csdnimg.cn/e2af4607da624cff9e7bf546663eaa91.gif [ceaefc422a4745479fc1e8cfd2bdb74e.jpg]: https://img-blog.csdnimg.cn/ceaefc422a4745479fc1e8cfd2bdb74e.jpg
还没有评论,来说两句吧...