??xml version="1.0" encoding="utf-8" standalone="yes"?>
<%@ taglib uri="<%@ taglib prefix="fn" uri="<c:set var="arrayvalue" value="0,1,10,15,20" />
<c:set var="delim" value=","/>
<c:set var="array" value="${fn:split(arrayvalue, delim)}"/>
<table border="1" align="center">
<tr><td>A</td><td>B</td></tr>
<c:forEach var="i" begin="0" end="5">
<tr>
<td><c:out value="${i}"/></td>
<td>
<c:out value="${array[i]}"/>
</tr>
</c:forEach>
</table>
如果不能使用fn函数麻烦了
public String getLink1()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lIndex= getListIndex();
return "<a href="details.jsp?index=" + lIndex + "">" + lObject.getId() + "</a>";
}
<display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" >
<display:column property="link1" title="ID" />
<display:column property="email" />
</display:table>
熟练Q能够掌握此技术的60%技术要点以上,使用此技术时间超q一q_q用此技术成功实?个以上的目。能使用此技术实现Y仉求ƈ有经验的U篏在实C前能做优化设计尽可能的实现模块或代码的重用?/P>
熟悉Q能够掌握此技术的50%技术要点以上,使用此技术时间超q半q上Qƈ使用此技术成功实?个以上的目。能使用此技术实现Y仉求?/P>
了解Q可以在实际需要时参考技术文档或帮助文g满你的需要,基本知道此项技术在你运用是所L作用Q能够调用或者用其Ҏ规定提供l你的调用方式?/P>
二:基本要求
1:html 掌握E度Q熟l。原因:不会html你可能写JSP?
2:javascript/jscript:掌握E度Q熟悉。原因:client端的数据校验、一些页面处理需要你使用脚本?/P>
3:css 掌握E度Q熟悉。原因:实现面风格的统一通常会用cssd现?/P>
4:java基础~程 掌握E度Q熟l。原因:不会java你能写JSP?开玩笑吧。还有你必须非常熟悉以下几个包java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http; javax.mail;{?/P>
5:sql 掌握E度Q熟l。原因:如果你不使用数据库的话你也许不需要掌握sql。同时你必须对以下几U数据库中的一U以上的sql比较熟悉。Oracle,DB2,Mysql,Postgresql.
6:xml 掌握E度Q了?原因QAppServer的配|一般是使用XML来实现的?/P>
7:ejb 掌握E度Q了?原因Q很多项目中商业逻辑是由ejb来实现的Q所以呢…?/P>
8:以下几种AppServer(engnier) 你需要了解一个以上?/P>
a:)Tomcat
b:)WebLogic
c:)WebSphere
d:)JRun
e:)Resin
原因Q你的jsp跑在什么上面啊Q?/P>
三:选择要求(因项目而定)
1:LDAP 掌握E度Q了解 原因QLADP来多的运用在权限控制上面?
2:Struts 掌握E度Q熟l 原因Q如果符合MVC设计通常会用Struts实现C?
3:Xsp 掌握E度Q根据需要而定很多时候是不用的Q但在不需要用ejb但jsp+servlet+bean实现不了的时候Xsp是一个非怸错的选择?
4:Linux 掌握E度Q熟悉 原因Q如果你的运用跑在Linux/Unix上你最要知道rm ,mv,cp,vi,tar gzip/gunzip 是用来做什么的吧?
四:工具的?/P>
1:UltraEdit(EditPlus)+jakarta-ant+jakarta-log4j;
2:Jubilder4-6
3:Visual Age For Java
4:VCafe
以上的工具你选择你自q悉的吧。不q强烈徏议你用log4j做调试工兗?/P>
五:成长之\
1:html 学习旉Q如果你的智商在80以上Q?5天时间应该够用了。至你能手写出一个页面来?
2:jacascript/jscript学习旉Q这真的不好_比较深奥的东西,够用的话一个礼拜可以学写皮毛?
3:css 学习旉,三天的时间你应该知道如何使用css了,不要求你写,一般是工来写css?
4:java 学习旉Q天才也的三个月吧。慢满学吧。如果要_N,那我不知道需要多时间了。用来写
jsp,四个月应该够了?
5:sql 学习旉Q只需要知道insert ,delete ,update ,select,create/drop table的话一天你应该知道了?
6:xml 学习旉Q我不知道我q没有学会呢。呵c不q我知道DTD是用来做什么的?
7:ejb 学习旉Q基本的调用?天你会调用了。不q是建立在你学会java的基上的?
8:熟悉AppServer,Tomcat四天你可以掌握安装,配置。把jsp跑v来了。如果是WebLogic也够了,但要使用ejb那不关你的事情吧。SA做什么去了?
9:熟悉Linux那可得需要不时间。慢慢看man吧?
10QStruts如果需要你再学习?
当应用服务器初始化servlet实例之后Qؓ客户端请求提供服务之前,它会调用q个servlet的init()Ҏ。在一个servlet的生命周期中Qinit()Ҏ只会被调用一ơ。通过在init()Ҏ中缓存一些静态的数据或完成一些只需要执行一ơ的、耗时的操作,可大大地提高系l性能?/P>
例如Q通过在init()Ҏ中徏立一个JDBCq接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库q接Q在通常的情况下Q我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQLh都要执行一ơJNDI查询的话Q那pȝ性能会急剧下降。解x法是如下代码Q它通过~存DataSourceQ得下一ơSQL调用时仍然可以l利用它Q?/P>
public class ControllerServlet extends HttpServlet
{
private javax.sql.DataSource testDS = null;
public void init(ServletConfig config) throws ServletException
{
super.init(config);
Context ctx = null;
try
{
ctx = new InitialContext();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch(NamingException ne)
{
ne.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public javax.sql.DataSource getTestDS()
{
return testDS;
}
...
...
}
Ҏ 2:止servlet和JSP 自动重蝲(auto-reloading)
Servlet/JSP提供了一个实用的技术,卌动重载技术,它ؓ开发h员提供了一个好的开发环境,当你改变servlet和JSP面后而不必重启应用服务器。然而,q种技术在产品q行阶段对系l的资源是一个极大的损耗,因ؓ它会lJSP引擎的类装蝲?classloader)带来极大的负担。因此关闭自动重载功能对pȝ性能的提升是一个极大的帮助?/P>
Ҏ 3: 不要滥用HttpSession
在很多应用中Q我们的E序需要保持客L的状态,以便面之间可以怺联系。但不幸的是׃HTTPh天生无状态性,从而无法保存客L的状态。因此一般的应用服务器都提供了session来保存客L状态。在JSP应用服务器中Q是通过HttpSession对像来实现session的功能的Q但在方便的同时Q它也给pȝ带来了不的负担。因为每当你获得或更新sessionӞpȝ者要对它q行Ҏ的序列化操作。你可以通过对HttpSession的以下几U处理方式来提升pȝ的性能Q?/P>
· 如果没有必要Q就应该关闭JSP面中对HttpSession的缺省设|: 如果你没有明指定的话,每个JSP面都会~省地创Z个HttpSession。如果你的JSP中不需要用session的话Q那可以通过如下的JSP面指示W来止它:
Q?@ page session="false"%Q?nbsp;
· 不要在HttpSession中存攑֤的数据对像:如果你在HttpSession中存攑֤的数据对像的话,每当对它q行dӞ应用服务器都对其进行序列化Q从而增加了pȝ的额外负担。你在HttpSession中存攄数据对像大Q那pȝ的性能׃降得快?/P>
· 当你不需要HttpSessionӞ快地释攑֮Q当你不再需要sessionӞ你可以通过调用HttpSession.invalidate()Ҏ来释攑֮?/P>
· 量session的超时时间设得短一点:在JSP应用服务器中Q有一个缺省的session的超时时间。当客户在这个时间之后没有进行Q何操作的话,pȝ会将相关的session自动从内存中释放。超时时间设得越大,pȝ的性能׃低Q因此最好的Ҏ是量使得它的g持在一个较低的水^?/P>
Ҏ 4: 页面输行压~?/P>
压羃是解x据冗余的一个好的方法,特别是在|络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)q行来对HTML文gq行压羃Q这U方法可以戏剧性地减少HTML文g的下载时间。因此,如果你将servlet或JSP面生成的HTML面q行压羃的话Q那用户׃觉得面览速度会非常快。但不幸的是Q不是所有的览器都支持gzip压羃Q但你可以通过在你的程序中查客L览器是否支持它。下面就是关于这U方法实现的一个代码片D:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
OutputStream out = null
String encoding = request.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") != -1)
{
request.setHeader("Content-Encoding" , "gzip");
out = new GZIPOutputStream(request.getOutputStream());
}
else if (encoding != null && encoding.indexOf("compress") != -1)
{
request.setHeader("Content-Encoding" , "compress");
out = new ZIPOutputStream(request.getOutputStream());
}
else
{
out = request.getOutputStream();
}
...
...
}
Ҏ 5: 使用U程?/P>
应用服务器缺省地为每个不同的客户端请求创Z个线E进行处理,qؓ它们分派service()ҎQ当service()Ҏ调用完成后,与之相应的线E也随之撤消。由于创建和撤消U程会耗费一定的pȝ资源Q这U缺省模式降低了pȝ的性能。但所q的是我们可以通过创徏一个线E池来改变这U状c另外,我们q要个线E池讄一个最线E数和一个最大线E数。在应用服务器启动时Q它会创建数量等于最线E数的一个线E池Q当客户有请求时Q相应地从池从取Z个线E来q行处理Q当处理完成后,再将U程重新攑օ到池中。如果池中的U程不够地话Q系l会自动地增加池中线E的数量Q但总量不能过最大线E数。通过使用U程池,当客Lh急剧增加Ӟpȝ的负载就会呈现的qx的上升曲U,从而提高的pȝ的可伸羃性?/P>
Ҏ 6: 选择正确的页面包含机?/P>
在JSP中有两种Ҏ可以用来包含另一个页面:1、用include指示W?Q?@ includee file=”test.jsp?%Q??、用jsp指示W?Qjsp:includee page=”test.jsp?flush=”true?Q?。在实际中我发现Q如果用第一U方法的话,可以使得pȝ性能更高?/P>
Ҏ 7:正确地确定javabean的生命周?/P>
JSP的一个强大的地方是对javabean的支持。通过在JSP面中用<jsp:useBeanQ标{,可以javabean直接插入C个JSP面中。它的用方法如下:
Qjsp:useBean id="name" scope="page|request|session|application" class=
"package.className" type="typeName"Q?
Q?jsp:useBeanQ?
其中scope属性指Zq个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话,它将影响pȝ的性能?/P>
举例来说Q如果你只想在一ơ请求中使用某个beanQ但你却这个bean的生命周期设|成了sessionQ那当这ơ请求结束后Q这个bean仍然保留在内存中,除非session时或用户关闭浏览器。这样会耗费一定的内存Qƈ无谓的增加了JVM垃圾攉器的工作量。因此ؓbean讄正确的生命周期,q在bean的命结束后快地清理它们,会用系l性能有一个提高?/P>
其它一些有用的Ҏ
· 在字W串q接操作中尽量不使用“+”操作符Q在java~程中,我们常常使用“+”操作符来将几个字符串连接v来,但你或许从来没有惛_q它居然会对pȝ性能造成影响吧?׃字符串是帔RQ因此JVM会生一些时的对像。你使用的“+”越多,生成的时对像就多Q这样也会给pȝ性能带来一些媄响。解决的Ҏ是用StringBuffer对像来代曎쀜+”操作符?/P>
· 避免使用System.out.println()ҎQ由于System.out.println()是一U同步调用,卛_调用它时Q磁盘I/O操作必须{待它的完成Q因此我们要量避免对它的调用。但我们在调试程序时它又是一个必不可的方便工具Qؓ了解册个矛盾,我徏议你最好用Log4j工具(http://Jakarta.apache.org )Q它既可以方便调试,而不会生System.out.println()q样的方法?
· ServletOutputStream ?PrintWriter的权?使用PrintWriter可能会带来一些小的开销Q因为它所有的原始输出都{换ؓ字符来输出Q因此如果用它来作为页面输出的话,pȝ要负担一个{换过E。而用ServletOutputStream作ؓ面输出的话׃存在一个问题,但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊?/P>
ȝ
本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能Qƈ因此提升整个J2EE应用的性能。通过q些调优技术,你可以发现其实ƈ不是某种技术^収ͼ比如J2EE?NET之争Q决定了你的应用E序的性能Q重要是你要对这U^台有一个较为深入的了解Q这样你才能从根本上对自q应用E序做一个优化!
从机预订系l、银行系l到购物pȝQWeb上到处都在应用JSP技术。新发布?.0版是对JSP1.2的升U,增加了一些有的新特性。JSP2的目标是使动态网늚设计更加ҎQ而且无需学习Java~程语言?
本文内容包括Q?
提供h丰富CZ代码的教E来使你熟悉JSP2.0
介绍JSP2.0的新Ҏ?
提供利用JSP2.0开发应用程序的一些体?
l出了一些示例代码,对这些代码稍加修改即可用于你自己的应用程序?
如果你还不熟悉JSPQ那么直接从JSP2.0入手是一个不错的L。但是如果希望学习JSP1.2Q也怽需要从 JSP教程 开始学习?
JSP 2.0
JSP 2.0是对JSP 1.2的升U,增加了几个有的新特性,可以使Web应用E序设计人员和开发h员的工作更容易一些。JSP 2.0的目标是比以前更易于使用Q更重要的是无须学习Java语言本n可以用它。它增加了一U称为SimpleTag的新扩展机制来简化标{APIQTag APIQ?
除了其他一些改q外QJSP 2.0引入的最主要的新Ҏ包括:
一U简单的表达式语aQELQ,能够用来ҎCJSP面讉K数据Q这U表辑ּ语言化了ZJSP的不含脚本的应用E序的编写,不需要用Java Scriptlet或者Java表达式;
用于直接使用JSP技术来定义可重用的自定义行为的新语法,该语法?tag?tagx文gQ这cL件可由开发h员或者网作者编写;
3XML语法得到了实质性的改进Q增加了新的标准文g扩展名(.tagx用于标签文gQ?jspx用于JSP文gQ?
本文主要讨论表达式语a、简化的标签API和标{文件。相信目前的JSP开发h员将会发现这些重要的Ҏ不但有,而且非常有用?
Z要从1.2跨越?.0Q?
在Java规格hQJSR 152Q中版本h初定?.3。但是正如你在后面看到的那P׃q些新特性对JSP应用E序的开发模型生了如此深刻的媄响,专家l感到有必要把主版本号升U到2.0Q这h能充分反映这U媄响。此外,新的版本号也有助于把开发h员的注意力吸引到q些有趣的新Ҏ上来。o人欣慰的是, 所有合法的 JSP1.2 面同时也是合法的JSP2.0 面 ?
JSP 2.0h
在着手学习JSP 2.0之前Q你需要一个支持JSP2.0和Java Servlet 2.4规范的JSP环境。幸q的是,Jakarta Tomcat 5.0Qalpha试版)支持新的JSP2.0和Servlet 2.4规范Q可以从http://jakarta.apache.org/builds/jakarta-tomcat/release/v5.0.4-alpha/下蝲q安?Tomcat 5.0 ?
JSP表达式语a
向JSP|页传递信息是通过JSP scoped属性和h参数完成的。专门ؓ|页作者量w定做的一U表辑ּ语言QELQ把JSP scoped属性提升ؓ从业务逻辑向JSP面传递信息的标准方式。但是要注意Q尽这U表辑ּ语言是JSP的一个重要特性,它ƈ不是一U通用的程序语a。它仅仅是一U数据访问语aQ可以方便地讉K和处理应用程序数据,而无需使用scriptlet或者请求时Qrequest-timeQ表辑ּ的倹{?
在JSP2.0之前Q网作者只能用表辑ּ<%= aName %>讉Kpȝ的|比如下面的例子:
<someTags:aTag attribute="<%= pageContext.getAttribute("aName") %>">
或者用自定义JavaBeanslg的|
<%= aCustomer.getAddress().getCountry() %>
表达式语a允许|页作者用简单的语法讉K对象。比如要讉K一个简单变量,可以像下面这样写Q?
<someTags:aTag attribute="${aName}">
而访问嵌套的JavaBeans属性,则可以像下面q样写:
${aCustomer.address.country}
你可能会问,q不是JavaScript的语法吗Q完全正!如果你用过JavaScriptQ就会感到非常轻松,因ؓ表达式语a正是借用了访问结构化数据的JavaScript语法?
注意Q?表达式语a最初是作ؓJSP标准标签库(JSTLQ?.0的一部分而开发的QJSTL是一U标准标{ֺQ它提供寚w用的、结构化的Q务的支持Q如q代和条件、XML文档处理、国际化和利用SQL讉K数据库等。JSTL规范是由JSR 52专家l开发的。关于JSTL的介l,请参?Faster Development with JSTL Q用JSTL加速开发).
讉K应用E序数据
可以使用点号q算W(.Q访问作为对象属性的应用E序数据Q也可用方括号q算W[‘name']讉K命名的数l元素?
表达?{data}表示名ؓdata的scoped变量。可以用点P.Q或ҎP[]Q运符从集合中索属性|
点号q算W用于访问命名的属性,比如表达?{customer.name}表示scoped变量customer的name属性;
Ҏ可符可用于检索命名的属性,比如?{customer[“name”]}中。也可以通过${customers[0]}的Ş式来讉K集合customers中的W一V?
表达式语al一了对点号和方括号q算W的处理Q因?{customer.name}?{customer[“name”]}是等L。正如你看到的那P表达式必M?{和}包围h?
EL的标识符求值方式是使用PageContext.findAttribute(String)Q把标识W作Z个属性来查找它的倹{如果没有找到该属性,则返回null?
q算W?
表达式语a支持术q算W、关p运符和逻辑q算W,以完成大多数的数据处理操作。此外,它还提供了一个用于测试一个对象是否ؓI的Ҏq算W。运符如表1所C。你可以使用emptyq算W判断某个集合或字符串是否ؓI。比方说Q只有当要求的命名参数param没有l出Ӟ表达?{empty param.name}才返回真。Emptyq算W可以与?”运符一起用,比如${!empty param.name}当要求的命名参数param存在时返回真?
?1 Q表辑ּ语言q算W?
q算W?
说明
+
?
-
?
*
?
/ ?div
?
% ?mod
模(求余Q?
== ?=
{于
!= ?!=
不等?
< ?lt
于
> ?gt
大于
<= ?le
于{于
>= ?ge
大于{于
&& ?and
逻辑?
|| or or
逻辑?
! ?not
逻辑?
empty
查是否ؓI?
a ? b : c
条gq算W?
隐含对象
除了q算W外Q表辑ּ语言q定义了一些隐含对象以支持|页作者访问需要的应用E序数据。表辑ּ语言定义的隐含对象如?所C,后面给Z用这些隐含对象的一个例子?
?2 Q表辑ּ语言中的隐含对象
隐含对象
内容
applicationScope
应用E序范围内的scoped变量l成的集?
cookie
所有cookiel成的集?
header
HTTPh头部Q字W串
headerValues
HTTPh头部Q字W串集合
initParam
全部应用E序参数名组成的集合
pageContext
当前面的javax.servlet.jsp.PageContext对象
pageScope
面范围内所有对象的集合
param
所有请求参数字W串l成的集?
paramValues
所有作为字W串集合的请求参?
requestScope
所有请求范围的对象的集?
sessionScope
所有会话范围的对象的集?
表达式语a的例?
如你所aQ网作者无d习Java也能够用这U表辑ּ语言。示例代?昄了一些表辑ּ的例子和隐含对象的用?
代码CZ1 : ex1.jsp
要运行这个例子,请参照以下步骤,q里我们假定Tomcat 5.0安装在c:\tomcat5.0下?
切换目录?c:\Tomcat5.0\webapps\jsp-examples
创徏新目录,名字可以是Q意的Q比如jsp2-tutorial
切换到jsp2-tutorial
把ex1.jsp复制q保存到该目录下
启动Tomcat 5服务器:指向“开始?>“程序?>“Apache Tomcat 5.0”,单击“Apache Tomcat 5.0”来启动Tomcat
在浏览器中输入http://localhost:8080/jsp-examples/jsp2-tutorial/ex1.jsp
你将看到cM?所C的画面。用表辑ּ语言p么简单!
?1 Q?JSP 表达式语a和隐含对?
注意 : 在本文中Q所有的JSP文g都保存在c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial目录下?
填充表单例子
隐含对象$paran[var]可用于读取填充表单的数据。代码示?l出了一个简单的表单Q该表单提示用户输入一个名字?
代码CZ2 : form.jsp
<HTML>
<HEAD>
<TITLE>Form Content</TITLE>
</HEAD> <BODY> <H3>Fill-out-form</H3>
<P>
<FORM action="form.jsp" method="GET">
Name = <input type="text" name="name" value="${param['name']}">
<input type="submit" value="Submit Name"> </FORM> <P>
The Name is: ${param.name} </BODY>
</HTML>
在本例中Q当用户输入名字q单几Z提交”按钮时Q输入的名字׃昄同一面中的“The Name is:”字样后面,如图2所C?
同样Q运行这个例子只需要把form.jsp复制到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下ƈ用浏览器打开它?
?2 Q表单处?
定义和用函?
表达式语a允许你定义可在表辑ּ中调用的函数。函数必M为publiccM的public staticҎ~写。函Cl定义,它的{QsignatureQ就映射到标{ֺ描述W(TLDQ中?
Z说明函数的用,我们举一个简单的例子Q把两个数相加。首先要~写求两C和的JavaҎ代码Q如代码CZ3所C,q里定义了一个静态方法,它接收两个字W串参数Q把它们解析成整数ƈq回它们的和?
代码CZ3 : Compute.java
package jsp2.examples.el; import java.util.*; public class Compute {
public static int add(String x, String y) {
int a = 0;
int b = 0;
try {
a = Integer.parseInt(x);
b = Integer.parseInt(y);
}catch(Exception e) {}
return a + b;
}
}
用javac把这D代码编译成功后Q下一步就要把函数的签名映到标签库。代码示?说明了如何把add函数映射到包含函数实现和函数{的类。后面将说明把这D代码添加到哪儿?
代码CZ4 : 函数描述W?
<function>
<description>add x and y</description>
<name>add</name>
<function-class>jsp2.examples.el.Compute
</function-class>
<function-signature>int
add(java.lang.String,java.lang.String)
</function-signature>
</function>
现在我们可以编写一个JSP面来用这个函数。代码示?是包含两个字D늚一个表单,用户输入两个数字q按下“求和”按钮,׃调用上面的函数ƈ把两个数相加Q结果在同一个页面中昄出来?
代码CZ5 : math.jsp
<%@ taglib prefix="my"
uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %> <HEAD>
<TITLE>Functions</TITLE>
</HEAD> <BODY> <H3>Add Numbers</H3>
<P>
<FORM action="math.jsp" method="GET">
X = <input type="text" name="x" value="${param["x"]}">
<BR>
Y = <input type="text" name="y" value="${param["y"]}">
<input type="submit" value="Add Numbers">
</FORM> <P>
The sum is: ${my:add(param["x"],param["y"])} </BODY>
</HTML>
要运行这个例子:
复制Compute.javaq保存到C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\classes\jsp2\examples\el下;
使用javac~译Compute.javaQ?
~辑文gC:\Tomcat5.0\webapps\jsp-examples\WEB-INF\jsp2\jsp2-example-taglib.tldQ把代码CZ4中的代码D|加到文g中最后一?lt;/function>标签之后Q?lt;/taglib>标签之前Q?
复制math.jspq保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下;
用浏览器打开该文件?
如果一切正常,应该会看到类似如?所C的H口?
?3 Q用函?
标签处理?
JSP 1.2中传l的标签处理API׃允许标签体中包含scriptlet而变得复杂,但是现在利用表达式语a可以~写不含scriptlet的JSP|页。最l,JSP 2.0引入了一U新的标{扩展机ӞUCؓ“简单标{扩展”,q种机制有两U用方式:
Java开发h员可以定义实现接口javax.servlet.jsp.tagext.SimpleTag的类;
不懂Java的网늼写h员则可以使用标签文g?
首先来看W一U方式,代码CZ6l出了一个简单的标签处理器,它的作用仅仅是打印“This is my first tag! ”?
代码CZ6 : HelloTag.java
package jsp2.examples.simpletag; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; /**
* SimpleTag handler that prints "This is my first tag!"
*/
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
getJspContext().getOut().write("This is my first tag!");
}
}
~译成功后,下一步就要在TLD中定义一个标{描q符Q下面是标签描述W的例子?
代码CZ7 : 标签描述W?
<tag>
<description>Prints this is my first tag</description>
<name>hello</name>
<tag-class>jsp2.examples.simpletag.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
最后再~写一个用上q标{JSP面文gQ见代码CZ8?
代码CZ8 : helloworld.jsp
<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
<HTML>
<HEAD>
<TITLE>Simple Tag Handler</TITLE>
</HEAD> <BODY>
<H2>Simple Tag Handler</H2>
<P>
<B>My first tag prints</B>: <mytag:hello/>
</BODY>
</HTML>
要运行这个例子:
复制HelloTg.javaq保存到C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\classes\jsp2\examples\simpletag下;
使用javac~译HelloTag.javaQ?
把代码示?中的标签描述W添加到文gC:\Tomcat5.0\webapps\jsp-examples\WEB-INF\jsp2\jsp2-example-taglib.tld中的</taglib>之前Q?
复制helloworld.jspq保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial目录中;
用浏览器打开helloworld.jsp?
如果一切正常,应该会看到类似如?所C的画面?
?4 Q简单标{֤理器
标签文g
使用单标{扩展机制的另一U方法是通过标签文g。标{文件是一U资源文Ӟ|页作者可以利用它抽取一DJSP代码Q通过定制功能来实C码的复用。换句话_标签文g允许JSP|页作者用JSP语法创徏可复用的标签库。标{文件的扩展名必L?tag”?
明用标{文件是多么ҎQ考虑一下代码示?。没错,q就是一个标{文Ӟ
代码CZ9 : greetings.tag
Hello there. How are you doing?
一旦定义了标签文gQ就可以在JSP|页的编写中使用q种定制的功能。比如代码示?0中的JSP|页?
代码CZ10 : chat.jsp
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<HTML>
<HEAD>
<TITLE>JSP 2.0 Examples - Hello World Using a Tag File</TITLE>
</HEAD>
<BODY>
<H2>Tag File Example</H2>
<P>
<B>The output of my first tag file is</B>: <tags:greetings/>
</BODY>
</HTML>
要运行这个例子:
复制标签文ggreetings.tagsq保存在c:\Tomcat5.0\webapps\jsp-examples\WEB-INF\tags 目录下;
复制JSP|页文gchar.jspq保存在c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial 目录下;
用浏览器打开chat.jsp文g?
如果一切正常,应该会看到类似如?所C的H口?
?5 Q简单的标签文g
注意 : 重要的是要注意到q里没有为问候标{写TLDQ而是创徏了一个标{文件ƈ攑֜Ҏ的目录中Q然后用taglib指o导入q直接用它?
另一个标{文件的例子
标签文g可以作ؓ模板使用。考虑代码CZ11中的标签文gdisplay.tagQ这个例子是ҎTomcat 5.0中的面板的例子改写的。指令attributecM于TLD中的<attribute>元素Q允许声明自定义的动作属性?
代码CZ11 : display.tag
<%@ attribute name="color" %>
<%@ attribute name="bgcolor" %>
<%@ attribute name="title" %>
<TABLE border="0" bgcolor="${color}"> <TR>
<TD><B>${title}</B></TD>
</TR>
<TR>
<TD bgcolor="${bgcolor}">
<jsp:doBody/>
</TD>
</TR>
</TABLE>
代码CZ12l出了用上q标{一个简单的JSP面?
代码CZ12 : newsportal.jsp
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<HTML>
<HEAD>
<TITLE>Another Tag File Example</TITLE>
</HEAD>
<BODY>
<H2>News Portal: Another Tag File Example</H2>
<TABLE border="0"> <TR valign="top">
<TD>
<tags:display color="#ff0000" bgcolor="#ffc0c0"
title="Travel">
Last French Concorde Arrives in NY<br/>
Another Travel Headline<br/>
Yet Another Travel Headline<br/>
</tags:display>
</TD>
<TD>
<tags:display color="#00fc00" bgcolor="#c0ffc0"
title="Technology">
Java for in-flight entertainment<BR>
Another Technology Headline<BR>
Another Technology Headline<BR>
</tags:display>
</TD>
<TD>
<tags:display color="#ffcc11" bgcolor="#ffffcc"
title="Sports">
American Football<BR/>
NBA<BR/>
Soccer<BR/>
</tags:display>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
要运行这个例子:
复制文gdisplay.tagq保存在c:\Tomcat5.0\webapps\jsp-examples\WEB-INF\tag 下;
复制文gnewsportal.jspq保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下;
用浏览器打开newsportal文g?
l果应该会得C?cM的画面?
?6 Q把标签文g用作模板
l论
JSP 2.0使得快速开发和l护动态网|以前更加ҎQ尽“Java”一词出现在JSP中,但用JSP2.0Q网作者无d习JavaE序语言本nQ就能开发出全新的动态网c本文中的例子说明了使用JSP2.0的新Ҏ开发动态网|多么Ҏ?
更多信息
Fast Track JSP 1.2
JavaServer Pages Technology
JavaServer Pages Specification (JSR 152)
The Tomcat 5 Servlet/JSP Container
JSP Developers Forum
JavaServer Pages Standard Tag Library (JSTL)
request.getRealPath()只是取得根目录所对应的绝对\径,看了一下Servlet API文档Q发现可?
通过q种方式获得当前文g的绝对\径名Q比如在我的cqq.jsp文g中这样写Q?
<%
String strAbsPath=application.getRealPath(request.getRequestURI());
out.println(strAbsPath);
%>
其实jsp中的application对象是Servlet中的ServerContext
q样得到的\径就?D:\aaa\bbb\ccc\cqq.jsp q样的,如果我们不想要后面的文g名呢Q?
是我们惛_?D:\aaa\bbb\ccc\ q个路径Q?我们可以直接用FilecL操作了?/P>
完整的语句应该是q样的:
String strAbsPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();
<table border="1"> <tr><td>Hello! World!</td></tr> </table>
<%@taglib prefix="demo" tagdir="/WEB-INF/tags" %> <html> <body> <demo:hello/> </body> </html>
<html> <body> <table border="1"> <tr><td>Hello! World!</td></tr> </table> </body> </html>