Java Web开发——第二章JSP语法

前言

本章为《JSP实用教程》第四版 耿祥义 张跃平主编
软件版本号为:

Tomcat:9.0
Java:jdk13

2.1 JSP页面的基本结构

一个JSP页面可由5种元素构成:

  • 普通的HTML标记和JavaScript标记
  • JSP标记,如指令标记、动作标记
  • 变量和方法的声明
  • Java程序片
  • Java表达式

当Tomcat服务器上的一个JSP页面被第一次请求执行,Tomcat服务器首先将JSP页面文件转译成一个Java文件,再将这个Java文件编译生成字节码文件,然后通过执行字节码文件响应用户的请求

字节码文件的任务:

  • 把JSP页面中普通的HTML标记和JavaScript标记交给用户端浏览器执行显示。
  • JSP标记、方法的定义、Java程序片由服务器负责处理和执行,将需要显示的结果发送给用户端浏览器
  • Java表达式由服务器负责计算,并将结果转化为字符串,然后交给用户端浏览器负责显示。

2.2 声明变量和定义方法

  1. 声明变量
    “<%!和%>”之间声明的变量在整个JSP页面内都有效,与“<%!” “%>”标记符在JSP页面中所在的书写位置无关
    Tomcat服务器将JSP页面转译成Java文件时,将“<%!” “%>”标记符之间声明的变量作为类的成员变量,这些变量占有的内存空间直到Tomcat服务器关闭才释放。
    当多个用户请求一个JSP页面时,Tomcat服务器为每个用户启动一个线程,这些线程由Tomcat服务器来管理,这些线程共享JSP页面的成员变量,因此任何一个用户对JSP页面的成员变量操作的结果都会影响到其他用户
  2. 定义方法和类
    可以在“<%!” “%>”标记符号之间定义方法,可以在Java程序片中调用该方法。方法内声明的变量只在该方法内有效,当方法被调用时,方法内声明的变量被分配内存,方法被调用完毕即可释放这些变量所占的内存

2.3 Java程序片

可以在“<%”和“%>”之间插入Java程序片。
在程序片中声明的变量称为JSP页面的局部变量。局部变量的有效范围与其声明的位置有关,即局部变量在JSP页面后继的所有程序片以及表达式部分内都有效。Tomcat服务器将JSP页面转译成Java文件时,将各个程序片的这些变量作为类中某个方法的变量,即局部变量。

运行在不同线程中的Java程序片的局部变量互不干扰,即一个用户改变Java程序片中的局部变量的值不会影响其他用户的Java程序片中的局部变量

一个JSP页面中的Java程序片会按其在页面中的顺序被执行,而且某个Java程序片中声明的局部变量在其后继的所有Java程序片以及表达式部分内都有效。利用Java程序片的这个性质,有时候可以将一个Java程序片分割成几个Java程序片,然后在这些Java程序片之间再插入其他标记元素。在程序片中插入HTML中的标记的技巧对于灵活显示数据是非常重要的。

2.4 Java表达式

可以在“<%=” “%>”之间插入一个可求值的表达式(注意:不可插入语句 ,“<%=”是一个完整的符号,“<%”和“=”之间不要有空格)。
表达式的值由服务器负责计算,并将计算结果用字符串形式发送到用户端显示

需要注意的是,在JSP页面中,表达式的值被表示成一个字符串的形式,即Tomcat服务器将表达式的结果转换成字符串,然后发送给用户的浏览器。因此,在编写JSP页面时,要把Java表达式按普通的文本来使用。

2.5 JSP中的注释

  1. HTML注释:在标记符号之间加入注释内容:
	<!--注释内容-->

JSP引擎把HTML注释交给用户,因此用户通过浏览器查看JSP页面的源文件时,能看到HTML注释
2、JSP注释:在标记符号之间加入注释内容

<%-- 注释内容 --%>

Tomcat服务器忽略JSP注释,即在编译JSP页面时忽略JSP注释

2.6 JSP中的注释

2.6.1 page指令标记

page指令标记
page指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。可以使用多个page指令分别为每个属性指定值,如:

<%@ page 属性1=“属性1的值”%>
<%@ page 属性2=“属性2的值”%>

<%@ page 属性n=“属性n的值”%>

page指令的作用对整个JSP页面有效,与其书写的位置有关

page指令标记可以为contentType、import、language、session、autoFlush、isThreadSafe、pageEncoding、inform等属性指定值

  1. contentType属性
    contentType属性值确定JSP页面响应的MIME类型.属性值的一般形式:

“MIME类型”

比如,如果我们希望用户浏览器启用HTML解析器来解析执行所接收到的信息(即所谓的网页形式),就可以如下设置:

<%@page contentType=“text/html”%>

如果希望用户浏览器启用本地的MS-Word应用程序来解析执行收到的信息,就可以如下设置contentType属性的值:

<%@page contentType=“application/msword”%>

如果不使用page指令为contentType指定一个值,那么contentType属性的默认值是"text/html"。JSP页面使用page指令只能为contentType指定一个值,不允许俩次使用page指令给contentType属性指定不同的属性值。
但可有多条语句(只不过都是指定同一个值)

用page指令为contentType指定一个值的同时,也同时为contentType的附加属性charset指定一个值(默认值是iso-8859-1)

contentType的附加属性charset的值是通知用户浏览器用怎样的编码解析收到的字符,当JSP页面用page指令指定设置charset的值GB2312时,浏览器会将编码换成GB2312。
但是,如果JSP页面用page指定了JSP的页面本身的编码,例如:<%@page pageEncoding=“utf-8”%>,那么charset的值和JSP的页面编码保持一致,即utf-8

如果用户浏览器不支持某种MIME类型,那么用户的浏览器就无法用相应的手段处理所接收到的信息

  1. pageEncoding属性
    pageEncoding属性的默认值是UTF-8。需要注意的是,和contentType的附加属性charset的值的意义不同,pageEncoding属性值是定义JSP页面使用的编码,即告诉Tomcat服务器的解析器用怎样的编码解析JSP页面中的字符,比如当JSP页面指定的编码是UTF-8时:
    <%@ page pageEncoding=“utf-8”%>
    保存JSP页面应当将“编码”选择为“UTF-8”,原因是Tomcat服务器根据JSP页面产生成Java文件时,Tomcat服务器的解析器是按照UTF-8编码解析JSP页面中的字符数据(JSP页面本质上是一个XML文档)产生对应Java文件。
    如果保存JSP页面时,不小心将“编码”选择为其他编码(不是UTF-8),那么Tomcat服务器的解析器产生对应的Java文件中的某些字符串就可能有乱码现象,而这些字符串又发送到客户端浏览器,所以用户浏览器显示信息就出现了乱码现象
    另外,JSP页面使用page指令只能为pageEncoding指定一个值,不允许两次使用page指定给pageEncoding属性指定不同的或相同的属性值。
    不可有多条语句(即使是同一个值 )

  2. language属性
    language属性定义JSP页面使用的脚本语言,该属性目前只能取"java"。
    格式:
    <%@ page language=“java” %>
    (默认也会有该指令)

  3. import属性
    该属性的作用是为JSP页面引入Java运行环境提供的包的类,这样就可以在JSP页面的程序片部分、变量及方法定义部分以及表达式部分使用包的类。可以为该属性指定多个值,该属性得到值可以是某包中的所有类的一个具体的类。

2.6.2 include指令标记

如果需要在JSP页面内某处整体嵌入一个文件,就可以考虑使用include指令标记。格式:

<%@ include file=“文件的URL” %>

include指令标记的作用是在JSP页面出现该指令的位置处,静态嵌入一个文件,该文件的编码必须和当前JSP而页面一致,比加二者都是UTF-8编码。被嵌入的文件必须是可以访向或可以使用的。
如果该文件和当前JSP页面在同一Web服务目录中,那么"文件的URL"就是文件的名字;
如果该文件在ISP面面所在的Web服务目录的一个子目录中,比如fileDir子目录中,那么"文件的URL”就是"fileDir/文件的名字"。

所谓静态嵌入,就是当前JSP页面和嵌入的文件合并成一个新的JSP页面,然后Tomcat服务器再将这个新的JSP页面转译成Java文件。
因此,嵌入文件后,必须保证新合并成的JSP页面符合JSP语法规则,即能够成为一个JSP页面文件。比如,被嵌入的文件是一个JSP页面,该JSP页面使用page指令为 contentType属性设置了值:
<%@page contentType = "application/msword”%>
那么,合并后的JSP页面就两次使用page指令为contentType属性设置了不同的属性值,导致出现语法错误。因为JSP页面中的page指令只能为contentType指定一个值。

Tomcat 5.0版本以后的服务器每次都要检查include指令标记嵌入的文件是否被修改过,因此,JSP页面成功静态嵌入一个文件后,如果对嵌入的文件进行了修改,那么Tomcat服务器会重新编译JSP页面.即将当前的JSP页面和修改后的文件合并成一个JSP页面,然后Tomcat服务器再将这个新的JSP页面转译成Java类文件。

使用include指令可以实现代码的复用。比如,每个JSP页面上都可能都需要一个导航条,以便用户在各个JSP页面之间方便地切换,那么每个JSP页面都可以使用include指令在页面的适当位置整体嵌入一个相同的文件。

需要特别注意的是,允许被嵌入的文件使用page指令指定contentType属性的值,但指定的值必须和嵌人该文件的JSP页面中的page指令指定的contentType属性的值相同。

2.7 JSP动作标记

2.7.1 include动作标记

include动作标记语法格式为:

<jsp:include page=“文件的URL”/>

<jsp:include page=“文件的URL”>
param子标记
</jsp:include>

需要注意的是,当include动作标记不需要param子标记时,必须使用第一种形式。
include动作标记告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。
与静态嵌人文件的include指令标记不同,当Tomcat服务器根据JSP页面产生成Java文件时,不把JSP页面中动作指令 include所包含的文件与原JSP页面合并为一个新的JSP页面,而是告诉Java解释器,这个文件在JSP运行(Java文件的字节码文件被加载执行)时才包含进来。如果包含的文件是普通的文本文件,就将文件的内容发送到用户端,由用户端的浏览器负责显示;
如果包含的文件是JSP文件,Tomcat服务器就执行这个文件,然后将执行的结果发送到用户端,并由用户端的浏览器负责显示这些结果。

2.7.2 param动作标记

param标记以“名字-值”对的形式为其他标记提供附加信息, param标记不能独立使用,须作为jsp: include、jsp: forward标记的子标记来使用
param 动作标记语法格式是:

<jsp: param name =“参数" value =”参数的值”/>

当该标记与 jsp:include动作标记一起使用时,可以将param标记中参数的值传递到include动作标记要加载的文件中去,被加载的JSP文件可以使用Tomcat 服务器提供的request内置对象获取include 动作标记的 param子标记中name给出的参数的值。

2.7.3 forward动作标记

forward动作标记语法格式:

<jsp:forward page=“要转向的页面”/>

<jsp:forward page=“要转向的页面”>
param子标记
</jsp:forward>

该指令的作用是:从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。需要注意的是,当forward动作标记不需要 param子标记时,必须使用第一种形式。
forward标记可以使用param动作标记作为子标记,向转向的页面传送信息。forward 动作标记指定的要转向的JSP文件可以使用Tomcat服务器提供的request内置对象获取param子标记中name指定的属性值。

需要注意的是,当前页面使用forward动作标记转向后,尽管用户看到了转向后的页面的效果,但浏览器地址栏中显示的仍然是转向前的JSP页面的URL地址,因此,如果刷新浏览器的显示,将再次执行当前浏览器地址栏中显示的JSP页面。

总结

以上就是本章大致的核心内容,本章所要掌握的是JSP的结构与基本的语法,其中JSP的指令标记和动作标记在后续的学习过程中也会经常的使用

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值