Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
本系列文章旨在記錄和總結(jié)自己在Java Web開發(fā)之路上的知識(shí)點(diǎn)、經(jīng)驗(yàn)、問題和思考,希望能幫助更多(Java)碼農(nóng)和想成為(Java)碼農(nóng)的人。
上篇文章我們使用JSP技術(shù)對(duì)租房網(wǎng)平臺(tái)進(jìn)行了改造,也提到下面這樣的代碼有點(diǎn)奇葩:
<%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技術(shù)來(lái)解決。當(dāng)然,JSTL可不僅僅只有這點(diǎn)功能,你還可以定義自己的標(biāo)簽。
在這篇文章里,我提到過JSTL是JSP相關(guān)的技術(shù),從它的名字全稱(JSP Standard Tag Library,即JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù))就可以看出來(lái)。
在本篇文章里,我們就嘗試初步使用JSTL來(lái)進(jìn)一步改造我們的租房網(wǎng)應(yīng)用。
既然稱之為庫(kù),那么它包含哪些庫(kù)呢?
我們可以把JSTL規(guī)范下載下來(lái)看一下,當(dāng)然你也可以找本相關(guān)書籍,或者直接在網(wǎng)上搜索一下。
JSTL規(guī)范的下載類似Servlet規(guī)范的下載(可以參考這篇文章),不過我們?cè)贘CP官網(wǎng)(https://jcp.org/en/home/index)中搜索的關(guān)鍵字就變成Tag或Tag Library了。
我們?cè)谒阉鹘Y(jié)果中就可以看到:
點(diǎn)擊 Download page 鏈接可以看到:
然后繼續(xù)點(diǎn)擊底部的 Maintenance Review 2 of JSR 52 鏈接,跳轉(zhuǎn)到:
不過,再次點(diǎn)擊DOWNLOAD按鈕時(shí),我這邊出現(xiàn)無(wú)法訪問此網(wǎng)站的錯(cuò)誤。所以我轉(zhuǎn)而點(diǎn)擊底部的 JSR-000052 A Standard Tag Library for JavaServer Pages Detail Page 鏈接:
從這里我們可以看到JSTL規(guī)范的各個(gè)階段,我們選擇 Maintenance Release 2 這個(gè)階段,點(diǎn)擊它右邊的 Download page 鏈接:
然后再點(diǎn)擊紅色箭頭所指的鏈接,跳轉(zhuǎn)到真正的下載頁(yè)面:
后續(xù)操作就跟Servlet規(guī)范的下載類似了。
現(xiàn)在,我們可以打開JSTL規(guī)范,可以看到如下描述:
事實(shí)上,JSTL應(yīng)該就只是一個(gè)庫(kù),但它根據(jù)不同功能而劃分成了多個(gè)庫(kù):
JSTL的終極目標(biāo)是簡(jiǎn)化JSP頁(yè)面的開發(fā),所以,它應(yīng)該是在JSP頁(yè)面中使用。
既然是標(biāo)簽,那它的使用是否跟HTML標(biāo)簽、XML標(biāo)簽類似呢?答案是肯定的。
不過,JSTL標(biāo)簽的使用與XML標(biāo)簽使用時(shí)聲明命名空間類似,也需要告訴Servlet/JSP容器該JSP頁(yè)面需要引入某個(gè)庫(kù)(即上述的核心、XML處理、國(guó)際化、數(shù)據(jù)庫(kù)訪問、函數(shù)等等,以及以后自定義的標(biāo)簽)。
在JSP頁(yè)面中是使用一個(gè)JSP指令(即taglib指令,之前我們用過page指令)來(lái)聲明的:
<%@ taglib uri="uri" prefix="prefix" %>
舉個(gè)例子,假設(shè)我們要使用JSTL的核心庫(kù),則應(yīng)該在JSP頁(yè)面的開頭處這樣聲明:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
然后,就可以使用核心庫(kù)的標(biāo)簽,比如out標(biāo)簽:
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/> <c:out value="value" [escapeXml="{true|false}"]> default value </c:out>
注意:在標(biāo)簽的語(yǔ)法中,[]表示可選的屬性。如果值帶下劃線,則表示為默認(rèn)值。
out標(biāo)簽有兩種形式,有屬性和屬性值,也可能有標(biāo)簽內(nèi)容,跟HTML標(biāo)簽和XML標(biāo)簽類似。
我們就拿租房網(wǎng)應(yīng)用中的房源列表頁(yè)面houses.jsp來(lái)使用JSTL改造,因?yàn)檫@里涉及列表數(shù)據(jù)的展示。
列表數(shù)據(jù)是很常見的,我們經(jīng)常可以看到包含列表數(shù)據(jù)的頁(yè)面,比如訂單列表、商品列表等等。
houses.jsp原來(lái)的代碼是這樣的:
<%@ 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中的核心庫(kù)(因?yàn)槲覀兒竺嬉玫降膄orEach標(biāo)簽是屬于核心庫(kù)的):
<%@ 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就報(bào)錯(cuò)了:
提示是說(shuō)找不到這個(gè)標(biāo)簽庫(kù)的描述符。那就根據(jù)這個(gè)提示在網(wǎng)上搜索答案唄。
答案就是原來(lái)我們還需要在我們的工程結(jié)構(gòu)里配置JSTL相關(guān)的JAR包,而Tomcat這個(gè)Servlet/JSP容器本身不提供這些JSTL相關(guān)的JAR包,我們需要單獨(dú)下載。
那么在哪里下載呢?既然我們是使用Tomcat這個(gè)Servlet/JSP容器,那么我們就可以到它的官網(wǎng)(http://tomcat.apache.org/)上看看:
我們可以看到左側(cè)導(dǎo)航欄中有個(gè)Taglibs鏈接,我們點(diǎn)進(jìn)去看看:
還真就是JSTL相關(guān)JAR包的下載頁(yè)面,點(diǎn)擊Download鏈接進(jìn)去,可以找到真正的下載鏈接:
我們可以看下Binary README文件,里面有該JAR包版本支持的Tomcat和JSP等版本信息,如果我們使用的Tomcat是最新版本(9.0.x),那直接下載下面四個(gè)JAR包即可,否則需要點(diǎn)進(jìn)Archives頁(yè)面下載歷史版本。
好,我們把四個(gè)JAR包下載下來(lái)之后,就可以添加到我們的租房網(wǎng)應(yīng)用的工程里面了,可以參考這篇文章。
實(shí)際上,直接把這四個(gè)JAR包拷貝到WebContent/WEB-INF/lib節(jié)點(diǎn)下是最快的。
現(xiàn)在,我們可以看到上述的Eclipse報(bào)錯(cuò)提示就消失了。
首先,我們可以使用EL表達(dá)式來(lái)訪問列表的長(zhǎng)度:
<h6>共找到你感興趣的房源 ${mockHouses.size()} 條</h6>
據(jù)說(shuō)低版本的JSP容器不可以這樣直接用EL表達(dá)式來(lái)訪問列表的長(zhǎng)度,而應(yīng)該使用JSTL的函數(shù)庫(kù)中的length方法:
${fn:length(list) }
當(dāng)然,首先需要引入JSTL的函數(shù)庫(kù)。讀者朋友可以自行嘗試一下。
我們可以通過JSTL規(guī)范查看一下這個(gè)forEach標(biāo)簽的用法:
當(dāng)然,可能只看這個(gè)語(yǔ)法格式還是不太明白如何使用,那么可以繼續(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 + /),然后敲入開始標(biāo)簽的左尖括號(hào) < ,于是Eclipse會(huì)出現(xiàn)智能提示:
嗯,這個(gè)功能還是挺好用的,提高開發(fā)效率。
閑話不多說(shuō)了,直接上代碼:
<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>
看似跟之前變化不大,但至少?zèng)]那么奇葩了,風(fēng)格也與HTML很一致。
forEach標(biāo)簽遍歷列表數(shù)據(jù)的基本屬性是:
forEach標(biāo)簽的內(nèi)容就可以是普通的HTML標(biāo)簽了,然后HTML標(biāo)簽里我們就可以使用EL表達(dá)式來(lái)訪問列表中每一項(xiàng)數(shù)據(jù)。
實(shí)際上,EL表達(dá)式直接訪問對(duì)象的屬性,而非調(diào)用對(duì)象的方法,比如:
${house.id}
注意,param是EL的隱式對(duì)象,它是由Servlet/JSP容器創(chuàng)建并傳進(jìn)來(lái)的,它可以直接訪問請(qǐng)求所攜帶的參數(shù)。
所以,我們實(shí)際上可以把原來(lái)的這一部分:
<% 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>
是不是清晰明朗了許多?
當(dāng)然,JSP頁(yè)面的開發(fā)者必須知道傳進(jìn)這個(gè)頁(yè)面的到底有哪些數(shù)據(jù)對(duì)象!
沒錯(cuò),這就相當(dāng)于把數(shù)據(jù)的展示(視圖層)給分離開來(lái),你需要與后端(控制器層和模型層)約定/設(shè)計(jì)好每一個(gè)JSP頁(yè)面都有哪些數(shù)據(jù)對(duì)象。
然后,JSP頁(yè)面的開發(fā)者和后端(控制器層和模型層)的開發(fā)者就可以各自獨(dú)立去開發(fā)了。
剩下的house-details.jsp和house-form.jsp該如何改造呢?大家可以先思考一下。
提示:JSP頁(yè)面應(yīng)該只關(guān)心取數(shù)據(jù)展示,而不應(yīng)該關(guān)心如何查找到某個(gè)數(shù)據(jù)這種邏輯,應(yīng)該把這種邏輯放到后端(控制器層和模型層)。
我的改造是這樣的,把原來(lái)這兩個(gè)頁(yè)面的如何查找到某個(gè)數(shù)據(jù)這種邏輯放到Filter中,前后端約定好這兩個(gè)頁(yè)面中存在target這個(gè)House對(duì)象,于是doFilter()方法中在將請(qǐng)求交給下個(gè)節(jié)點(diǎn)之前應(yīng)該掛載上target這個(gè)House對(duì)象:
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); }
另外,應(yīng)該把如何查找某個(gè)房源的邏輯封裝起來(lái):
private House findHouseById(String houseId) { for (House house : mockHouses) { if (houseId.equals(house.getId())) { return house; } } return null; }
然后,這兩個(gè)頁(yè)面就極其簡(jiǎn)單了,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">房源詳細(xì)信息:</label><input type="text" id="house_detail" name="houseDetail" value="${target.detail}" /> <input type="submit" value="提交" /> </form> </body> </html>
可以看到,這兩個(gè)頁(yè)面只是取數(shù)據(jù)(target這個(gè)House對(duì)象)展示而已。
人工到自動(dòng)化,從重復(fù)到創(chuàng)新,技術(shù)演進(jìn)的歷程中,伴隨著開發(fā)者工具類產(chǎn)品的發(fā)展。
阿里巴巴將自身在各類業(yè)務(wù)場(chǎng)景下的技術(shù)積淀,通過開源、云上實(shí)現(xiàn)或工具等形式對(duì)外開放,本文將精選了一些阿里巴巴的開發(fā)者工具,希望能幫助開發(fā)者們提高開發(fā)效率、更優(yōu)雅的寫代碼。
由于開發(fā)者涉及的技術(shù)領(lǐng)域眾多,筆者僅從自己熟悉的領(lǐng)域,以后端開發(fā)者的視角盤點(diǎn)平時(shí)可能用得到的工具。每個(gè)工具按照以下幾點(diǎn)進(jìn)行介紹:
Arthas 阿里巴巴 2018 年 9 月開源的一款 Java 線上診斷工具。
工具的使用場(chǎng)景:
Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同時(shí)提供豐富的 Tab 自動(dòng)補(bǔ)全功能,進(jìn)一步方便進(jìn)行問題的定位和診斷。
使用教程:
基礎(chǔ)教程:
https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-basics
進(jìn)階教程:
https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-advanced
獲取方式:(免費(fèi))
開源地址:
https://github.com/alibaba/arthas
Cloud Toolkit是一款 IDE 插件,可以幫助開發(fā)者更高效地開發(fā)、測(cè)試、診斷并部署應(yīng)用。通過 Cloud Toolkit,開發(fā)者能夠方便地將本地應(yīng)用一鍵部署到任意機(jī)器(本地或云端),并內(nèi)置 Arthas 診斷、高效執(zhí)行終端命令和 SQL 等,提供 IntelliJ IDEA 版,Eclipse 版,PyCharm 版和 Maven 版。
工具的使用場(chǎng)景:
使用教程:
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
獲取方式:(免費(fèi)) 工具地址:
https://www.aliyun.com/product/cloudtoolkit
ChaosBlade是一款遵循混沌工程實(shí)驗(yàn)原理,提供豐富故障場(chǎng)景實(shí)現(xiàn),幫助分布式系統(tǒng)提升容錯(cuò)性和可恢復(fù)性的混沌工程工具,可實(shí)現(xiàn)底層故障的注入,提供了延遲、異常、返回特定值、修改參數(shù)值、重復(fù)調(diào)用和 try-catch 塊異常等異常場(chǎng)景。
工具的使用場(chǎng)景:
使用教程:
https://github.com/chaosblade-io/chaosblade/wiki/ 新手指南
獲取方式:(免費(fèi))
開源地址:
https://github.com/chaosblade-io/chaosblade/wiki/ 新手指南
該插件用于檢測(cè) Java 代碼中存在的不規(guī)范的位置,并給予提示。規(guī)約插件是采用 Kotlin 語(yǔ)言開發(fā)。
使用教程:
IDEA 插件使用文檔:
https://github.com/alibaba/p3c/wiki/IDEA 插件使用文檔
Eclipse 插件使用文檔:
https://github.com/alibaba/p3c/wiki/Eclipse 插件使用文檔
獲取方式:(免費(fèi))
開源地址:
https://github.com/alibaba/p3c
ARMS是一款 APM 類的監(jiān)控工具,提供前端、應(yīng)用、自定義監(jiān)控 3 類監(jiān)控選項(xiàng),可快速構(gòu)建實(shí)時(shí)的應(yīng)用性能和業(yè)務(wù)監(jiān)控能力。
工具的使用場(chǎng)景:
使用教程:
前端監(jiān)控接入:
https://help.aliyun.com/documentdetail/106086.html
應(yīng)用監(jiān)控接入:
https://help.aliyun.com/documentdetail/63796.html
自定義監(jiān)控:
https://help.aliyun.com/document_detail/47474.html
獲取方式:(收費(fèi))
工具地址:
https://www.aliyun.com/product/arms
Docsite一款集官網(wǎng)、文檔、博客和社區(qū)為一體的靜態(tài)開源站點(diǎn)的解決方案,具有簡(jiǎn)單易上手、上手不撒手的特質(zhì),同時(shí)支持 react 和靜態(tài)渲染、PC 端和移動(dòng)端、支持中英文國(guó)際化、SEO、markdown 文檔、全局站點(diǎn)搜索、站點(diǎn)風(fēng)格自定義、頁(yè)面自定義等功能。
使用教程:
https://docsite.js.org/zh-cn/docs/installation.html
獲取方式:(免費(fèi))
項(xiàng)目地址:
https://github.com/txd-team/docsite
Freeline 可以充分利用緩存文件,在幾秒鐘內(nèi)迅速地對(duì)代碼的改動(dòng)進(jìn)行編譯并部署到設(shè)備上,有效地減少了日常開發(fā)中的大量重新編譯與安裝的耗時(shí)。Freeline 最快捷的使用方法就是直接安裝 Android Studio 插件。
使用教程:
https://github.com/alibaba/freeline/blob/master/README-zh.md
獲取方式:(免費(fèi))
項(xiàng)目地址:
https://github.com/alibaba/freeline
PTS可以模擬大量用戶訪問業(yè)務(wù)的場(chǎng)景,任務(wù)隨時(shí)發(fā)起,免去搭建和維護(hù)成本,支持 JMeter 腳本轉(zhuǎn)化為 PTS 壓測(cè),同樣支持原生 JMeter 引擎進(jìn)行壓測(cè)。
使用教程:
https://help.aliyun.com/document_detail/70290.html
獲取方式:(收費(fèi))
工具地址:
https://www.aliyun.com/product/pts
KT 可以簡(jiǎn)化在 Kubernetes 下進(jìn)行聯(lián)調(diào)測(cè)試的復(fù)雜度,提高基于 Kubernetes 的研發(fā)效率。
使用教程:
https://yq.aliyun.com/articles/690519
獲取方式:(免費(fèi))
工具地址:
https://yq.aliyun.com/download/3393
AHAS為 K8s 等容器環(huán)境提供了架構(gòu)可視化的功能,同時(shí),具有故障注入式高可用能力評(píng)測(cè)和一鍵流控降級(jí)等功能,可以快速低成本的提升應(yīng)用可用性。
工具的使用場(chǎng)景:
使用教程:
https://help.aliyun.com/document_detail/90323.html
獲取方式:(免費(fèi))
工具地址:
https://www.aliyun.com/product/ahas
EasyExcel 是一個(gè)用來(lái)對(duì) Java 進(jìn)行解析、生成 Excel 的框架,它重寫了 poi 對(duì) 07 版 Excel 的解析,原本一個(gè) 3M 的 Excel 用 POI sax 需要 100M 左右內(nèi)存,EasyExcel 可降低到 KB 級(jí)別,并且再大的 excel 也不會(huì)出現(xiàn)內(nèi)存溢出的情況。03 版依賴 POI 的 sax 模式。在上層做了模型轉(zhuǎn)換的封裝,讓使用者更加簡(jiǎn)單方便。
使用教程:
https://github.com/alibaba/easyexcel/blob/master/quickstart.md
獲取方式:(開源)
https://github.com/alibaba/easyexcel
HandyJSON 是一個(gè)用于 Swift 語(yǔ)言中的 JSON 序列化 / 反序列化庫(kù)。
與其他流行的 Swift JSON 庫(kù)相比,HandyJSON 的特點(diǎn)是,它支持純 Swift 類,使用也簡(jiǎn)單。它反序列化時(shí) (把 JSON 轉(zhuǎn)換為 Model) 不要求 Model 從 NSObject 繼承 (因?yàn)樗皇腔?KVC 機(jī)制),也不要求你為 Model 定義一個(gè) Mapping 函數(shù)。只要你定義好 Model 類,聲明它服從 HandyJSON 協(xié)議,HandyJSON 就能自行以各個(gè)屬性的屬性名為 Key,從 JSON 串中解析值。
使用教程:
https://github.com/alibaba/HandyJSON/blob/master/README_cn.md
獲取方式:(開源)
https://github.com/alibaba/HandyJSON
EDAS Serverless一款基于 Kubernetes,面向應(yīng)用和微服務(wù)的 Serverless 平臺(tái)。用戶無(wú)需管理和維護(hù)集群與服務(wù)器,即可通過鏡像、WAR 包和 JAR 包,快速創(chuàng)建原生支持 Kubernetes 的容器應(yīng)用,同時(shí)支持 Spring Cloud 和 Dubbo 等主流微服務(wù)框架。
使用教程:
https://help.aliyun.com/document_detail/102048.html
獲取方式:(公測(cè)期間免費(fèi))
https://help.aliyun.com/document_detail/97792.html
Druid 是 Java 語(yǔ)言下的數(shù)據(jù)庫(kù)連接池,它能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。
使用教程:
https://github.com/alibaba/druid/wiki/ 常見問題
獲取方式:(開源)
http://central.maven.org/maven2/com/alibaba/druid/
Alibaba Dragonwell 是阿里巴巴內(nèi)部 OpenJDK 定制版 AJDK 的開源版本, AJDK 為在線電商,金融,物流做了結(jié)合業(yè)務(wù)場(chǎng)景的優(yōu)化,運(yùn)行在超大規(guī)模的,100,000+ 服務(wù)器的阿里巴巴數(shù)據(jù)中心。 Alibaba Dragonwell 與 Java SE 標(biāo)準(zhǔn)兼容,目前僅支持 Linux/x86_64 平臺(tái)。
使用教程:
https://github.com/alibaba/dragonwell8/wiki/ 阿里巴巴 Dragonwell8 用戶指南
獲取方式:(開源)
https://github.com/alibaba/dragonwell8
想看更多關(guān)于工程效率文章?點(diǎn)擊左下角了解更多哦~
么是HTML / HTM文件?他們相差一個(gè)字母有什么區(qū)別嗎,如何查看或編輯源代碼以及如何轉(zhuǎn)換成其他格式,例如DOCX,PDF,JPG 等,針對(duì)這些問題編程獅W3Cschool整理以下資料希望能對(duì)你有所幫助:
HTM / HTML 文件是超文本標(biāo)記語(yǔ)言(Hyper Text Markup Language)文件,是 Internet 上的標(biāo)準(zhǔn)網(wǎng)頁(yè)文件類型。
由于 HTM 文件是純文本文件,因此它們僅包含文本(例如您現(xiàn)在正在閱讀的內(nèi)容)以及對(duì)其他外部文件的文本引用(例如本文中的配圖)。
HTM 和 HTML 文件還可以引用其他文件,例如視頻,CSS 或 JS 文件。
HTM 與 HTML 沒有本質(zhì)意義的區(qū)別,只是為了滿足 DOS 僅能識(shí)別 8+3 的文件名而已,因?yàn)橐恍├系南到y(tǒng) (win32) 不能識(shí)別四位文件名,所以某些網(wǎng)頁(yè)服務(wù)器要求 index.html 最后一個(gè) l 不能省略。MSIE 能自動(dòng)識(shí)別和打開這些文件,但編寫網(wǎng)頁(yè)地址的時(shí)候必須是完全對(duì)應(yīng)的,也就是說(shuō) index.htm 和 index.html 是兩個(gè)不同的文件,對(duì)應(yīng)著不同的地址。值得一提的是 UNIX 系統(tǒng)中對(duì)大小寫敏感,不吻合的話就可能報(bào)沒有文件或者找不到文件。
任何 Web 瀏覽器,例如 Edge,F(xiàn)irefox,Chrome,Opera,IE,360 安全瀏覽器等,都可以打開并正確顯示 HTM 和 HTML 文件。換句話說(shuō),在瀏覽器中打開這些文件并“解碼(decode)” HTM 或 HTML 文件使其能正確顯示。
現(xiàn)在有很多簡(jiǎn)化編輯和創(chuàng)建 HTM / HTML 文件的工具。一些著名的免費(fèi) HTML 編輯器包括 Eclipse ,Komodo Edit 和 Bluefish 。另一個(gè)流行的具有許多高級(jí)功能的 HTM / HTML 編輯器是 Adobe Dreamweaver ,不過它是收費(fèi)的。
雖然 Windows 系統(tǒng)自帶的記事本等簡(jiǎn)單的文本編輯器的功能不如專用的 HTM 編輯器那么豐富,但是對(duì) HTM 或 HTML 文件進(jìn)行簡(jiǎn)單編輯修改還是可以的。不過,W3Cschool還是建議大家使用專用的編輯器,如 WebStorm、VS Code 等,它具更多專業(yè)功能。
這是一個(gè)非常簡(jiǎn)單的 HTML 頁(yè)面以文本形式顯示的示例:
源碼:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>什么是HTM或HTML文件? - 編程獅(w3cschool.cn)</title>
</head>
<body>
<h1>什么是HTM或HTML文件?</h1>
<p>HTM / HTML 文件是超文本標(biāo)記語(yǔ)言(Hyper Text Markup Language)文件,是 Internet 上的標(biāo)準(zhǔn)網(wǎng)頁(yè)文件類型。</p>
<p>由于 HTM 文件是純文本文件,因此它們僅包含文本(例如您現(xiàn)在正在閱讀的內(nèi)容)以及對(duì)其他外部文件的文本*引用*(例如本文中的配圖)。</p>
<p>HTM 和 HTML 文件還可以引用其他文件,例如視頻,CSS 或 JS 文件。</p>
</body>
</html>
當(dāng) Web 瀏覽器呈現(xiàn)信息時(shí),HTML 文件的源代碼被“轉(zhuǎn)換”為真實(shí)的網(wǎng)頁(yè)(盡管源代碼已很精簡(jiǎn)了)。
HTM 文件以特定的語(yǔ)法(規(guī)則)構(gòu)成,以使其中的代碼和文本在瀏覽器中打開時(shí)能夠正確顯示。因此,將 HTM / HTML 文件轉(zhuǎn)換為另一種格式可能會(huì)丟失頁(yè)面上的所有功能。
如果你想要做的是將一個(gè) HTM / HTML 文件轉(zhuǎn)換為方便離線查看的文件,這時(shí)圖片或 PDF 格式會(huì)方便很多。
在 Chrome 中,鼠標(biāo)右鍵單擊網(wǎng)頁(yè),出現(xiàn)的選項(xiàng)菜單中進(jìn)入 “打印(P)...”(快捷鍵:CTRL + P) ,在打印選項(xiàng)中選擇另存為 PDF,以將窗口中的頁(yè)面轉(zhuǎn)換為 PDF 文件。Chrome 瀏覽器的擴(kuò)展功能也稱為“全屏截屏”,可將 Chrome 瀏覽器中所有打開的 HTM / HTML 文件轉(zhuǎn)換為 PNG 文件。
其他瀏覽器具有類似的功能,例如 Firefox 的 “另存為 PDF” 加載項(xiàng)。
您也可以使用專門用于 HTM / HTML 進(jìn)行圖像文件轉(zhuǎn)換的網(wǎng)站,例如iWeb2Shot 或Web-capture 。
一個(gè)免費(fèi)的文件轉(zhuǎn)換器可以用來(lái)轉(zhuǎn)換并保存 HTM / HTML 文件到您的計(jì)算機(jī)。如 FileZigZag 是一個(gè)免費(fèi)的文檔轉(zhuǎn)換器網(wǎng)站,可將 HTM 轉(zhuǎn)換為RTF,EPS,CSV,PDF 和許多其他格式。
HTM / HTML 文件不能轉(zhuǎn)換為文本文件格式以外的任何格式。例如,HTML 文件永遠(yuǎn)不能轉(zhuǎn)換為 MP3 音頻文件。
HTML / HTM 文件應(yīng)該很容易打開,因?yàn)樗鼈冎皇侨魏?Web 瀏覽器都可以查看的文本文件。如果您的文件沒有從上面建議的任何程序打開,則很有可能正在打開的這個(gè)文件并非超文本標(biāo)記語(yǔ)言文件。
某些文件格式使用的文件擴(kuò)展名與 HTML / HTM 非常相似,但實(shí)際上并非相同。一個(gè)主要的示例是用于壓縮 HTML 電子書文件的 HTMLZ 文件擴(kuò)展名。有 HTML 文件在內(nèi)的 HTMLZ 文件,但整個(gè)包的格式為 ZIP,不會(huì)在 Web 瀏覽器或文本編輯器打開。
在此示例中,您需要特定的 HTMLZ 文件查看器,例如Caliber 。或者,由于此文件格式實(shí)際上是存檔,因此您可以使用 7-Zip 之類的文件解壓縮器將其打開,然后您可以使用網(wǎng)絡(luò)瀏覽器或上述任何其他 HTML 查看器/編輯器打開任何單獨(dú)的 HTML 文件。
TMLANGUAGE 是另一個(gè)可能與 HTML / HTM 文件混淆的文件擴(kuò)展名。這些實(shí)際上是TextMate 用于 macOS 的 TextMate 語(yǔ)言語(yǔ)法文件。
以上就是編程獅W3Cschool為你整理的關(guān)于《什么是HTM或HTML文件?如何打開、編輯和轉(zhuǎn)換HTM和HTML文件?》的全部?jī)?nèi)容,現(xiàn)希望可以幫到你~
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。