JSP有哪些动作?作⽤分别是什么?
JSP动作利⽤XML语法格式的标记来控制Servlet引擎的⾏为。利⽤JSP动作可以动态地插⼊⽂件、重⽤JavaBean组件、把⽤户重定向到另外的页⾯、为Java插件⽣成HTML代码。
JSP动作包括:
jsp:include:在页⾯被请求的时候引⼊⼀个⽂件。
jsp:useBean:寻或者实例化⼀个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到⼀个新的页⾯。
jsp:plugin:根据浏览器类型为Java插件⽣成OBJECT或EMBED标记。
13.1 jsp:include动作
该动作把指定⽂件插⼊正在⽣成的页⾯。其语法如下:
<jsp:include page="relative URL" flush="true" />
前⾯已经介绍过include指令,它是在JSP⽂件被转换成Servlet的时候引⼊⽂件,⽽这⾥的jsp:include动作不同,插⼊⽂件的时间是在页⾯被请求的时候。jsp:include动作的⽂件引⼊时间决定了它的效率要稍微差⼀点,⽽且被引⽤⽂件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。
例如,下⾯的JSP页⾯把4则新闻摘要插⼊⼀个“What's New ?”页⾯。改变新闻摘要时只需改变这四个⽂件,⽽主JSP页⾯却可以不作修改:
WhatsNew.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<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</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>
13.2 jsp:useBean动作
jsp:useBean动作⽤来装载⼀个将在JSP页⾯中使⽤的JavaBean。这个功能⾮常有⽤,因为它使得我们既可以发挥Java组件重⽤的优势,同时也避免了损失JSP区别于Servlet的⽅便性。jsp:useBean动作最简单的语法为:
<jsp:useBean id="name" class="package.class" />
这⾏代码的含义是:“创建⼀个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变
量上”。不过,就象我们接下来会看到的,定义⼀个 scope属性可以让Bean关联到更多的页⾯。此时,jsp:useBean动作只有在不存在同样id和scope的Bean时才创建新的对象实例,同时,获得现有Bean的引⽤就变得很有必要。
获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进⾏,也可以在Scriptlet中利⽤id属性所命名的对象变量,通过调⽤该对象的⽅法显式地修改其属性。这使我们想起,当我们说“某个Bean有⼀个类型为X的属性foo”时,就意味着“这个类有⼀个返回值类型为X的getFoo⽅法,还有⼀个setFoo⽅法以X类型的值为参数”。
有关jsp:setProperty动作的详细情况在后⾯讨论。但现在必须了解的是,我们既可以通过jsp:setProperty动作的value属性直接提供⼀个值,也可以通过param属性声明Bean的属性值来⾃指定的请求参数,还可以列出Bean属性表明它的值应该来⾃请求参数中的同名变量。
在JSP表达式或Scriptlet中读取Bean属性通过调⽤相应的getXXX⽅法实现,或者更⼀般地,使⽤jsp:getProperty动作。
注意包含Bean的类⽂件应该放到服务器正式存放Java类的⽬录下,⽽不是保留给修改后能够⾃动装载的类的⽬录。例如,对于Java Web Server来说,Bean和所有Bean⽤到的类都应该放⼊classes⽬录,或者封装进jar⽂件后放⼊lib⽬录,但不应该放到servlets 下。
下⾯是⼀个很简单的例⼦,它的功能是装载⼀个Bean,然后设置/读取它的message属性。
BeanTest.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test"
property="message"
value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
</HTML>
SimpleBean.java
BeanTest页⾯⽤到了⼀个SimpleBean。SimpleBean的代码如下:
package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
}
}
13.3 关于jsp:useBean的进⼀步说明
使⽤Bean最简单的⽅法是先⽤下⾯的代码装载Bean:
<jsp:useBean id="name" class="package.class" />
然后通过jsp:setProperty和jsp:getProperty修改和提取Bean 的属性。不过有两点必须注意。第⼀,我们还可以⽤下⾯这种格式实例化Bean:
<jsp:useBean ...>
Body
</jsp:useBean>
它的意思是,只有当第⼀次实例化Bean时才执⾏Body部分,如果是利⽤现有的Bean实例则不执⾏Body部分。正如下⾯将要介绍
的,jsp:useBean并⾮总是意味着创建⼀个新的Bean实例。
第⼆,除了id和class外,jsp:useBean还有其他三个属性,即:scope,type,beanName。下表简要说明这些属性的⽤法。 属性 ⽤法  id 命名引⽤该Bean的变量。如果能够到id和scope相同的Bean实例,jsp:useBean动作将使⽤已有的Bean实例⽽不是创建新的实例。  class 指定Bean的完整包名。
scope 指定Bean在哪种上下⽂内可⽤,可以取下⾯的四个值之⼀:page,request,session和application。
默认值是page,表⽰该Bean只在当前页⾯内可⽤(保存在当前页⾯的 PageContext内)。
request表⽰该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
session表⽰该Bean对当前HttpSession内的所有页⾯都有效。
最后,如果取值application,则表⽰该Bean对所有具有相同 ServletContext的页⾯都有效。
scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope 的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使⽤已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
type 指定引⽤该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接⼝名字之⼀。请记住变量的名字是由id属性指定的。
beanName 指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。
13.4 jsp:setProperty动作
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。
jsp:setProperty动作有下⾯四个属性: 属性 说明
name name属性是必需的。它表⽰要设置属性的是哪个Bean。
property property属性是必需的。它表⽰要设置哪个属性。有⼀个特殊⽤法:如果property的值是“*”,表⽰所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set⽅法。
value value 属性是可选的。该属性⽤来指定Bean属性的值。字符串数据会在⽬标类中通过标准的valueOf⽅法⾃动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(⽐如“true”)通过
Boolean.valueOf转换,int和Integer类型的属性值(⽐如“42”)通过Integer.valueOf转换。
value和param不能同时使⽤,但可以使⽤其中任意⼀个。
param param 是可选的。它指定⽤哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set⽅法。因此,你可以让Bean⾃⼰提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。
例如,下⾯的代码⽚断表⽰:如果存在numItems请求参数的话,把 numberOfItems属性的值设置为请求参数numItems的值;否则什么也不做。
<jsp:setProperty name="orderBean"
java和jsp
property="numberOfItems"
param="numItems" />
如果同时省略value和param,其效果相当于提供⼀个param且其值等于 property的值。进⼀步利⽤这种借助请求参数和属性名字相同进⾏⾃动赋值的思想,你还可以在property(Bean属性的名字)中指定“*”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则⾃动赋值。
下⾯是⼀个利⽤JavaBean计算素数的例⼦。如果请求中有⼀个numDigits参数,则该值被传递给Bean的numDigits属性;numPrimes 也类似。
JspPrimes.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>在JSP中使⽤JavaBean</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
在JSP中使⽤JavaBean</TABLE>
</CENTER>
<P>
<jsp:useBean id="primeTable" class="hall.NumberedPrimes" />
<jsp:setProperty name="primeTable" property="numDigits" />
<jsp:setProperty name="primeTable" property="numPrimes" />
Some <jsp:getProperty name="primeTable" property="numDigits" />
digit primes:
<jsp:getProperty name="primeTable" property="numberedList" />
</BODY>
</HTML>
注:NumberedPrimes的代码略。
13.5 jsp:getProperty动作
jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。 jsp:getProperty有两个必需的属性,即: name,表⽰Bean 的名字;property,表⽰要提取哪个属性的值。下⾯是⼀个例⼦,更多的例⼦可以在前⽂到。
<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>
13.6 jsp:forward动作
jsp:forward动作把请求转到另外的页⾯。jsp:forward标记只有⼀个属性 page。page属性包含的是⼀个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,如下⾯的例⼦所⽰:
<jsp:forward page="/utils/errorReporter.jsp" />
<jsp:forward page="<%= someJavaExpression %>" />
13.7 jsp:plugin动作
jsp:plugin动作⽤来根据浏览器的类型,插⼊通过Java插件 运⾏Java Applet所必需的OBJECT或EMBED元素。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。