整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Java Web輕松學41 - JSTL初步使用

          Java Web輕松學41 - JSTL初步使用
          本系列文章旨在記錄和總結(jié)自己在Java Web開發(fā)之路上的知識點、經(jīng)驗、問題和思考,希望能幫助更多(Java)碼農(nóng)和想成為(Java)碼農(nóng)的人。
          

          1. 介紹
          2. JSTL規(guī)范下載
          3. JSTL包含哪些庫
          4. JSTL如何使用
          5. 租房網(wǎng)應用中使用JSTL
          6. JSTL相關的JAR包
          7. EL表達式訪問列表的長度
          8. JSTL的forEach標簽
          9. 剩下的頁面改造
          10. 總結(jié)

          介紹

          上篇文章我們使用JSP技術對租房網(wǎng)平臺進行了改造,也提到下面這樣的代碼有點奇葩:

          <%for (House house : mockHouses) { 
          	System.out.println(house); %>
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li>
          <%} %>
          

          像這樣的代碼我們可以使用JSTL技術來解決。當然,JSTL可不僅僅只有這點功能,你還可以定義自己的標簽。

          在這篇文章里,我提到過JSTL是JSP相關的技術,從它的名字全稱(JSP Standard Tag Library,即JSP標準標簽庫)就可以看出來。

          在本篇文章里,我們就嘗試初步使用JSTL來進一步改造我們的租房網(wǎng)應用。

          JSTL規(guī)范下載

          既然稱之為庫,那么它包含哪些庫呢?

          我們可以把JSTL規(guī)范下載下來看一下,當然你也可以找本相關書籍,或者直接在網(wǎng)上搜索一下。

          JSTL規(guī)范的下載類似Servlet規(guī)范的下載(可以參考這篇文章),不過我們在JCP官網(wǎng)(https://jcp.org/en/home/index)中搜索的關鍵字就變成Tag或Tag Library了。

          我們在搜索結(jié)果中就可以看到:

          點擊 Download page 鏈接可以看到:

          然后繼續(xù)點擊底部的 Maintenance Review 2 of JSR 52 鏈接,跳轉(zhuǎn)到:

          不過,再次點擊DOWNLOAD按鈕時,我這邊出現(xiàn)無法訪問此網(wǎng)站的錯誤。所以我轉(zhuǎn)而點擊底部的 JSR-000052 A Standard Tag Library for JavaServer Pages Detail Page 鏈接:

          從這里我們可以看到JSTL規(guī)范的各個階段,我們選擇 Maintenance Release 2 這個階段,點擊它右邊的 Download page 鏈接:

          然后再點擊紅色箭頭所指的鏈接,跳轉(zhuǎn)到真正的下載頁面:

          后續(xù)操作就跟Servlet規(guī)范的下載類似了。

          JSTL包含哪些庫

          現(xiàn)在,我們可以打開JSTL規(guī)范,可以看到如下描述:

          事實上,JSTL應該就只是一個庫,但它根據(jù)不同功能而劃分成了多個庫:

          • 核心:變量支持、流控制、URL管理等等,它的命名空間URI是:http://java.sun.com/jsp/jstl/core,標簽前綴通常使用:c
          • XML處理:它的命名空間URI是:http://java.sun.com/jsp/jstl/xml,標簽前綴通常使用:x
          • 國際化:語言區(qū)域、消息格式化、數(shù)字和日期格式化等,它的命名空間URI是:http://java.sun.com/jsp/jstl/fmt,標簽前綴通常使用:fmt
          • 數(shù)據(jù)庫訪問(SQL):它的命名空間URI是:http://java.sun.com/jsp/jstl/sql,標簽前綴通常使用:sql
          • 函數(shù):集合長度、字符串操作等,它的命名空間URI是:http://java.sun.com/jsp/jstl/functions,標簽前綴通常使用:fn

          JSTL如何使用

          JSTL的終極目標是簡化JSP頁面的開發(fā),所以,它應該是在JSP頁面中使用。

          既然是標簽,那它的使用是否跟HTML標簽、XML標簽類似呢?答案是肯定的。

          不過,JSTL標簽的使用與XML標簽使用時聲明命名空間類似,也需要告訴Servlet/JSP容器該JSP頁面需要引入某個庫(即上述的核心、XML處理、國際化、數(shù)據(jù)庫訪問、函數(shù)等等,以及以后自定義的標簽)。

          在JSP頁面中是使用一個JSP指令(即taglib指令,之前我們用過page指令)來聲明的:

          <%@ taglib uri="uri" prefix="prefix" %>
          

          舉個例子,假設我們要使用JSTL的核心庫,則應該在JSP頁面的開頭處這樣聲明:

          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          

          然后,就可以使用核心庫的標簽,比如out標簽:

          <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>
          <c:out value="value" [escapeXml="{true|false}"]>
           default value
          </c:out>
          

          注意:在標簽的語法中,[]表示可選的屬性。如果值帶下劃線,則表示為默認值。

          out標簽有兩種形式,有屬性和屬性值,也可能有標簽內(nèi)容,跟HTML標簽和XML標簽類似。

          租房網(wǎng)應用中使用JSTL

          我們就拿租房網(wǎng)應用中的房源列表頁面houses.jsp來使用JSTL改造,因為這里涉及列表數(shù)據(jù)的展示。

          列表數(shù)據(jù)是很常見的,我們經(jīng)常可以看到包含列表數(shù)據(jù)的頁面,比如訂單列表、商品列表等等。

          houses.jsp原來的代碼是這樣的:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <%
          	List<House> mockHouses=(List<House>) request.getAttribute("mockHouses");
          	System.out.println(mockHouses);
          %>
          <h6>共找到你感興趣的房源 <%=mockHouses.size() %> 條</h6>
          <ul>
          <%for (House house : mockHouses) { 
          	System.out.println(house); %>
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li>
          <%} %>
          </ul>
          </body>
          </html>
          

          首先要引入JSTL中的核心庫(因為我們后面要用到的forEach標簽是屬于核心庫的):

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          

          遺憾的是,我們添加這句聲明之后,Eclipse就報錯了:

          提示是說找不到這個標簽庫的描述符。那就根據(jù)這個提示在網(wǎng)上搜索答案唄。

          答案就是原來我們還需要在我們的工程結(jié)構(gòu)里配置JSTL相關的JAR包,而Tomcat這個Servlet/JSP容器本身不提供這些JSTL相關的JAR包,我們需要單獨下載。

          JSTL相關的JAR包

          那么在哪里下載呢?既然我們是使用Tomcat這個Servlet/JSP容器,那么我們就可以到它的官網(wǎng)(http://tomcat.apache.org/)上看看:

          我們可以看到左側(cè)導航欄中有個Taglibs鏈接,我們點進去看看:

          還真就是JSTL相關JAR包的下載頁面,點擊Download鏈接進去,可以找到真正的下載鏈接:

          我們可以看下Binary README文件,里面有該JAR包版本支持的Tomcat和JSP等版本信息,如果我們使用的Tomcat是最新版本(9.0.x),那直接下載下面四個JAR包即可,否則需要點進Archives頁面下載歷史版本。

          好,我們把四個JAR包下載下來之后,就可以添加到我們的租房網(wǎng)應用的工程里面了,可以參考這篇文章。

          實際上,直接把這四個JAR包拷貝到WebContent/WEB-INF/lib節(jié)點下是最快的。

          現(xiàn)在,我們可以看到上述的Eclipse報錯提示就消失了。

          EL表達式訪問列表的長度

          首先,我們可以使用EL表達式來訪問列表的長度:

          <h6>共找到你感興趣的房源 ${mockHouses.size()} 條</h6>
          

          據(jù)說低版本的JSP容器不可以這樣直接用EL表達式來訪問列表的長度,而應該使用JSTL的函數(shù)庫中的length方法:

          ${fn:length(list) }
          

          當然,首先需要引入JSTL的函數(shù)庫。讀者朋友可以自行嘗試一下。

          JSTL的forEach標簽

          我們可以通過JSTL規(guī)范查看一下這個forEach標簽的用法:

          當然,可能只看這個語法格式還是不太明白如何使用,那么可以繼續(xù)看規(guī)范中的描述,或者直接網(wǎng)上搜索即可。

          我們需要改造的代碼是這一部分:

          <%for (House house : mockHouses) { 
          	System.out.println(house); %>
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li>
          <%} %>
          

          我們可以先把它注釋掉(在Eclipse中可以選中這一段,然后鍵入Ctrl + Shift + /),然后敲入開始標簽的左尖括號 < ,于是Eclipse會出現(xiàn)智能提示:

          嗯,這個功能還是挺好用的,提高開發(fā)效率。

          閑話不多說了,直接上代碼:

          <c:forEach var="house" items="${mockHouses}">
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=${house.id}">${house.name}</a></h2></li>
          </c:forEach>
          

          看似跟之前變化不大,但至少沒那么奇葩了,風格也與HTML很一致。

          forEach標簽遍歷列表數(shù)據(jù)的基本屬性是:

          • var:相當于定義一個變量來表示指向列表中的某一項;
          • items:指定需要遍歷哪個列表,需要注意的是其值又是使用EL表達式來訪問頁面/請求/會話/應用中的某個屬性數(shù)據(jù)(即使用setAttribute()添加的對象)

          forEach標簽的內(nèi)容就可以是普通的HTML標簽了,然后HTML標簽里我們就可以使用EL表達式來訪問列表中每一項數(shù)據(jù)。

          實際上,EL表達式直接訪問對象的屬性,而非調(diào)用對象的方法,比如:

          ${house.id}
          

          注意,param是EL的隱式對象,它是由Servlet/JSP容器創(chuàng)建并傳進來的,它可以直接訪問請求所攜帶的參數(shù)。

          所以,我們實際上可以把原來的這一部分:

          <%
          	List<House> mockHouses=(List<House>) request.getAttribute("mockHouses");
          	System.out.println(mockHouses);
          %>
          

          刪除掉。

          現(xiàn)在houses.jsp的代碼就變成這樣了:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          <h6>共找到你感興趣的房源 ${mockHouses.size()} 條</h6>
          <ul>
          <c:forEach var="house" items="${mockHouses}">
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=${house.id}">${house.name}</a></h2></li>
          </c:forEach>
          </ul>
          </body>
          </html>
          

          是不是清晰明朗了許多?

          當然,JSP頁面的開發(fā)者必須知道傳進這個頁面的到底有哪些數(shù)據(jù)對象!

          沒錯,這就相當于把數(shù)據(jù)的展示(視圖層)給分離開來,你需要與后端(控制器層和模型層)約定/設計好每一個JSP頁面都有哪些數(shù)據(jù)對象。

          然后,JSP頁面的開發(fā)者和后端(控制器層和模型層)的開發(fā)者就可以各自獨立去開發(fā)了。

          剩下的頁面改造

          剩下的house-details.jsp和house-form.jsp該如何改造呢?大家可以先思考一下。

          提示:JSP頁面應該只關心取數(shù)據(jù)展示,而不應該關心如何查找到某個數(shù)據(jù)這種邏輯,應該把這種邏輯放到后端(控制器層和模型層)。

          我的改造是這樣的,把原來這兩個頁面的如何查找到某個數(shù)據(jù)這種邏輯放到Filter中,前后端約定好這兩個頁面中存在target這個House對象,于是doFilter()方法中在將請求交給下個節(jié)點之前應該掛載上target這個House對象:

          		if (userName==null || userName.isEmpty()) {
          			System.out.println("invalid user!");
          			httpServletResponse.sendRedirect("login.html");
          		} else {
          			String houseId=httpServletRequest.getParameter("houseId");
          			if (houseId !=null && !houseId.trim().isEmpty()) {
          				House target=findHouseById(houseId);//找不到怎么辦?
          				httpServletRequest.setAttribute("target", target);
          			}
          			chain.doFilter(request, response);
          		}
          

          另外,應該把如何查找某個房源的邏輯封裝起來:

          	private House findHouseById(String houseId) {
          		for (House house : mockHouses) {
          			if (houseId.equals(house.getId())) {
          				return house;
          			}
          		}
          		return null;
          	}
          

          然后,這兩個頁面就極其簡單了,house-details.jsp是這樣的:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <h2>${target.name}<a href="house-form.jsp?userName=${param.userName}&houseId=${target.id}">編輯</a></h2>
          <h3>${target.detail}</h3>
          <h4><a href="houses.jsp?userName=${param.userName}">回到列表</a></h4>
          </body>
          </html>
          

          house-form.jsp是這樣的:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <form action="house-form.servlet" method="post">
          <input type="hidden" name="userName" value="${param.userName}"/>
          <input type="hidden" name="houseId" value="${target.id}"/>
          <label for="house_name">房源名字:</label><input type="text" id="house_name" name="houseName" value="${target.name}" />
          <label for="house_detail">房源詳細信息:</label><input type="text" id="house_detail" name="houseDetail" value="${target.detail}" />
          <input type="submit" value="提交" />
          </form>
          </body>
          </html>
          

          可以看到,這兩個頁面只是取數(shù)據(jù)(target這個House對象)展示而已。

          總結(jié)

          • JSTL的終極目標是簡化JSP開發(fā);
          • JSTL的使用需要先聲明某個庫;
          • JSTL的標簽使用類似HTML標簽和XML標簽,語法規(guī)則可以查看JSTL規(guī)范;
          • JSP頁面使用JSTL和EL表達式基本可以實現(xiàn)大部分功能;
          • EL表達式能夠直接訪問頁面/請求/會話/應用這幾個對象中掛載(即setAttribute()方法)的數(shù)據(jù)對象;
          • EL表達式使用 ${ }
          • EL中存在隱式對象,以后再介紹;
          • 列表數(shù)據(jù)很常見很重要;
          • 列表數(shù)據(jù)采用JSTL的forEach標簽來遍歷(實際上也可以采用EL表達式,比如${mockHouses[i].id});
          • 前后端開發(fā)的分離:前端只關心取數(shù)據(jù)如何展示;后端關心如何取數(shù)據(jù)并掛載到頁面/請求/會話/應用這幾個對象中;
          • 前后端需約定/設計好數(shù)據(jù);

          人工到自動化,從重復到創(chuàng)新,技術演進的歷程中,伴隨著開發(fā)者工具類產(chǎn)品的發(fā)展。

          阿里巴巴將自身在各類業(yè)務場景下的技術積淀,通過開源、云上實現(xiàn)或工具等形式對外開放,本文將精選了一些阿里巴巴的開發(fā)者工具,希望能幫助開發(fā)者們提高開發(fā)效率、更優(yōu)雅的寫代碼。

          由于開發(fā)者涉及的技術領域眾多,筆者僅從自己熟悉的領域,以后端開發(fā)者的視角盤點平時可能用得到的工具。每個工具按照以下幾點進行介紹:

          • 工具名稱和簡介
          • 使用場景
          • 使用教程
          • 獲取方式

          一、Java 線上診斷工具 Arthas

          Arthas 阿里巴巴 2018 年 9 月開源的一款 Java 線上診斷工具。

          工具的使用場景:

          • 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
          • 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
          • 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
          • 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
          • 是否有一個全局視角來查看系統(tǒng)的運行狀況?
          • 有什么辦法可以監(jiān)控到 JVM 的實時運行狀態(tài)?

          Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

          使用教程

          基礎教程:

          https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-basics

          進階教程:

          https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-advanced

          獲取方式:(免費)

          開源地址:

          https://github.com/alibaba/arthas

          二、IDE 插件 Cloud Toolkit

          Cloud Toolkit是一款 IDE 插件,可以幫助開發(fā)者更高效地開發(fā)、測試、診斷并部署應用。通過 Cloud Toolkit,開發(fā)者能夠方便地將本地應用一鍵部署到任意機器(本地或云端),并內(nèi)置 Arthas 診斷、高效執(zhí)行終端命令和 SQL 等,提供 IntelliJ IDEA 版,Eclipse 版,PyCharm 版和 Maven 版。

          工具的使用場景:

          • 每次修改完代碼后,是否正在經(jīng)歷反復地打包?
          • 在 Maven 、Git 以及其他運維腳本和工具的之間頻繁切換?
          • 采用 SCP 工具上傳?使用 XShell 或 SecureCRT 登陸服務器?替換部署包?重啟?
          • 文件上傳到服務器指定目錄,在各種 FTP、SCP 工具之間頻繁切換 ?

          使用教程

          IntelliJ IDEA 版:

          https://help.aliyun.com/document_detail/98762.html

          Eclipse 版:

          https://help.aliyun.com/document_detail/29970.html

          PyCharm 版:

          https://help.aliyun.com/document_detail/112740.html

          Maven 版:

          https://help.aliyun.com/document_detail/108682.html

          獲取方式:(免費) 工具地址:

          https://www.aliyun.com/product/cloudtoolkit

          三、混沌實驗注入工具 ChaosBlade

          ChaosBlade是一款遵循混沌工程實驗原理,提供豐富故障場景實現(xiàn),幫助分布式系統(tǒng)提升容錯性和可恢復性的混沌工程工具,可實現(xiàn)底層故障的注入,提供了延遲、異常、返回特定值、修改參數(shù)值、重復調(diào)用和 try-catch 塊異常等異常場景。

          工具的使用場景:

          • 微服務的容錯能力不易衡量?
          • 容器編排配置是否合理無法驗證?
          • PaaS 層健壯性的測試工作無從入手?

          使用教程

          https://github.com/chaosblade-io/chaosblade/wiki/ 新手指南

          獲取方式:(免費)

          開源地址:

          https://github.com/chaosblade-io/chaosblade/wiki/ 新手指南

          四、Java 代碼規(guī)約掃描插件

          該插件用于檢測 Java 代碼中存在的不規(guī)范的位置,并給予提示。規(guī)約插件是采用 Kotlin 語言開發(fā)。

          使用教程

          IDEA 插件使用文檔:

          https://github.com/alibaba/p3c/wiki/IDEA 插件使用文檔

          Eclipse 插件使用文檔:

          https://github.com/alibaba/p3c/wiki/Eclipse 插件使用文檔

          獲取方式:(免費)

          開源地址:

          https://github.com/alibaba/p3c

          五、應用實時監(jiān)控工具 ARMS

          ARMS是一款 APM 類的監(jiān)控工具,提供前端、應用、自定義監(jiān)控 3 類監(jiān)控選項,可快速構(gòu)建實時的應用性能和業(yè)務監(jiān)控能力。

          工具的使用場景:

          • 晚上 10 點收到 37 條報警信息,你卻無從下手?
          • 當我們發(fā)現(xiàn)問題的時候,客戶 / 業(yè)務方已經(jīng)發(fā)起投訴?
          • 每個月花幾十萬買服務器,卻無法保障用戶體驗?

          使用教程

          前端監(jiān)控接入:

          https://help.aliyun.com/documentdetail/106086.html

          應用監(jiān)控接入:

          https://help.aliyun.com/documentdetail/63796.html

          自定義監(jiān)控:

          https://help.aliyun.com/document_detail/47474.html

          獲取方式:(收費)

          工具地址:

          https://www.aliyun.com/product/arms

          六、靜態(tài)開源站點搭建工具 Docsite

          Docsite一款集官網(wǎng)、文檔、博客和社區(qū)為一體的靜態(tài)開源站點的解決方案,具有簡單易上手、上手不撒手的特質(zhì),同時支持 react 和靜態(tài)渲染、PC 端和移動端、支持中英文國際化、SEO、markdown 文檔、全局站點搜索、站點風格自定義、頁面自定義等功能。

          使用教程

          https://docsite.js.org/zh-cn/docs/installation.html

          獲取方式:(免費)

          項目地址:

          https://github.com/txd-team/docsite

          七、Android 平臺上的秒級編譯方案 Freeline

          Freeline 可以充分利用緩存文件,在幾秒鐘內(nèi)迅速地對代碼的改動進行編譯并部署到設備上,有效地減少了日常開發(fā)中的大量重新編譯與安裝的耗時。Freeline 最快捷的使用方法就是直接安裝 Android Studio 插件。

          使用教程

          https://github.com/alibaba/freeline/blob/master/README-zh.md

          獲取方式:(免費)

          項目地址:

          https://github.com/alibaba/freeline

          八、性能測試工具 PTS

          PTS可以模擬大量用戶訪問業(yè)務的場景,任務隨時發(fā)起,免去搭建和維護成本,支持 JMeter 腳本轉(zhuǎn)化為 PTS 壓測,同樣支持原生 JMeter 引擎進行壓測。

          使用教程

          https://help.aliyun.com/document_detail/70290.html

          獲取方式:(收費)

          工具地址:

          https://www.aliyun.com/product/pts

          九、云效開發(fā)者工具 KT

          KT 可以簡化在 Kubernetes 下進行聯(lián)調(diào)測試的復雜度,提高基于 Kubernetes 的研發(fā)效率。

          使用教程

          https://yq.aliyun.com/articles/690519

          獲取方式:(免費)

          工具地址:

          https://yq.aliyun.com/download/3393

          十、架構(gòu)可視化工具 AHAS

          AHAS為 K8s 等容器環(huán)境提供了架構(gòu)可視化的功能,同時,具有故障注入式高可用能力評測和一鍵流控降級等功能,可以快速低成本的提升應用可用性。

          工具的使用場景

          • 服務化改造過程中,想精確的了解資源實例的構(gòu)成和交互情況,實現(xiàn)架構(gòu)的可視化?
          • 想引入真實的故障場景和演練模型?
          • 低門檻獲得流控、降級功能?

          使用教程

          https://help.aliyun.com/document_detail/90323.html

          獲取方式:(免費)

          工具地址:

          https://www.aliyun.com/product/ahas

          十一、數(shù)據(jù)處理工具 EasyExcel

          EasyExcel 是一個用來對 Java 進行解析、生成 Excel 的框架,它重寫了 poi 對 07 版 Excel 的解析,原本一個 3M 的 Excel 用 POI sax 需要 100M 左右內(nèi)存,EasyExcel 可降低到 KB 級別,并且再大的 excel 也不會出現(xiàn)內(nèi)存溢出的情況。03 版依賴 POI 的 sax 模式。在上層做了模型轉(zhuǎn)換的封裝,讓使用者更加簡單方便。

          使用教程

          https://github.com/alibaba/easyexcel/blob/master/quickstart.md

          獲取方式:(開源)

          https://github.com/alibaba/easyexcel

          十二、iOS 類工具 HandyJSON

          HandyJSON 是一個用于 Swift 語言中的 JSON 序列化 / 反序列化庫。

          與其他流行的 Swift JSON 庫相比,HandyJSON 的特點是,它支持純 Swift 類,使用也簡單。它反序列化時 (把 JSON 轉(zhuǎn)換為 Model) 不要求 Model 從 NSObject 繼承 (因為它不是基于 KVC 機制),也不要求你為 Model 定義一個 Mapping 函數(shù)。只要你定義好 Model 類,聲明它服從 HandyJSON 協(xié)議,HandyJSON 就能自行以各個屬性的屬性名為 Key,從 JSON 串中解析值。

          使用教程

          https://github.com/alibaba/HandyJSON/blob/master/README_cn.md

          獲取方式:(開源)

          https://github.com/alibaba/HandyJSON

          十三、云上資源和應用部署工具 EDAS Serverless

          EDAS Serverless一款基于 Kubernetes,面向應用和微服務的 Serverless 平臺。用戶無需管理和維護集群與服務器,即可通過鏡像、WAR 包和 JAR 包,快速創(chuàng)建原生支持 Kubernetes 的容器應用,同時支持 Spring Cloud 和 Dubbo 等主流微服務框架。

          使用教程

          https://help.aliyun.com/document_detail/102048.html

          獲取方式:(公測期間免費)

          https://help.aliyun.com/document_detail/97792.html

          十四、數(shù)據(jù)庫連接池 Druid

          Druid 是 Java 語言下的數(shù)據(jù)庫連接池,它能夠提供強大的監(jiān)控和擴展功能。

          使用教程

          https://github.com/alibaba/druid/wiki/ 常見問題

          獲取方式:(開源)

          http://central.maven.org/maven2/com/alibaba/druid/

          十五、Java 工具集 Dragonwell

          Alibaba Dragonwell 是阿里巴巴內(nèi)部 OpenJDK 定制版 AJDK 的開源版本, AJDK 為在線電商,金融,物流做了結(jié)合業(yè)務場景的優(yōu)化,運行在超大規(guī)模的,100,000+ 服務器的阿里巴巴數(shù)據(jù)中心。 Alibaba Dragonwell 與 Java SE 標準兼容,目前僅支持 Linux/x86_64 平臺。

          使用教程

          https://github.com/alibaba/dragonwell8/wiki/ 阿里巴巴 Dragonwell8 用戶指南

          獲取方式:(開源)

          https://github.com/alibaba/dragonwell8

          想看更多關于工程效率文章?點擊左下角了解更多哦~

          么是HTML / HTM文件?他們相差一個字母有什么區(qū)別嗎,如何查看或編輯源代碼以及如何轉(zhuǎn)換成其他格式,例如DOCX,PDF,JPG 等,針對這些問題編程獅W3Cschool整理以下資料希望能對你有所幫助:

          什么是HTM或HTML文件?

          HTM / HTML 文件是超文本標記語言(Hyper Text Markup Language)文件,是 Internet 上的標準網(wǎng)頁文件類型。

          由于 HTM 文件是純文本文件,因此它們僅包含文本(例如您現(xiàn)在正在閱讀的內(nèi)容)以及對其他外部文件的文本引用(例如本文中的配圖)。

          HTM 和 HTML 文件還可以引用其他文件,例如視頻,CSS 或 JS 文件。

          HTM與HTML的區(qū)別

          HTM 與 HTML 沒有本質(zhì)意義的區(qū)別,只是為了滿足 DOS 僅能識別 8+3 的文件名而已,因為一些老的系統(tǒng) (win32) 不能識別四位文件名,所以某些網(wǎng)頁服務器要求 index.html 最后一個 l 不能省略。MSIE 能自動識別和打開這些文件,但編寫網(wǎng)頁地址的時候必須是完全對應的,也就是說 index.htmindex.html 是兩個不同的文件,對應著不同的地址。值得一提的是 UNIX 系統(tǒng)中對大小寫敏感,不吻合的話就可能報沒有文件或者找不到文件。

          如何打開HTM或HTML文件?

          任何 Web 瀏覽器,例如 Edge,F(xiàn)irefox,Chrome,Opera,IE,360 安全瀏覽器等,都可以打開并正確顯示 HTM 和 HTML 文件。換句話說,在瀏覽器中打開這些文件并“解碼(decode)” HTM 或 HTML 文件使其能正確顯示。

          現(xiàn)在有很多簡化編輯和創(chuàng)建 HTM / HTML 文件的工具。一些著名的免費 HTML 編輯器包括 Eclipse ,Komodo Edit 和 Bluefish 。另一個流行的具有許多高級功能的 HTM / HTML 編輯器是 Adobe Dreamweaver ,不過它是收費的。

          雖然 Windows 系統(tǒng)自帶的記事本等簡單的文本編輯器的功能不如專用的 HTM 編輯器那么豐富,但是對 HTM 或 HTML 文件進行簡單編輯修改還是可以的。不過,W3Cschool還是建議大家使用專用的編輯器,如 WebStorm、VS Code 等,它具更多專業(yè)功能。

          這是一個非常簡單的 HTML 頁面以文本形式顯示的示例:

          源碼:

          <!doctype html>
          <html>
          
              
          <head>
          <meta charset="utf-8">
          <title>什么是HTM或HTML文件? - 編程獅(w3cschool.cn)</title>
          </head>
          
          
          <body>
              <h1>什么是HTM或HTML文件?</h1>
              <p>HTM / HTML 文件是超文本標記語言(Hyper Text Markup Language)文件,是 Internet 上的標準網(wǎng)頁文件類型。</p>
              <p>由于 HTM 文件是純文本文件,因此它們僅包含文本(例如您現(xiàn)在正在閱讀的內(nèi)容)以及對其他外部文件的文本*引用*(例如本文中的配圖)。</p>
              <p>HTM 和 HTML 文件還可以引用其他文件,例如視頻,CSS 或 JS 文件。</p>   
          </body>
          
              
          </html>

          當 Web 瀏覽器呈現(xiàn)信息時,HTML 文件的源代碼被“轉(zhuǎn)換”為真實的網(wǎng)頁(盡管源代碼已很精簡了)。

          如何轉(zhuǎn)換HTML和HTM文件?

          HTM 文件以特定的語法(規(guī)則)構(gòu)成,以使其中的代碼和文本在瀏覽器中打開時能夠正確顯示。因此,將 HTM / HTML 文件轉(zhuǎn)換為另一種格式可能會丟失頁面上的所有功能。

          如果你想要做的是將一個 HTM / HTML 文件轉(zhuǎn)換為方便離線查看的文件,這時圖片或 PDF 格式會方便很多。

          在 Chrome 中,鼠標右鍵單擊網(wǎng)頁,出現(xiàn)的選項菜單中進入 “打印(P)...”(快捷鍵:CTRL + P) ,在打印選項中選擇另存為 PDF,以將窗口中的頁面轉(zhuǎn)換為 PDF 文件。Chrome 瀏覽器的擴展功能也稱為“全屏截屏”,可將 Chrome 瀏覽器中所有打開的 HTM / HTML 文件轉(zhuǎn)換為 PNG 文件。

          其他瀏覽器具有類似的功能,例如 Firefox 的 “另存為 PDF” 加載項。

          您也可以使用專門用于 HTM / HTML 進行圖像文件轉(zhuǎn)換的網(wǎng)站,例如iWeb2Shot 或Web-capture 。

          一個免費的文件轉(zhuǎn)換器可以用來轉(zhuǎn)換并保存 HTM / HTML 文件到您的計算機。如 FileZigZag 是一個免費的文檔轉(zhuǎn)換器網(wǎng)站,可將 HTM 轉(zhuǎn)換為RTF,EPS,CSV,PDF 和許多其他格式。

          HTM / HTML 文件不能轉(zhuǎn)換為文本文件格式以外的任何格式。例如,HTML 文件永遠不能轉(zhuǎn)換為 MP3 音頻文件。

          文件打不開?

          HTML / HTM 文件應該很容易打開,因為它們只是任何 Web 瀏覽器都可以查看的文本文件。如果您的文件沒有從上面建議的任何程序打開,則很有可能正在打開的這個文件并非超文本標記語言文件。

          某些文件格式使用的文件擴展名與 HTML / HTM 非常相似,但實際上并非相同。一個主要的示例是用于壓縮 HTML 電子書文件的 HTMLZ 文件擴展名。有 HTML 文件在內(nèi)的 HTMLZ 文件,但整個包的格式為 ZIP,不會在 Web 瀏覽器或文本編輯器打開。

          在此示例中,您需要特定的 HTMLZ 文件查看器,例如Caliber 。或者,由于此文件格式實際上是存檔,因此您可以使用 7-Zip 之類的文件解壓縮器將其打開,然后您可以使用網(wǎng)絡瀏覽器或上述任何其他 HTML 查看器/編輯器打開任何單獨的 HTML 文件。

          TMLANGUAGE 是另一個可能與 HTML / HTM 文件混淆的文件擴展名。這些實際上是TextMate 用于 macOS 的 TextMate 語言語法文件。

          以上就是編程獅W3Cschool為你整理的關于《什么是HTM或HTML文件?如何打開、編輯和轉(zhuǎn)換HTM和HTML文件?》的全部內(nèi)容,現(xiàn)希望可以幫到你~


          主站蜘蛛池模板: 亚洲色无码一区二区三区| 免费无码一区二区三区蜜桃| 久久久久久人妻一区精品| 亚洲一区欧洲一区| 无码精品人妻一区| 区三区激情福利综合中文字幕在线一区亚洲视频1| 3d动漫精品啪啪一区二区中| 国产香蕉一区二区在线网站 | 亚洲免费一区二区| 精品国产a∨无码一区二区三区| 国产a∨精品一区二区三区不卡| 国产福利电影一区二区三区,日韩伦理电影在线福 | 久久久久人妻一区精品果冻| 亚洲AV无码一区二区三区在线观看| 一区国严二区亚洲三区| 中日av乱码一区二区三区乱码| 亚洲AV无码一区二区二三区软件| 精品无码av一区二区三区| ...91久久精品一区二区三区| 日本一区二区三区爆乳| 人妻夜夜爽天天爽一区| 免费无码AV一区二区| 亚洲啪啪综合AV一区| 精品国产一区二区三区香蕉事| 国产观看精品一区二区三区| 无码人妻啪啪一区二区| 精品一区二区三区无码免费直播 | 国产精品一区二区AV麻豆| 国偷自产Av一区二区三区吞精 | 亚洲欧美成人一区二区三区 | 韩国一区二区视频| 国产午夜精品一区二区三区| 亚洲一区二区三区在线视频| 精品一区二区久久久久久久网精| 国产精品亚洲一区二区麻豆| 亚洲bt加勒比一区二区| 2018高清国产一区二区三区 | 亚洲AV无码一区二区三区性色 | 国产自产V一区二区三区C| 任你躁国产自任一区二区三区| 日本无卡码一区二区三区|