《Web应用开发技术》课件第六章_第1页
《Web应用开发技术》课件第六章_第2页
《Web应用开发技术》课件第六章_第3页
《Web应用开发技术》课件第六章_第4页
《Web应用开发技术》课件第六章_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.1JSP指令元素6.2JSP动作习题6第6章JSP标签

JSP指令元素为翻译阶段提供全局信息。例如,设置全局变量的值和输出内容的类型,声明要引用的类,指明页面中包含的文件等。所有的指令元素在整个文件的范围内都有效。指令元素从JSP发送这些信息到JSP/Servlet容器上,但它们并不向客户机产生任何输出。

目前,JSP中有三个指令元素,分别是page、include和taglib。6.1JSP指令元素6.1.1page指令

page指令用来定义JSP文件的全局属性。其语法格式如下:

<%@page属性1="属性1的值"属性2="属性2的值"……%>

例如:

<%@pagecontentType="text/html;charset=GB2312"%>

这条page指令就指定了contentType属性的值是"text/html;charset=GB2312",即JSP页面的MIME类型是text/html,使用的字符集是GB2312,这样可以显示标准的汉字。

page指令的属性主要包括:language,import,contentType,info,pageEncoding,buffer,autoFlush,session,errorPage,isErrorPage,isThreadSafe等。表6.1列出了page指令的属性及其作用。

表6.1page指令的属性及其用法说明续表在一个JSP页面中,可以用一条page指令来指定多个属性的值,也可以用多条page指令来指定各个属性的值。但是,需要注意的是,除import属性外,其它属性只能使用一次page指令给该属性指定一个值。由于import属性的取值较多,因此,可以在一条page指令中为import属性指定多个值,各个值间用逗号分隔;也可以使用多个page指令给import属性指定几个值。例如,下面两种写法都是正确的:

<%@pageimport="java.io.*","javax.servlet.*","java.util.Date"%>

或者

<%@pageimport="java.io.*"%>

<%@pageimport="javax.servlet.*","java.util.Date"%>

注意:page指令对整个页面有效,可以在JSP页面的任何地方写这种代码。但是,好的习惯是把它写在JSP程序的最前面,而且因为它是JSP页面指令,请记住一定要写在<HTML>标记的前面。6.1.2include指令

include指令的作用是在JSP页面出现该指令的位置处静态插入一个文件,即通知JSP容器在当前页面的include指令位置上嵌入指定的资源文件的内容。include指令的语法如下:

<%@includefile="文件名"%>

所谓静态插入,就是将当前JSP页面和插入的部分合并成一个新的JSP页面,然后再由JSP引擎将这个新的JSP页面转译成Java类文件。因此,使用include指令插入文件时,应注意下面几个问题:

(1)

include指令所包含文件的文件名不能是变量,文件名后也不能带任何参数。文件的扩展名可以是

.jsp、.html、.txt和

.inc等,且必须保证被插入的文件是可获得和可访问的。

(2)如果在文件名中包含有路径信息,则路径必须是相对于当前JSP网页文件的路径,一般情况下该文件必须和当前JSP页面在同一Web服务目录中。如果路径以“/”开头,则这个路径主要是参照JSP应用的上下关系路径;如果路径是以目录名开头,则这个路径就是正在使用的JSP文件的当前路径。

(3)使用include指令插入文件后,必须保证新合并成的JSP页面符合JSP语法规则,即形成一个新的JSP页面文件后,不存在语法冲突。例如,如果在一个JSP页面中使用include指令插入另一个JSP文件,而这两个文件中都用page指令设置了页面contentType属性,如果二者不一致时就会出现语法错误,当转译合并JSP页面到Java文件时就会失败。

(4)如果修改了被包含的文件,则也应将当前的JSP文件修改一下(在实际操作中,就是在编辑状态下打开该JSP文件,重新保存一次)。这是因为JSP引擎是通过比较JSP页面文件和相应的字节码文件的最后修改日期来判断JSP页面是否被修改过,如果两者相同,则认为JSP网页未被修改。由于在include指令中被包含的文件是在编译成字节码文件之前插入到源JSP页面中的,所以,如果只是修改了被包含的文件,而没有修改JSP页面文件,则得到的结果将和修改前是一样的。

【示例程序include.jsp和calculate.jsp】

include指令的使用。在这个例子中我们编写了一个计算平方根的程序calculate.jsp,然后在include.jsp中使用<%@includefile="calculate.jsp"%>指令将这个文件包含进来,使include.jsp能完成计算平方根的功能。其执行效果如图6.1所示。

图6.1在include.jsp中包含calculate.jsp的效果

(1)

include.jsp文件的源代码如下。

<%@pagecontentType="text/html;charset=gb2312"%>

<HTML>

<HEAD>

<TITLE>使用include包含文件</TITLE>

</HEAD>

<BODY>

<PALIGN=center>

请输入一个正数,单击按钮计算这个数的平方根!

<%@includefile="calculate.jsp"%>

</P>

</BODY>

</HTML>

(2)

calculate.jsp文件的源代码如下。

<%@pagecontentType="text/html;charset=gb2312"%>

<FORM

ACTION=""METHOD="post">

<INPUTTYPE="text"NAME="ok">

<INPUTTYPE="submit"VALUE="计算">

</FORM>

<%Stringa=request.getParameter("ok");

if(a==null)a="1";

try

{

doublenumber=Integer.parseInt(a);

out.println("<BR>计算结果是:"+Math.sqrt(number));

}

catch(NumberFormatExceptione)

{out.println("<BR>请输入数字");}

%>6.1.3taglib指令

这个指令用于引入一些特定的标签库以简化JSP页面的开发。这些标签可以是JSP标准标签库(JSPStandardTagLibrary,JSTL)中的标签,也可以是使用者自己定义和开发的标签。使用JSP标签库的语法格式如下:

<%@taglibprefix="标签前缀"uri="标签库的统一资源定位符"%>

其中,prefix指出要引入的标签的前缀;uri(UniformResourceIdentifer,统一资源定位符)用于指出所引用标签资源的位置,可以使用绝对路径或相对路径。例如:

<%@taglibprefix="c"uri="/jsp/jstl/core"%>

表示从JSP标准标签库的core库中引入前缀为c的标签。

使用标签库的主要好处是增加了代码的重用度,使页面易于维护。例如,可以把一些需要迭代显示的内容做成一个标签,在每次迭代显示时,使用这个标签就可以了,不必重复书写这些代码。然而,由于目前的tomcat中还没有将JSTL集成进去,如果要使用标准标签库(JSTL),需要下载和安装标签库文件,修改web.xml文件并进行相关的设置等,操作比较繁杂。虽然通过下载并安装MyEclipse插件可以解决一些问题,但仍然需要具备一些相关的知识。鉴于此,我们将在第11章介绍了XML语言后,在第12章专门介绍JSP中开发自定义标签库的技术和使用标准标签库的方法。

与在编译阶段提供全局信息的JSP指令元素相对应,JSP动作元素在执行阶段起作用,动态地为页面提供一些信息和插件等。JSP动作元素采用类似HTML/XML语法书写,并采用以下两种语法格式中的一种:6.2JSP动作

<jsp:动作名属性1="值1"属性2="值2"……/>

或者

<jsp:动作名属性1="值1"属性2="值2"……>

……

</jsp:动作名>

JSP规范定义了一系列的标准动作,它们均以jsp作为前缀。这些动作元素中使用比较频繁的主要有:<jsp:param>,<jsp:include>,<jsp:forword>,<jsp:plugin>,<jsp:fallback>,<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>,<jsp:attribute>等。6.2.1param动作

param动作以“名—值”对的形式为其它标签提供附加信息。这个动作与<jsp:include>、<jsp:forward>、<jsp:plugin>动作一起使用。它的使用方式如下:

<jsp:paramname="名字"value="指定给param的值"/>

我们将在下面的几个小节中结合<jsp:include>、<jsp:forward>、<jsp:plugin>动作的使用来说明<jsp:param>动作。6.2.2include动作

如果需要在JSP页面内某处动态地加入一个文件,可以使用include动作。该动作告诉JSP页面,在JSP页面执行时将指明的文件加入进来。其使用格式如下:

<jsp:includepage="文件名"flush="true"/>

或者

<jsp:includepage="文件名"flush="true">

<jsp:paramname="名字"value="指定给param的值"/>

……

</jsp:include>

include动作与include指令有下述几点不同:

(1)

include动作动态地插入文件到JSP页面中,而include指令静态地插入文件到JSP页面中。即当JSP引擎把JSP页面转译成Java文件时,不把JSP页面中用include动作所包含的文件与原JSP页面合并成一个新的JSP页面,而是告诉Java解释器,这个文件在JSP运行时(Java文件的字节码文件被加载执行时)才包含进来。如果被包含的文件是普通的HTML文件(静态文件),就将文件的内容发送到客户端,由客户端负责显示;如果被包含的文件是JSP文件(动态文件),JSP引擎就执行这个文件,然后将执行结果发送到客户端,由客户端负责显示执行结果。

(2)由于include动作在执行时才对包含的文件进行处理,因此,JSP页面和它所包含的文件在逻辑上和语法上都是独立的。如果对include动作中包含的文件进行了修改,那么运行时可以看到所包含文件修改后的结果;而如果对include指令中包含的文件进行了修改,则必须重新编译JSP页面文件,否则只能看到所包含文件修改前的内容。

(3)当include动作与param动作一起使用时,可以将param动作中的参数值传递到include动作要加载的文件中去。因此,include动作如果结合param动作,可以在加载文件的过程中向该文件提供信息。

(4)

include动作可以动态增加内容,但它的运行效率比include指令低。

【示例程序jsp_include.jsp、twoParam.jsp和login.html】

include动作与include指令的应用对比。在这个例子的jsp_include.jsp程序中,我们分别使用<%@include%>指令和<jsp:include>动作包含了twoParam.jsp程序,并在twoParam.jsp和jsp_include.jsp两个文件中都使用JSP内置对象request的getParameter方法获取两个参数yourname和yourpass的值,在jsp_include.jsp中还使用<jsp:param>动作传递这两个参数的值。下面是这几个文件的源代码。

(1)程序jsp_include.jsp的源代码如下。

<%@pagecontentType="text/html;charset=gb2312"language="java"%>

<HTML><BODY>

两种不同的文件包含方式执行效果比较:<BR>

<%@includefile="login.html"%>

1.使用include指令静态包含twoParam.jsp的执行效果:

<%@includefile="twoParam.jsp"%>

<BR><BR>

2.使用include动作动态包含twoParam.jsp的执行效果:

<jsp:includepage="twoParam.jsp"flush="true">

<jsp:paramname="yourname"value="<%=request.getParameter("user")%>"/>

<jsp:paramname="yourpass"value="<%=request.getParameter("passw")%>"/>

</jsp:include>

</BODY></HTML>

(2)程序twoParam.jsp的源代码如下。

<%@pagecontentType="text/html;charset=gb2312"language="java"%>

<BR>twoParam.jsp文件的执行效果:

<BR>你的名字是:<%=request.getParameter("yourname")%>

<BR>你的口令是:<%=request.getParameter("yourpass")%>

<BR>

<%out.println("你好?来自twoParam.jsp文件");%>

(3)文件login.html的源代码如下。

<HTML><BODY>

<FORMMETHOD=postACTION="jsp_include.jsp">

<TABLE>

<TR><TD>Pleaseinputyourname:</TD>

<TD><INPUTTYPE=textNAME=user></TD>

</TR>

<TR><TD>Inputyourpassword:</TD>

<TD><INPUTTYPE=textNAME=passw></TD>

</TR>

<TR><TD><INPUTTYPE=submitVALUE=login></TD>

</TR>

</TABLE>

</FORM>

</BODY></HTML>

图6.2是上述文件在两种情况下的执行效果。从图中可以看出,不论在哪种情况下,使用<%@include%>指令静态包含文件的执行结果都是相同的;而使用<jsp:include>动作动态包含文件时,执行结果可根据参数的变化而变化。

(a)执行jsp_include.jsp的初始效果图6.2使用include动作与include指令的效果对比

(b)输入数据后点击login按钮的效果图6.2使用include动作与include指令的效果对比6.2.3forward动作

forward动作的作用是将请求转向另一个页面,并停止执行当前页面中该动作后的内容。在控制型的JSP页面中经常使用这个动作。该动作只有一个page属性,其使用格式如下:

<jsp:forwardpage="要转向页面的相对URL"或"<%=表达式%>"/>

或者

<jsp:forwardpage="要转向页面的相对URL"或"<%=表达式%>">

<jsp:paramname="名字"value="指定给param的值"/>

……

</jsp:forword>

【示例程序checklogin.jsp、success.jsp和login1.html】

forward动作应用。下面以登录验证页面checklogin.jsp为例来说明forward动作的使用。几乎所有的登录验证页面的机制都是:首先提供登录界面(本例为login1.html)让用户输入登录信息,然后在登录验证页面(本例为checklogin.jsp)中获取用户输入的信息并进行验证,如果验证通过则把页面转向到登录成功后的页面(本例为success.jsp),否则,把页面重新定位到登录页面。图6.3是本例的运行效果。

(a)在login1.html表单输入数据图6.3使用forward动作的checklogin.jsp程序的执行效果

(b)验证成功后显示success.jsp页面的内容图6.3使用forward动作的checklogin.jsp程序的执行效果

(1)登录验证页面checklogin.jsp程序的源代码如下。

<%@pagecontentType="text/html;charset=gb2312"%>

<%

Stringname=request.getParameter("user");

Stringpassword=request.getParameter("passw");

if(name.equals("Seamens")&&password.equals("123456"))

{

%>

<jsp:forwardpage="sucess.jsp">

<jsp:paramname="userXy"value="<%=name%>"/>

</jsp:forward>

<%

}

else

{

%>

<jsp:forwardpage="login1.html">

<jsp:paramname="userXy"value="<%=name%>"/>

</jsp:forward>

<%}%>

(2)下面的代码是登录成功success.jsp页面的源代码。登录界面login1.html的源代码只是将6.2.2节login.html中的<FORM>标记的ACTION属性值改为ACTION=checklogin.jsp,再把第二个输入框的TYPE属性改为TYPE=password,故此处从略。

<%@pagecontentType="text/html;charset=gb2312"%>

<%=request.getParameter("user")%>

登录成功,欢迎您进入本系统!注意,在执行结果图6.3(b)的地址栏里显示的是checklogin.jsp,而页面实际显示的内容却是success.jsp的。即使用forward动作时,客户端看到的地址是A页面的,而实际看到的内容却是B页面的。

另外需指出的是,实际网站中的这些页面的代码都比本例中的代码要复杂得多。首先,实际网站的登录验证往往通过连接数据库来进行。其次,验证通过后将引导用户至他所感兴趣的页面。作为一个例子,这里只写了一段最为简单的代码,用户名和密码都直接以字符串常量的形式给出。6.2.4useBean动作

useBean动作用来在JSP页面中创建和使用一个JavaBean组件,并指定它的名字以及作用范围。它保证对象在动作指定的范围内可以使用。useBean动作的使用格式如下:

<jsp:useBeanid="名字id"scope="作用范围"typeSpec/>

其中:“作用范围”可以是page、request、session、application四者之一;“typeSpec”可以是下面四个中的一个:

class="类名"

class="类名"type="类型名"

beanName="bean的名字id"

type="类型名"

表6.2列出了useBean动作的属性及其含义和使用方法。

表6.2useBean动作的属性及含义和使用方法注意,<jsp:useBean>动作所引用的类必须存放在服务器的class路径中,否则,JSP将无法通过编译。如果编写的Bean需要存放在特定的目录下,则应将其所在的目录加到系统的classpath变量中。关于useBean更详细的使用技术将在第8章讲述。6.2.5setProperty动作

setProperty动作用来设置Bean的属性值。在使用这个动作标签之前,必须使用<jsp:useBean>动作声明此Bean。实际上,<jsp:setProperty>动作使用Bean给定的setXxx()方法来设置Bean的属性值。其语法如下:

<jsp:useBeanid="名字id"……/>

……

<jsp:setPropertyname="Bean的名字id"propertyDetails/>

<jsp:useBeanid="Bean的名字id"……/>

……

<jsp:setPropertyname="名字id"propertyDetails/>

</jsp:useBean>其中,“Bean的名字id”是此前在<jsp:useBean>中用id属性引入的名字;“propertyDetails”可以是下面四个中的一个:

Property="*"

Property="Bean的属性名"

Property="Bean的属性名"param="request中的参数名"

Property="Bean的属性名"value="字符串"或"<%=表达式%>"

例如:

<jsp:useBeanid="cart"scope="session"class="session.Carts">

<jsp:setPropertyname="cart"property="name"value="Peter"/>

</jsp:useBean>6.2.6getProperty动作

getProperty动作是对setProperty动作的补充,用来访问一个Bean的属性,并将获得的属性值转化成一个字符串后发送到输出流中。同理,在使用这个动作标签之前,必须使用useBean动作声明此Bean。该动作的使用格式如下:

<jsp:getPropertyname="Bean的名字id"property="属性名"/>

例如:

<jsp:useBeanid="usersession"scope="session"class="user.UserSession">

<jsp:getPropertyname="usersession"property="name"/>

<jsp:getPropertyname="usersession"property="password"/>

useBean、getProperty和setProperty动作的使用。

【示例程序ProductWeight.jsp和ProductWeight.java】

这个例子中包括两个程序:ProductWeight.jsp和ProductWeight.java。其中,ProductWeight.java就是我们开发的一个JavaBean,它实际上是一个包(packagepWeight),在这个包中我们只定义了一个ProductWeight类,并为这个类定义了两个属性和五个方法。为此,我们在useBean动作中用class="pWeight.ProductWeight"指出类的全名,用id="pw"指出它在Bean中的名字。此外,在执行ProductWeight.jsp前需要将ProductWeight.java文件编译成ProductWeight.class文件(在Eclipse环境下只需创建相应的包,系统会自动编译)。

(1)

ProductWeight.jsp文件的源代码如下。

<%@pagecontentType="text/html;charset=GBK"%>

<HTML>

<HEAD><TITLE>使用Javabeans</TITLE></HEAD>

<BODY>

<jsp:useBeanid="pw"scope="application"class="pWeight.ProductWeight"/>

修改前

<BR>使用getProperty取得Bean的属性值

<BR>产品型号:<jsp:getPropertyname="pw"property="product"/>

<BR>产品重量:<jsp:getPropertyname="pw"property="weight"/>

<BR><BR>使用类中定义的方法获取产品的属性值

<BR>产品型号:<%=pw.getProduct()%>

<BR>产品重量:<%=pw.getWeight()%>

<jsp:setPropertyname="pw"property="product"value="k1568"/>

<jsp:setPropertyname="pw"property="weight"value="35"/>

<HR><BR>修改后

<BR>使用getProperty取得Bean的属性值

<BR>产品型号:<jsp:getPropertyname="pw"property="product"/>

<BR>产品重量:<jsp:getPropertyname="pw"property="weight"/>

<BR><BR>使用类中定义的方法获取产品的属性值

<BR>产品型号:<%=pw.getProduct()%>

<BR>产品重量:<%=pw.getWeight()%>

</BODY></HTML>

(2)

ProductWeight.java文件的源代码如下。

packagepWeight;

publicclassProductWeight

{Stringproduct;

doubleweight;

publicProductWeight()

{//构造方法进行初始化

duct="Y8015";

this.weight=32;

}

publicvoidsetProduct(StringProductName)

{//用于设置属性值的方法

duct=ProductName;

}

publicStringgetProduct()

{//用于得到属性值的方法

return(duct);

}

publicvoidsetWeight(doubleWeightValue)

{

this.weight=WeightValue;

}

publicdoublegetWeight()

{return(this.weight

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论