690 likes | 801 Views
Java 与数据库连接. 11.1 JSP 概念及主要特性、运行模式. 11.2 JSP基本语法、指令及其应用. 11.3 JSP与表单的交互方法. 11.4 JSP内部对象的使用. 11.5 JavaBeans的使用. 11.6 JSP访问数据库. 11.1 JSP概念及主要特性、运行模式.
E N D
Java与数据库连接 11.1 JSP概念及主要特性、运行模式 11.2 JSP基本语法、指令及其应用 11.3 JSP与表单的交互方法 11.4 JSP内部对象的使用 11.5 JavaBeans的使用 11.6 JSP访问数据库
11.1 JSP概念及主要特性、运行模式 Java Server Pages(简称JSP),是由Sun Microsystems公司倡导、多家公司参与合作而建立起的一种动态网页技术标准,其网址为http://www.javasoft.com/products/jsp。它正式发布于1999年6月,是基于Java Servlet以及整个Java体系的WEB开发技术,也是Servlet2.1 API的扩展。JSP可以不加修改地在85%以上的Web Server上运行,其中包含微软的Windows 9x/NT/2000系统。 一.JSP概念 在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请示时,首先执行其中的程序片段,然后将执行的结果以HTML格式返回给客户。程序片段可以操作数据库、重新定义网页以及发送E-Mail等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame。由于JSP是将Java代码嵌在html标记里(同ASP一样用<% ...%>),JSP的界面设计同后台开发人员的工作可以有效分离。可以想像让开发人员用Servlet写一个花俏的Web页面有多困难,所以JSP+Servlet混合Web应用是比较理想的选择。
二.JSP主要特性 1.将内容的生成和显示进行分离 2.生成可重用的组件 3.采用标识简化页面开发 4.具有“一次编写,各处运行”的特点 5.程序执行的效率和安全性更高 6.强大的数据库支持 7.JSP组件(Component)方式更方便 8.JSP的适应平台更广
三.JSP运行模式 1.JSP的运行模式 • Web服务器向浏览器传送一个页面的过程如下: • 浏览器发出对Web页面的请求; • 浏览器利用URL辨别Web服务器的地址,找到自己需要的主页,并给出Web服务器需要的其他信息。这些信息包括浏览名称(Internet Explorer)、版本(6.0)、操作系统(Windows 98)以及由用来来填写的表。 • 当请求的是HTML文件时,Web服务器就简单地找到该文件,然后传送该文件的内容到浏览器,浏览器得到内容后就开始将基于HTML的代码译成页面。 • 当请求的是JSP页面时,并不立即发送文件的内容。首先执行脚本。由脚本产生一些HTML代码,然后将这些代码传送给JSP执行引擎,再由它将HTML文件传送给Web浏览器。JJSP的运行模式如图11-1所示。
图11-1 JSP运行模式 图11-1 JSP运行模式
2.JSP的运行过程 当Web服务器接收到一个后缀为“.jsp”页的请求时,触发JSP引擎。JSP引擎首先检查JSP文件是新的还是未修改过的文件,对这两种情况会有不同的处理。 • JSP引擎把JSP文件转换成Java Servlet,然后使用标准的Java编译器编译Servlet,使用用标准的API执行Java Servlet。这个翻译步骤也是JSP为什么慢的一个原因。 • 对于旧文件则直接进行编译,省略了前面翻译的工作,接下来的步骤是一样的。 • JSP是将网页的表现形式和服务器端的代码逻辑分开。作为服务器进程的JSP页面,首先被转换成Servlet。Servlet支持HTTP协议的请求和响应。多个用户同时请求一个JSP页面时,应用实例化线程来响应请求。这些线程由Web服务器进程来管理。 • JSP在执行以前先被编写成字节码,然后字节码由Java虚拟机解释执行,比源码解释的效率高──服务器上还有字节码的Cache机制,能提高字节码的访问效率。第一次调用JSP网页可能稍慢,因为它被编译成Cache,以后就快得多了。另外,JSP源程序不大可能被下载,特别是JavaBeans程序完全可以放到不对外的目录中。JSP的运行过程如图11-2所示。
四.JSP运行环境的配置 本书以安装配置Resin2.1.4为例,简单讲述JSP运行环境的配置。 1.安装JDK:这一步同Java开发环境的配置中的安装JDK一样,不再重复。 2.配置环境变量:这一步也与Java开发环境的配置一样。 3.配置Resin:
11.2 JSP基本语法、指令及其应用 11.2.1 JSP语法基本原理 JSP可以在HTML文件内直接嵌入简单的脚本命令,就可以轻易地将静态Web页面,升级为动态Web页面,你可以用任何Web页面编辑器(如FrontePage,MicroMedia UltraDev等),如通常方式一样编写HTML。然后用特殊的标记来附上动态部分的代码,这个特殊标记一般都是以“<%”开头,以“%>”结尾的(这点和ASP一样)。 一般情况下文件以.jsp为扩展名,并放在一般的Web页面所放的地方,虽然你写的更像一个正常的HTML文件,而不是一个servlet,但在幕后JSP页面被转换成正常的servlet。被第一次请求时,JSP页面,被翻译成servlet,接着servlet被编译和装载。
示例11-1简单的JSP程序 程序:Sample11_1.jsp <HTML> <HEAD> <TITLE>JSP页面</TITLE> </HEAD> <BODY> <%@ page language="java" %> <%! String str="0";int i=0; %> <% for (int i=0;i<10;i++){ str = str + i; }%> JSP输出之前。 <P> <%= str %> <P> JSP输出之后。 </BODY> </HTML>
JSP页面由以下四个部分组成: 1.首先它应描述页面的基本信息,如所使用的语言,是否维持会话状态、是否使用缓冲等。在此<%@ page language="java" %>只简单地定义了本例使用的是Java语言。 2.接下来的是JSP的声明,JSP声明可以看成是定义类这一层次的变量和方法的地方,在此<%! String str="0";int i=0; %>只定义了一个字符串变量和一个整数变量。要注意的是:在每一项声明的后面都必须有一个分号,就是在普通Java类中声明成员变量一样。 3.接下来的是位于<%和%>之间的程序代码段,它是一个for循环,由它来描述JSP页面处理逻辑的Java代码。 <% for (int i=0;i<10;i++){ str = str + i; }%> 4.最后是位于<%=和%>之间的运算式代码,被称为JSP表达式,它提供了一种将JSP生成的数值嵌入到HTML页面的简单方法。如本例中的<% = str %>所示。
一.编译器指引(Directives) JSP的编译器指引是针对JSP引擎而设计的。他们并不直接产生任何可见输出,而只是告诉引擎如何处理其余JSP页面。这些指令始终被括在 “<%@ %>”标记中。两个最重要的指令是“Page”和“Include”。“Taglib”指令不在讨论之列,但是在用JSP1.1创建自定义标记可以使用它。 你几乎可以在所有JSP页面顶部都会看到“Page”指令。尽管不是必须的,但它可以让你指定: 到何处查找起支持作用的Java类别: <%@ page import="java.util.Date" %>, 出现Java运行问题时,将网上冲浪者引向何处: <%@ page errorPage="errorPage.jsp" %>, 还有你是否需要管理用户的会话级信息,这些信息可能来自多个网页(在下面的JavaBeans一节将对此做进一步讲)述: <%@ page session="true" %>。 “Include”指令可以把你的内容分成更多可管理的元素,比如包括一个普通页面页眉或页脚的元素。包含的网页可以是一个固定的HTML 页面或更多的JSP内容: <%@ include file="filename.jsp" %>
二.声明 (Declarelations) 1.声明的JSP语法 <%! Declaration;[declaration;]+... %> 2.声明的语法描述 JSP声明用来让你定义页面级变量,以保存信息或定义JSP页面的其余部分可能需要的支持方法。如果你发现代码太多,通常最好把它们写成一个独立的Java类别。 当你声明方法或变量时,请注意以下的一些规则: (1)你可以一次性声明多个变量和方法,声明一般都在“<%! ?%>”标记中。一定要以分号(;)结束变量声明,因为任何内容都必须是有效的Java语句:(Scriptlet有同样的规则,但是表达式就不同了)。 (2)你可以直接使用在<%@ page %>中被包含进来 的已经声明的变量和方法,不需要对它们重新进行声明。 (3)一个声明仅在一个页面中有效。如果你想每个页面都用到一些声明,最好把他们写成一个单独的文件,然后用<%@ include %>或<jsp:include>元素包含进去。 (4)声明不能产生任何输出,它通常用作JSP表达式和scriptlets之间连接。
三.表达式 有了JSP表达式,表达式结果会被转换成一个字符串,并且被直接包括在输出页面之内。JSP 表达式包含在“<%= ?%>” 标记中,没有分号,除非在加引号的字符串部分使用分号。 因为这个表达式的值已经被转化为字符串,所以你能在一行文本中插入这个表达式(形式和ASP完全一样)。 当您在JSP中使用表达式时请记住以下几点: (1)你不能用一个分号(“;”)作为表达式的结束符,但是scriptlet就需要以分号来结尾! (2)一个表达式元素能够包含任何一个符合Java语言规范的表达式。 (3)有时候表达式也能做为其他JSP元素的属性值。 (4)一个表达式能够变得复杂,它可能由多个表达式组成,这些表达式的顺序是从左到右。 在XML中也有JSP表达式的类似语法: <jsp:expression> Java Expression </jsp:expression> 记住XML要素不像HTML,它是很敏感的,务必要使用小写字母。
四.程序代码片段/脚本片段(Scriptlets) 1.程序代码片段的JSP语法 <% code fragment %> 2.程序代码片段的语法描述 Scriptlet是指一个有效的程序段,这个程序段可以包含多个jsp语句、方法变量和表达式。 JSP代码片段或脚本片段是嵌在“<% code fragment %>”标记中的。这种Java代码在Web服务器响应请求时就会运行。在脚本片段周围可能是原始的HTML或XML语句,在这些地方,代码片段可以使你创建条件执行代码,或要用到另外一段代码的代码。 使用scriptlet,我们可以做以下事情,下面就对scriptlet进行一下说明: (1)可以声明将要用到的变量或方法,scriptlet也可以象表达式那样随意定义变量。 (2)可以编写JSP表达式(请参考前面表达式的描述)。 (3)可以使用任何隐含的对象和任何用<jsp:useBean>声明过的对象。 (4)可以编写JSP语句(如果你使用的是Java语言,它必须遵从Java语言的规范)。 (5)任何文本,HTML标记,必须写在JSP元素scriptlet(即:<% %>)之外。 当JSP编译器收到客户端的请求时,scriptlet就会被执行,如果scriptlet有显示内容,这些显示的内容被保存在out对象中。
五.注释 最后一个主要的JSP元素是嵌入式注释。尽管你始终可以在文件中加入HTML注释,但用户在查看页面源代码时会看到这些注释。如果你不想让用户看到它,你就应该将其嵌入“<%-- comment--%>” 标记中: <%-- comment for server side only --%>. 更详细的说,JSP的注释可分为两种:HTML注释和隐藏注释。 1.HTML注释 (1)HTML注释 <!—comment[<%= expression %>] (2)HTML的语法描述 JSP中的HTML注释与其他HTML中的注释很像,它可以在客户端浏览器的“查看源代码”中看到,唯一有些不同的就是,你可以在这个注释中使用各种表达式,只要表达式是合法的就行。顺便提到Java的注释/* comment */和//也当属此类。
2.隐藏注释 (1)隐藏注释的JSP语法 <%--comment--%> (2)隐藏注释的语法描述 尽管你始终可以在文件中加入HTML注释,但用户在查看页面源代码时会看到这些注释。如果你不想让用户看到它,就应该将其嵌入到“<%--?--%>”标记中,这在你希望隐藏或注释你的JSP程序时是很有用的。JSP编译器会忽略掉这些隐藏注释标记中的字符,而不对该语句进行编译。 隐藏注释文档不发给客户端。 (3)隐藏注释的例子
JSP指令是为JSP引擎而设计的。他们并不直接产生任何可见输出,而只是告诉引擎如何处理其余JSP页面。这些指令始终被括在“<%@ ? %>”标记中。 一.include指令 1.include的JSP语法 <%@ include file = “relativeURL” %> 2.include语法描述 include指令将会在JSP编译时插入一个包含文本或代码的文件,当你使用<%@ include %>指令时,这个包含的过程就当是静态的。静态的包含就是指这个被包含的文件将会被插入到JSP文件中去,这个包含的文件可以是JSP文件、HTML文件、文本文件。如果包含的是JSP文件,这个包含的JSP文件中的代码将会被执行。 如果你仅仅只是用include来包含一个静态文件,那么这个包含的文件所执行的结果将会插入到JSP文件中放include的地方。一旦包含文件被执行,那么主JSP文件的过程将会被恢复,继续执行下一行。 11.2.2 JSP指令及其应用
3.几点值得说明和初学者要注意的地方: (1)包含文件中不能使用<html>,</html>,<body>,</body>标记,因为这将会影响在原JSP文件中同样的标记而导致错误。 (2)如果某个包含文件被改变,包含此文件的JSP文件也将被重新编译。 (3)有一些<%@ include %>指令的行为是以特殊的JSP编译条件为基础的,比如:这个被包含的文件必须对所有客户都开放且必须有效,或者它有安全限制。 (4)file="relativeURL"这个包含文件的路径名一般来说是指相对路径,不需要什么端口,协议和主机域名。 (5)同C语言一样,include文件是不能嵌套使用的。
二.Page指令 1.Page的JSP语法 <%@ page [language="java"] [extends="package.class"] [import="{package.class|package.*},…"] [session="true|false"] [buffer="none|8kb|size kb"] [autoFlush="true|false"] [isThreadSafe="true|false"] [info="text"] [errorPage="relativeURL"] [contentType="mimeType[;charset=characterSet]"| "text/html;charset=ISO-8859-1"] [isErrorPage="true|false"] 2.Page语法描述 Page指令的作用是定义JSP文件中的全局属性。 Page指令作用于整个JSP页面,同样包括静态的包含文件。但是Page指令不能作用于动态的包含文件,比如<jsp:include>。 3.Page的属性及其用法 (1)声明脚本语言的种类,目前只有“java”一种语言,所以暂时只能用“java”。 例如:<%@ page language="java" %> (2)extends="package.class" 该属性指出将要生成的Servlet使用哪个超类。使用该属性应当十分小心,因为服务器可能已经在用自定义的超类。
(3)import="{package.class|package.*},…" 表示需要导入的Java包的列表,这些包(以及它们的类)作用于程序段、表达式、声明以及JSP文件内的标签,它必须放在调用它的类的标签之前。 下面的包在JSP编译时已经导入了,所以不需要再特别指明了: java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.* (4)session="true|false" 默认值true表明预定义变量session(类型为HttpSession)应该绑定到已有的会话,如果不存在已有的会话,则新建一个并绑定session变量。如果取值false,表明不会用到会话,试图访问变量session将导致JSP转换成Servlet时出错。Session的缺省值是true。 例如:<%@ page session="true" %> (5)buffer="none|8kb|sizekb" buffer的大小以千字节为单位,是out对象处理JSP页面到客户端浏览器输出时使用的缓冲区。如自定义,则以最后定义的为准,但必须不小于8kb。Buffer的缺省值是8kb。
(6)autoFlush="true|false" 设置对buffer溢出时的处理方式,是否需要强制输出。 如果其值被定义为true,输出正常。如果其值被定义为false,一旦buffer溢出,就会导致一个意外错误的发生。如果buffer设置为none,那么autoFlush就不能设置为false。autoFlush缺省值是true。 (7)isThreadSafe="true|false" 设置JSP文件是否能多线程使用。如果设置为true,假定有多个请求访问实例变量的时候,多重请求都可以被单个servlet实例同时执行。如果设置为false,表明servlet为单线程模式,每个请求分配给一个独立的servlet实例,即一次只能处理一个请求。isThreadSafe的缺省值是true。 (8)info="text" 一个插入到JSP页面中的文本,被合并编译后,你能够使用Servlet.getServletInfo方法重新得到这个文本。 (9)errorPage="relativeURL" 设置处理异常事件的JSP文件。 例如:<%@ page errorPage="errorPage.jsp" %>
(10)isErrorPage="true | false" 设置此页是否为出错页,如果被设置为true,你就能使用exception异常处理对象。如果设置为false,意味着在你的JSP文件中不能使用异常处理对象。 (11)contentType= "mimeType [ ;charset=characterSet ]" | "text/html;charset=ISO-8859-1" 设置JSP文件的MIME类型和字符集,是用于反馈给客户回答信息而设置的。你能够使用任何对servlet有效的MIME类型和字符集。缺省MIME 类型是: text/html;缺省字符集为 ISO-8859-1。 例如:<%@ Page contentType=”text/html;Charset=gb2312” %>
3.Page的属性及其用法 (1)声明脚本语言的种类,目前只有“java”一种语言,所以暂时只能用“java”。 例如:<%@ page language="java" %> (2)extends="package.class" 该属性指出将要生成的Servlet使用哪个超类。使用该属性应当十分小心,因为服务器可能已经在用自定义的超类。 (3)import="{package.class|package.*},…" 表示需要导入的Java包的列表,这些包(以及它们的类)作用于程序段、表达式、声明以及JSP文件内的标签,它必须放在调用它的类的标签之前。 下面的包在JSP编译时已经导入了,所以不需要再特别指明了: java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.* (4)session="true|false" 默认值true表明预定义变量session(类型为HttpSession)应该绑定到已有的会话,如果不存在已有的会话,则新建一个并绑定session变量。如果取值false,表明不会用到会话,试图访问变量session将导致JSP转换成Servlet时出错。Session的缺省值是true。 例如:<%@ page session="true" %>
(5)buffer="none|8kb|sizekb" buffer的大小以千字节为单位,是out对象处理JSP页面到客户端浏览器输出时使用的缓冲区。如自定义,则以最后定义的为准,但必须不小于8kb。Buffer的缺省值是8kb。 4.Page例子 <%@ page import = “java.util.*,java.lang.*” %> <%@ page buffer = “5kb” autoFlush = ”false” %> <%@ page errorPage = “error.jsp” %> 三.<jsp:forward> 重定向一个HTML文件,JSP文件,或者是一个程序段. 1.<jsp:forward>的JSP语法 <jsp:forward page={"relativeURL" | "<%= expression %>"} /> 或 <jsp:forward page={"relativeURL" | "<%= expression %>"} > <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> </jsp:forward>
2.<jsp:forward>语法描述 <jsp:forward>重定向一个HTML文件、JSP文件、或者是一个程序段。 (1)<jsp:forward>标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象。<jsp:forward>标签以下的代码,将不能执行. (2)你能够向目标文件传送参数和值。 例:<jsp:forward page=<%=otherpage.jsp%> <jsp:param name="username" value="scott" /> </jsp:forward> 在这个例子中我们传递的参数名为username,值为scott,如果你使用了<jsp:param>标签的话,目标文件必须是一个动态的文件,能够处理参数。 (3)如果你使用了非缓冲输出的话,那么使用<jsp:forward>时就要小心。如果在你使用<jsp:forward>之前,jsp文件已经有了数据,那么文件执行就会出错. 3.<jsp:forward>属性及其用法 (1)page="{relativeURL | <%= expression %>}" (2)<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />
四.<jsp:include> 包含一个静态或动态文件. 1.<jsp:include>的JSP语法 <jsp:include page="{relativeURL | <%= expression%>}" flush="true" /> 或 <jsp:include page="{relativeURL | <%= expression %>}" flush="true" > <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> </jsp:include> 2.<jsp:include>描述 <jsp:include>元素允许你包含动态文件和静态,这两种包含文件的结果是不同的。如果文件仅是静态文件,那么这种包含仅仅是把包含文件的内容加到jsp文件中去,而如果这个文件动态的,那么这个被包含文件也会被Jsp编译器执行(这一切与asp相似) 3.<jsp:include>属性及其用法 (1)page="{relativeURL | <%= expression %>}" (2)flush="true" 这里你必须使用flush="true",你不能使用false值。 (3)<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" /> <jsp:param>子句能让你传递一个或多个参数给动态文件,你能在一个页面中使用多个<jsp:param>来传递多个参数。
五.<jsp:plugin> 执行一个applet或Bean,有可能的话还要下载一个Java插件用于执行它. 1.<jsp:plugin>的JSP语法 <jsp:plugin type="bean | applet" code="classFileName" codebase="classFileDirectoryName" [ name="instanceName" ] [ archive="URIToArchive, ..." ] [ align="bottom | top | middle | left | right" ] [ height="displayPixels" ] [ width="displayPixels" ] [ hspace="leftRightPixels" ] [ vspace="topBottomPixels" ] [ jreversion="JREVersionNumber | 1.1" ] [ nspluginurl="URLToPlugin" ] [ iepluginurl="URLToPlugin" ] > [ <jsp:params> [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+ </jsp:params> ] [ <jsp:fallback> text message for user </jsp:fallback> ] </jsp:plugin>
2.<jsp:plugin>语法描述 (1)<jsp:plugin>元素用于在浏览器中播放或显示一个对象(典型的就是applet和Bean),而这种显示需要在浏览器的java插件。 当Jsp文件被编译,送往浏览器时,<jsp:plugin>元素将会根据浏览器的版本替换成<object>或者<embed>元素。(注意,<object>用于HTML 4.0 ,<embed>用于HTML 3.2)。 (2)<jsp:params>元素的作用是,在启动时向applet或Bean传递参数名和值。<jsp:fallback>元素的作用是,一旦plugin不能启动时向用户提示信息;如果plugin启动了,但applet和Bean未启动,plugin一般是弹出一个窗口,将错误信息告知用户。 (3)<jsp:plugin>标签的许多属性来自于HTML的<applet>和<object>标签(即:HTML3.2的<applet>及HTML4.0的<object>),如果你想深入了解的话,可参考有关HTML说明书中的相关部分。 一般来说,<jsp:plugin>元素会指定对象是Applet还是Bean,同样也会指定class的名字,还有位置,另外还会指定将从哪里下载这个Java插件。请继续阅读下面的属性详解: 3.<jsp:plugin>属性 (1)type="bean | applet" .将被执行的插件对象的类型,你必须得指定这个是Bean还是applet,因为这个属性没有缺省值.。
(2)code="classFileName" 将会被Java插件执行的Java Class的名字,必须以.class结尾。这个文件必须存在于codebase属性指定的目录中。 (3)codebase="classFileDirectoryName" 将会被执行的Java Class文件的目录(或者是路径),如果你没有提供此属性,那么使用<jsp:plugin>的jsp文件的目录将会被使用。 (4)name="instanceName" 这个Bean或applet实例的名字,它将会在Jsp其它的地方调用。 (5)archive="URLToArchive, ..." 一些由逗号分开的路径名,这些路径名用于预装一些将要使用的class,这会提高applet的性能。 (6)align="bottom | top | middle | left | right" 图形,对象,Applet的位置,有以下值: bottom:图形的底部与文本的基线对齐 top:图形的顶部与文本的顶部对齐 middle:图形的水平中心线与文本的水平中心线对齐 left:图形放置左边的空白页,文本沿着图形的右侧排列 right:图形放置右边的空白页,文本沿着图形的左侧排列 这些均和HTML的属性值相同。
(7)height="displayPixels" width="displayPixels" Applet或Bean将要显示的长宽的值,此值为数字,单位为象素。 (8)hspace="leftRightPixels" vspace="topBottomPixels" Applet或Bean显示时在屏幕左右,上下所需留下的空间,单位为象素。 (9)jreversion="JREVersionNumber | 1.1" Applet或Bean运行所需的Java Runtime Environment (JRE) 的版本。缺省值是 1.1。 (10)nspluginurl="URLToPlugin" Netscape Navigator用户能够使用的JRE的下载地址,此值为一个标准的URL,带有协议名、端口号、域名。 (11)iepluginurl="URLToPlugin" IE用户能够使用的JRE的下载地址,此值为一个标准的URL,带有协议名、端口号、域名。 (12)<jsp:params> [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ] </jsp:params> 你需要向applet或Bean传送的参数或参数值。 (13)<jsp:fallback> text message for user </jsp:fallback> 一段文字用于Java 插件不能启动时显示给用户的,如果插件能够启动而applet或Bean不能时,那么浏览器会有一个出错信息弹出。
六.<jsp:setProperty> 设置Bean中的属性值. 1.<jsp:setProperty>的JSP语法 <jsp:setProperty name="beanInstanceName" { property= "*" | property="propertyName" [ param="parameterName" ] | property="propertyName" value="{string | <%= expression %>}" } /> 2.<jsp:setProperty>语法描述 (1)<jsp:setProperty>元素使用Bean给定的setter方法,在Bean中设置一个或多个属性值。 (2)在使用这个元素之前必须得使用<jsp:useBean>声明此Bean。.因为,<jsp:useBean>和<jsp:setProperty>是联系在一起的,同时这他们使用的Bean实例的名字也应当相匹配(就是说,在<jsp:setProperty>中的name的值应当和<jsp:useBean>中id的值相同) (3)你能使用多种方法利用<jsp:setProperty>来设定属性值: 通过用户输入的所有值(被做为参数储存中request对象中)来匹配Bean中的属性 通过用户输入的指定的值来匹配Bean中指定的属性 在运行时使用一个表达式来匹配Bean的属性
3.属性及其用法 (1)name="beanInstanceName" 表示已经在<jsp:useBean>中创建的Bean实例的名字,而这个Bean实例已经存在或已经由<jsp:useBean>标签创建好了。<jsp:setProperty>标签的名字name与<jsp:Bean>标签中的id一致,并且<jsp:useBean>标签在JSP程序中的位置一定要排在<jsp:setProperty>标签之前。 (2)property="*" 储存用户在Jsp输入的所有值,用于匹配Bean中的属性。在Bean中的属性的名字必须和request对象中的参数名一致。这个参数名通常来自于HTML元素和用户的输入。 从客户传到服器上的参数值一般都是字符类型 ,这些字符串为了能够在Bean中匹配就必须转换成其它的类型,下面的表中列出了Bean属性的类型以及他们的转换方法: (3)property="propertyName" [ param="parameterName" ] 使用request中的一个参数值来指定Bean中的一个属性值。在这个语法中,property指定Bean的属性名,param指定request中的参数名。如果bean属性和request参数的名字不同,那么你就必须得指定property和param ,如果他们同名,那么你就只需要指明property就行了。如查参数值为空(或未初始化),对应的Bean属性不被设定。 (4)property="propertyName" value="{string | <%= expression %>}" 使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果这个字符串,那么它就会被转换成Bean属性的类型(查看上面的表).如果它是一个表达式,那么它类型就必须和它将要设定的属性值的类型一致。 如果参数值为空,那么对应的属性值也不会被设定。
七.<jsp:getProperty>指令 1.<jsp:getProperty>的JSP语法 <jsp:getProperty name="beanInstanceName" property="propertyName"/> 2.<jsp:getProperty>语法描述 (1)这个<jsp:getProperty>标签将获得Bean的属性值,并可以将其显示在JSP结果页面中。但你应知道在使用<jsp:getProperty>之前,如果不存在有可利用的<jsp:useBean>实例的话,你必须首先创建<jsp:useBean>实例。 2.<jsp:getProperty>属性 (1)name="beanInstanceName" Bean实例的名字,由<jsp:useBean>标签中的id指出。 (2)property="propertyName" Bean属性的名字,可以显示。 技巧:在SUN的JSP参考中提到,如果你用<jsp:getProperty>检索,其值为空时,将显示NullPointerException字样。 如果使用程序段或表达式来检索,则在浏览器上出现的是null(空值)。 3.<jsp:getProperty>例子 <jsp:useBean id="calendar" scope="page" class="employee.Calendar"/> <h2> Calendar of <jsp:getProperty name="calendar" property="username"/> </h2>
八.<jsp:useBean> 创建一个Bean实例并指定它的名字和作用范围。通常我们可以编写一段一段的功能独立的Java小程序,把它放在一个特定的地方,在程序需要执行某些功能时,象调用函数那样调用它。这样的Java小程序是属于可以重复使用的元件,我们称之为JavaBean。JavaBean就跟ActiveX Controls一样,它们提供一些常用的基本功能,是为了便于随时重复使用的目的而设计的。人们对JavaBean的使用,正是通过<jsp:useBean>来完成的。 1.<jsp:useBean>的JSP 语法 <jsp:useBean id="beanInstanceName" scope="page | request | session | application" { class="package.class" | type="package.class" | class="package.class" type="package.class" | beanName="{package.class | <%= expression %>}" type="package.class" } { /> | > other elements </jsp:useBean> }
2.<jsp:useBean>语法描述 <jsp:useBean>用于定位或示例一个JavaBeans组件。<jsp:useBean>首先会试图定位一个Bean实例,如果这个Bean不存在,那么<jsp:useBean>就会从一个class或相关的模版为基础,创建一个Bean示例。 为了定位或示例一个Bean,<jsp:useBean>会进行以下步聚,顺序如下: (1)通过给定的名字(name)和范围(scope)试图定位一个Bean。 (2)对这个Bean对象引用变量以你指定的名字命名。 (3)如果发现了这个Bean,即这个Bean存在,将会在这个变量中储存这个引用。如果你也指定了类型,那么这个Bean也设置为相应的类型。 (4)如果没有发现这个Bean,将会从你指定的class中进行示例,并将此引用储存到一个新的变量中去。如果这个class的名字代表的是一个模版,那么这个Bean被java.beans.Beans.instantiate示例. (5)如果<jsp:useBean>已经示例(不是定位)了这个Bean,同时<jsp:useBean>和</jsp:useBean>中有元素,那么将会执行其中的代码. <jsp:useBean>元素的主体通常包含有<jsp:setProperty>元素,用于设置Bean的属性值。正如上面第五步所说的,<jsp:useBean>的主体仅仅只有在<jsp:useBean>示例Bean时才会被执行,如果这个Bean已经存在,<jsp:useBean>能够定位它,那么主体中的内容将不会起作用。
3.<jsp:useBean>属性以及用法 • (1)id="beanInstanceName" • 在你所定义的范围中确认Bean的变量,你能在后面的程序中使用此变量名来分辨不同的Bean。 • 这个变量名对大小写敏感,必须符合你所使用的脚本语言的规定,在Java Programming Language中,这个规定在Java Language 规范已经写明。如果这个Bean已经在别的<jsp:useBean>中创建,那么这个id的值必须与原来的那个id值一致。 • (2)scope="page | request | session | application" • Bean存在的范围以及id变量名的有效范围。缺省值是page,以下是详细说明: • Page:你能在包含<jsp:useBean>元素的JSP文件以及此文件中的所有静态包含文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。 • Request:你在任何执行相同请求的Jsp文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。你能够使用Request对象访问Bean,比如request.getAttribute(beanInstanceName)。 • Session:从创建Bean开始,你就能在任何使用相同session的Jsp文件中使用Bean.这个Bean存在于整个Session生存周期内,任何在分享此Session的Jsp文件都能使用同一Bean。注意在你创建Bean的Jsp文件中<% @ page %>指令中必须指定session=true。 • Application:从创建Bean开始,你就能在任何使用相同application的Jsp文件中使用Bean.这个Bean存在于整个application生存周期内,任何在分享此application的Jsp文件都能使用同一Bean。
(3)class="package.class" 使用new关键字以及class构造器从一个class中示例一个bean。这个class不能是抽象的,必须有一个公用的,没有参数的构造器。这个package的名字区别大小写。 (4)type="package.class" 如果这个Bean已经在指定的范围中存在,那么写这个Bean一个新的数据库类型 。如果你没有使用class或beanName指定type,Bean将不会被示例。package和class的名字区分大小写。 (5)beanName="{package.class | <%= expression %>}" type="package.class" 使用java.beans.Beans.instantiate方法来从一个class或连续模版中示例一个Bean,同时指定Bean的类型。 说明: beanName可以是package和class也可以是表达式,它的值会传给Beans.instantiate.tupe的值可以和Bean相同。 package 和 class 名字区分大小写。
11.3JSP与表单的交互方法 一.什么是HTML表单 在Web上获取用户的信息,大多数情况下都是通过表单来实现的。比如说输入注册用户的姓名、地址,或者输入一个词来使用搜索引擎来查找,或者从来访问者处收集数据提供参考等等。 1.HTML表单的数据流 11.3.1 HTML表单的基本概念 HTML表单的数据流
二.创建表单的步骤 • 建立HTML表单; • 使用GET和POST方法; • 写Bean; • 传数据到Bean; • Request对象; • 从Bean中调数据到JSP页面; • 如何运行例子 1.建立HTML表单 一个HTML表单分为三个部分: (1)表单及其参数定义: (2)输入域的制作及设置: (3)提交按钮的制作: 2.使用GET和POST方法
3.写Bean 如果JSP程序用到了Bean,你就得按照JavaBean API的说明设计你的Bean。记住下面两个关键部分。 如果JSP程序里用<jsp:getProperty>标签,那你就得在Bean里边写配合的GET方法。 如果JSP程序里用<jsp:setProperty>标签,那你就得在Bean里边写配合的Set方法。 • 4.传数据到Bean • 把HTML表单的数据传到Bean里需要两个工作: • 用<jsp:useBean>标签创建或者定位到Bean。 • 在Bean里面用<jsp:setProperty>设置属性值。 5.Request对象 用户输入的数据用来存放在Request对象里,用javax.servlet.HttpServletRequest来执行(也可以用其他不同的工具来执行,但他们其实都是javax.servletHttpServletRequest的子集)。 也可以直接用scriptlet来直接访问Request对象。Scriptlet因限于篇幅不作详细讨论。现在只要知道他是用脚本语言写的一段放在<%和%>之间的代码就足够了。 你经常会用到如下方法处理Request对象,如表11-2所示。
表11-2 使用方法处理Request对象 6.从Bean中调数据到JSP页面 一旦用户的数据被传到Bean,你就想重新得到数据,然后在JSP页面中显示出来。想达到这一步,你就得用到<jsp:getProperty>标签传Bean名和属性名。 <jsp:useBean>,<jsp:setProperty>和<jsp:getProperty>标签必须相配。
11.4 JSP内部对象的使用 • JSP内部对象有以下几种: • Request:客户端请求,此请求会包含来自GET/POST请求的参数。 • Response:网页传回客户端的响应。 • pageContext:网页的属性是在这里管理。 • session:与请求有关的会话。 • application:正在执行的内容。 • out:用来传送响应的输出流。 • config:servlet的架构对象。 • page:处理JSP网页本身。 • exception:处理JSP文件执行时发生的错误和异常。 11.4.1 Request对象的使用 Request对象主要用于接受客户端通过HTTP协议连接传输到服务器端的数据。 一、Request对象的主要方法 (1)getCookies() 使用该方法可以返回客户端Cookie对象,结果是一个Cookie数组。 (2)getHeader(String name) 使用该方法可以获得HTTP协议定义的传送文件头信息,例如:Request.getHeader("User-Agent")将返回客户端浏览器的版本号、类型。
(3)getAttribute(String name) 使用该方法可以返回name指定的属性值,如果不存在指定的属性,则返回空值(null)。 (4)getAttributeName() 使用该方法可以返回Request对象所有属性的名字,结果集是一个Enumeration(类举)类的实例。 (5)getHeaderName() 使用该方法可以返回所有RequestHeader的名字,结果集是一个Enumeration类的实例。 (6)getHeaders(String name) 使用该方法可以返回指定名字的RequestHeader的所有值,结果集是一个Enumeration类的实例。 (7)getMethod () 使用该方法可以获得客户端向服务器端传送数据的类型,有GET,POST或PUT等类型。 (8)getParameter(String name) 使用该方法可以获得客户端传送给服务器端的参数值,该参数由name指定。 (9)getParameterNames () 使用该方法可以获得客户端传送给服务器商的所有参数名字,结果集是一个Enumeration类的实例。
(10)getParameterValues (String name) 使用该方法可以获得指定参数所有值。 (11)getQueryString () 使用该方法可以获得查询字符串,该字符串由客户端以GET方法向服务器端传送。 (12)getRequestURI () 使用该方法可以获得发出请求字符串的客户端地址。 (13)getServletPath () 使用该方法可以获得客户端所请求文件的文件路径。 (14)setAttribute(String name,Java.lang.Object o) 使用该方法可以设定名字为name的Request参数的值,该值由Object类型的O指定。 (15)getServerName()、getServerPort()、getRemoteAddr()、getRemoteHost() 使用以上四个中以分别获得服务器的名字、端口号、客户端的IP地址和微机的名字,其中getRemoteHost()方法如果失败,将会返回客户端电脑的IP地址。 (16)getProtocol() 使用该方法可以获取客户端向服务器端传送数据所依据的协议名称。 二、Request对象的用法 用法一:使用Request的方法获得服务器端的各个参数,并把它们用out.print()输出到浏览器上。 用法二:使用getMethod()方法,返回GET,使用getQueryString()方法,返回”bal=123.45,fName=Steven”。
11.4.2 Response对象的使用 Response对象和Request对象相反,主要用于向客户端发送数据,例如Cookie、HTTP文件头信息等。 一、Response对象的主要方法 (1)addCookie(Cookie cookie) 使用该方法可以添加一个Cookie对象,用来保存客户端的用信息,括号中的前一个Cookie表示Cookie的名称,后一个cookie表示对应的Cookie的值。例如: Cookie userCookie = new Cookie("user", "uid1234"); response.addCookie(userCookie); 用getCookies()方法可以获得这个Cookie。 (2)addHeader(String name,String value) 使用该方法可以添加HTTP文件头,该Header将会传到客户端去,如果同名的Header存在,那么原来的Header将会被覆盖。 (3)Contains Header(String name) 使用该方法可以判断指定名字的HTTP文件头是否存在并返回布尔值。 (4)Send Error(int sc) 使用该方法要以向客户端发送错误信息,例如:服务器内部错误(500),网页找不到错误(404)。 (5)setHeader(String name,String value) 使用该方法可以设定指定名字的HTTP文件头的值,如果该值存在,则它会被新的值覆盖。
二、Response对象的用法 使用Response方法,定时刷新页面,服务器重新解释执行这个程序,产生新的时间,然后输出到客户端。 11.4.3 Session对象的使用 Session对象用来在每一个用户之间分别保存用户信息。会话状态维持是Web应用开发者必须面对的问题。有多种方法可以用来解决这个问题,如使用Cookies、隐藏的表单输入域,或直接将状态信息附加到URL中。Java Servlet提供了一个在多个请求之间持续有效的会话对象,该对象允许用户存储和提取会话状态信息。JSP也同样支持Servlet中的这个概念。 Session对象和前面的Request,Response一样也是一个内部对象。这个对象在第一个JSP页面被封装时自动创建,并被关联到request对象上。与ASP中的会话对象相似,JSP中的Session对象对于那些希望通过多个页面完成一个事务的应用是非常有用的,因为多个页面可以共用Session对象的信息。 一、Session对象的主要方法 (1)getAttribute(String name) 使用该方法可以获得指定名字的属性,如果该属性不存在,将会返回null。 (2)getAttributeNames() 使用该方法可以返回Session对象中存储的每一个属性对象,结果集是一个Enumeration类的实例。
(3)getCreationTime() 使用该方法可以返回Session对象创建的时间。 (4)getId() 使用该方法使得每生成一个Session对象,服务器就会给他一个编号,该编号不会重复,并返回当前Session对象的编号。 (5)getLastAccessedTime() 使用该方法可以返回当前Session对象最后一次被操作的时间。 (6)getMaxInactiveInterval() 使用该方法可以获取Session对象的生存时间。 (7)removeAttribute(String name) 使用该方法可以删除指定的属性。 (8)setAttribute(String name,java.Lang.Object.Value) 使用该方法可以设定名字的属性值,并且把它存储在Session对象中。 二.Session对象的用法 用法一:利用Session对象存储信息。 用法二:为说明session对象的具体应用,接下来我们用三个页面一个页面的Web应用。第一个页面q1.html仅包含一个要求输入用户名字的html表单,代码如下:
11.4.4 Application对象的使用 Application对象主要用于保存用户信息,当创建了Application对象,则Application对象将一直保持下去。在服务器启动或者JSP创建Application对象时,服务器会自动执行该文件,并完成Application对象的初始化,在顺关闭或者 Application对象被删除时,服务器执行global.jsp来完成Application对象的注销工作。值得说明的是:Application对象和ASP里的一样,是所有连接用户所有页面共用的对象。 一.Application对象的主要方法 (1)getAttribute(String name) 使用该方法可以返回由name指定名字的Application对象属性值。 (2)getAttributeNames() 使用该方法可以返回所有Application对象属性的名字,结果集是一个Enumeration类的实例。 (3)getInitParameter(String name) 使用该方法可以返回Application对象属性的初始值,这个属性由name指定。 (4)getServerInfo() 使用该方法可以获得当前版本Servlet编译器的信息。 (5)setAttribute(String name,Object object) 使用该方法可以实现用Object来初始化某个属性,该属性由name指定。