摘要:下面我们再打开对应的文件,我们会看到如下部分内容静态测试调用我是文件,我被文件调用了我们发现,在该包含文件被引入处那条语句被执行了。
在上一节中我们学习了如何搭建一个简单的Web应用,并且已经知晓了一个JSP页面主要由静态的HTML内容和动态的Java脚本共同组成。JSP的基本语法共有JSP注释、JSP声明、输出JSP表达式与JSP程序片段四种,用来控制动态向页面输出内容的。现在我们就一起来学习JSP的这几种基本语法。
(一)JSP的基本语法 1.JSP注释语句JSP注释用于标注在程序开发过程中的开发提示,不会输出到客户端。
JSP注释的格式如下:
<%--我是JSP注释的内容--%>
其实我们可以发现JSP的注释与HTML的注释十分类似,下面是HTML的注释格式:
下面我们通过一个例子来体会一下这二者在JSP页面中的区别:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>注释实例 下面的是JSP注释:
<%--我是JSP注释--%>
下面的是HTML注释:
在浏览器中浏览该页面,并且右击查看网页源代码,我们会看到JSP注释消失了,如下图所示:
这表明JSP注释只在服务器端有效,但是并不会作为HTML代码的一部分发送到客户端。
2.JSP脚本语句 (1)JSP声明JSP声明用于声明Servlet类的成员变量和方法
JSP的声明格式如下:
<%! 声明内容 %>
下面来看一个使用JSP声明的示例页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>JSP声明 <%! public int count; public String sayHello(){ return "hello"; } %> <% //这行代码的意思是向屏幕输出count的值后再加1 out.println(count++); %>
<% //这行代码的意思是输出sayHello方法的返回值 out.println(sayHello()); %>
当我们在浏览器中查看时,可以看到count的值与字符hello的输出。
对于JSP声明有下列三点需要注意:
可以一次性声明多个变量和方法,前提是符合Java语法。
一个声明仅在一个页面中有效
声明的变量为全局变量,所有执行此JSP页面的用户会共享此变量。
在JSP声明中声明方法似乎不需要任何类作为载体而独立存在,事实上并不是这样。根据我们学过的知识我们知道JSP实质 就是Servlet,JSP会被转化为一个Servlet实例。而我们在JSP页面中声明的内容会被转换为对应Servlet实例的成员变量和成员方法。
下面我们打开F:TomcatworkCatalinalocalhostmyThreeProjectorgapachejsp下的.java文件,我们会看到如下的java代码:
* generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { public int count; public String sayHello(){ return "hello"; } ... }
以上就是由JSP页面转换成的的Servlet类,我们可以看到count变量与sayHello方法是这个类的成员。
由于JSP声明的变量与方法会转换为对应Servlet实例的成员变量与成员方法,所以我们可以对JSP声明部分定义的变量和方法使用private和public等访问控制符,也可以使用static,但是不能使用abstract修饰声明部分的方法,因为抽象方法将导致JSP对应的Servlet变成抽象类,从而导致无法实例化。
(2)输出JSP表达式JSP提供了如下方式的输出表达式语法:
<%=JSP表达式%>
值得注意的是JSP表达式后面不能有分号。
下面来看一个实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>输出JSP表达式 <%! public int count; public String sayHello(){ return "hello"; } %> <%=count++%>
<%=sayHello()%>
可以看到这个页面与前一个页面的区别仅仅是把out.println输出语句替换成了"=",这两个页面的执行效果是一致的。其实,JSP/Servlet引擎在解释执行JSP页面时会把"="替换成Servlet实例类中的out输出语句。
(3)JSP程序片段JSP脚本中可以包含任何可执行性代码
JSP程序片段简称Scriptlet,就是脚本小部件的意思。我们可以通过Scriptlet把代码嵌入到静态HTML页面中去,JSP的核心代码也都是写在这里面的。同样,它的内容也是包裹在"<%%>"中,如下所示:
<% 代码 %>
下面我们来看一个例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>JSP脚本 <% String name = "Jom"; if (name.equals("Jom")){ %> He is Jom. <% } else { %> He is not Jom. <% } %>
输出结果为:
He is Jom.
下面我们打开此项目生成的.java文件
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { ... try { ... out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write("JSP脚本 "); out.write(" "); String name = "Jom"; if (name.equals("Jom")){ out.write(" "); out.write(" He is Jom. "); out.write(" "); } else { out.write(" "); out.write(" He is not Jom. "); out.write(" "); } out.write(" "); out.write(" "); out.write(""); } ... }"); out.write(" "); out.write(" "); out.write("
我们可以看出,JSP脚本与静态的HTML内容已经全部被转换为_jspService方法的可执行代码。由此我们可以得出两个结论:
我们可以在JSP脚本中声明变量,只是声明的只是局部变量。
JSP脚本中不能定义方法,因为按照java语法,方法中不能定义方法。
(二)JSP编译指令JSP编译指令用于提供整个JSP网页的相关信息、设定JSP网页的相关属性,例如网页的编码方式、语法等。JSP编译指令语法如下:
<%@ 指令名 属性1="属性值1" 属性2="属性值2" ... %>
编译指令都有默认值,所以我们无需为每个指令设置值。常见的编译指令有page、include、taglib三个,下面主要介绍page、include两个指令,关于taglib指令在后续章节中会详细学习。
1.page指令page指令定义了JSP文件的全局属性,可以指定所使用的的脚本语言、JSP对应的Servlet所实现的接口等。
page指令的语法格式如下:
<%@ page 属性1="属性值1" 属性2="属性值2" ... %>
page指令常用的属性见下图(图片来源于网络):
值得注意的是,contentType的charset属性和pageEncoding属性都涉及JSP网页的编码方式,但是两者有所区别。contentType的charset属性是指服务器发送给客户端时的内容编码方式,pageEncoding是JSP文件本身的编码方式。另外,errorPage属性实质是JSP的异常处理机制,JSP脚本不要求强制处理异常,包括checked异常。
使用page指令需要注意一下几点:
page指令作用于整个页面,包括静态的包含文件,不包括动态的包含文件。
page指令在一个页面中可以出现多次,除了import属性外,其他属性只能出现一次。
为了JSP程序的可读性,我们一般将page指令置于顶部
2.include指令使用include指令可以将外部文件包含进当前JSP页面,这个外部文件可以是JSP文件、HTML文件或者文本文件。
include指令的语法格式如下:
<%@ include 属性1="属性值1" 属性2="属性值2" ... %>
这种包含是静态包含,即将被包含文件插入到JSP指定的位置,解析这个页面,同时把目标文件的其他编译指令也包含进来。
下面来看一个使用静态导入的示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>静态include测试 <%@include file="text.jsp" %>
在这个JSP页面里包含了当前路径下的text.jsp文件,该文件里只有一条JSP输出语句:
<% out.println("我是text.jsp文件,我被index.jsp文件调用了!"); %>
下面我们启动这个项目,在浏览器中我们会看到如下的输出:
我们发现text.jsp文件里的内容在index.jsp文件里被成功执行了。下面我们再打开对应的.java文件,我们会看到如下部分内容:
out.write(" "); out.write(" "); out.write(" "); out.write("静态include测试itle> "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write("JSP-include调用 "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.println("我是text.jsp文件,我被index.jsp文件调用了!"); out.write(" "); out.write(" "); out.write(""); out.write(" "); out.write(" "); out.write("");
我们发现,在该包含文件被引入处那条语句被执行了。所以,我们得出结论:include指令将包含的页面与本页面融合成一个了页面。
鉴于此,如果多数JSP网页包含相同的内容,我们可以将这些相同的内容多带带放在一个文件中,其他JSP页面通过include指令将这个文件包含。这样做不仅可以提高开发效率还有利于网站的维护。
下面以下图总结本次学习内容(图片来源于网络):
以上就是本次学习内容,下次我们将学习JSP的动作指令。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66818.html
摘要:当后继请求相同的页面时,容器加载之前生成的类,并且通知去执行已经存在的字节码,从而省去了转换的过程,这也是第一次执行页面时间较长的原因。 以往学习的时候大多是看完书或者看完视频,动手实践一下就OK了。然而过了一段时间我发现东西都忘差不多了,需要复习才能重新掌握。现在开始学习JavaWeb了,我将在这里记录自己的学习的一点一滴,不仅便于自己以后回顾知识点,也希望能对JavaWeb初学者有...
摘要:系列文章请查看超详细的面试题总结一之基础知识篇超详细的面试题总结二之基础知识篇超详细的面试题总结三之集合篇常见问题下面的都是自己之前在学习的时候总结的,对于巩固的基础知识应该有很大帮助。注意多线程的并发的读写类属性会导致数据不同步。 系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(...
摘要:出现的目的同一样也是要提到页面中的脚本代码。标准标准标签库有个子库,但随着发展,目前常使用的是他的核心库标签库标签库的前缀下载与导入下载从的网站下载的包。 一、JSP技术1.jsp脚本和注释jsp脚本:1) ----- 内部的java代码翻译到service方法的内部2) ----- 会被翻译成service方法内部out.print()3) ---- 会被翻译成servlet的成员的...
阅读 3902·2021-09-22 10:02
阅读 3347·2019-08-30 15:52
阅读 3039·2019-08-30 12:51
阅读 739·2019-08-30 11:08
阅读 2043·2019-08-29 15:18
阅读 3078·2019-08-29 12:13
阅读 3573·2019-08-29 11:29
阅读 1857·2019-08-29 11:13