学习目标:

  • 掌握JSP的脚本元素:“隐藏注释”、“声明”、“表达式”
  • 掌握JSP的指令元素:page、include
  • 了解JSP的指令:taglib
  • 掌握JSP的动作元素:<jsp:include><jsp:forward><jsp:param>
  • 掌握include指令和<jsp:include>的区别
  • 掌握JSP的动作元素:<jsp:useBean><jsp:getProperty><jsp:setProperty>
  • 了解JSP的动作元素:<jsp:plugin>

目录:


JSP语法分为三种不同的类型:

  • 脚本元素(SCRIPTING)
  • 指令元素(DIRECTIVE) 例如: <%@ page import=“java.io.*” %>
  • 动作元素(ACTION) 例如:<jsp:include><jsp:forward><jsp:getProperty>

JSP文件的结构

在传统的网页HTML(.htm、.html)中加入Java程序片断,就构成了JSP网页(*.JSP)
Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片断,然后将执行结果以HTML格式返回给客户端

创建第一个JSP文件

<%@ page contentType="text/html; charset=GBK"%>
<html>
<head>
<title>我的第一个JSP程序!</title>
</head>
<body>
<%!int number = 1;%>
<%--这是声明一个变量 --%>
<%!public int count() {
    return number++;
    }/*这是声明一个方法*/%>
<%  //JSP程序代码
    out.println("Hello JSP!");
    out.println("欢迎使用JSP交互式动态网页!!");
%>
<br>
<%="您是第" + count() + "个客人!"%>
<br>
</body>
</html> 

分析JSP文件的组成元素

helloJSP.jsp网页例子的结构

  • page指令

    • <%@ page contentType="text/html; charset=GBK" %>
    • 这行代码为page指令,page是JSP的指令元素
  • 批注

    • <%--这是声明一个变量 --%>
    • <%/*这是声明一个方法*/%>
    • <%// JSP程序代码%>

<%…%>区块里的程序代码,程序执行的过程中,这些标识的程序代码都将被忽略。批注在程序中可有可无,然而为了程序日后便于维护,为程序加上良好的批注,是一个优秀的程序员必须养成的习惯。

  • 数据输出
    out对象进行指定字符串的输出。out是JSP中的默认对象,主要用来输出数据到客户端网页上。println则是out对象提供将字符串等数据输出网页的方法,接受一个特定类型的参数,并且将参数的内容输出到网页上。且其中每一行完整的程序语句,均必须以分号;作为结束。
<%
    out.println("Hello JSP ");
    out.println("欢迎使用JSP交互式动态网页!!");
%>

表达式也是脚本元素的一部分,在表达式中调用count方法,计算访问该页面的人数,并在页面上输出结果。
<%= "您是第" + count() + "个客人!" %>

  • JSP原始代码中包含了JSP元素和Template(模板) data两类
    Template data指的是JSP引擎不处理的部分,即标记<%……%>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端的浏览器。
    JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误。

JSP的脚本元素

JSP语句中的JSP脚本元素(Scripting Elements)用来插入一些Java语言程序代码,这些Java语言的程序代码将出现在由当前JSP页面生成的Servlet中,用来实现一些功能。包括:

  1. 隐藏注释(Hidden Comment):<%--这是客户端不可见的注释 --%>
  2. HTML注释(HTML Comment): <!--这是HTML注释-->
  3. 声明(Declaration): <%! 这是声明%>
  4. 脚本代码(ScriptLets): <%这是脚本段 %>
  5. 表达式(Expression): <%=这是表达式 %>

在JSP中,主要的程序部分就是脚本元素,其中包括三个部分:声明(Declaration)、表达式(Expression)和脚本代码(Scriptlet)。从功能上讲,声明用于声明一个或多个变量,表达式将是一个完整的语言表达式,而脚本代码部分将是一些程序片断。

三个脚本元素的基本语法都是以一个“<%”开头,以一个“% >”结尾的。

  • 声明<%! this is a declaration %>

  • 脚本代码<% this is a scriptlet %>

  • 表达式<%= this is an expression %>

隐藏注释

JSP 语法格式如下:<%--comment for server side only--%>

隐藏注释标记的字符在JSP编译时会被忽略,它在希望隐藏或者注释JSP程序时是非常有用的。JSP编译器不会对<%--和--%>之间的语句进行编译,且该语句也不会显示在客户端的浏览器中。

隐藏注释内容可以写任意字符串除了“--%>”,如果必须要使用“--%>”,必须写成“--%\>”。

JSP语句中的隐藏注释镶嵌在JSP程序的源代码中,使用隐藏注释的目的并不是提醒用户,而是为了:

  • 使程序设计人员和开发人员阅读程序方便,增强程序的可读性。
  • 在增强程序可读性的同时,又顾及程序系统的安全性。如果用户通过Web浏览器查看该JSP页面,是看不到隐藏注释的内容的。
  • “隐藏注释”写在JSP程序代码中,但不发送到客户端。

HTML注释

HTML注释又称为显示注释,用户能够在客户端看到注释内容。

HTML注释语法格式如下:<!--注释[<%= 表达式 %>]-->

这种注释发送到客户端,但不直接显示在页面中,可以通过在某一JSP页面中右击,在弹出的快捷菜单中选择“查看源文件”命令查看其代码。

Scriptlets中的注释

由于Scriptlets包含Java代码,所以Java中的注释规则在Scriptlets中也适用。常用的Java注释使用//表示单行注释,使用/*……*/表示多行注释。

例如:

<%
     ……
     //color表示颜色,通过它来动态控制颜色。
     String color1="99ccff";
     /* 
     color表示颜色,通过它来动态控制颜色。
     */
     ……
%>

声明

JSP中的声明(Declaration)用来定义一个或多个合法的变量(包括普通变量和类变量)和方法,并不输出任何的文本到输出流,声明的变量和方法将在JSP页面初始化时被初始化。

语法:<%! declaration;[declaration;] ... %>

注意:声明并不在JSP页内产生任何输出。它们仅仅用于定义,而不生成输出结果。要生成输出结果,应该用JSP表达式或脚本段。

  • JSP的声明语句用来声明将要在JSP中使用的变量和方法。变量和方法必须要声明,否则会出错。可以一次声明多个变量和方法,只要以;结尾即可,而且必须保证这些声明在Java中合法。

  • 可以在JSP页面中定义方法或变量,这些方法和变量可被同一页面的其他代码访问。通常应该在JavaBean中定义方法,然而当代码只用于一页时,在网页内定义方法会更方便。

  • 在JSP里,声明是一段Java代码,它用来定义在产生的类文件中类的属性和方法。声明后的变量和方法可以在JSP的任意地方使用,既可以声明方法,也可以声明变量。

在声明方法或变量时,应该注意以下方面

  • 声明必须以;结尾,在这一点上JSP语法中的Scriptlet语句有同样的规则,但是JSP语法中的表达式就不能以;结尾。

  • 可以直接使用在<%@ page %>中包含进来的已经声明的变量和方法,不需要对它们重新进行声明。

  • 一个声明仅在一个页面中有效,对于一些在每个页面都用得到的声明,最好把它们写成一个单独的文件,然后用<%@ include %>语句把该文件及文件中的各个元素包含进来。

  • 由于声明不会有任何输出,因此它们往往和JSP表达式或Scriptlet结合在一起使用。

JSP的变量可以分为局部变量和全局变量,在JSP中声明变量时,要注意变量的定义域

  • <% %>中声明的变量是局部变量,对外部函数不可见。

  • <%! %>中声明的变量是全局变量,这种变量在整个JSP页面内都有效。因为JSP引擎将JSP页面编译成Java文件时,将这些变量做为类的成员变量,这些变量的内存空间直到服务器关闭后才释放。

  • 在<%! %>中声明的方法,该方法在整个JSP页面内有效,但是在该方法内定义的变量只在该方法内有效。

脚本代码

JSP中的脚本代码是一段Java程序代码,这些代码在请求处理时在服务器端按顺序执行,脚本代码中如果使用了out对象,则会在客户端显示输出内容。

语法: <% code %>

注意:
1. 脚本段内不能定义方法
2. 脚本代码内只能定义局部变量

一个Scriptlet能够包含多个JSP语句、变量、表达式。有了Scriptlet,用户可以进行以下操作:

  • 声明将要用到的变量

  • 编写JSP表达式

  • 使用任何隐含的对象和任何用声明过的对象

  • 编写JSP语句 (如果使用Java语言,这些语句必须遵从Java Language Specification,即Java语言规范)

  • 填写任何文本和HTML标记,注意JSP元素必须在Scriptlet之外

  • 当JSP收到客户的请求时,Scriptlet就会被执行,如果Scriptlet有显示的内容,这些显示的内容就可以存放在out对象中。

<%
    String t=“test”;
    out.println(t);
%>

注意:
1、在Scriptlet内部使用字符“%> ”,必须写成“%\>”。
2、脚本段内不能定义方法,这与声明不同,这是因为JSP引擎会把脚本段内的代码放到Servlet内的方法内,而方法是不能被嵌套定义的。

表达式

JSP能够计算表达式(Expression),并向JSP页面输出表达式的运算结果

语法格式如下:<%= Java Expression %>

表达式元素表示的是一个在Java脚本语言中被定义的Java表达式,在运行后被自动转换成字符串,然后插入到表达式所在JSP文件的位置显示。表达式在运行时进行计算(页面被请求时),因此可以访问和请求有关的全部信息。

例如:

<%= new java.util.Date() %> // 输出系统当前时间
<%= "Hello" %>  // 输出Hello
<%= 1+3+5 %>  // 输出9

表达式的值在执行后会被自动转化为字符串类型进行输出,因此特定情况下需要进行数据类型的转换。

在JSP页面中使用表达式时请注意以下两点:

  • 不能用分号;作为表达式的结束符,这一点与Scriptlet不同,同样的表达式用在Scriptlet中时,就需要以分号来作为一句Scriptlet语句的结尾
  • 有时候表达式也能作为其他JSP元素的属性值,一个表达式能够变得很复杂,它可能由一个或者多个表达式组成,这些表达式的顺序是从左到右

注意:

  • JSP的表达式中没有分号,除非在加引号的字符串部分才使用分号。
    Current time:<%=new java.util.Date();%>
  • 表达式实际上是被转换成out.println()方法中的内容。
    如:<%= “hello world”%>相当于JSP页面中的:<%out.println(“hello world”); %>

JSP指令元素

JSP的指令元素描述了JSP页面转换成JSP容器所能执行的Java代码的控制信息,如JSP页面所使用的语言、导入的Java类、网页的编码方式和指定错误处理页面等。JSP的指令元素独立于JSP页面接受的任何请求,且不产生任何页面输出信息。

JSP有三个指令元素pageincludetaglib。这些指令元素是针对JSP引擎的,并不会直接产生任何看得见的输出。它们包含在<%@ %>里。

两个主要的指令是pageincludetaglib指令只有在使用标签库编程时才使用。

Page指令

Page指令用于定义JSP页面中的全局属性,它描述与页面相关的一些信息

JSP 语法格式如下:

<%@ page 
[language="java" ] 
[extends="package.class" ] 
[import="{package.class | package.*},..." ] 
[session="true | false" ] 
[buffer="none | 8kb | sizekb" ] 
[autoFlush="true | false" ] 
[isThreadSafe="true | false" ] 
[info="text" ] 
[errorPage="relativeURL" ] 
[contentType="mimeType;charset=characterSet"|"text/html; charset=ISO-8859-1" ] 
[isErrorPage="true | false" ] 
%> 

Page指令的位置一般在JSP页面的开头,放在其他位置也是可行的,在一个JSP页面中可以有多个page指令。

language="java"
language属性用来设定编写JSP网页使用的程序语法,目前处理JSP网页服务器中的JSP引擎都只支持Java,因此这个属性的默认值为Java。

extends="package.class"
extends属性定义了由JSP页面产生的servlet的父类,标明JSP编译时需要加入的Java Class的全名。一般来说,这个属性不会用到,只是当需要实现一些特殊功能时比较方便。但是必须谨慎使用,除非用户对Java非常熟悉,因为它会限制JSP的编译能力。

import="{package.class|package.*},…"
import属性用来指定所要加载的非预设Java包或类。默认加载的包类有java.lang.*javax.servlet.*javax.servlet.jsp.*javax.servlet.http.*
载入非预设包,如 <%@page import="java.util.*, java.io.*"%>

一个import属性导入一个或多个Java类的定义,中间用逗号分隔。

session="true|false"

  • 用来设定JSP网页的用户是否需要使用内建的HTTPsession对象与功能,属性值可为true或false,默认值为true。如果他为true,那么session是有用的;如果它为false,那么用户就不能使用session对象,以及定义scope=session元素。
  • 例如: <%@page session="false" %><%=session.getId() %>,由于session被设置为false,无法使用session对象,因此该实例代码运行时将产生异常。
  • Session对象的类型是javax.servlet.http.HttpSession

autoFlush="true|false"

  • 设置如果buffer溢出,是否需要强制自动刷新输出缓冲。
  • 默认值为true,表示输出正常,即当输出缓冲区满的时候,刷新缓冲区而不是抛出一个异常。
  • 如果设置为false,这个buffer溢出就会导致一个意外错误的发生。
  • 如果用户把buffer设置为none,那么就不能设置为false。

isThreadSafe="true|false"

isThreadSafe属性的属性值可为true或false,缺省值是true,用来设置JSP文件是否能多线程使用。如果被设置为true,JSP能够同时处理多个用户的请求。JSP程序员要处理同步时共享的状态,以保证同步时确实是安全的。如果设置成false,则采用单线程模式控制客户端访问该页,一个JSP一次只能处理一个请求。

info="text"

  • 设定一个代表当前这个JSP网页的信息,在执行JSP时将会被逐字加入JSP中
  • 设定內容可在程序中使用getServletInfo()方法取回
  • 设定info属性:<%@page info = "网页信息说明 … "%>

errorPage="relativeURL"

  • 设置处理异常事件的JSP文件
  • 当前网页产生例外错误时,可取得与显示这个例外错误信息的另一个网页地址:
    <%@page errorPage="error.jsp"%>
  • 当目前的网页发生例外错误时,网页被重定向到error.jsp,error.jsp中可直接使用exception对象来获取相关的错误信息。

isErrorPage="true|false"

  • 设置此网页是否为错误处理页面可显示其它网页所产生的例外信息,默认值为false
  • 如果设为true,则表明在该页面中可以获取异常对象exception,并通过该对象取得从发生错误的页面传出的错误信息,获取错误信息的常用方法如下: <%=exception.getMessage()%>

contentType="mimeType[;charset=charcterSet]"|"text/html"

  • contentType属性指定返回浏览器的内容类型,可用的属性值有text/plain(纯文本页面)、text/html(纯文本的HTML页面)、text/xml(XML页面)、applcation/x-msexcel(Excel文件)和applcation/msword(Word文件)等。
  • contentType中可以同时指定返回页面中所使用的字符编码,如charset=gbk等。常用格式如下:
    <%@page contentType ="text/html;charset=gbk"%>

无论把 <%@page%> 放在JSP文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及养成良好的编程习惯,最好还是把它放在JSP文件的顶部。

注意:

  • <%@ page %>指令作用于整个JSP页面,同样包括静态的包含文件。但是<%@ page %>指令不能作用于动态的包含文件,比如

  • 可以在一个页面中使用多个<%@ page %>指令,但其中的属性只能用一次,除了import属性。因为import属性和Java中的import语句类似(参照Java Language,import语句引入得是Java语言中的类),所以能多用几次

include指令

JSP中的include指令用来包含一个静态的文件,在解析当前页面时,这个文件中的代码会被复制到当前页面中。其语法格式如下: <%@ include file="relativeURL"|"相对位置" %>

其中,file="filename"这个被包含文件的路径名一般来说是指相对路径,不需要什么端口、协议和域名,例如conn.jsp/beans/calendar.jsp等。如果路径是以文件名或目录名开头,那么这个路径就是正在使用的JSP文件的当前路径;如果这个路径以/开头,那么这个路径主要是参照JSP应用的上下关系路径。

<%@include%>指令将会在JSP程序代码被编译时,插入一个包含文本或者源代码的文件一起进行编译。

使用<%@include%>指令语句去包含某个文本或程序代码文件的过程是静态的,静态包含的具体含义是指这个被包含的文件将会被完整地插入到原来的主JSP文件中去,这个由主JSP文件包含的文件可以是JSP文件、HTML文件、文本文件或者是一段Java代码等。如果<%@include%>指令包含的文件时JSP文件,则该JSP文件将会被主JSP文件一起编译执行。

include指令将会在JSP编译时插入一个文件,而这个包含过程是静态的。所谓静态的是指file属性值不能是一个变量。例如,下面为file属性赋值方式是不合法的。

<%String url="header.htmlf";%><%@ include file="<%=url%>"%>

也不可以在file所指定的文件后添加任何参数,下面的这行代码是不合法的。
<%@ include file="query.jsp?name=browser"%>

include指令只能加载指定的外部文件,而且不能进行传递参数操作,如果外部文件只包含单纯的静态内容,使用include指令是理所当然的选择。

  • 如果只是用include指令来包含一个静态文件,那么这个包含的文件所执行的结果将会插入到JSP文件中放<%@ include %>的地方。一旦包含文件被执行,那么主JSP文件的过程将会被恢复,继续执行下一行

  • 在这个包含文件中不能使用<html></html><body></body>标记,因为这将会影响在原JSP文件中同样的标记,有时会导致错误

  • 一旦引用了include指令,加载的外部文件内容将成为当前网页的一部分

  • 当文件的内容包含中文时,Tomcat会显示为乱码;在外部文件中加入page指令,即可将中文正确显示出来

  • 被包含文件可以是JSP文件、HTML文件、文本文件、inc文件等。如果包含的文件包含可执行代码,那么这个包含的文件的代码将会被执行

  • 被包含的文件内容常常是代码段,因此代码片断的后缀名最好是以"f"(fragment的第一个字母)结尾,例如,".htmlf"、".jspf"等,从而避免JSP编译器对该文件内容进行语法检查。如果要改变filename的内容,不需重新编译JSP文件,所以此方式执行效率较高

  • 由于使用include指令,可以把一个复杂的JSP页面分成若干简单的部分,这样大大增加了JSP页面的管理性。当要对页面进行更改时,只需要更改对应的部分就可以了。

taglib指令

taglib指令用来定义一个标签库及其自定义标签的前缀,其语法格式如下:
<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>

其中,属性uri(Uniform Resource Identifier,统一资源标识符)用来唯一地确定标签库地路径,并告诉JSP引擎在编译JSP程序时如何处理指定标签库中的标签;属性prefix定义了一个指示使用此标签库的前缀。例如:
<%@ taglib uri="http://jspcentral.com/tags" prefix="public" %>
<public:loop>…</public:loop>(使用public标签库中的loop标签)

以上指令,声明此JSP文件使用了自定义标签库,同时引用标签库,并且指定了它们的标签前缀。

例如,使用JSTL中数据库标签库的例子:

<%@ taglib uri="http://www.sun.com.jsp/jstl/sql" prefix="sql" %> 
    <sql:query var="books"> 
             select * from books
    </sql:query> 
  1. uri="tagLibraryURI"

URI根据标签的前缀对自定义的标签进行唯一的命名,URI可以是以下的内容:

  • 一个相对或绝对的路径
  • 可以是标签库描述文件
  1. prefix="tagPrefix"
    表示标签在JSP中的名称。比如,在<>中的public,如果这里不写public,就是不合法的。

注意:
(1) 必须在使用自定义标签之前使用<<%@tag%>>指令。
(2) 一个页面中可以多次使用taglib指令,但是前缀只能使用一次。
(3) 请不要用jsp, jspx, java, javax, servlet, sun和sunw做为前缀,这些已被Sun公司声明保留。

JSP动作元素

JSP动作元素和JSP指令元素不同,它是在客户端请求时动态执行的,是通过XML语法格式的标记来实现控制Servlet引擎行为的。JSP动作元素是一种特殊标签,并且以前缀jsp和其他的HTML标签相区别,利用JSP动作元素可以实现很多功能,包括动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码等。

3-4-1.png

<jsp:include> 动作

<jsp:include> 动作元素可以用来包含其他静态或动态页面,JSP有两种不同的包含方式:编译时包含和运行时包含。编译时包含只是将静态文件内容加到JSP页面中,其优点是速度快,如前面提到的<%@ include %> 指令。运行时包含指被包含的文件在运行时被JSP容器编译执行, <jsp:include> 的包含就是运行时包含,同时支持编译时包含

<jsp:include> 有带参数和不带参数两种语法格式,分别如下所示:

     <jsp:include page="relativeURL" flush="true|flase"/> 

     <jsp:include page="relativeURL" flush="true|flase"> 
        <jsp:param name="attributeName"      
             value="attributeValue"/>
        <jsp:param … />
     </jsp:include> 

其中,relativeURL指代被包含文件的相对路径;属性flush为true时,表示实时输出缓冲区。<jsp:param> 用于在包含文件时传递一些参数,一个 <jsp:include> 中可以包含一个或多个<jsp:param> 动作元素。

JSP中include指令与include动作的区别:

  • include指令是指把其它页面的JAVA代码(源码)加进来,跟本页面的代码合并在一起,相当于把源码从那个页面复制到本页面中来,然后再编译。并且由于本页面编译时已经包含了别的文件的源码,所以以后其它页面更改时,本页面并不理会,因为已经编译过了。
  • <jsp:include> 动作是指两个页面的代码运行完以后,再把被包含页面运行后的HTML结果加到本页面运行后的HTML结果中来。所以是运行时包含,并且还可以传递参数给被包含的页面。
  • <%@include%> 指令不同的是,<jsp:include> 动作包含的内容可以是动态改变的,它在执行时才确定,而前者包含的内容是固定不变的,一经编译,就不再改变。
语法 状态 对象 描述
<%@include file="...."%> 编译时包含 静态 JSP引擎将对所包含的文件进行语法分析
运行时包含 静态和动态 JSP引擎将不对所包含的文件进行语法分析

<jsp:forward>动作

<jsp:forward> 用于在服务器端结束当前页面的执行,并从当前页面跳转到其他指定页面。转向的目标页面可以是静态的HTML页面、JSP文件或Servlet类。这个元素的使用语法和 <jsp:include> 类似。
<jsp:forward> 既可以带参数也可以不带参数,语法格式分别如下:

        <jsp:forward page="relativeURL"/> 

​ 和

        <jsp:forward page="relativeURL"> 
          <jsp:param name="attributeName" value="attributeValue"/>
          <jsp:param … />
       </jsp:forward> 

<jsp:param … /> 指可以有多个 <jsp:param/> 标记。

1、page="relativeURL"

这里是一个表达式或是一个字符串用于说明你将要定向的文件或URL。这个文件可以是JSP程序段,或者其它能够处理request对象的文件(如asp,cgi,php)。

2、<jsp:param name="attributeName" value="attributeValue" />

向一个动态文件发送一个或多个参数,这个文件必须是动态文件。如果想传递多个参数,可以在一个JSP文件中使用多个<jsp:param>;name属性指定参数名,value属性指定参数值。

  • <jsp:forward> 标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象。

  • <jsp:forward> 标签以后的代码,将不能执行。

  • 执行时查看浏览器地址栏,跳转后地址并没有发生变化

<jsp:forward> 操作典型的使用就是登录。如进行权限验证的页面。当验证通过后,就把页面forword到登录成功的页面;当验证不通过时,就把页面forword到登录页面。

<jsp:param>动作

<jsp:param>元素用来传递参数给JSP程序,而由程序取得参数值,在程序中便是一个变量值。语法如下:
<jsp:param name="attributeName" value="attributeValue"/>

<jsp:param>元素使用时必须要设置其name属性,表示传递参数的名称,并通过value属性来设置该参数的值。JSP中设置元素的属性时必须加上双引号""。

在JSP程序中以如下的程序代码来获取该参数的值:request.getParameter("attributeName");

<jsp:param> 操作元素的使用必须配合 <jsp:include><jsp:forward> 以及 <jsp:plugin> 等元素。

<jsp:useBean><jsp:getProperty><jsp:setProperty> 动作

所谓JavaBean,其实是一个Java类,封装了一些常用的复杂的操作,一般可以使用JavaBean进行数据库连接、实现业务逻辑等,可以使得前台显示和后台业务逻辑更好地分离。使用JavaBean有利于代码重用,提高程序结构清晰性,这些Java类放在“WEB-INF/classes”目录内,可以使用进行实例化,并指定一个名字和作用域。

1、<jsp:useBean>动作

<jsp:useBean> 用来加载JSP页面中使用的JavaBean,其语法格式如下:

<jsp:useBean 
    id="beanInstanceName" 
    scope="page|request|session|application"
    class="package.class"
    type="class_or_interface_name"
    beanName="ser_filename"
>
    optional properties tags
</jsp:useBean >  
  • id="beanInstanceName"

其中,id制定该JavaBean的实例变量的名称。

在所定义的范围中确认Bean的变量,使之能在后面的程序中使用此变量名来分辨不同的Bean,这个变量名对大小写敏感,必须符合所使用的脚本语言的规定,这个规定在Java Language规范已经写明。如果Bean已经在别的标记中创建,则当使用这个已经创建过Bean时,id的值必须与原来的那个id值一致;否则意味着创建了同一个类的两个不同对象。

  • scope="page|request|session|application"

    • scope指定该Bean存在的范围以及id变量名的有效范围。缺省值是page,以下是详细说明:
    • page-能在包含元素的JSP文件以及此文件中的所有静态包含文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止
    • request-在任何执行相同请求的JSP文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。能够使用Request对象访问这个Bean,比如request.getAttribute(beanInstanceName)。其中beanInstanceName是Bean实例化的名字。
    • session从创建Bean开始,在任何使用相同session的JSP文件中使用这个Bean。这个Bean存在于整个session生存周期内,任何在分享此session的JSP文件都能使用同一Bean。注意在创建这个Bean的JSP文件中<%@ page %>指令中必须指定session="true",否则可能会导致致命错误发生。可以使用session对象访问Bean,比如 session.getValue(beanInstanceName)
    • application从创建Bean开始,在任何使用相同application的JSP文件中使用Bean。这个Bean存在于整个application生存周期内,任何在分享此application的JSP文件都能使用同一Bean。能够使用application对象访问这个Bean,比如application.getAttribute(beanInstanceName)
  • class="package.class"

    • class属性指定Bean的类路径和类名,不可接受动态值,不能是抽象的。
    • 使用new关键字以及class构造器从一个class中实例化一个bean。这个class不能是抽象的,必须有一个公用的,没有参数的构造器。这个package的名字区别大小写。
    • 如果该Bean不在作用域内,则将它实例化。也可以使用type属性并结合class属性来指定要将何种类型的Bean实例化。
    • 如果使用类属性,不要同时指定beanName属性
<jsp:useBean id="customer" class="com.myco.Customer"/>
<%/*
   * 实例化bean: com.myco.Customer,并把对象存放在页面上下文(PageContext)中
   * 该实例对象只能在当前页面通过customer访问
*/%> 
…
<%=customer.getName()%>
  • beanName

    • .class文件的名称、Bean包名或者包含该Bean的串行化文件(.ser文件)。仅当Bean不存在于指定的作用域时,才使用此属性。还必须使用类型属性来指定要将何种类型的Bean实例化。
    • BeanName属性不能与class属性一起使用。
    • 此值区分大小写。
  • type

    • 如果此属性与class或者beanName属性一起使用,它指定要实例化的Bean的类或接口。如果type属性未能与class或者beanName属性一起使用,则不将新的Bean实例化,而且type属性指的是已在作用域内的Bean。
  • 此值区分大小写。

  • Properties tags

<jsp:setProperty> 标记列表,它设置实例化的Bean的初始特性值。

<jsp:useBean id="connection" class="com.myco.myapp.Connection" scope="session">
        <jsp:setProperty name="connection" property="timeout" value="33">
        <jsp:setProperty name="connection" property="maxUsers" value="100">
</jsp:useBean>

2、<jsp:setProperty> 动作

<jsp:setProperty> 用于设置Bean的属性值,语法格式如下:

<jsp:setProperty name="beanInstanceName" 
      { 
          property="*"|
          property="propertyName"[param="parameterName"]|
          property="propertyName" value="{string|<%=expression%>}" 
       } 
/>

<jsp:setProperty> 用于设置Bean的属性值,有以下两种用法。

  • 可以在 <jsp:useBean> 元素的外面(后面)使用 <jsp:setProperty>
<jsp:useBean id="myName" … />
        …
<jsp:setProperty name="myName" property="someProperty" …/>

此时,不管 <jsp:useBean> 是找到了一个现有的Bean,还是新创建了一个Bean实例, <jsp:setProperty> 都会执行。

  • <jsp:setProperty> 放入 <jsp:useBean> 元素的内部。
    <jsp:useBean id="myName" … >
          …
      <jsp:setProperty name="myName" property="someProperty" …/>
    </jsp:useBean> 

此时,<jsp:setProperty> 只有在新建Bean实例时才会执行,如果使用现有实例,则不执行 <jsp:setProperty>

属性:

1.name="beanInstanceName"

  • 该属性对应 <jsp:useBean> 中的id,因此name要和 <jsp:useBean> 的id一样 。

2.property="*"

  • 这是一种设置Bean属性的快捷方式。储存用户在JSP输入的所有值,用于匹配Bean中的属性。JSP解释器将把系统Request对象中的参数一个一个的列举出来,检查这个JavaBean的属性是否和Request对象中的参数有相同的名称。如果有,就自动将Request对象中参数值传递给相应的JavaBean属性。

  • 在Bean中,属性的名字、类型必须和request对象中的参数名称相匹配。由于表单中传过来的数据类型都是String类型的,JSP内在机制会把这些参数转化成Bean属性对应类型。

  • property="propertyName" [ param="parameterName" ]
    用一个参数值来指定Bean中的一个属性值,一般情况下是从request对象中获得的。其中property指定Bean的属性名,param指定request中的参数名。
    在Bean属性的名字和request中参数名字不同时使用这个方法。 Param指定request中的参数名。

  • property="propertyName" value="{string | <%= expression %>}"

    • 使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果是字符串,那么它就会被转换成Bean属性的类型。如果是一个表达式,那么它的类型就必须和将要设定的属性值的类型一致。
    • 如果参数值为空值,那么对应的属性值也不会被设定。此外,不能在同一个中同时使用param和value参数
  • 下面两行使用请求参数值来匹配Bean中的属性值。

  • <jsp:setProperty name="user" property="*" />
    <jsp:setProperty name="user" property="user" param="username"/>

假设上面两行所在的JSP文件是action-setproperty.jsp。访问该页面的URL是http://localhost:8080/action-setproperty.jsp?username=liuyongpo。则该URL中的参数username的值liuyongpo就会自动赋予给user中的属性user.

3.动作

  • 主要用于获得JavaBean中的属性值
  • 使用<jsp:getProperty> 之前,必须用 <jsp:useBean> 创建它。
  • JSP 语法格式如下:<jsp:getProperty name="beanInstanceName" property="propertyName" />
  • 属性:
  1. name="beanInstanceName"
    该属性对应中的id,因此name要和的id一样 。
  2. property="propertyName"
    propertyName是想要取得的属性值。

<jsp:plugin>

<jsp:plugin> JSP 语法格式如下:

<jsp:plugin
        type="bean|applet"
        code="classFileName"
        codebase="classFileDirectoryName"
        name="instanceName"
        align="left|right|top|middle|bottom"
        width="width"
        height="height"
        hspace="horizontalSpace"
        vspace="verticalSpace"
        archive="archiveURL,…">
        <jsp:params>
                <jsp:param name="propertyName" value="propertyValue"/>
                  …
        </jsp:params>
        <jsp:fallback>text message</jsp:fallback>
</jsp:plugin>