SP指令是指:用于设置JSP页面相关属性的一个语法命令,例如:设置页面编码字符集、导入其他包等等。JSP中提供了三个指令,分别是:page指令、include指令、taglib指令。其中page指令用于设置JSP页面属性,include指令用于引入其他的JSP文件,taglib指令用于引入标签库。这一小节内容介绍include指令的使用。
include指令作用:将指定的文件引入到当前JSP页面里面。include指令会将引入的文件内容嵌入到当前JSP页面中的对应位置。
<%@ include file="文件的相对路径" %>
案例代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>这是HTML头部</title>
</head>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入头部文件 --%>
<%@ include file="header.jsp" %>
<body>
<div style="background-color: cadetblue">
这是正文内容区域
</div>
<%-- 引入底部文件 --%>
<%@ include file="footer.html" %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div style="background-color: antiquewhite;">
这是footer底部内容区域
</div>
启动Tomcat容器,浏览器访问http://localhost:8080/servlet/include.jsp,结果如下:
include指令的本质是什么呢???我们来查看下编译之后的Java源代码,找到上面include.jsp文件编译之后的源文件,如下所示:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.98
* Generated at: 2024-02-25 05:06:41 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package com.gitcode.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class include_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
static {
_jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(2);
_jspx_dependants.put("/footer.jsp", Long.valueOf(1708837593266L));
_jspx_dependants.put("/header.jsp", Long.valueOf(1708837593271L));
}
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('\r');
out.write('\n');
out.write('\r');
out.write('\n');
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>这是HTML头部</title>\r\n");
out.write("</head>");
out.write("\r\n");
out.write("<body>\r\n");
out.write("\r\n");
out.write("<div style=\"background-color: cadetblue\">\r\n");
out.write(" 这是正文内容区域\r\n");
out.write("</div>\r\n");
out.write("\r\n");
out.write('\r');
out.write('\n');
out.write("\r\n");
out.write("<div style=\"background-color: antiquewhite;\">\r\n");
out.write(" 这是footer底部内容区域\r\n");
out.write("</div>");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
通过上面源代码,可以看到,使用include指令引入的两个文件,最终都会将两个文件中的内容直接嵌入到当前include.jsp文件里面,如下所示:
所以include指令的本质就是将引入文件中的内容,直接拼接到当前JSP页面的对应位置。这里也就会存在一个问题,引入的JSP文件中,不能存在和当前JSP页面相同的变量名称,因为变量名称相同会导致编译失败。另外,使用include指令引入其他的JSP文件时候,只会生成访问的那个JSP文件的源代码,被引入的JSP文件不会生成对应的源代码。
以上,就是include指令的使用及其本质。
今天就到这里,未完待续~~
天上班前二十分钟都是学习的时间,虽然这些内容都学习了好多次,但是温故而知新,html/htm/shtml它们仨的区别你知道吗?虽然网络推广、网络营销不是开发网站的,但是基本的代码标签还是需要知道的,有利于我们做网站的SEO优化,所以是必不可少的。
百度百科解释:
htm与.html并没有本质上的区别,表示的是同一种文件,不同的命名只是因为于不同的环境。 在Unix、Windows NT和Windows 95操作系统中,由于都支持长文件名格式,超文本文件文件名和扩展名长度可以不受限制,但扩展名必须是.HTML或 是.HTM。Unix系统的扩展名必须为.HTML,如果使用了三个字符的扩展名.HTM,那么当网上的Unix系统用户浏览你的超文本文件时,只能在屏幕上看到超文本的源文件,而不是展示的结果;若访问你的用户系统是Windows 3.X、Windows NT 或Windows 95,那么文件扩展名是HTML和HTM是一样的。所以Unix系统用户建立超文本时,文件扩展名一定要采用.HTML。
简单可以理解如下:
1、.htm与.html没有本质上的区别,表示的是同一种文件,只是适用于不同的环境之下。
2、DOS仅能识别8+3的文件名,所以*.htm的命名方法可以被DOS识别,而*.html的文件命名方式不能被之识别。
3、在UNIX系统中,网页必须使用.html扩展名,如果是htm,在浏览器中打开时则出现源代码;Windows中支持两种扩
展名。也可以说,htm和html是Windows和UNIX对抗的产物。
4、如果在网页中同时存在index.html与index.htm,这是浏览器将先解释index.html。
其它理解:
就是说实际上一样的,比方有个html的文件,你重命名为htm也没关系,IE还是能识别他并且打开。 但是我们在浏览器地址栏打开某个网址的时候,htm和html是完全不同的两个文件了,指向了不同的服务器地址,其实说白了就是后缀名不同而已, 比如在电脑上搜索*.htm与*.html搜索出来不同。
百度百科解释:
如果用一句话来解释就是:SHTML 不是HTML而是一种服务器API,shtml可通过服务器动态产成html.
虽然两者都是超文本格式,但shtml是一种用于SSI技术的文件。也就是Server Side Include--SSI服务器端包含指令。
如果Web Server有SSI功能的话(大多数(尤其是基于Unix平台)的WEB服务器如Netscape Enterprise Server等均支持SSI命令)。
会对shtml文件特殊招待。先扫一次shtml文件看有没有特殊的SSI指令存在。有就按Web Server设定规则解释SSI指令。解释完后跟一般html一起调去客户端。
html或htm与shtml或shtm的关系是什么?
html或者htm是一种静态的页面格式,也就是说不需要服务器解析其中的脚本,或者说里面没有服务器端执行的脚本,而shtml或者shtm由于它基于SSI技术,当有服务器端可执行脚本时被当作一种动态编程语言来看待,就如asp、jsp或者php一样。
当shtml或者shtm中不包含服务器端可执行脚本时其作用和html或者htm是一样的。
以上分享文字是个人原创观点,如有问题可评论讨论学习,如涉及到商业等法律问题与本人无关。
nclude指令用于在JSP页面引入其它内容,可以是JSP文件、html文件和文本文件等,相当于把文件的内容复制到JSP页面。引入的文件和JSP页面同时编译运行。
使用include指令有以下优点:
增加代码的可重用性
使JSP页面的代码结构清晰易懂
维护简单
include的语法如下:
<%@ include file="URL" %> 1复制代码类型:[java]
其中,file指定需要引入文件的相对路径。
可以在页面的任何位置编写include指令。
「链接」
*请认真填写需求信息,我们会在24小时内与您取得联系。