2 动态网页设计技术Word下载.docx
《2 动态网页设计技术Word下载.docx》由会员分享,可在线阅读,更多相关《2 动态网页设计技术Word下载.docx(31页珍藏版)》请在冰点文库上搜索。
AttachedGETdata:
"
+queryData);
%>
JSP脚本和HTML标记混合使用的例子:
%if(Math.random()<
0.5){%>
Havea<
B>
nice<
/B>
day!
%}else{%>
lousy<
%=%>
2.2.3JSP的声明
JSP声明用来定义JSP页面的脚本命令使用到的变量和方法,其语法如下:
%!
Java代码%>
由于声明不会有任何输出,因此它们往往和JSP表达式或脚本命令结合在一起使用。
例如,下面的JSP代码片断输出自从服务器启动(或Servlet类被改动并重新装载以来)当前页面被请求的次数:
privateintaccessCount=0;
%>
自从服务器启动以来页面访问次数为:
%=++accessCount%>
2.2.4page指令
page指令定义了一系列页面依赖属性,并能将这些属性传递给JSP容器。
page指令的形式为:
%@page
[language="
java"
]
[extends="
package.class"
[import="
{package.class|.*},..."
[session="
true|false"
[buffer="
none|8kb|sizekb"
[autoFlush="
[isThreadSafe="
[info="
text"
[errorPage="
relativeURL"
[contentType="
mimeType[;
charset=characterSet]"
|"
text/html;
charset=ISO-8859-1"
[isErrorPage="
page指令的属性解释如下:
(1)language
定义了在jsp使用的脚本语言,目前java是缺省又是唯一合法的选择。
language=”java”
(2)extends
extends=”package.class”。
这将为servlet产生一个超类。
请特别谨慎的使用这一功能,因为,服务器也许已经定义了一个。
(3)import
import=”package.class”或import=”package.class1,..,package.classN”。
通过该属性你可以导出在jsp文件中要使用到的类(在java中完成某种功能的类文件)。
举例:
%@pageimport="
java.util.*"
import属性是这几个属性中唯一一个可以在一个JSP中出现多次的。
(4)session
session=”true|false”。
如果值为“true”(缺省)表示:
预定义变量session(继承HttpSession)应该绑定到一个已存在的session,否则就应该创建一个并将之绑定。
值为“false”时表示:
将不使用session变量,如果试图使用,将在JSP向servlet转化时出现错误。
(5)buffer
buffer=”sizekb|none”。
为JspWriter输出确定缓冲的大小。
缺省由服务器而定,但至少要有8kb。
(6)autoflush
autoflush=”true|false”。
如果值为”true”(缺省)表示:
当缓冲满时将自动清空,值为”false“时表示:
当缓冲满时递出一个异常,这很少使用。
当buffer=”none”是若”false”值是不合法的。
(7)isThreadSafe
isThreadSafe=”true|false”.如果值为“true”(缺省)表示:
将进行普通的servlet处理,多个请求将被一个servlet实例并行处理,在这种情况下,编程人员同步访问多个实例变量。
servlet将实现单线程模式(SingleThreadModel),不管请求是顺序提交还是并发出现,都将提供不同的分离的servlet实例。
(8)info
info=”message”。
定义一个可以通过调用getServletInfo方法得到的串。
(9)isErrorPage
isErrorPage=”true|false”。
指定当前页面是否可以处理来自另一个页面的错误,缺省为“false”。
(10)errorPage
errorPage=”URL”。
指定一个JSP页面来处理任何一个可抛出的但当前页面并未处理的意外错误。
(11)contentType
contenType=”MIME-Type”或contentType=”MIME-Type;
charset=Character-Set”.它指定输出的MIME类型。
缺省为“text/html”。
%@pagecontentType="
text/plain"
%@pagecontentType=”text/html;
charset=GB2312”%>
2.2.5include指令
include指令可以在jsp文件编译为servlet类文件时,将一个文件包含进来。
include指令的形式如下:
%@includefile=”URL”%>
URL通常相对于指向它的JSP页面。
但是,普遍使用相对“URL”,可以使用一个斜杠“/”作为URL的开始来告知系统URL相对的Webserver的主路径。
被包含的文件将以规则的JSP形式来解析,因此,您可以在其中使用静态HTML,scriptingelements,directives,和actions。
让我们来看一个例子,许多站点在每一个页面上包含一个小型的导航条。
它通常出现在页面的顶部或左右侧,并包含在每一个页面里。
这用includedirective来实现是很自然的,若用规则的HTML来把这些语句拷到每一个页面无疑是个梦魇。
请看下列代码:
HTML>
HEAD>
TITLE>
JSP教程<
/TITLE>
/HEAD>
BODY>
%@includefile="
/navbar.html"
!
—本页面的其他部分...-->
/BODY>
/HTML>
因为文件是在页面被转换时插入的,因此,如果导航条改变了,您需要将所有指向它的JSP页面全部重新编译一次。
如果您的导航条并不常改变这样做无疑是高效的,但是,如果您的被包含文件更改频繁,则建议您使用<
jsp:
include>
动作(后面将谈到)来替代,它在页面被请求时才包含文件。
2.2.6JSP的注释
JSP注释的形式为:
%--注释--%>
或<
%/**注释...**/%>
JSP注释和字符引用约定
下面是一些特殊的标记或字符,你可以利用它们插入注释或可能被视为具有特殊含义的字符。
%--comment--%>
JSP注释,也称为“隐藏注释”。
JSP引擎将忽略它。
标记内的所有JSP脚本元素、指令和动作都将不起作用。
--comment-->
HTML注释,也称为“输出的注释”,直接出现在结果HTML文档中。
标记内的所有JSP脚本元素、指令和动作正常执行。
\%在模板文本(静态HTML)中实际上希望出现“<
%”的地方使用。
%\>
在脚本元素内实际上希望出现“%>
”的地方使用。
\'
使用单引号的属性内的单引号。
不过,你既可以使用单引号也可以使用双引号,而另外一种引号将具有普通含义。
\"
使用双引号的属性内的双引号。
参见“\'
”的说明。
脚本和指令应用举例
下面是一个使用JSP表达式、Scriptlet、声明、指令的简单例子。
DOCTYPEHTMLPUBLIC"
-//W3C//DTDHTML4.0Transitional//EN"
>
JavaServerPages<
BODYBGCOLOR="
#FDF5E6"
TEXT="
#000000"
LINK="
#0000EE"
VLINK="
#551A8B"
ALINK="
#FF0000"
CENTER>
TABLEBORDER=5BGCOLOR="
#EF8429"
TR>
THCLASS="
TITLE"
JSP应用实例<
/TABLE>
/CENTER>
P>
下面是一些利用各种JSP功能生成的动态内容:
UL>
LI>
表达式.<
BR>
你的主机名:
.
JSPScriptlet.<
%out.println("
查询字符串:
+
request.getQueryString());
声明(和表达式).<
服务器启动以来访问次数:
指令(和表达式).<
%@pageimport="
当前日期:
%=newDate()%>
/UL>
2.3JSP内建对象
为了简化JSP表达式和脚本的代码编写,JSP提供了一些预先定义对象,使用这些对象时可以不事先定义它们。
JSP页面中可以使用的预定义对象如下表所示:
预定义对象
类型
描述
存活范围
request
javax.servlet.ServletRequest
javax.servlet.HttpServletRequest
触发服务的请求
response
javax.servlet.ServletResponse
javax.servlet.HttpServletResponse
对请求的响应
page
pageContext
javax.servlet.jsp.PageContext
JSP页面的页面上下文
session
javax.servlet.http.HttpSession
为发出请求的客户端创建的会话对象,该对象仅对HTTP协议有效。
application
javax.servlet.ServletContext
从servlet配置对象中获取的servlet上下文,也可通过getServletConfig().get
Context()获得。
out
javax.servlet.jsp.JspWriter
写入输出流的对象
config
javax.servlet.ServletConfig
当前页面的ServletConfig
java.lang.Object
执行当前请求的页面实现类的实例。
另外,在出错处理页面中,你还可以访问预定义对象exception:
exception
java.lang.Throwable
导致出错处理页面被唤醒的未捕获的Throwable。
下面逐一对上述预定义对象进行详细描述。
2.3.1request对象
通过request对象可以获得客户请求的参数、方法类型、HTTP头、客户端主机信息等。
下表列出request对象的部分方法。
返回值
方法
String
getParameter(Stringname)
以字符串类型返回请求参数的值;
如果参数不存在返回null。
参数类
java.util.Enumeration
getParameterNames()
返回包含在请求中的所有参数名称的枚举型。
Object
getAttribute(Stringname)
以对象类型返回命名属性的值;
如果命名属性不存在返回null。
属性类
void
setAttribute(Stringname,Objectobject)
在request对象中保存一个命名属性。
getAttributeNames()
返回包含在请求中的所有命名属性的名称的枚举型。
。
removeAttribute(Stringname)
删除request对象中的命名属性。
getCharacterEncoding()
获得request对象中字符编码的名称。
字符集类
setCharacterEncoding(StringcharSet)
设置request对象中字符编码的名称。
getRemoteAddr()
获得发送请求客户端主机的IP地址。
客户主机
getRemoteHost()
获得发送请求客户端主机的名称。
Cookie[]
getCookies()
以数组形式返回包含在客户机请求中的所有Cookie对象。
getHeader(Stringname)
略。
Http头
getHeaderNames()
HttpSession
getSession()
返回与本请求相关联的当前会话;
如果不存在,则创建一个新的会话。
会话类
2.3.2response对象
response对象是对客户请求的响应,一般由继承HttpServletResponse而来。
可以用来添加Cookie、设置HTTP状态码和response头等。
addCookie(Cookiecookie)
向响应添加特定的Cookie。
addHeader(Stringname,Stringvalue)
添加一个含有名称和值的响应头部。
vodi
sendError(intsc)
使用特定的状态码向客户端发送一个错误响应,并清空缓冲。
sendError(intsc,java.lang.Stringmsg)
setStatus(intsc)
设置相应的状态码。
2.3.3out对象
out对象是用来向客户端发送内容的PrintWriter。
然而,为了让response对象更为实用,out是带缓存功能的PrintWriter,即JspWriter。
JSP允许通过page指令的buffer属性调整缓存的大小,甚至允许关闭缓存。
out一般只在Scriptlet内使用,这是因为JSP表达式是自动发送到输出流的,很少需要显式地引用out。
out对象的方法有out.pringln(Objectobject)、out.fluse()、out.clear()、out.clearBuffer()、out.close()等方法。
2.3.4session对象
session对象是和请求关联的HttpSession对象。
前面我们已经介绍过会话的自动创建,我们知道,即使不存在session引用,这个对象也是自动绑定的。
但有一个例外,这就是如果你用page指令的session属性关闭了会话,此时对session变量的引用将导致JSP页面转换成Servlet时出错。
下表列出session对象的部分方法。
Returnstheobjectboundwiththespecifiednameinthissession,ornullifnoobjectisboundunderthename.
ReturnsanEnumerationofStringobjectscontainingthenamesofalltheobjectsboundtothissession.
removeAttribute(Stringname)
从会话中删除绑定到指定名称的对象。
setAttribute(java.lang.Stringname,java.lang.Objectvalue)
根据制定的名称将对象绑定到会话中。
getId()
返回分配给会话的唯一标示符。
invalidate()
取消会话,并解除绑定到它上面的所有对象。
int
getMaxInactiveInterval()
Returnsthemaximumtimeinterval,inseconds,thattheservletcontainerwillkeepthissessionopenbetweenclientaccesses.
setMaxInactiveInterval(intinterval)
以秒为单位设置两个客户请求之间的最大时间间隔,超过该间隔将取消会话。
为说明session对象的具体应用,接下来我们用三个页面模拟一个多页面的Web应用。
第一个页面(q1.html)仅包含一个要求输入用户名字的HTML表单,代码如下:
<
HTML>
BODY>
FORMMETHOD=POSTACTION="
q2.jsp"
请输入您的姓名:
INPUTTYPE=TEXTNAME="
thename"
INPUTTYPE=SUBMITVALUE="
SUBMIT"
/FORM>
/BODY>
/HTML>
第二个页面是一个JSP页面(q2.jsp),它通过request对象提取q1.html表单中的thename值,将它存储为name变量,然后将这个name值保存到session对象中。
session对象是一个名字/值对的集合,在这里,名字/值对中的名字为"
thename"
,值即为name变量的值。
由于session对象在会话期间是一直有效的,因此这里保存的变量对后继的页面也有效。
q2.jsp的另外一个任务是询问第二个问题。
下面是它的代码:
%@pagelanguage="
%!
Stringname="
"
;
%
name=request.getParameter("
);
session.putValue("
name);
%>
您的姓名是:
%=name%>
p>
q3.jsp"
您喜欢吃什么?
food"
P>
第三个页面也是一个JSP页面(q3.jsp),主要任务是显示问答结果。
它从session对象提取thename的值并显示它,以此证明虽然该值在第一个页面输入,但通过session对象得以保留。
q3.jsp的另外一个任务是提取在第二个页面中的用户输入并显示它:
Stringfood="
food=request.getParameter("
Stringname=(String)session.getValue("
您喜欢吃:
%=food%>
2.3.5application对象
application对象是一个ServletContext,也可以通过getServletConfig().getContext()获得。
可以在其中存放应用程序的初始化参数、全局性对象等。
下表列出application对象的部分方法。
Returnstheservletcontai