整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java Web轻松学41 - JSTL初步使用

Java Web轻松学41 - JSTL初步使用
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人。

  1. 介绍
  2. JSTL规范下载
  3. JSTL包含哪些库
  4. JSTL如何使用
  5. 租房网应用中使用JSTL
  6. JSTL相关的JAR包
  7. EL表达式访问列表的长度
  8. JSTL的forEach标签
  9. 剩下的页面改造
  10. 总结

介绍

上篇文章我们使用JSP技术对租房网平台进行了改造,也提到下面这样的代码有点奇葩:

<%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来进一步改造我们的租房网应用。

JSTL规范下载

既然称之为库,那么它包含哪些库呢?

我们可以把JSTL规范下载下来看一下,当然你也可以找本相关书籍,或者直接在网上搜索一下。

JSTL规范的下载类似Servlet规范的下载(可以参考这篇文章),不过我们在JCP官网(https://jcp.org/en/home/index)中搜索的关键字就变成Tag或Tag Library了。

我们在搜索结果中就可以看到:

点击 Download page 链接可以看到:

然后继续点击底部的 Maintenance Review 2 of JSR 52 链接,跳转到:

不过,再次点击DOWNLOAD按钮时,我这边出现无法访问此网站的错误。所以我转而点击底部的 JSR-000052 A Standard Tag Library for JavaServer Pages Detail Page 链接:

从这里我们可以看到JSTL规范的各个阶段,我们选择 Maintenance Release 2 这个阶段,点击它右边的 Download page 链接:

然后再点击红色箭头所指的链接,跳转到真正的下载页面:

后续操作就跟Servlet规范的下载类似了。

JSTL包含哪些库

现在,我们可以打开JSTL规范,可以看到如下描述:

事实上,JSTL应该就只是一个库,但它根据不同功能而划分成了多个库:

  • 核心:变量支持、流控制、URL管理等等,它的命名空间URI是:http://java.sun.com/jsp/jstl/core,标签前缀通常使用:c
  • XML处理:它的命名空间URI是:http://java.sun.com/jsp/jstl/xml,标签前缀通常使用:x
  • 国际化:语言区域、消息格式化、数字和日期格式化等,它的命名空间URI是:http://java.sun.com/jsp/jstl/fmt,标签前缀通常使用:fmt
  • 数据库访问(SQL):它的命名空间URI是:http://java.sun.com/jsp/jstl/sql,标签前缀通常使用:sql
  • 函数:集合长度、字符串操作等,它的命名空间URI是:http://java.sun.com/jsp/jstl/functions,标签前缀通常使用:fn

JSTL如何使用

JSTL的终极目标是简化JSP页面的开发,所以,它应该是在JSP页面中使用。

既然是标签,那它的使用是否跟HTML标签、XML标签类似呢?答案是肯定的。

不过,JSTL标签的使用与XML标签使用时声明命名空间类似,也需要告诉Servlet/JSP容器该JSP页面需要引入某个库(即上述的核心、XML处理、国际化、数据库访问、函数等等,以及以后自定义的标签)。

在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标签有两种形式,有属性和属性值,也可能有标签内容,跟HTML标签和XML标签类似。

租房网应用中使用JSTL

我们就拿租房网应用中的房源列表页面houses.jsp来使用JSTL改造,因为这里涉及列表数据的展示。

列表数据是很常见的,我们经常可以看到包含列表数据的页面,比如订单列表、商品列表等等。

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就报错了:

提示是说找不到这个标签库的描述符。那就根据这个提示在网上搜索答案呗。

答案就是原来我们还需要在我们的工程结构里配置JSTL相关的JAR包,而Tomcat这个Servlet/JSP容器本身不提供这些JSTL相关的JAR包,我们需要单独下载。

JSTL相关的JAR包

那么在哪里下载呢?既然我们是使用Tomcat这个Servlet/JSP容器,那么我们就可以到它的官网(http://tomcat.apache.org/)上看看:

我们可以看到左侧导航栏中有个Taglibs链接,我们点进去看看:

还真就是JSTL相关JAR包的下载页面,点击Download链接进去,可以找到真正的下载链接:

我们可以看下Binary README文件,里面有该JAR包版本支持的Tomcat和JSP等版本信息,如果我们使用的Tomcat是最新版本(9.0.x),那直接下载下面四个JAR包即可,否则需要点进Archives页面下载历史版本。

好,我们把四个JAR包下载下来之后,就可以添加到我们的租房网应用的工程里面了,可以参考这篇文章。

实际上,直接把这四个JAR包拷贝到WebContent/WEB-INF/lib节点下是最快的。

现在,我们可以看到上述的Eclipse报错提示就消失了。

EL表达式访问列表的长度

首先,我们可以使用EL表达式来访问列表的长度:

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

据说低版本的JSP容器不可以这样直接用EL表达式来访问列表的长度,而应该使用JSTL的函数库中的length方法:

${fn:length(list) }

当然,首先需要引入JSTL的函数库。读者朋友可以自行尝试一下。

JSTL的forEach标签

我们可以通过JSTL规范查看一下这个forEach标签的用法:

当然,可能只看这个语法格式还是不太明白如何使用,那么可以继续看规范中的描述,或者直接网上搜索即可。

我们需要改造的代码是这一部分:

<%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会出现智能提示:

嗯,这个功能还是挺好用的,提高开发效率。

闲话不多说了,直接上代码:

<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标签遍历列表数据的基本属性是:

  • var:相当于定义一个变量来表示指向列表中的某一项;
  • items:指定需要遍历哪个列表,需要注意的是其值又是使用EL表达式来访问页面/请求/会话/应用中的某个属性数据(即使用setAttribute()添加的对象)

forEach标签的内容就可以是普通的HTML标签了,然后HTML标签里我们就可以使用EL表达式来访问列表中每一项数据。

实际上,EL表达式直接访问对象的属性,而非调用对象的方法,比如:

${house.id}

注意,param是EL的隐式对象,它是由Servlet/JSP容器创建并传进来的,它可以直接访问请求所携带的参数。

所以,我们实际上可以把原来的这一部分:

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

删除掉。

现在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页面的开发者必须知道传进这个页面的到底有哪些数据对象!

没错,这就相当于把数据的展示(视图层)给分离开来,你需要与后端(控制器层和模型层)约定/设计好每一个JSP页面都有哪些数据对象。

然后,JSP页面的开发者和后端(控制器层和模型层)的开发者就可以各自独立去开发了。

剩下的页面改造

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

提示:JSP页面应该只关心取数据展示,而不应该关心如何查找到某个数据这种逻辑,应该把这种逻辑放到后端(控制器层和模型层)。

我的改造是这样的,把原来这两个页面的如何查找到某个数据这种逻辑放到Filter中,前后端约定好这两个页面中存在target这个House对象,于是doFilter()方法中在将请求交给下个节点之前应该挂载上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>

可以看到,这两个页面只是取数据(target这个House对象)展示而已。

总结

  • JSTL的终极目标是简化JSP开发;
  • JSTL的使用需要先声明某个库;
  • JSTL的标签使用类似HTML标签和XML标签,语法规则可以查看JSTL规范;
  • JSP页面使用JSTL和EL表达式基本可以实现大部分功能;
  • EL表达式能够直接访问页面/请求/会话/应用这几个对象中挂载(即setAttribute()方法)的数据对象;
  • EL表达式使用 ${ }
  • EL中存在隐式对象,以后再介绍;
  • 列表数据很常见很重要;
  • 列表数据采用JSTL的forEach标签来遍历(实际上也可以采用EL表达式,比如${mockHouses[i].id});
  • 前后端开发的分离:前端只关心取数据如何展示;后端关心如何取数据并挂载到页面/请求/会话/应用这几个对象中;
  • 前后端需约定/设计好数据;

人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展。

阿里巴巴将自身在各类业务场景下的技术积淀,通过开源、云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具,希望能帮助开发者们提高开发效率、更优雅的写代码。

由于开发者涉及的技术领域众多,笔者仅从自己熟悉的领域,以后端开发者的视角盘点平时可能用得到的工具。每个工具按照以下几点进行介绍:

  • 工具名称和简介
  • 使用场景
  • 使用教程
  • 获取方式

一、Java 线上诊断工具 Arthas

Arthas 阿里巴巴 2018 年 9 月开源的一款 Java 线上诊断工具。

工具的使用场景:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到 JVM 的实时运行状态?

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 插件,可以帮助开发者更高效地开发、测试、诊断并部署应用。通过 Cloud Toolkit,开发者能够方便地将本地应用一键部署到任意机器(本地或云端),并内置 Arthas 诊断、高效执行终端命令和 SQL 等,提供 IntelliJ IDEA 版,Eclipse 版,PyCharm 版和 Maven 版。

工具的使用场景:

  • 每次修改完代码后,是否正在经历反复地打包?
  • 在 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是一款遵循混沌工程实验原理,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具,可实现底层故障的注入,提供了延迟、异常、返回特定值、修改参数值、重复调用和 try-catch 块异常等异常场景。

工具的使用场景:

  • 微服务的容错能力不易衡量?
  • 容器编排配置是否合理无法验证?
  • PaaS 层健壮性的测试工作无从入手?

使用教程

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

获取方式:(免费)

开源地址:

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

四、Java 代码规约扫描插件

该插件用于检测 Java 代码中存在的不规范的位置,并给予提示。规约插件是采用 Kotlin 语言开发。

使用教程

IDEA 插件使用文档:

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

Eclipse 插件使用文档:

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

获取方式:(免费)

开源地址:

https://github.com/alibaba/p3c

五、应用实时监控工具 ARMS

ARMS是一款 APM 类的监控工具,提供前端、应用、自定义监控 3 类监控选项,可快速构建实时的应用性能和业务监控能力。

工具的使用场景:

  • 晚上 10 点收到 37 条报警信息,你却无从下手?
  • 当我们发现问题的时候,客户 / 业务方已经发起投诉?
  • 每个月花几十万买服务器,却无法保障用户体验?

使用教程

前端监控接入:

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

应用监控接入:

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

自定义监控:

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

获取方式:(收费)

工具地址:

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

六、静态开源站点搭建工具 Docsite

Docsite一款集官网、文档、博客和社区为一体的静态开源站点的解决方案,具有简单易上手、上手不撒手的特质,同时支持 react 和静态渲染、PC 端和移动端、支持中英文国际化、SEO、markdown 文档、全局站点搜索、站点风格自定义、页面自定义等功能。

使用教程

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

获取方式:(免费)

项目地址:

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

七、Android 平台上的秒级编译方案 Freeline

Freeline 可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时。Freeline 最快捷的使用方法就是直接安装 Android Studio 插件。

使用教程

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

获取方式:(免费)

项目地址:

https://github.com/alibaba/freeline

八、性能测试工具 PTS

PTS可以模拟大量用户访问业务的场景,任务随时发起,免去搭建和维护成本,支持 JMeter 脚本转化为 PTS 压测,同样支持原生 JMeter 引擎进行压测。

使用教程

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

获取方式:(收费)

工具地址:

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

九、云效开发者工具 KT

KT 可以简化在 Kubernetes 下进行联调测试的复杂度,提高基于 Kubernetes 的研发效率。

使用教程

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

获取方式:(免费)

工具地址:

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

十、架构可视化工具 AHAS

AHAS为 K8s 等容器环境提供了架构可视化的功能,同时,具有故障注入式高可用能力评测和一键流控降级等功能,可以快速低成本的提升应用可用性。

工具的使用场景

  • 服务化改造过程中,想精确的了解资源实例的构成和交互情况,实现架构的可视化?
  • 想引入真实的故障场景和演练模型?
  • 低门槛获得流控、降级功能?

使用教程

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

获取方式:(免费)

工具地址:

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

十一、数据处理工具 EasyExcel

EasyExcel 是一个用来对 Java 进行解析、生成 Excel 的框架,它重写了 poi 对 07 版 Excel 的解析,原本一个 3M 的 Excel 用 POI sax 需要 100M 左右内存,EasyExcel 可降低到 KB 级别,并且再大的 excel 也不会出现内存溢出的情况。03 版依赖 POI 的 sax 模式。在上层做了模型转换的封装,让使用者更加简单方便。

使用教程

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

获取方式:(开源)

https://github.com/alibaba/easyexcel

十二、iOS 类工具 HandyJSON

HandyJSON 是一个用于 Swift 语言中的 JSON 序列化 / 反序列化库。

与其他流行的 Swift JSON 库相比,HandyJSON 的特点是,它支持纯 Swift 类,使用也简单。它反序列化时 (把 JSON 转换为 Model) 不要求 Model 从 NSObject 继承 (因为它不是基于 KVC 机制),也不要求你为 Model 定义一个 Mapping 函数。只要你定义好 Model 类,声明它服从 HandyJSON 协议,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 包,快速创建原生支持 Kubernetes 的容器应用,同时支持 Spring Cloud 和 Dubbo 等主流微服务框架。

使用教程

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

获取方式:(公测期间免费)

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

十四、数据库连接池 Druid

Druid 是 Java 语言下的数据库连接池,它能够提供强大的监控和扩展功能。

使用教程

https://github.com/alibaba/druid/wiki/ 常见问题

获取方式:(开源)

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

十五、Java 工具集 Dragonwell

Alibaba Dragonwell 是阿里巴巴内部 OpenJDK 定制版 AJDK 的开源版本, AJDK 为在线电商,金融,物流做了结合业务场景的优化,运行在超大规模的,100,000+ 服务器的阿里巴巴数据中心。 Alibaba Dragonwell 与 Java SE 标准兼容,目前仅支持 Linux/x86_64 平台。

使用教程

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

获取方式:(开源)

https://github.com/alibaba/dragonwell8

想看更多关于工程效率文章?点击左下角了解更多哦~

么是HTML / HTM文件?他们相差一个字母有什么区别吗,如何查看或编辑源代码以及如何转换成其他格式,例如DOCX,PDF,JPG 等,针对这些问题编程狮W3Cschool整理以下资料希望能对你有所帮助:

什么是HTM或HTML文件?

HTM / HTML 文件是超文本标记语言(Hyper Text Markup Language)文件,是 Internet 上的标准网页文件类型。

由于 HTM 文件是纯文本文件,因此它们仅包含文本(例如您现在正在阅读的内容)以及对其他外部文件的文本引用(例如本文中的配图)。

HTM 和 HTML 文件还可以引用其他文件,例如视频,CSS 或 JS 文件。

HTM与HTML的区别

HTM 与 HTML 没有本质意义的区别,只是为了满足 DOS 仅能识别 8+3 的文件名而已,因为一些老的系统 (win32) 不能识别四位文件名,所以某些网页服务器要求 index.html 最后一个 l 不能省略。MSIE 能自动识别和打开这些文件,但编写网页地址的时候必须是完全对应的,也就是说 index.htmindex.html 是两个不同的文件,对应着不同的地址。值得一提的是 UNIX 系统中对大小写敏感,不吻合的话就可能报没有文件或者找不到文件。

如何打开HTM或HTML文件?

任何 Web 浏览器,例如 Edge,Firefox,Chrome,Opera,IE,360 安全浏览器等,都可以打开并正确显示 HTM 和 HTML 文件。换句话说,在浏览器中打开这些文件并“解码(decode)” HTM 或 HTML 文件使其能正确显示。

现在有很多简化编辑和创建 HTM / HTML 文件的工具。一些著名的免费 HTML 编辑器包括 Eclipse ,Komodo Edit 和 Bluefish 。另一个流行的具有许多高级功能的 HTM / HTML 编辑器是 Adobe Dreamweaver ,不过它是收费的。

虽然 Windows 系统自带的记事本等简单的文本编辑器的功能不如专用的 HTM 编辑器那么丰富,但是对 HTM 或 HTML 文件进行简单编辑修改还是可以的。不过,W3Cschool还是建议大家使用专用的编辑器,如 WebStorm、VS Code 等,它具更多专业功能。

这是一个非常简单的 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 上的标准网页文件类型。</p>
    <p>由于 HTM 文件是纯文本文件,因此它们仅包含文本(例如您现在正在阅读的内容)以及对其他外部文件的文本*引用*(例如本文中的配图)。</p>
    <p>HTM 和 HTML 文件还可以引用其他文件,例如视频,CSS 或 JS 文件。</p>   
</body>

    
</html>

当 Web 浏览器呈现信息时,HTML 文件的源代码被“转换”为真实的网页(尽管源代码已很精简了)。

如何转换HTML和HTM文件?

HTM 文件以特定的语法(规则)构成,以使其中的代码和文本在浏览器中打开时能够正确显示。因此,将 HTM / HTML 文件转换为另一种格式可能会丢失页面上的所有功能。

如果你想要做的是将一个 HTM / HTML 文件转换为方便离线查看的文件,这时图片或 PDF 格式会方便很多。

在 Chrome 中,鼠标右键单击网页,出现的选项菜单中进入 “打印(P)...”(快捷键:CTRL + P) ,在打印选项中选择另存为 PDF,以将窗口中的页面转换为 PDF 文件。Chrome 浏览器的扩展功能也称为“全屏截屏”,可将 Chrome 浏览器中所有打开的 HTM / HTML 文件转换为 PNG 文件。

其他浏览器具有类似的功能,例如 Firefox 的 “另存为 PDF” 加载项。

您也可以使用专门用于 HTM / HTML 进行图像文件转换的网站,例如iWeb2Shot 或Web-capture 。

一个免费的文件转换器可以用来转换并保存 HTM / HTML 文件到您的计算机。如 FileZigZag 是一个免费的文档转换器网站,可将 HTM 转换为RTF,EPS,CSV,PDF 和许多其他格式。

HTM / HTML 文件不能转换为文本文件格式以外的任何格式。例如,HTML 文件永远不能转换为 MP3 音频文件。

文件打不开?

HTML / HTM 文件应该很容易打开,因为它们只是任何 Web 浏览器都可以查看的文本文件。如果您的文件没有从上面建议的任何程序打开,则很有可能正在打开的这个文件并非超文本标记语言文件。

某些文件格式使用的文件扩展名与 HTML / HTM 非常相似,但实际上并非相同。一个主要的示例是用于压缩 HTML 电子书文件的 HTMLZ 文件扩展名。有 HTML 文件在内的 HTMLZ 文件,但整个包的格式为 ZIP,不会在 Web 浏览器或文本编辑器打开。

在此示例中,您需要特定的 HTMLZ 文件查看器,例如Caliber 。或者,由于此文件格式实际上是存档,因此您可以使用 7-Zip 之类的文件解压缩器将其打开,然后您可以使用网络浏览器或上述任何其他 HTML 查看器/编辑器打开任何单独的 HTML 文件。

TMLANGUAGE 是另一个可能与 HTML / HTM 文件混淆的文件扩展名。这些实际上是TextMate 用于 macOS 的 TextMate 语言语法文件。

以上就是编程狮W3Cschool为你整理的关于《什么是HTM或HTML文件?如何打开、编辑和转换HTM和HTML文件?》的全部内容,现希望可以帮到你~