当客户端请求浏览JSP页面时,
JSP到Servlet的编译过程一般在第一次页面请求时进行。
JSP程序的成分主要有如下四种:注释(Comment)、指令(Directive)、脚本元素(Scripting Element)、动作(Action 标签)。
为了简化脚本元素,JSP定义了一组由容器实现和管理的对象(内
Jsp内置对象 |
功能 |
主要方法 |
out |
向客户端输出数据 |
print() println() flush() clear() isAutoFlush() getBufferSize() close() ………… |
request |
向客户端请求数据 |
getAttributeNames() getCookies() getParameter() getParameterValues() setAttribute() getServletPath() ………….. |
response |
封装了jsp产生的响应,然后被发送到客户端以响应客户的请求 |
addCookie() sendRedirect() setContentType() flushBuffer() getBufferSize() getOutputStream() sendError() containsHeader()…………… |
application |
|
|
config |
表示Servlet的配置,当一个Servlet初始化时,容器 |
getServletContext() getServletName() getInitParameter() getInitParameterNames()…………… |
page |
Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问 |
flush()……… |
pagecontext |
为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分 |
forward() getAttribute() getException() getRequest() getResponse() getServletConfig() getSession() getServletContext() setAttribute() removeAttribute() findAttribute() …………… |
session |
用来保存每个用户的信息,以便跟踪每个用户的操作状态 |
getAttribute() getId() getAttributeNames() getCreateTime() getMaxInactiveInterval() invalidate() isNew() |
exception |
反映运行的异常 |
getMessage()…………
|
.
JSP注释分为HTML注释和隐藏注释两种。
JSP隐藏注释语句在JSP页面执行的时候会被忽略,不会执行。
HTML注释和JSP注释的不同之处在于HTML注释在客户端浏
JSP注释语句的语法:
<%--comment--%>
HTML注释语句的语法:
<!--该注释可以被查看-->
<!--该页面生成于 <%= (new java.util.Date()).
在客户端的HTML源代码中显示为:
<!--该页面生成于October 15, 2006 -->
JSP指令常用以下形式:
<%@ directive attribute=”value”%>
可以将多个属性写在一个语句中:
<%@ directive attribute1="value1" attribute2="value2" attributeN="valueN" %>
主要的三种指令是page include指令taglib,下面对三种指令进行详细说明。
在JSP文件中,可以通过<%@ page %>命令定义整个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命令的几个小例子:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" buffer="5kb" autoFlush="false" errorPage=" error.jsp " %>
通过Page命令,
关于<%@ page %>的位置可以不去考虑,放在任何地方都可以很好的工作,
定义JSP页面使用的脚本语言,
language=”java”
指明JSP文件中使用的脚本语言,目前只能使用Java。
contentType属性定义了JSP页面字符编码和页面响应
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" %>
该属性用于JSP引入Java包中的类,
在使用Java包中的元素之前一定要先声明该包的import引
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
定义此JSP页面产生的Servlet是继承自哪个父类。请特别
isErrorPage="true|false"
默认值为“true”,设置是否显示错误信息。如果为true,
errorPage="relativeURL"
设置处理异常事件的JSP文件的位置。表示如果发生异常错误,
session="true|false"
默认值为“true”,
buffer="none|8kb|sizekb"
为内置对象out指定发送信息到客户端浏览器的信息缓存大小。以
autoFlush="true|false"
指定是否当缓存填满时自动刷新,输出缓存中的内容。如果为tru
isThreadSafe="true|false"
指定JSP页面是否支持多线程访问。默认值是ture,表示可以
info="text"
指定任何一段字符串,该字符串被直接加入到翻译好的页面中。
Include指令的功能是在JSP编译时插入包含的文件。
include指令的语法:
<%@ include file="relativeURL" %>
其中只有一个file属性,这个属性指定了被包含文件的路径。
如果路径是以"/"开头的,
"header.jsp"
"/templates/onlinestore.html"
"/beans/calendar.jsp"
在JSP中,你可以用Include指令将JSP文件,
当你使用Include包含一个文件的时候,一定要注意,
使用包含文件有以下一些优点:
(1)被包含文件可以在多个文件中被使用,实现了代码共享和重用
(2)当被包含文件修改后,
taglib指令的功能是使用标签库定义新的自定义标签,
taglib指令的语法:
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
例如
<%@ taglib uri="http://www.jspcentral.
<public:loop>
</public:loop>
<% @ taglib %>指令声明此JSP文件使用了自定义的标签,同时引用标签库,
这里自定义的标签有标签和元素之分。
URI根据标签的前缀对自定义的标签进行唯一的命名prefix
JSP声明用来声明JSP程序中的变量、实例、方法和类。
声明是以<%!为起始,以%>结尾。在JSP程序中,
JSP的声明可以让你定义页面一级的变量以保存信息或定义该JS
其语法如下:
<%! declaration; %>
例如:
<%! int i=0; %>
<%! int a,b,c; %>
注意:
1.编译JSP时,脚本小程序生成于jspService()
2.每一个声明仅在一个页面中有效,
由于声明不会有任何输出,
<%! private int accessCount = 0; %>
自从服务器启动以来页面访问次数为:
<%= ++accessCount %>
JSP表达式用来计算输出Java数据,
其语法如下:
<%= expression %>
例如:
<%= i %>
<%= "Hello" %>
<%= a+b %>
下面的代码显示页面被请求的日期/时间:
当前时间为:<%= new java.util.Date() %>
为简化这些表达式,JSP预定义了一组可以直接使用的对象变量。
(1)request:HttpServletRequest。
(2)response:
(3)session:
(4)out:PrintWriter,
例如:
Your hostname: <%= request.getRemoteHost() %>
如果要完成的任务比简单的表达式复杂时,
JSP脚本小程序的语法如下:
<% Java Code %>
由于JSP和其他一些嵌入式语言一样,
<%
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData);
%>
注意:在程序段中定义的变量是局部变量,且程序段中的“表达式”
编译JSP时,编译器在jspService()
例如,下面的JSP片断混合了HTML语言和脚本小程序:
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
上述JSP代码将被转换成如下Servlet代码:
if (Math.random() <0.5) {
out.println("Have a <B>nice</B> day!");
}
Else
{
out.println("Have a <B>lousy</B> day!");
}
JSP动作利用XML语法格式的标记来控制Servlet引擎的
JSP动作元素包括:
jsp:include:当页面被请求时引入一个文件。
jsp:forward:请求转到一个新的页面。
jsp:plugin:
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:
<jsp:include>
语法:
<jsp:include page="path" flush="true" />
其中,page="path"表示相对路径,
例如:
inc.jsp
<%= 2 + 2 %>
test.jsp
Header
<jsp:include page="inc.jsp"/>
Footer
运行结果:4
【例4.5】 下面的JSP页面把4则新闻摘要插入到 “WhatsNew.jsp”页面。
WhatNews.jsp
<HTML>
<HEAD>
<TITLE>What's New</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH class="TITLE">
What's New at JspNews.com</TABLE>
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>
一般而言,
前面已经介绍过include指令,
include指令是在JSP文件执行时被转换成Servlet
<jsp:include>动作是在JSP文件被请求时,
<jsp:forward>将客户端所发出来的请求,
语法:
<jsp:forward page={"relativeURL"|"<%= expression %>"}/>
page属性包含的是一个相对URL。
<jsp:forward page="/utils/errorReporter.
<jsp:forward page="<%= someJavaExpression %>" />
有一点要特别注意,<jsp:forward>
例如
<%
out.println("会被执行!!! ");
%>
<jsp:forward page="other.jsp" />
<%
out.println("不会执行!!!");
%>
上面这个范例在执行时,会打印出“会被执行!!!”,
【例4.6】该实例需要四个文件:login.jsp,
首先看一下login.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<center>
<form method=get action="test.jsp">
username<input type=text name=username>
<br><br>
password<input type=password name=password>
<br><br>
<input type=submit value="确定">
</form>
</center>
</body>
</html>
test.jsp代码如下:
<html>
<%
string username=request.getparameter(
if(username.trim().equals("
{%>
<jsp:forward page="ok.html" />
<%}
else
{%>
<jsp:forward page="no.html" />
<%}
%>
</html>
ok.htm和no.htm非常简单,可以分别写为:
<html>ok</html>
<html>no</html>
运行效果是当你输入用户名为abc时,页面会自动跳转到ok.
jsp:plugin动作用来根据浏览器的类型,
语法:
<jsp:plugin
type="bean|applet"
code="classFileName"
codebase="
[name="instanceName"]
[align="bottom|top|middle|
[height="displsyPixels"]
[width="displsyPixels"]
[hspace="leftRightPixels"]
[vspace="topButtomPixels"]
[jreversion="java的版本"]
[<jsp:params>
[<jsp:param name="parameterName" value="参数的值"/>]
</jsp:params>]
[<jsp:fallback> 这里是在不能启动插件的时候,显示给用户的文本信息</jsp:
</jsp:plugin>
Plugin中的各个属性如下:
(1)type="bean|applet"
插件将执行的对象的类型,必须指定。
(2)code="classFileName"
插件将执行的java类文件的名称,在名称中必须包含扩展名,
(3)codebase="
包含插件将运行的java类的目录或指相对这个目录的路径。
param动作元素用于传递参数。我们还可以使用<jsp:
和<jsp:include>一起使用的语法如下:
<jsp:include page="相对的URL值"|"<% =表达式%> " flush="true">
<jsp:param name="参数名1" value="{参数值|<%=表达式 %>}"/>
<jsp:param name="参数名2" value="{参数值|<%=表达式 %>}"/>
</ jsp:include>
和<jsp: forward>一起使用的语法如下:
<jsp:forward page="path"} >
<jsp:param name="paramname" value="paramvalue" />
</jsp:forward>
<jsp:param>中name指定参数名,
例如:
<jsp:include page="scripts/login.jsp">
<jsp:param name="username" value="Aqing" />
<jsp:param name="password" value="123456"/>
</jsp:include>
<jsp:useBean>
在程序中可把逻辑控制、
其语法形式:
<jsp:usebean id="name" scope="page | request | session | application" typespec />
其中typespec有以下几种可能的情况:
class="classname" | class="classname" type="typename" | beanname="beanname" type="typename" | type="typename" |
<jsp:useBean id="name" class="package.class" />
注意必须使用class或type,
只有当第一次实例化Bean时才执行Body部分,
获得Bean实例之后,要修改Bean的属性既可以通过jsp:
通过jsp:setProperty和jsp:
useBean动作元素属性如下:
(1)id用来引用Bean实例的变量。
(2)class指定Bean的完整包名,
(3)scope指定Bean的有效范围,可取四个值分别为:
scope之所以很重要,是因为jsp:
(4)type指定引用该对象的变量的类型,
(5)beanName指定Bean的名字。
<jsp:setproperty>
可以使用两种语法实现方式:
(1)在jsp:usebean后使用jsp:
<jsp:usebean id="myuser"/>
<jsp:setproperty name="user" property="user"/>
在这种方式中,jsp:setproperty将被执行。
(2)jsp:setproperty出现在jsp:
<jsp:usebean id="myuser">
<jsp:setproperty name="user" property="user"/>
</jsp:usebean>
在这种方式中,jsp:
在<jsp:setproperty>中的name值应和<
<jsp:setproperty>动作有下面四个属性:
(1)name用来表明对哪个bean实例执行下面的动作,
(2)property用来表示要设置哪个属性。
(3)value属性是可选的。
value和param不能同时使用,但可以使用其中任意一个。
(4)param属性是可选的。
例如,下面的代码片断表示:
<jsp:setProperty name="orderBean"
property="numberOfItems"
param="numItems" />
如果同时省略value和param,
<jsp:getproperty>
在使用<jsp:getproperty>之前,必须用<
语法如下:
<jsp:getProperty name="beanInstanceName" property="propertyName"/>
jsp:getProperty有两个必需的属性,即:
例如
<jsp:useBean id="itemBean" ... />
<UL>
<LI>Number of items:
<jsp:getProperty name="itemBean" property="numItems" />
<LI>Cost of each:
<jsp:getProperty name="itemBean" property="unitCost" />
</UL>
.
.
.
.
.
.
.
本章小结
一个JSP页面主要由注释、指令、脚本元素、
动作元素的内容组成。 1.注释包括HTML注释和JSP隐藏注释。
2.指令包括:
(1)page:用来定义整个JSP页面的属性和相关功能。
(2)include:
用来指定JSP文件被编译时需要插入的资源,可以是文本、代码、 HTML文件或JSP文件。 (3)taglib:页面使用者用来自定义标签。
3.脚本元素
(1)声明:用来定义在程序中使用的实体,
它是一段Java代码,可以声明变量,也可以声明方法。格式:< %! 开始声明 %> 例如:<%! int i;%>。 (2)表达式:格式:<%=表达式%> 最后是没有分号的.例如:<%=1+2+3%>。
(3)Scriptlet:格式:<%java代码%>。
4.在JSP中的动作指令包括:Include、 Forward、 UseBean、 GetProperty、 SetProperty、 Plugin。
(1)include指令:表示包含一个静态的或者动态的文件。
子句能让你传递一个或多个参数给动态文件, 也可在一个页面中使用多个指令来传递多个参数给动态文件。 (2)forward指令:表示重定向一个静态html/
jsp的文件,或者是一个程序段。 (3)Plugin指令:用于在浏览器中播放或显示一个对象(
典型的就是Applet和Bean), 而这种显示需要浏览器的Java插件。一般来说, 元素会指定对象是Applet还是Bean, 同样也会指定class的名字和位置, 另外还会指定将从哪里下载这个Java插件。 (4)useBean指令:
表示用来在JSP页面中创建一个Bean实例并指定它的名字以及 作用范围。 (5)setProperty指令:
用来为一个Bean的属性赋值。若在jsp: useBean后使用,jsp: setProperty将被执行。若jsp: setProperty出现在jsp:useBean标签内, jsp: setProperty只会在新的对象被实例化时才将被执行。 注意name值应当和useBean中的id值相同。 (6)getProperty指令:
表示获取Bean的属性的值并将之转化为一个字符串, 然后将其插入到输出的页面中。 课后习题
一.填空题
1. JSP文件不需要引入
类包。 2.一个JSP页面主要包含
、 、 、 等成分。 3.三种JSP指令分别是
、 、 。 4.三种脚本元素分别是 、 、
。 5.jsp:useBean动作指令的作用是
。 二.选择题
1.JSP的默认应用语言是( )
A JSP B Servlet C Java D JavaScript
2.下列哪种方式不属于JSP脚本元素语法( )
A <%! int i=0; %>
B <%= "Hello" %> C <% out.println("Hello "); %> D <%@ language="java" %>
3.jsp:forward动作的page属性的作用是( )
A 定义JSP文件名 B 定义JSP文件的传入参数
C 定义JSP文件的文件头信息 D 定义JSP文件的相对地址
三.简答题
1.jsp有哪些页面成分?作用分别是什么?
2.JSP中动态include与静态include的区别?
我们都知道在JSP中include有两种形式,分别是
<%@ include file=” ”%>
<jsp:include page=” ” flush=”true”/>
以下是对include 两种用法的区别,主要有两个方面的不同:
1.执行时间上:
<%@ include file=”relativeURI”%> 是在翻译阶段执行
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.
2.引入内容的不同:
<%@ include file=”relativeURI”%>引入静态文本(
html,jsp), 在JSP页面被转化成servlet之前和它融和到一起. <jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.
3.另外在两种用法中file和page属性都被解释为一个相对
的URI.如果它以斜杠开头,那么它就是一个环境相关的路径. 将根据赋给应用程序的URI的前缀进行解释, 如果它不是以斜杠开头, 那么就是页面相关的路径,
就根据引入这个文件的页面所在的路径进行解释。 3.jsp有哪些动作元素?作用分别是什么?
4.简述JSP的几种注释方式。
1、jsp有哪些内置对象作用分别是什么
答:JSP共有以下9种基本内置组件( request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet 正在执行的内容 out 用来传送回应的输出 config servlet的构架部件 page JSP网页本身 exception 针对错误网页,未捕捉的例外
2、jsp有哪些动作作用分别是什么
答:JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty: jsp:forward:把请求转到一个新的页面。 jsp:plugin: 3、JSP中动态INCLUDE与静态INCLUDE的区别? 答:动态INCLUDE用jsp:include动作实现 4。JSP的常用指令 isErrorPage(是否能使用Exception对象), 5、JSP和Servlet有哪些相同点和不同点, 6。Jsp和Servlet中的请求转发分别如何实现? JSP的转发请求可通过<jsp:forward> 7.jsp有哪些隐式对象?作用分别是什么? request request表示HttpServletRequest对象。 8.两种跳转方式分别是什么?有什么区别? |
.