JSP技术是一种动态网页技术。
1. JSP组成及原理
JSP页面由HTML代码和嵌入在其中的Java脚本组成。当浏览器端用户请求某个JSP页面时,Web服务器在服务器端对所请求的JSP文件进行编译处理,执行其中的Java脚本,并把生成的HTML页面返回到浏览器端显示。
当客户端表单把请求提交给JSP页面时,服务器端的JSP引擎从服务器端的磁盘上找到该JSP文件。然后把它解析为Java文件,接着将该Java文件编译为Class文件。然后执行该Class文件处理请求。处理完成后生成了一个HTML文件,最后JSP引擎负责将该HTML文件发送到客户端去显示。
2. JSP的优势:
-
一次编写,到处运行。这一点JSP比PHP技术更有优势,在不同的系统平台上运行,代码不用做任何修改。被多平台支持。JSP几乎可以在任何的平台上进行开发,并且可以在任何的平台上部署和运行。这一点是ASP和PHP所无法企及的。
-
后台强大的功能。由于JSP后台有Java语言和Servlet的支持,在后台可以进行复杂的、功能强大的业务逻辑处理。并且可以实现多台服务器端集群和负载均衡,从而更加适应企业级的应用。
-
有很多优秀的IDE,比如MyEclipse等。
JSP语法及应用
1. JSP文件中的注释
由于JSP文件是由不同的语言形式,如HTML、XML、Java等组成的,所以它里面有多种注释方式。下面将这些注释方式归为3类。
-
HTML/XML注释
这种注释方式可以用来注释JSP文件中除了Java脚本外的所有内容。它用“ ”之间的部分来标识。它的特点是当JSP被解析为Java文件时,注释的语句会被out.println()方法返回到客户端,所以在作为JSP响应发送到客户端的HTML代码中,仍然可以找到这类注释。
-
JSP注释
这种注释方式同样可以用来注释JSP文件中除了Java脚本外的所有内容。它用“<%–”和“–%>”之间的部分来标识。它的特点是只能用来注释JSP文件,在JSP文件解析为Java文件时,这类注释会被删除,不会出现在Java代码中,更不会出现在返回到客户端的HTML源码中。
-
Java注释
这种注释方式只能用来注释Java脚本。它用“/**/”和“//”标识。它的特点是在JSP被解析为Java文件时被保留,所以它也可以用来注释JSP对应的Java文件。
2. JSP文件中的模板元素
模板元素是指JSP源文件中属于静态的HTML或者XML的部分。它们是JSP文件最终用来响应客户端请求的HTML页面的主体,因而它们对于JSP的显示是非常重要的。通常在开发的过程中JSP的脚本编程人员不用太关心这部分内容,因为它们主要是由美工人员完成的。
3. JSP文件中的脚本元素
脚本元素是指JSP文件中插入的Java脚本。这类元素是JSP中真正完成业务逻辑的部分,例如,它可以连接数据库、向数据库中插入数据、查询数据。按照实现形式及功能上的不同,可以进一步将这类元素分为3个子类。
-
声明(Declaration)
它们是脚本元素中声明变量和方法的部分,一般用符号“<%!”和“%>”来标识。它用来将文件中用到的变量或方法封装起来,这样可以使代码变得简洁。声明完一个方法或者变量后就可以在剩余的脚本元素中去调用该方法或变量。
声明的格式如下: <%! variable declaration / method declaration(paraType param) %>
-
表达式(Expression)
它们把方法的结果或变量的值作为一个字符串输出,一般用“<%=”和“%>”之间的部分来标识。表达式必须有一个返回值,它输出的字符串作为HTML页面的一部分被最终输出到客户端显示。
语法如下所示: <%=Some Java expression %>
其实从功能上看,表达式就相当于JSP文件中的out.println()方法,但是它更简洁。
-
脚本Scriptlets
Scriptlet是一段可以在请求处理阶段执行的Java代码。它可以用来进行业务逻辑的处理;可以用来产生一些输出;可以是一些流程控制语句;还可以是一些Java注释。它们一般是在遍历和循环中将方法的结果或变量的值用out.pirntln()方法输出,用“<%”和“%>”之间的部分来标识。
语法如下所示: <% Java code statements %>
4. JSP文件中的指令元素
指令元素一般有3类:页面(page)指令、include指令和taglib指令。它们一般用符号“<%@”和“%>”之间的部分来标识。它不向客户端输出任何内容,是用来设置全局变量,声明类、要实现的方法和输出内容的类型等。在JSP文件被解析为Java文件时,Web容器会将它们翻译为对应的Java代码。
指令元素的格式如下: <%@ directivename attribute=“value”, attribute=“value” %>
-
页面(page)指令元素
页面指令用来定义JSP文件中的全局属性,这些全局属性都是影响整个页面的重要属性。一个JSP文件中可以有多个页面指令,在JSP文件被解析为Java代码时,这些页面指令也被解析为对应的Java代码。
页面指令的格式如下: <%@ page attribute=“value”…
其中,attribute可以为language、import、contentType、session、buffer、autoFlush、isThreadSafe、info、errorPage、isErrorPage、extends等。
-
包含(include)指令元素
include指令用来将指定位置上的资源包含在当前JSP文件中。在JSP文件被编译为Java文件时,这些被包含的资源会被作为JSP文件的一部分被翻译为Java文件。所以这些资源可以看做是JSP文件的一部分。
include指令的格式如下: <%@ include file=”filename”%>
上面的filename指定要包含资源的文件名。如果filename以“/”开头,那么该文件的路径是参照JSP应用的上下文路径;如果filename是以文件名或目录名开头,那么该文件的路径就是当前JSP文件的路径。
-
自定义标签(taglib)指令元素
这个指令用来让用户自己定义标签。使用自定义标签,既可以实现同一功能的代码重用,又可以使JSP页面易于维护。例如,可以将显示日期的代码定义为一个日期标签,每当需要显示日期时,就使用这个标签去实现。这样可以使同一段代码多次使用并且显得简洁,更改起来方便。
自定义标签的一般顺序是开发标签库、为标签库编写.tld配置文件、最后在JSP页面里使用自定义标签。
在JSP文件中taglib指令的使用格式如下: <%@ taglib url=“taglibURL” prefix=“tagPrefix” %>
url用来告诉Web容器在什么地方找到标签描述文件和标签库;prefix定义了在JSP文件中使用该自定义标签的前缀。注意这些标签的前缀不可以为jsp、jspx、java、javax、sun、servlet等。
5. JSP文件中的动作元素
动作元素一般用标签“<jsp:XXX >”来标识。JSP规范定义了一些常见的动作元素,它们以jsp为前缀,几乎被所有的Web容器支持。动作元素在处理客户端请求时起作用。
常用的JSP标准动作有:jsp:useBean、jsp:setProperty、<jsp: getProperty >、jsp:param、jsp:include、jsp:forward、jsp:plugin、jsp:fallback、jsp:params、jsp:param、jsp:attribute、jsp:body、jsp:invoke、jsp:doBody、jsp:element、jsp:text、jsp:output、jsp:root、jsp:decaration、jsp:scriptlet/jsp:expression等。
-
参数元素jsp:param
该动作元素用来给其他的标签提供参数,例如,它可以和jsp:include、jsp:forward、jsp:plugin一起使用。
它一般采用如下形式: <jsp:param name=“paramName” value=“paramValue”/>
其中name为参数或者属性的名字,value为其值。在下面几节中会和其他标签一起讲述该动作元素的使用方法。
-
包含元素jsp:include
该动作元素用于在客户端请求时间内把静态或者动态的资源包含在JSP页面内,被包含的对象只有对JspWriter对象的访问权,并且它不能设置头和Cookie。
该指令的格式如下: <jsp:include page=“fileName” flush=“true”/> 或者 <jsp:include page=“fileName” flush=“true”> <jsp:param name=“paramName” value=“paramValue”/> … </jsp:include>
1.page=“fileName”
fileName为一个被包含资源的相对路径,或者是代表相对路径的表达式。如果路径以“/”开头,那么路径主要是参照JSP应用的上下文路径;如果路径以文件名或目录名开头,这个路径就是当前使用的JSP文件的路径。
2.flush=“true”
该属性用来指定是否自动刷新。flush的值必须被设置为true,不能为false,但是默认值为false。
3.jsp:param/
jsp:param可以用来给被包含的动态页面传递一个或多个参数。
-
转发元素jsp:forward
该元素用来将请求转发到其他的JSP页面、Servlet或者静态资源文件,每当遇到该元素时,就停止执行当前的JSP而执行被转发的资源。请求转发的资源必须位于和发送请求的JSP页面相同的上下文环境中。
该元素的使用方式是: <jsp:forward page=“url”/> 或者 <jsp:forward page=“url”>
<jsp:param name=“paramName” value=“paramValue”/> … </jsp:forward>
1.page=“url”
url的值为一个字符串或者一个表达式,用于指定要请求的文件的URL或文件名。要请求的文件可以是JSP文件、Servlet,或一个程序端。
2.<jsp:param name=“paramName” value=“paramValue”/>
通过它可以给请求的页面传输一个或多个参数,name指定参数的名字,value指定参数的值。如果要传输多个参数,可以使用多个jsp:param/标签。当给一个页面传输参数时,该页面肯定是动态页面。
-
属性设置元素jsp:setProperty
该元素和jsp:useBean一起使用,用来给JavaBean设置属性,该标签会调用JavaBean的setXXX()方法去完成一个或者多个属性的设置。
使用该元素一般有4种方法: <jsp:setProperty name=“BeanName” property="*">
<jsp:setProperty name=“BeanName” property=“propertyName” param= “parameterName”>
<jsp:setProperty name=“BeanName” property=“propertyName”>
<jsp:setProperty name=“BeanName” property=" propertyName" value= “propertyValue”>
1.property="*"
这种设置方式最快捷。JSP的内在机制会将request对象中的参数名字和JavaBean中的属性名字进行配对,并把名字相同的参数值赋给JavaBean中的同名属性。使用这种方式要求JavaBean中的属性和request对象中的参数的名字相匹配。 如果request对象中某一个匹配参数值为空值,那么对应的JavaBean中的属性不会设置任何值;同样,如果JavaBean的属性中有一个在request对象中找不到与它对应的参数,那么这个属性也不会被设置任何值。
2.property=“propertyName” param=“parameterName”
propertyName代表JavaBean的属性,它和JavaBean中某属性的setXXX()中的XXX必须相同。parameterName代表request对象中的参数名。该方式把指定的参数值赋值给指定的属性值,适应于属性名和参数名不一致的情况。
3.property=“propertyName”
propertyName代表JavaBean的一个属性。这种方式将request对象中与该属性名字相同的参数的值赋给这个属性。如果request中没有与该属性匹配的参数,这个属性也不会被设置任何值。
4.property=" propertyName" value=“propertyValue”
propertyValue可以是一个字符串,也可以是表达式。如果是字符串,需要用对象的valueOf()方法将其转换为对应JavaBean属性的数据类型。例如,“double.valueOf(“12.55”)”将字符串12.55转换为double类型的值;如果是表达式,则其结果必须与对应的JavaBean属性的数据类型一致。
可以看出,这种方式采用指定的值,而不是request对象中的参数值来赋值给JavaBean的属性。所以同一个jsp:setProperty标签中,不能同时出现value和param。
-
属性获取元素jsp:getProperty
该元素用来获取JavaBean中属性的值。它将JavaBean的值转换为String类型,然后发送到输出流中。
它使用的方法如下: <jsp:getProperty name=“BeanName” property=“propertyName”>
1.name=" BeanName"
这个是必须指定的,BeanName为JavaBean的名字,也即通过jsp:useBean/引入的JavaBean的id。
2.property=“userName”
这个也是必须指定的,它用来指定JavaBean的属性名。
-
JavaBean调用元素jsp:useBean
该元素用来在JSP文件中使用一个JavaBean的实例,并声明该实例的名字以及作用范围,从而保证该实例可以在声明的作用范围内使用。
使用的语法如下所示。 <jsp:useBean id=“name” scope=“page|request|session|application” class= “className”/>
1.id=“name”
id用来在使用范围内唯一标识该JavaBean的实例,这样就可以通过它来调用该JavaBean的实例。该项大小写敏感,并且必须符合所使用的脚本语言的命名规定。
2.scope=“page|request|session|application”
该项用来指定JavaBean实例的使用范围,它的默认值是page。
3.class=“className”
class用来指定该JavaBean类的路径和类名。这样Web容器中才能找到该JavaBean对应的Class文件。