由于笔记由word写成,贴在CSDN富文本中导致序号出错,建议下载word原文档。
链接地址:点击这里下载文件 访问密码:whnq8k
JSP语法知识
- JSP的基本构成
- JSP中的指令标识
有三种:page/include/taglib。具体用法参考第二节。
- HTML标记语言
就是HTML语言。
(三)嵌入的JAVA代码片段
即jsp脚本程序。
(四)JSP表达式
就是长着这种样的:<%=XXX%>
二、指令标识
1.可以被服务器解释和执行,通过指令可以使服务器按照指令的设置来执行动作和设置在整个JSP页面范围内有效的属性。
2.在一个指令中可以设置多个属性,这些属性的设置可以影响到整个页面
3.三种指令的通用格式如:<%@ 属性名=”属性值” 属性名=”属性值”…%>,不是一定要用这个格式。
(一) page指令
在JSP中主要有三种指令:
- page指令
- include指令
- taglib指令
page具有的指令如下:
<%@page
[language=”java”]
[contextType=”mimeType;charset=CHARSET”]
[import=”{package.class|pageage.*},…”]
[extends=”pakage.class”]
[session=”True|False”]
[buffer=”none|8kb|size kb”]
[autoFlush=”True|Falsh”]
[isThreadSafe=”True|False”]
[info=”text”]
[errorPage=”True|False”]
[isELIgonred=”True|False”]
[pageEncoding=”CHARSET”]
%>
下面讲解pge指令中的各属性具有的功能:
- contentType属性:设置页面相应的MIME类型,通常被设置为“text/html”,在该属性中还可以附加设置JSP字符的编码:
<%@page contextType=”text/html;charset=utf-8”%> |
- import属性:类似于java中的import语句,用来向JSP文件中导入需要用到的包,因此在page指令中可以多次使用这个属性。可以使用逗号间隔来一次导入多个包。另:在JSP中已经默认导入了如下包:
Java.lang.*; Javax.servlet.*; Javax.servlet.jsp; Javax.servlet.http; |
若在页面中编写JavaBeans,也可以通过import属性来导入,还可以通过标签<jsp:useBean>来创建一个JavaBean实例来进行调用。
- session属性:默认值为True,设置为True则表示当前页面支持session
- buffer属性:设置了out对象(jspWriter类型)所使用的缓冲区的大小。若设置为none,则表示不适用缓存,而直接调用PirntWriter对象进行输出,默认值为8k。
- autoFlush属性:该属性默认值为True,表示当缓冲区已满时,自动将其中的内容输出到客户端。如果设置为False,则当缓冲区汇总的内容大小超出设置的大小时,会产生“JSP Buffer overflow”的异常。
- isThreadSafe属性:默认值为True,表示jsp转换为servlet后,会以多线程的方式处理用户请求,若为False,则以单线程的方式。
- errorPage属性:该属性用来指定一个页面出现异常时搜需要调用的页面。如果属性值是以:“/”开头的路径,则将在当前应用程序的根目录下查找文件;否则,将在当前页面下的目录下查找文件。
- info属性:该属性可以设置任意字符串,需要通过Servlet.getServletInfo()方法来获取设置的字符串:
<%@page info=”helloworld”%> <%=this.getServletInfo%> |
- isErrorPage属性:默认值为False,当其为True时,才能在当前页面中使用exception异常对象。一般放在错误页面中,当其它页面出现界面而调用了这个错误页面时,才会将它设置为true。
- pageEncoding属性:用来设置JSP页面字符的编码,默认值为“ISO-8859-1”。
- include指令
该指令用于在当前的JSP页面中在当前使用该指令的位置嵌入其它文件,如果被包含的文件中有可执行的代码,则显示代码执行后的结果。使用这个指令可以大大减少代码的冗余,使一些固定的页面模板得到重复使用。
指令的使用格式如下:
<%@include file=”文件的绝对路径或相对路径”%> |
file属性:该属性不支持任何表达式,也不允许接收任何数据来作为文件的地址。
以“/”开头为绝对路径,将在当前应用的根目录下查找文件。
使用include指令包含了另一个文件,编译时实际上只有一个文件。
- taglib指令
通过taglib指令,开发者可以在页面中使用标签或自定义标签来完成特定功能。
格式如:
<%@taglib uri=”tagURI” prefix=”tagPrefix”%> |
参数说明:
uri:uri制定了JSP要在web.xml文件中查找的标签库描述符,该描述符是一个标签描述文件(*.tld)的映射。在tld标签描述文件中定义了该标签库中的各个标签名称,并为每个标签指定一个标签处理类,另外,通过uri属性直接指定标签描述文件的路径,而无需再web.xml文件中进行配置,同样可以使用指定的标记。
prefix:指定一个在页面中使用由uri属性指定的标签库前缀(也就是一个前缀),前缀名不能为:jsp、jspx、java、Javax、sun、servlet和sunw。
这里举个例子加深理解:
<%@taglib uri=”http://java.sun.com/jsp/jstl/core”prefix=”c”%> //这里就表示指定使用一个http://java.sun.com/jsp/jstl/core库中的“c”这个前缀。 <c:set var=“name” value=”江小白”/> //这里就表示通过<c:set>这个标签将“江小白”赋值给“name” |
三、脚本标识
脚本表示可以可以很方便很灵活地生成页面中的动态内容,特别是Scriptlet脚本。JSP中的脚本表示包括以下三种:声明标识(Declaration)、JSP表达式(Expression)和脚本程序(Scriptlet)。
- JSP表达式
表达式用于向页面中输出信息,使用格式为:
<%=变量或可以返回值的方法或java表达式> |
特别注意:%和=之间不能有空格
表达式在页面中被转换为Servlet后,转换为了out.println()方法,所以JSP的表达式和JSP页面中嵌入到小脚本程序中的out.println()方法实现的功能相同。如果表达式最终输出的是一个对象,则该对象的toString()方法被调用,表达式将返回该对象的toString()方法的返回内容。
表达式可以应用在JSP页面中的如下位置:
- 向页面输出内容:
<% String name=”张三”;%> 用户名:<%=name%> |
将生成如下结果:
用户名:张三 |
- 生成动态的链接地址:
<% String path=”welcome.jsp”;%> <a href=”<%=path%>”>链接到welcome.jsp</a> |
将生成如下结果:
<a href=”welcome.js”>链接到welcome.jsp</a> |
- 使Form表单提交到不同的页面
<% String name=”login.jsp”;%> <form action=”<%=name%>”></form> |
将生成如下结果:
<form action=”login.jsp”></form> |
- 为循环语句生成的元素命名
<% for(int i=1;i<3;i++){%>file<%=i%>: <input type=”text”name=”<%=”file”+i%>”><br><%}%> |
将生成如下HTML代码
file1:<input type=”text”name=”file1”><br> file2:<intput type=”text”name=”file2”><br> |
- 声明标识
在JSP中可以声明变量或方法,其格式为:
<%! 声明变量或方法的代码 %> |
特别注意:%与!之间不要有空格
声明的语法和java中声明变量的语法是一样的。
在页面中通过声明表示声明的变量和方法,在整个页面内都有效。它们将成为JSP页面被转换为类文件后类中的属性和方法,且会被多线程多用户共享,也就是说,任何一个线程或用户对这个方法或属性的修改都会改变它们的原来的状态。它们的生命周期从创建到服务器关闭后结束。
- 脚本程序
脚本程序(scriptlet)是在JSP页面中使用“<%”与“%>”标记起来的一段java代码。在脚本程序中可以定义变量、调用方法以及进行各种表达式运算,且每行语句后面都要加分号。在脚本程序中定义的变量在整个页面内都有效,不会被其他线程共享,当前用户对该变量的操作不会影响到其它用户。当变量在页面关闭后就会被摧毁。
脚本程序的格式如下:
<% java 程序片段 %> |
四、JSP注解
- HTML中的注释
HTML的注释方法也可以使用在JSP文件中。
注释格式如下:
<!-- 注释内容 --> |
- 带有JSP表达式的注释
在HTML的注释中可以嵌入JSP表达式。
注释格式如:
<!--注释<%=express%>--> |
通过查看HTML源码可以看到表达式的结果。
- 隐式注释
使用隐式注释的内容,在HTML查看源码时也看不到,相比起HTML类型的注释来说要安全很多。
注释格式如:
<%--注释内容--%> |
- 脚本程序中的注释
JSP脚本程序本质上就是java代码,在其中使用到的几种注释,和在java 中使用的注释是同一个东西。有//单行注释,有/** …*/文本注释,有/* …*/多行注释。
这些注释都可以直接写在脚本程序中。
五、动作标识
在JSP中提供了一系列使用XML语法写成的动作标识,这些标识可用来实现特殊的功能,例如请求的转发、在当前页中包含其它文件、在页面汇总创建一个JavaBEAN实例等。
动作标识是在页面请求中按出现的顺序被执行的。
JSP动作标识的属性前必须要有空格
动作标识通用的使用格式如:
<动作标识名称 属性1=”属性值1” 属性2=”属性值2”…/> |
或
<动作标识名称 属性1=”属性值1” 属性2=”属性值2”…> <子动作 属性1=“值1” 属性2=“值2” …/> </动作标识名称> |
在JSP中提供的常用JSP标准动作有:
<jsp:include>、<jsp:forward>、<jsp:param>、<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>、<jsp:fallback>、<jsp:plugin> |
(一)<jsp:include>
该动作标识用来向当前的页面中包含其它文件,这个文件可以是动态文件也可以是静态文件。<jsp:include>通过page属性指定被包含的页面,但与include指令标识<%@incluse file=”被包含的文件的路径”%>不同的是,<jsp:include>的属性page所指定页面的地址可以JSP表达式和Struts应用中的请求模式。
使用的格式如:
<jsp:include page=”被包含的文件的路径” flush=”True|False”/> |
或者向被包含的动态页面中传递参数:
<jsp:include page=”被包含的文件的路径” flush=”True|False”> <jsp:param name=”参数名称”value=”参数值”/> </jsp:include> |
参数说明:
- flush属性:表示当输出缓冲区满时,是否清空缓冲区,默认值为False。
- 子标识<jsp:param>用来向动态的目标文件中传输参数。
- 处理方式
使用incluse指令包含的页面实际编译时只有一个文件。但是使用<jsp:include>动作标识,在编译进行时,是编译了两个文件。
- 包含方式
include指令包含的文件,实际上编译只会得到一个.class文件,这种包含过程称为静态包含。
<jsp:include>动作标识通常用来包含那些经常需要改动的文件。此时服务器执行的是两个文件,被包含的文件的改动不会影响到主文件, 因此服务器不会对对主文件进行重新编译,只需要重新编译被包含的文件即可。只有当<jsp:include>标识被执行时,使用该标识包含的文件才会被编译,这种包含过程称为动态包含。
- 对包含文件的约定
我们说使用include指令包含的页面最终会和主页面合并为一个页面来编译,所以主页面和被包含的页面就要保持同样的一些约定,例如:
某主页面中charset:
<%@page contentType=”text/html”charset=”gb2312”%> <%@include path=”top.jsp”> |
但是包含的页面top.jsp中的charset:
<%@page contentType=”text/html”charset=”utf-8”%> |
两个页面的charset没有保持一致,就会导致编译时抛异常,这时只需要将charset统一就行了。
但是,使用<jsp:include>就无需遵循这样的约定。
总结一句话:<jsp:include>就是用来动态包含一个页面并可以做出一些小动作的动作标识。
(二)<jsp:forward>
<jsp:forward>用来将请求转发到另一JSP、HTML或相关的资源文件中去。当该标识被执行后,当前的页面将不再执行,而是去执行被改标识指定的页面。
使用格式如:
<jsp:forward page=”文件路径|表示路径的表达式”/> |
如果转发的是一个动态文件,还可以向该文件中传递参数使用格式如:
<jsp:forward page=”文件路径|表示文件路径的表达式”> <jsp:param name”参数名1 value=”参数值1”/> … </jsp:forward> |
参数说明:
- 子标识<jsp:param>用来向动态的目标文件中传输参数。
重点强调:<jsp:forward>实现的是请求转发的操作,而不是请求重定向。两者的区别是:
请求转发时,存储在request对象中的信息会被保留并带到目标的页面中;而请求重定向是重新生成一个request请求,然后该请求定向到指定的URL,所以事先存储在request对象中的信息都不存在了。
(三)<jsp:param>
<jsp:param>标识可用来传递参数,被传递的参数以“参数名=值”的形式加入到请求中。该标识不能单独存在。
使用格式如:
<jsp:param name=”参数名” value=”值”/> |
属性说明:
- name属性:指定了参数的名称,不支持任何表达式。
- value属性:指定了参数的值,可以是一个具体值,也可以是一个表达式。
(四)<jsp:useBean>
通过应用该动作标识可以再JSP页面中创建一个Bean实例,并且通过属性的设置可以将该实例存储到JSP中的指定范围内。如果在指定的范围内已经存在了指定的Bean实例,那么将使用这个实例,而不会重新创建。通过<jsp:useBean>标识创建的Bean实例可以在Scriptlet中应用。
使用格式如:
<jsp:useBean id:=”变量名” scope=”page|request|session|application” { //实际大括号是不写进去的 class=”package.className”| type=”数据类型”| class=”package.className”type=”数据类型”| beanName=”package.className”type=”数据类型” }/> <jsp:setProperty name=”变量名”property=”*”/> |
也可以在标识体内嵌入子标识或其它内容:
<jsp:useBean id=”变量名” scope=”page|request|session|applition”{…}> <jsp:setProperty name=”变量名” property=”*”/> </jsp:useBean> |
属性简要说明:
属性 | 说明 |
id | 定义了一个变量名,程序中将使用该变量名对所创建的Bean实例进行引用 |
type | 指定了一个Id属性所定义变量的类型 |
scope | 定义Bean实例的范围,默认值为“page”,其他可选值为request/session/application |
class | 指定一个完整的类名,与beanName属性不能同时存在,若没有设置type属性,那么必须设置class属性 |
beanName | 指定一个完整的类名,与class属性不能同时存在,设置该属性时必须设置type属性,其属性值可以是一个表示完整类名的表达式。 |
属性详细说明:
- id属性
该属性指定一个变量,该变量必须符合java中的变量命名规则。
- type属性
type属性用于设置由id属性指定的变量的类型。type属性可以指定要创建实例的类的本身、类的父类或者一个接口。
- scope属性
该属性指定了所创建的Bean实例的存取范围,缺省值为page。
- page:制定了创建的Bean实例只能在JSP文件中使用,包括在include指令静态包含的页面中有效。
- request:制定了所创建的Bean实例可以在请求范围内进行存取。在请求被转发到目的页面中可通过request对象的getAttibute(“id属性值”)方法获得Bean的一个实例。一个请求生命周期是从客户端向服务器发出一个请求到服务器相应这个请求给用户后结束。
- session:指定了创建的Bean实例的有效范围为session。session是当用户访问Web应用时,服务器为用户本身创建的一个对象,服务器通过session的id值来区分其它用户。针对某一用户而言,在该范围中的对象可以被读个页面共享。
可以使用session对象的getAttribute(“id属性值”)来获取创建的Bean实例。
- application:该值指定了创建的Bean实例的有效范围从服务器启动开始到服务器关闭结束。application对象是在服务器启动时创建的,它被多个用户共享。所以访问该application对象的所有用户共享存储于该对象的Bean实例。
可以使用application对象的getAttribute(“id属性值”)方法来获取创建的Bean实例。
- class=”package.className”
class属性指定了一个完整的类名,其中package指包的名字,className表示类的文件名称。通过class属性指定的类不能是抽象类,必须具有公共、无参构造方法。
- calss=”package.className”type=”类型”
class属性与type属性可以指定同一个类,在<jsp:useBean>标识中class属性与type属性一起使用的格式如下:
<jsp:useBean id=”us” class=”com.Bean.UserInfo”type=”con.Bean.UserBase”scope=”session”/> |
这里假设UserBase类为UserInfo类的父类。该标识被执行时,程序先创建了一个以type属性的值为类型,以id属性值为为名称的变量us,并赋值为null,然后再session范围内查找这个us的Bean实例,如存在,则将其转换为type属性所指定的UserBase类型(这个转换必须是合法的)并赋值给us。如实例不存在,那么将通过new操作符来实例化一个UserInfo类的实例并赋值给变量us,最后将变量us存储在session范围内。
- beanName=“package.className”type=”类型”
beanName属性与type属性可以指定同一个类,它们一起使用时的格式如下:
<jsp:useBean id=”us” beanName=”com.Bean.UserInfo”type=”com.Bean.UserBase”/> |
注意:这个默认范围就是session
通常情况下应用<jsp:useBean>标识的格式如下:
<jsp:useBean id=”变量名” class=”package.classNmae”/> |
如果想要多个页面共享这个实例,将scope值设置为“session”即可。
<jsp:useBean>标识的两种使用方式:
<jsp:useBean id=”变量名” scope=”作用范围”…/> <jsp:setProperty name=”变量名”property=“*”/> |
<jsp:useBean id=”变量名” …> <jsp:setProperty name=”变量名” property=”*”/> </jsp:useBean> |
对于第一种,无论scope指定的范文内是否存在一个与id属性值相同的实例,<jsp:setProperty ../>都会被执行。
而对于第二种,如果scope指定的范围内已经存在一个与id属性值相同的实例,那么<jsp:useBean>…</jsp:useBean>中的子标识将不执行。
(五)<jsp:setProperty>
<jsp:setProperty>标识通常与<jsp:useBean>一起用,它将调用Bean中的setXXX()方法将请求中的参数赋值给由<jsp:useBean>标识创建的javaBean实例中对应的属性。
该标识的使用方法如:
<jsp:setProperty name=”Bean实例名” { //大括号不写进去 property=”*”| property=“propertyName”| property=“propertyName” param=”parameterName”| property=”propertyName” value=”值或表达式” } //大括号不写进去 /> |
属性的简要说明:
属性 | 说明 |
name | 该属性是必需存在的,用来指定一个Bean实例 |
property | 必须存在的属性,可选值为“*”或Bean实例中的属性 |
param | 将param指定的请求中的一个参数赋给peoperty指定的Bean属性 |
value | 将value的值赋给property指定的Bean属性,该属性不能与param一起使用 |
属性详解:
- name属性
<jsp:setProperty>标识将按照page、request、session和application的顺序来查找这个Bean实例。若找不到则抛异常。
2.property=”*”
请求中的参数与Bean实例中的属性一一对应赋值,如请求中存在空值参数或者请求中没有这个参数,name中的原属性不会被赋null,而是保留原来的值。这种方法要求请求参数与Bean中的属性同名。
底层解析:由于要求请求中参数要与Bean中属性的数据类型一致,但请求是String型的,所以JSP底层会自动将这些请求中的参数转换成对应的数据类型。
- property=“propertyName”
propertyName为Bean中的属性。这种方法将传递请求中的指定参数到指定的Bean属性。当Bean中没有对应的setXXX()方法时,将抛异常。同样这种方式也会自动进行数据类型转换。
- property=”propertyName” param=”parameterName”
param指定一个请求中的参数,property指定一个Bean中的属性,这种方法可以使不同名的请求参数赋值给不同名的属性。
- property=”propertyName” value=“值或表达式”
value的值可以是一个字符串或是JSP表达式或是EL表达式。
当为字符串时,将自动转换为对应的数据类型。
当为JSP表达式时,要求表达式返回的值必须与property指定的Bean属性一致,否则抛异常。
(六)<jsp:getProperty>
<jsp:getProperty>标识用来从Bean实例中获得指定的属性值,并输出到页面中,该Bean必须具有getXXX()方法。
使用格式如:
<jsp:getProperty name=”bean实例名” property=”Bean属性”/> |
如果property指定的Bean属性是一个对象,那么这个对象的toString 方法将被调用。
(七)<jsp:fallback>
<jsp:fallback>是<jsp:plugin>的子标识,当使用<jsp:plugin>标识加载java小应用程序或javabean失败时,可通过<jsp:fallback>标识向用户输出提示信息。该标识的使用格式如:
<jsp:plugin type=”applet” code=”com.source.MyApplet.class” codebase=”.”> … <jsp:fallback>加载java小程序失败!</jsp:fallback> … </jsp:plugin> |
(八)<jsp:plugin>
使用<jsp:plugin>标识可以在页面中插入JAVA Applet小程序或JavaBean,他们能够在客户端运行。该标识会根据客户端的浏览器版本转换为<object>或<embed>HTML元素。
该标识的使用格式如:
<jsp:plugin type=”applet|bean” code=”” codebase=”” [name=“”] [archive=””] [align=””] [height=””] [width=””] [hspace=””] [vspace=””] [jreversion=””] [nspluginurl=””] [iepluginurl=””] [<jsp:params> <jsp:param name-“parameterName” value=“{parameterValue|<%=expression%>}”/> </jsp:params>] [<jsp:fallback >加载失败信息</jsp:fallback>] </jsp:plu |
属性简要说明:
属性 | 说名 |
type | 该属性指定了要加载的插件对象的类型,可选值为applet和bean |
code | 指定了加载的java类文件的名称,该名称可包含扩展名和类包名,如“com.applet.MyApplet.class” |
codebase | 默认值为当前访问的JSP页面的路径,多个路径可用分号进行分割 |
archive | 指定预先加载的存档文件的路径,多个路径可用逗号进行分割 |
align | 加载的插件对象在页面中显示时的对齐方式,可选值为bottom、top、middle、left、right |
height和width | 加载的插件对象在页面中的长度和宽度,单位为像素,这两个属性值支持JSP表达式或EL表达式 |
hspace和vsapce | 加载的applet或bean在屏幕或单元格中所留出的空间大小。jspace表示左右,vspace表示上下,他们不支持任何表达式 |
jreversion | 在浏览器中执行applet或bean时所需的java runtime environment的版本,默认值为1.1 |
nspluginurl和iepluginurl | 分别指定了Netscape Navigator用户和Internet Explorer用户能使用的JRE的下载地址 |
<jsp:params> | 在该标识中可包含多个<jsp:param>标识,用来向applet或bean中传递参数 |
<jsp:fallback> | 当加载java类文件失败时,用来显示给用户的提示信息 |
属性详解:
- type属性
type属性指定了所要加载的插件对象的类型,一般为java appplet小程序或javabean类,该属性没有默认值,必须设置可选值中的一个,否则会抛异常。
- code属性
code属性指定了加载的java类的文件名称。该名称可包含扩展文件名好类包名。
- codebase属性
该属性用来指定code属性指定的java类文件的目录。默认值为当前JSP页面的路径。
- 当codebase值为”/”或””,那么容器将那诈骗“协议+主机+code属性值”的路径来查找插件对象。
比如一个位于根目录下的index.jsp文件,它的代码中包含的<jsp:plugin>中的dede=“com.applet.myApplet.class” codebase=”/”,那么容器将按照以下路径来查找myApplet.class文件:
- 如果codebase的属性值为”.”,那么容器将按照当前访问的JSP文件的目录为基础路径开始查找插件对象。查找的路径为“协议+加主机+当前访问的JSP文件目录+code属性值指定的路径”。
例如:若当前的Web应用为JSP_Plugin,index.jsp文件位于其根目录下。
index.jsp包含如下代码:
<jsp:plugin type=”applet” code=”com.applet.MyApplet.class” codebase=”.”> <jsp:fallback>加载java小程序失败!</jsp:fallback> </jsp:plugin> |
那么容器将按照如下路径来查找MyApplet.class文件
http:localhost:8080/JSP_Plugin/com/applet/MyApplet.class |
- 如果codebase属性值是以”./”开头,那么容器将按照当前访问的JSP页面所在目录加上codebase属性指定的路径开始查找插件对象。
- 如果codebase属性值是以”../”开头,那么容器将按照当前访问的JSP页面所在的目录的上一级目录机上codebase属性值指定的目录为基础路径开始超找插件对象。
- nspluginurl和iepluginurl属性
这两个属性分别指定了Netscape Navigator用户和Internet Explorer用户能够使用的JRE的下载地址。
- <jsp:params>子标识
在该标识内可包含多个<jsp:param>子标识,每个<jsp:param>标识指定一个向要加载Applet或Bean中传递的参数。
六、声明
该资料由吃蔬菜的天蝎猫整理自《JSP开发技术大全》明日科技 编著一书。