﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-似水流年-文章分类-JSP/Servlet </title><link>http://www.blogjava.net/huhu/category/1641.html</link><description>Huhu'Blog</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 09:48:45 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 09:48:45 GMT</pubDate><ttl>60</ttl><item><title>jstl中定义String数组(转载)</title><link>http://www.blogjava.net/huhu/articles/39356.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Wed, 05 Apr 2006 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/39356.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/39356.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/39356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/39356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/39356.html</trackback:ping><description><![CDATA[
		<p>有人提出了个这个问题，想了半天可以使用fn函数实现<br />&lt;%@ taglib uri="<a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a>" prefix="c" %&gt;<br />&lt;%@ taglib prefix="fn" uri="<a href="http://java.sun.com/jsp/jstl/functions">http://java.sun.com/jsp/jstl/functions</a>" %&gt;<br />&lt;c:set var="arrayvalue" value="0,1,10,15,20" /&gt;<br />&lt;c:set var="delim" value=","/&gt; <br />&lt;c:set var="array" value="${fn:split(arrayvalue, delim)}"/&gt; <br />&lt;table border="1" align="center"&gt;<br />&lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;/tr&gt;<br />&lt;c:forEach var="i" begin="0" end="5"&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;c:out value="${i}"/&gt;&lt;/td&gt;<br />&lt;td&gt;<br />&lt;c:out value="${array[i]}"/&gt;<br />&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt; <br />如果不能使用fn函数就麻烦了</p>
		<p>&lt;%@ taglib uri="<a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a>" prefix="c" %&gt;</p>
		<p>&lt;% int[] arrayvalue={0,1,5,10,15,88};%&gt;<br />&lt;table border="1" align="center"&gt;<br />&lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;/tr&gt;<br />&lt;c:forEach var="i" begin="0" end="5"&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;c:out value="${i}"/&gt;&lt;/td&gt;<br />&lt;td&gt;<br /> &lt;% Integer j=(Integer)pageContext.getAttribute("i"); %&gt; <br /> &lt;%= arrayvalue[j.intValue()] %&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</p>
		<p>下面是某位大侠的话，时常看看<br />会话范围（session scope）<br />在我的经验中，会话范围要比应用范围用的多。会话范围允许你创建并且将对象绑定到一个会话上面。你必须在session-aware的JSPs中创建绑定在会话的对象并且使在同一个会话中所有的JSP和servlet能够访问到这些对象。会话范围常常用在管理安全验证和管理多个页面的状态信息。绑定在会话范围的对象在不需要的时候也要显示的删除。当我计划将某个类的对象绑定到会话范围的时候我通常会使该类可串行化。 】<br />请求范围（request scope） <br />在绑定对象的时候，页面范围我用的最多。此类对象只在同一个请求的页面间有效。在请求处理完成的时候这些对象将会自动的被释放。因而不需要显式的释放它们，这样就没有了使系统被一些不必要内存消耗而拖累的危险。<br />页面范围（page scope） <br />当你创建只对当前页面相关的对象的时候你需要选择页面范围。和请求范围一样，绑定在页面范围的对象不要显式的删除。我很少在我的JSP应用中使用“页面范围”，但是这是的默认范围。<br /></p>
<img src ="http://www.blogjava.net/huhu/aggbug/39356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2006-04-05 13:11 <a href="http://www.blogjava.net/huhu/articles/39356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>displayTag学习摘要</title><link>http://www.blogjava.net/huhu/articles/23790.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Wed, 14 Dec 2005 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/23790.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/23790.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/23790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/23790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/23790.html</trackback:ping><description><![CDATA[<P><STRONG>1.tableTag中name属性：值默认作用域：request</STRONG></P><BR>&lt;display:table name="accList"&gt;<BR>如果作用域为session，则&lt;display:table name="sessionScope.accList"&gt;<BR>tableTag中指定ID属性会把该对象加入到pageContext对象中去。如ID="test"<BR>&lt;%int cate=((Role)pageContext.getAttribute("test")).getCategory();%&gt;<BR>生成表格的序列号 例如：&lt;display:table id="row" name="mylist"&gt;<BR>&lt;display:column title="序列号"&gt;&lt;%=pageContext.getAttribute("row_rowNum")%&gt;&lt;/display:column&gt;<BR>如行号：row_rowNum &lt;c:out value="${row_rowNum}"/&gt;<BR>firstName:row.firstName&nbsp;&nbsp; &lt;c:out value="${row.firstName}"/&gt;<BR>lastName: row.lastName&nbsp;&nbsp;全部由ID来取得<BR><BR><B>2.限制页面显示的结果集数</B><BR>1)全部&lt;display:table name="accList" class="its" id="test"&gt;<BR>2)头5个&lt;display:table name="accList" class="its" id="test" length="5"&gt;<BR>3)从第二个开始，显示下5个&lt;display:table name="accList" class="its" id="test" offset="2" length="5"&gt;<BR><BR><B>3.包装器decorators,有行包装器(必须继承TableDecorator)和列包装器(必须实现ColumnDecorator)</B><BR>&nbsp;&nbsp;在tableTag中显示list时，decorators中的方法会在list前调用，如果decorators实现类中有相关的getXXX()方法时，调用此方法，如果没有，则直接调用list<BR>&nbsp;&nbsp;在columnTag中显示value时，decorators中的方法会先调用，(应该重用)<BR><BR><B>4.传递参数，有两种方式，</B><BR>&nbsp;&nbsp;一。struts方式：有以下几个属性<BR>&nbsp;&nbsp;1)href 基本的超连接<BR>&nbsp;&nbsp;2)paramId 添加到url上的参数名<BR>&nbsp;&nbsp;&lt;display:column property="status" href="details.jsp" paramId="id" paramProperty="id" /&gt;<BR>&nbsp;&nbsp;3)paramName 传递容器内的其它bean当作参数 如：request.setAttribute("testparam", "sendamail");<BR>&nbsp;&nbsp;&lt;display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" /&gt;<BR>&nbsp;&nbsp;4)paramScope 指定bean的作用域<BR>&nbsp;&nbsp;二。decorators方式<BR>&nbsp;&nbsp;类Wrapper方法：<BR><BR><PRE class=overflow title="pre code">public String getLink1()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListObject lObject= (ListObject)getCurrentRowObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int lIndex= getListIndex();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "&lt;a href="details.jsp?index=" + lIndex + ""&gt;" + lObject.getId() + "&lt;/a&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</PRE><BR><BR>标签：<BR><PRE class=overflow title="pre code">&lt;display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" &gt;<BR>&nbsp;&nbsp;&lt;display:column property="link1" title="ID" /&gt;<BR>&nbsp;&nbsp;&lt;display:column property="email" /&gt;<BR>&lt;/display:table&gt;</PRE><BR><BR><B>5.分页</B><BR>&nbsp;&nbsp;指定属性:pagesize="10" 每页显示10条记录<BR><BR><B>6.排序</B><BR>1)在list中封装的对象的属性要实现Comparable接口,(一般均实现了)<BR>2) 在columnTag中指定sortable="true"<BR>&nbsp;&nbsp;可指定默认排序的列 defaultsort="1" 数值为第几列默认排序 defaultorder="descending" 指定默认为降序<BR><BR><B>7.导出 支持下列格式：'html', 'xml', 'csv', and 'excel'.</B><BR>&nbsp;&nbsp;属性：export="true",注意导出无效，当使用jsp:include or the RequestDispatcher<BR>&nbsp;&nbsp;&lt;display:column media="csv excel" title="URL" property="url"/&gt;<BR>&nbsp;&nbsp;指定该url属性值只能在csv、excel中导出<BR>&nbsp;&nbsp;需要指定export filter.<BR><BR><B>8.更改默认设置</B><BR>&nbsp;&nbsp;1)通过&lt;display:setProperty name=... value=...&gt; 标签，可以覆盖一些默认设置<BR>&nbsp;&nbsp;2)创建displaytag.properties文件，所有时区共用，建中文编码则创建displaytag_zh_cn.properties，放到类路径下,jar包内共有两个默认的属性文件TableTag.properties，message.properties<BR><BR><B>9其它</B><BR>&nbsp;&nbsp;1)当多个表在一页显示时，每个表都想要有分页、排序、导出等功能时，只需为每个table指定一个不同的ID即可。<BR>&nbsp;&nbsp;2)增加表头&lt;display:caption&gt;角色管理&lt;/display:caption&gt;<BR>&nbsp;&nbsp;3)增加表尾&nbsp;&nbsp;&lt;display:footer&gt;&lt;tr&gt;&lt;td colspan="6" align="center" &gt;国瑞数码版权所有&lt;/td&gt;&lt;/tr&gt;&lt;/display:footer&gt;<BR>&nbsp;&nbsp;4)http和email自动链接功能，指定autolink="true"<BR>&nbsp;&nbsp;5)指定一列显示的最大长度，避免太长把表格变形 maxLength="10" style="whitespace: nowrap;"<BR>&nbsp;&nbsp;6)当列的值为null，使用nulls="false"属性把null转为空白 
<P></P>
<DIV class=footer><A href="http://blog.ccidnet.com/index.php?op=Default&amp;postCategoryId=2888&amp;blogId=2084"><FONT color=#ff6600>Java </FONT></A></DIV><img src ="http://www.blogjava.net/huhu/aggbug/23790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-12-14 10:55 <a href="http://www.blogjava.net/huhu/articles/23790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用JDOM处理数据库到XML转换的JSP实现</title><link>http://www.blogjava.net/huhu/articles/6608.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Thu, 23 Jun 2005 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/6608.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/6608.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/6608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/6608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/6608.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、JDOM介绍我们知道DOM是用于与平台和语言无关的方式表示XML文档的官方W3C标准，利用DOM和SAX API可以解析和处理XML文档。这里我们介绍的JDOM是基于树操作的纯JAVA API，应该说它提供的是一套用于解析、创建、处理和实现XML的解决方案。这些API比DOM和SAX API提供的方法更为直观，对于有JAVA经验的程序员将会发现JDOM非常容易掌握。JDOM处理XML的方式...&nbsp;&nbsp;<a href='http://www.blogjava.net/huhu/articles/6608.html'>阅读全文</a><img src ="http://www.blogjava.net/huhu/aggbug/6608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-23 17:54 <a href="http://www.blogjava.net/huhu/articles/6608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 JSP 2.0 开发类似 JSTL 的标记</title><link>http://www.blogjava.net/huhu/articles/5697.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5697.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5697.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5697.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 学习如何使用简单标记 API 和构建用于求解 JSP 表达式的定制标记，如何控制 JSP 页面中的流以及如何创建 Java 集合。 本文相关下载： · 示例代码 · OC4J 10g 开发人员预览版 2 · JSTL 1.1 JavaServer Pages (JSP) 和 JSP 标准标记库 (JSTL) 为 Web 开发人员提供了许多有用的标记（也称作操作）。此外，...&nbsp;&nbsp;<a href='http://www.blogjava.net/huhu/articles/5697.html'>阅读全文</a><img src ="http://www.blogjava.net/huhu/aggbug/5697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:27 <a href="http://www.blogjava.net/huhu/articles/5697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试你对技术的掌握度：JSP程序员成长之路</title><link>http://www.blogjava.net/huhu/articles/5692.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5692.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5692.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5692.html</trackback:ping><description><![CDATA[在本文章中使用精通、熟练、熟悉、了解标志你对某技术的掌握程度。 
<P>　　精通:能够掌握此技术的85%技术要点以上，使用此技术时间超过两年，并使用此技术成功实施5个以上的项目。能使用此技术优化性能或代码，做到最大可能的重用。</P>
<P>　　熟练：能够掌握此技术的60%技术要点以上，使用此技术时间超过一年，并使用此技术成功实施3个以上的项目。能使用此技术实现软件需求并有经验的积累在实现之前能做优化设计尽可能的实现模块或代码的重用。</P>
<P>　　熟悉：能够掌握此技术的50%技术要点以上，使用此技术时间超过半年上，并使用此技术成功实施1个以上的项目。能使用此技术实现软件需求。</P>
<P>　　了解：可以在实际需要时参考技术文档或帮助文件满足你的需要，基本知道此项技术在你运用是所起的作用，能够调用或者使用其根据规定提供给你的调用方式。</P>
<P>　　二：基本要求</P>
<P>　　1:html 掌握程度：熟练。原因：不会html你可能写JSP?</P>
<P>　　2:javascript/jscript:掌握程度：熟悉。原因：client端的数据校验、一些页面处理需要你使用脚本。</P>
<P>　　3:css 掌握程度：熟悉。原因：实现页面风格的统一通常会使用css去实现。</P>
<P>　　4:java基础编程 掌握程度：熟练。原因：不会java你能写JSP?开玩笑吧。还有你必须非常熟悉以下几个包java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http; javax.mail;等。</P>
<P>　　5:sql 掌握程度：熟练。原因：如果你不使用数据库的话你也许不需要掌握sql。同时你必须对以下几种数据库中的一种以上的sql比较熟悉。Oracle,DB2,Mysql,Postgresql.</P>
<P>　　6:xml 掌握程度：了解 原因：AppServer的配置一般是使用XML来实现的。</P>
<P>　　7:ejb 掌握程度：了解 原因：很多项目中商业逻辑是由ejb来实现的，所以呢……</P>
<P>　　8:以下几种AppServer(engnier) 你需要了解一个以上。</P>
<P>　　a:)Tomcat </P>
<P>　　b:)WebLogic</P>
<P>　　c:)WebSphere</P>
<P>　　d:)JRun</P>
<P>　　e:)Resin</P>
<P>　　原因：你的jsp跑在什么上面啊！</P>
<P>　　三：选择要求(因项目而定)</P>
<P>　　1:LDAP 掌握程度：了解　原因：LADP越来越多的运用在权限控制上面。 <BR>　　2:Struts 掌握程度：熟练　原因：如果符合MVC设计通常会使用Struts实现C。 <BR>　　3:Xsp 掌握程度：根据需要而定很多时候是不使用的，但在不需要使用ejb但jsp+servlet+bean实现不了的时候Xsp是一个非常不错的选择。 <BR>　　4:Linux 掌握程度：熟悉　原因：如果你的运用跑在Linux/Unix上你最少要知道rm ,mv,cp,vi,tar gzip/gunzip 是用来做什么的吧。 </P>
<P>　　四：工具的使用</P>
<P>　　1:UltraEdit(EditPlus)+jakarta-ant+jakarta-log4j; <BR>　　2:Jubilder4-6 <BR>　　3:Visual Age For Java <BR>　　4:VCafe </P>
<P>　　以上的工具你选择你自己熟悉的吧。不过强烈建议你用log4j做调试工具。</P>
<P>　　五：成长之路</P>
<P>　　1:html 学习时间，如果你的智商在80以上，15天时间应该够用了。至少你能手写出一个页面来。 <BR>　　2:jacascript/jscript学习时间，这真的不好说，比较深奥的东西，够用的话一个礼拜可以学写皮毛。 <BR>　　3:css 学习时间,三天的时间你应该知道如何使用css了，不要求你写，一般是美工来写css。 <BR>　　4:java 学习时间，天才也的三个月吧。慢满学吧。如果要精通，那我不知道需要多少时间了。用来写 <BR>jsp,四个月应该够了。 <BR>　　5:sql 学习时间，只需要知道insert ,delete ,update ,select,create/drop table的话一天你应该知道了。 <BR>　　6:xml 学习时间，我不知道我还没有学会呢。呵呵。不过我知道DTD是用来做什么的。 <BR>　　7:ejb 学习时间，基本的调用看3天你会调用了。不过是建立在你学会java的基础上的。 <BR>　　8:熟悉AppServer,Tomcat四天你可以掌握安装，配置。把jsp跑起来了。如果是WebLogic也够了，但要使用ejb那不关你的事情吧。SA做什么去了。 <BR>　　9:熟悉Linux那可得需要不少时间。慢慢看man吧。 <BR>　　10：Struts如果需要你再学习。 </P><img src ="http://www.blogjava.net/huhu/aggbug/5692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:24 <a href="http://www.blogjava.net/huhu/articles/5692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提升JSP应用程序的七大绝招</title><link>http://www.blogjava.net/huhu/articles/5691.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5691.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5691.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5691.html</trackback:ping><description><![CDATA[你时常被客户抱怨JSP页面响应速度很慢吗？你想过当客户访问次数剧增时，你的WEB应用能承受日益增加的访问量吗？本文讲述了调整JSP和servlet的一些非常实用的方法，它可使你的servlet和JSP页面响应更快，扩展性更强。而且在用户数增加的情况下，系统负载会呈现出平滑上长的趋势。在本文中，我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升。其中，某些调优技术是在你的编程工作中实现的。而另一些技术是与应用服务器的配置相关的。在本文中，我们将详细地描述怎样通过调整servlet和JSP页面，来提高你的应用程序的总体性能。在阅读本文之前，假设你有基本的servlet和JSP的知识。 
<P>　　方法一：在servlet的init()方法中缓存数据</P>
<P>　　当应用服务器初始化servlet实例之后，为客户端请求提供服务之前，它会调用这个servlet的init()方法。在一个servlet的生命周期中，init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作，就可大大地提高系统性能。</P>
<P>　　例如，通过在init()方法中建立一个JDBC连接池是一个最佳例子，假设我们是用jdbc2.0的DataSource接口来取得数据库连接，在通常的情况下，我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中，如果每次SQL请求都要执行一次JNDI查询的话，那系统性能将会急剧下降。解决方法是如下代码，它通过缓存DataSource，使得下一次SQL调用时仍然可以继续利用它：</P>
<P>public class ControllerServlet extends HttpServlet <BR>{ <BR>　private javax.sql.DataSource testDS = null; <BR>　public void init(ServletConfig config) throws ServletException <BR>　{ <BR>　　super.init(config); <BR>　　Context ctx = null; <BR>　　try <BR>　　{ <BR>　　　ctx = new InitialContext(); <BR>　　　testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS"); <BR>　　} <BR>　　catch(NamingException ne) <BR>　　{ <BR>　　　ne.printStackTrace(); <BR>　　} <BR>　　catch(Exception e) <BR>　　{ <BR>　　　e.printStackTrace(); <BR>　　} <BR>　} </P>
<P>　public javax.sql.DataSource getTestDS() <BR>　{ <BR>　　return testDS; <BR>　} <BR>　... <BR>　... <BR>} </P>
<P>　　方法 2:禁止servlet和JSP 自动重载(auto-reloading)</P>
<P>　　Servlet/JSP提供了一个实用的技术，即自动重载技术，它为开发人员提供了一个好的开发环境，当你改变servlet和JSP页面后而不必重启应用服务器。然而，这种技术在产品运行阶段对系统的资源是一个极大的损耗，因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。</P>
<P>　　方法 3: 不要滥用HttpSession </P>
<P>　　在很多应用中，我们的程序需要保持客户端的状态，以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性，从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中，是通过HttpSession对像来实现session的功能的，但在方便的同时，它也给系统带来了不小的负担。因为每当你获得或更新session时，系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能：</P>
<P>　　· 如果没有必要，就应该关闭JSP页面中对HttpSession的缺省设置： 如果你没有明确指定的话，每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话，那可以通过如下的JSP页面指示符来禁止它：</P>
<P>＜%@ page session="false"%＞&nbsp; </P>
<P>　　· 不要在HttpSession中存放大的数据对像：如果你在HttpSession中存放大的数据对像的话，每当对它进行读写时，应用服务器都将对其进行序列化，从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大，那系统的性能就下降得越快。</P>
<P>　　· 当你不需要HttpSession时，尽快地释放它：当你不再需要session时，你可以通过调用HttpSession.invalidate()方法来释放它。</P>
<P>　　· 尽量将session的超时时间设得短一点：在JSP应用服务器中，有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话，系统会将相关的session自动从内存中释放。超时时间设得越大，系统的性能就会越低，因此最好的方法就是尽量使得它的值保持在一个较低的水平。</P>
<P>　　方法 4: 将页面输出进行压缩</P>
<P>　　压缩是解决数据冗余的一个好的方法，特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩，这种方法可以戏剧性地减少HTML文件的下载时间。因此，如果你将servlet或JSP页面生成的HTML页面进行压缩的话，那用户就会觉得页面浏览速度会非常快。但不幸的是，不是所有的浏览器都支持gzip压缩，但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段：</P>
<P>public void doGet(HttpServletRequest request, HttpServletResponse response) <BR>throws IOException, ServletException <BR>{ <BR>　OutputStream out = null <BR>　String encoding = request.getHeader("Accept-Encoding"); <BR>　if (encoding != null &amp;&amp; encoding.indexOf("gzip") != -1) <BR>　{ <BR>　　request.setHeader("Content-Encoding" , "gzip"); <BR>　　out = new GZIPOutputStream(request.getOutputStream()); <BR>　} <BR>　else if (encoding != null &amp;&amp; encoding.indexOf("compress") != -1) <BR>　{ <BR>　　request.setHeader("Content-Encoding" , "compress"); <BR>　　out = new ZIPOutputStream(request.getOutputStream()); <BR>　} <BR>　else <BR>　{ <BR>　　out = request.getOutputStream(); <BR>　} <BR>　... <BR>　... <BR>}&nbsp; </P>
<P>　　方法 5: 使用线程池</P>
<P>　　应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理，并为它们分派service()方法，当service()方法调用完成后，与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源，这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。另外，我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时，它会创建数量等于最小线程数的一个线程池，当客户有请求时，相应地从池从取出一个线程来进行处理，当处理完成后，再将线程重新放入到池中。如果池中的线程不够地话，系统会自动地增加池中线程的数量，但总量不能超过最大线程数。通过使用线程池，当客户端请求急剧增加时，系统的负载就会呈现的平滑的上升曲线，从而提高的系统的可伸缩性。</P>
<P>　　方法 6: 选择正确的页面包含机制</P>
<P>　　在JSP中有两种方法可以用来包含另一个页面：1、使用include指示符(＜%@ includee file=”test.jsp” %＞)。2、使用jsp指示符(＜jsp:includee page=”test.jsp” flush=”true”/＞)。在实际中我发现，如果使用第一种方法的话，可以使得系统性能更高。</P>
<P>　　方法 7:正确地确定javabean的生命周期</P>
<P>　　JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用＜jsp:useBean＞标签，可以将javabean直接插入到一个JSP页面中。它的使用方法如下：</P>
<P>＜jsp:useBean id="name" scope="page|request|session|application" class= <BR>"package.className" type="typeName"＞ <BR>＜/jsp:useBean＞ </P>
<P>　　其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话，它将影响系统的性能。</P>
<P>　　举例来说，如果你只想在一次请求中使用某个bean，但你却将这个bean的生命周期设置成了session，那当这次请求结束后，这个bean将仍然保留在内存中，除非session超时或用户关闭浏览器。这样会耗费一定的内存，并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期，并在bean的使命结束后尽快地清理它们，会使用系统性能有一个提高。</P>
<P>　　其它一些有用的方法 </P>
<P>　　· 在字符串连接操作中尽量不使用“＋”操作符：在java编程中，我们常常使用“＋”操作符来将几个字符串连接起来，但你或许从来没有想到过它居然会对系统性能造成影响吧？由于字符串是常量，因此JVM会产生一些临时的对像。你使用的“＋”越多，生成的临时对像就越多，这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“＋”操作符。</P>
<P>　　· 避免使用System.out.println()方法：由于System.out.println()是一种同步调用，即在调用它时，磁盘I/O操作必须等待它的完成，因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具，为了解决这个矛盾，我建议你最好使用Log4j工具(<A href="http://jakarta.apache.org/">http://Jakarta.apache.org</A> )，它既可以方便调试，而不会产生System.out.println()这样的方法。 </P>
<P>　　· ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销，因为它将所有的原始输出都转换为字符流来输出，因此如果使用它来作为页面输出的话，系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题，但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。</P>
<P>　　总结</P>
<P>　　本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能，并因此提升整个J2EE应用的性能。通过这些调优技术，你可以发现其实并不是某种技术平台（比如J2EE和.NET之争）决定了你的应用程序的性能，重要是你要对这种平台有一个较为深入的了解，这样你才能从根本上对自己的应用程序做一个优化！</P><img src ="http://www.blogjava.net/huhu/aggbug/5691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:23 <a href="http://www.blogjava.net/huhu/articles/5691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 网页制作技巧总结</title><link>http://www.blogjava.net/huhu/articles/5690.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5690.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5690.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5690.html</trackback:ping><description><![CDATA[1 表单的另一种参数传递方法： <BR>&lt;form name="form1&lt;%=id%&gt;" method="post" action="bookOrder.jsp?bookid=&lt;%=id%&gt;"&gt; <BR><BR>&lt;img src="images/all1.gif" width="40" height="40" onClick="submit()"&gt;&lt;/form&gt; <BR><BR><BR><BR>2 防止为登陆浏览： <BR>if(session.getAttribute("UserName")==null||session.getAttribute("UserName")=="") <BR><BR>{ <BR><BR><BR><BR>out.println("&lt;Script language=´javascript´&gt;"); <BR><BR>out.println("alert(´对不起！请你登陆后再订阅´)"); <BR><BR>out.println("history.go(-1)"); <BR><BR>out.println("&lt;/script&gt;"); <BR><BR>} <BR><BR>else <BR><BR>{ <BR><BR><BR><BR>%&gt; <BR><BR><BR><BR>3验证 用户信息的合法性： <BR><BR><BR><BR><BR>&lt;%@ page language="java" import="java.sql.*" %&gt; <BR><BR>&lt;jsp:useBean id="bookM" scope="page" class="date.SearchBookCar" /&gt; <BR><BR>&lt;%! String bookid,bookNumS; int Id,bookNumI; <BR><BR>%&gt; <BR><BR><BR><BR>&lt;% <BR><BR><BR><BR>bookid=request.getParameter("bookid");//得到ID <BR><BR>bookNumS=request.getParameter("bookfield");//得到数量 <BR><BR>if(bookNumS!=""&amp;bookNumS!=null) <BR><BR>{ <BR><BR><BR><BR>try <BR><BR>{ <BR><BR>bookNumI=Integer.parseInt(bookNumS);//转换成int类型 <BR><BR>Id=Integer.parseInt(bookid) ; <BR><BR><BR><BR>} <BR><BR>catch(NumberFormatException e) <BR><BR>{ <BR><BR>out.println("&lt;Script language=´javascript´&gt;"); <BR><BR>out.println("alert(´对不起,您输入的数字格式不对!´)"); <BR><BR>out.println("history.back(-1)"); <BR><BR>out.println("&lt;/script&gt;"); <BR><BR><BR><BR>} <BR><BR>boolean one=bookM.bookQuery(Id,bookNumI,""+session.getAttribute("loginTime"),""+session.getAttribute("UserName")); <BR><BR>if(one) <BR><BR>{ <BR><BR>out.println("&lt;Script language=´javascript´&gt;"); <BR><BR>out.println("alert(´提交成功!´)"); <BR><BR>out.println("history.back(-1)"); <BR><BR>out.println("&lt;/script&gt;"); <BR><BR><BR><BR>} <BR><BR>else <BR><BR>{ <BR><BR>out.println("&lt;Script language=´javascript´&gt;"); <BR><BR>out.println("alert(´您已经订过此书！´)"); <BR><BR>out.println("history.back(-1)"); <BR><BR>out.println("&lt;/script&gt;"); <BR><BR><BR><BR>} <BR><BR>} <BR><BR>bookM.bclose(); <BR><BR>}%&gt; <BR><BR>4表单的检验 <BR>&lt;form action="search.jsp" name="search_form" methor="post"&gt; <BR><BR>&lt;input type="submit" name="Submit3" value="确定" onclick=search_sub()&gt; <BR><BR>&lt;script language="javascript"&gt; <BR><BR>function search_sub() <BR><BR>{ <BR><BR>if(document.search_form.keyword.value==""|document.search_form.keyword.value=="请输入关键字") <BR><BR>{ <BR><BR>window.alert("请输入关键字!"); <BR><BR>document.search_form.keyword.focus(); <BR><BR>return; <BR><BR>} <BR><BR>else <BR><BR>{ <BR><BR>document.search_form.submit(); <BR><BR>} <BR><BR>} <BR><BR>5搜索的sql代码： <BR>String strSQL="Select * from hotbook"; <BR><BR>if(way!=null&amp;&amp;keyword!=null) <BR><BR>{ <BR><BR><BR><BR>//////////////出版社******************** <BR><BR>if(way.trim().equals("3")) <BR><BR>{ <BR><BR>strSQL="SELECT * FROM hotbook where"; <BR><BR>strSQL=strSQL+" 出版社 like "+"´%"+keyword+"%´"; <BR><BR>} <BR><BR>//////////////出版日期******************** <BR><BR>if(way.trim().equals("4")) <BR><BR>{ <BR><BR>strSQL="SELECT * FROM hotbook where"; <BR><BR>strSQL=strSQL+" 出版日期 like ´%"+keyword+"%´"; <BR><BR>} <BR><BR>//////////////书名******************** <BR><BR>if(way.trim().equals("1")) <BR><BR>{ <BR><BR>strSQL="SELECT * FROM hotbook where"; <BR><BR>strSQL=strSQL+" 书名 like ´%"+keyword+"%´"; <BR><BR>} <BR><BR>//////////////作者******************** <BR><BR>if(way.trim().equals("2")) <BR><BR>{ <BR><BR>strSQL="SELECT * FROM hotbook where"; <BR><BR>strSQL=strSQL+" 作者 like ´%"+keyword+"%´"; <BR><BR>} <BR><BR>//////////////ISBN******************** <BR><BR>if(way.trim().equals("5")) <BR><BR>{ <BR><BR>strSQL="SELECT * FROM hotbook where"; <BR><BR>strSQL=strSQL+" ISBN like ´%"+keyword+"%´"; <BR><BR>} <BR><BR>} <BR><BR><BR><BR>6分页显示 <BR>if (strSQL!=null) <BR><BR>{ <BR><BR>Connection con=yy.getConn(); <BR><BR>Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <BR><BR>ResultSet RSa=stmt.executeQuery(strSQL); <BR><BR>RSa.last(); <BR><BR>int qikan_num=0;//每页实际页数 <BR><BR>int pageNO=1;//第几页 <BR><BR>int pageRecorders=5;//每页10条记录 <BR><BR>int pageTotal=RSa.getRow();//共几条 <BR><BR>int pageCount=pageTotal/pageRecorders;//每页10条共几页 <BR><BR>String strPage = request.getParameter("pagenum");//得到传递上来的页数 <BR><BR>if(strPage==null) <BR><BR>{ <BR><BR>//表明在QueryString中没有page这一个参数，此时显示第一页数据 <BR><BR>pageNO = 1; <BR><BR>} <BR><BR>else <BR><BR>{ <BR><BR>//将字符串转换成整型 <BR><BR>pageNO= java.lang.Integer.parseInt(strPage); <BR><BR>if(pageNO&lt;1) <BR><BR>{pageNO = 1;} <BR><BR>} <BR><BR>if(pageCount&gt;=0) <BR><BR>{ <BR><BR>//将记录指针定位到待显示页的第一条记录//的前一条上 <BR><BR>if((pageNO-1)==0)//如果为第一页，则指向第0条 <BR><BR>{ <BR><BR>RSa.beforeFirst();//如果为第一条记录， <BR><BR>} <BR><BR>else RSa.absolute((pageNO-1) * pageRecorders);//如果为其它，则指向当前条的下一条 <BR><BR>} <BR><BR><BR><BR>%&gt; <BR><BR><BR><BR>&lt;table width="772" border="0"&gt; <BR><BR>&lt;tr&gt; <BR><BR>&lt;td width="120"&gt;&lt;%if (session.getAttribute("UserName")!=null) <BR><BR>{ out.println("&lt;font color=red&gt;欢迎您："+session.getAttribute("UserName")+"&lt;/font&gt;");} <BR><BR>else <BR><BR>{ out.println("&lt;font color=red&gt;请您登陆!&lt;/font&gt;"); };%&gt; <BR><BR>&lt;/td&gt; <BR><BR>&lt;%if(pageNO&lt;=pageCount){%&gt; <BR><BR>&lt;td width="128"&gt; <BR><BR>&lt;a href="../search.jsp?pagenum=&lt;%=pageNO+1%&gt;&amp;keyword=&lt;%=keyword%&gt;&amp;way=&lt;%=way%&gt;"&gt;下一&lt;/a&gt;&lt;/td&gt; <BR><BR>&lt;%}%&gt; <BR><BR>&lt;%if(pageNO&gt;1){%&gt; <BR><BR>&lt;td width="124"&gt; <BR><BR>&lt;a href="../search.jsp?pagenum=&lt;%=pageNO-1%&gt;&amp;keyword=&lt;%=keyword%&gt;&amp;way=&lt;%=way%&gt;"&gt;上一&lt;/a&gt;&lt;/td&gt; <BR><BR>&lt;%}%&gt; <BR><BR>&lt;td width="124"&gt;&nbsp;&lt;/td&gt; <BR><BR>&lt;td width="124"&gt;&lt;a href="search.jsp"&gt;查看全部热点书&lt;/a&gt;&lt;/td&gt; <BR><BR>&lt;td width="126"&gt;&lt;a href="myorder.jsp" target="_blank"&gt;查看我的订单&lt;/a&gt;&lt;/td&gt; <BR><BR>&lt;/tr&gt; <BR><BR>&lt;/table&gt; <BR><BR><BR><BR><BR><BR>&lt;/td&gt; <BR><BR>&lt;/tr&gt; <BR><BR>&lt;/table&gt; <BR><BR>&lt;table width="660" border=0 align="center" cellpadding=6 cellspacing=0 class=linehight height="123"&gt; <BR><BR>&lt;% <BR><BR>while( RSa.next()&amp;&amp;qikan_num&lt;pageRecorders) <BR><BR>{ <BR><BR>String bookname= RSa.getString("书名"); <BR><BR>String writer=RSa.getString("作者"); <BR><BR>float sale2=RSa.getFloat("定价"); <BR><BR>String pubname= RSa.getString("出版社"); <BR><BR>String pubtime= RSa.getString("出版日期"); <BR><BR>int bookid= RSa.getInt("id"); <BR><BR>String image= RSa.getString("ISBN"); <BR><BR><BR><BR>%&gt; <BR><BR>&lt;tr&gt; <BR><BR>&lt;td align=middle width="23%" height=16&gt;&lt;a href=javascript:show("../search_info.jsp?id=&lt;%=bookid%&gt;","详细资料",600,300)&gt;&lt;img src="image/hotbook/&lt;%=image%&gt;.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; <BR><BR>&lt;td valign=top width="58%" &gt;&lt;b&gt;书名:&lt;/b&gt;&lt;a href=javascript:show("../search_info.jsp?id=&lt;%=bookid%&gt;","详细资料",600,300)&gt;&lt;font color="#cc0000"&gt;&lt;b&gt;&lt;%= bookname%&gt;&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;&lt;br&gt; <BR><BR>&lt;b&gt;&lt;br&gt;作者:&lt;/b&gt;&lt;%=writer%&gt;&lt;br&gt; <BR><BR>&lt;b&gt;定价:&lt;/b&gt;&lt;font color="#cc0000"&gt; ￥&lt;%=sale2%&gt;&lt;/font&gt;&lt;br&gt; <BR><BR>&lt;b&gt;出版社:&lt;/b&gt;&lt;%=pubname%&gt;&lt;br&gt; <BR><BR>&lt;b&gt;出版日期:&lt;/b&gt;&lt;%=pubtime%&gt;&lt;/td&gt; <BR><BR>&lt;td valign=bottom width="19%" height=16 &gt; <BR><BR>&lt;form name="form1&lt;%=bookid%&gt;" method="post" action="bookTiqiao.jsp?bookid=&lt;%=bookid%&gt;"&gt; <BR><BR>&lt;input type="text" name="bookfield" size="3" maxlength="3" value="1"&gt; <BR><BR>本&lt;img src="images/all1.jpg" width="41" height="36" onClick="submit()" style="cursor:hand"&gt; <BR><BR>&lt;/form&gt; <BR><BR>&lt;/td&gt; <BR><BR>&lt;/tr&gt; <BR><BR>&lt;tr align=middle&gt; <BR><BR>&lt;td valign=top colspan=3 height=0&gt; <BR><BR>&lt;div align="right"&gt;&lt;img src="images/search_end.gif" width="424" height="15"&gt;&lt;/div&gt; <BR><BR>&lt;/td&gt; <BR><BR>&lt;/tr&gt; <BR><BR>&lt;% <BR><BR>qikan_num++; <BR><BR>} <BR><BR>%&gt; <BR><BR>&lt;/table&gt; <BR><BR>&lt;table width="772" border="0" align="center"&gt; <BR><BR>&lt;tr&gt; <BR><BR>&lt;td&gt;&lt;% <BR><BR>out.println("&lt;p&gt;&lt;b&gt;&lt;font color=´#174572´ size=´2´&gt;本页有"+qikan_num+"条纪录，共找到"+pageTotal+"条&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;"); <BR><BR>out.println("&lt;font color=´#cc00000´ size=´2´&gt;当前是第"+pageNO+"页&lt;/font&gt;"); <BR><BR>out.println("页数"); <BR><BR>for(int i=1;i&lt;pageCount+2;i++) <BR><BR>{ <BR><BR>%&gt; <BR><BR>&lt;a href="../search.jsp?pagenum=&lt;%=i%&gt;&amp;keyword=&lt;%=keyword%&gt;&amp;way=&lt;%=way%&gt;"&gt;&lt;u&gt;&lt;%=i%&gt;&lt;/u&gt;&lt;/a&gt; <BR><BR>&lt;% <BR><BR>} <BR><BR>RSa.close(); <BR><BR>stmt.close(); <BR><BR>con.close(); <BR><BR>}%&gt; <BR><BR><BR><BR>&lt;/td&gt; <BR><BR>&lt;/tr&gt; <BR><BR>&lt;/table&gt; <BR><BR>7另一种 删除数据后，跳转的方法 <BR>&lt;% <BR><BR>if (session.getAttribute("UserName")==null) <BR><BR>{ <BR><BR>response.sendRedirect("../index.jsp"); <BR><BR>}else{ <BR><BR><BR><BR>String keyword1,SQL; <BR><BR><BR><BR><BR><BR>keyword1=request.getParameter("bookid"); <BR><BR>SQL="Delete From bookdindan Where ¶©ÔÄÕßid=´"+keyword1+"´"; <BR><BR><BR><BR>Connection con=yy.getConn(); <BR><BR>Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <BR><BR>stmt.executeUpdate(SQL); <BR><BR>response.sendRedirect("../myorder.jsp"); <BR><BR><BR><BR><BR><BR>stmt.close(); <BR><BR>con.close(); <BR><BR>} <BR><BR>%&gt; <BR><BR>8将 年月日转换的方法 如 2004-05-02 2004年5月2日 <BR>&lt;%! <BR><BR>public static String YMD(String dt) <BR><BR>{ <BR><BR>try <BR><BR>{ <BR><BR>return dt.substring(0,4)+"年"+dt.substring(5,7)+"月"+dt.substring(8,10)+"日"; <BR><BR>} <BR><BR>catch(Exception e) <BR><BR>{ <BR><BR>} <BR><BR>return "null"; <BR><BR>} <BR><BR>%&gt; <BR><BR>9 中文转换 <BR>&lt;%! <BR><BR>public String getStr(String str) <BR><BR>{ <BR><BR>try <BR><BR>{ <BR><BR>String temp_p=str; <BR><BR>byte[] temp_t=temp_p.getBytes("GBK"); <BR><BR>String temp=new String(temp_t,"ISO8859_1"); <BR><BR>return temp; <BR><BR>} <BR><BR>catch(Exception e) <BR><BR>{ <BR><BR><BR><BR>} <BR><BR>return "null"; <BR><BR>} <BR><BR>10 用户注销 代码 <BR>&lt;% <BR><BR>session.setAttribute("UserName",""); <BR><BR>session.setAttribute("station",""); <BR><BR>session.setAttribute("id",""); <BR><BR>response.sendRedirect("default.jsp"); <BR><BR>%&gt; <BR><BR><BR><BR>第二篇 <BR>1 防止用户刷新页面，等待10秒 <BR>// default.jsp <BR>&lt;%String aaa="b"+session.getAttribute("nF"); <BR>if(!aaa.equals("bnull")) <BR>{ <BR>session.setAttribute("nF",null); <BR>response.sendRedirect("1.jsp"); <BR>} <BR>else <BR>{ <BR>session.setAttribute("nF","a"); <BR><BR>%&gt; <BR>//1.jsp <BR>&lt;%@ page contentType="text/html; charset=gb2312"%&gt; <BR>&lt;%@ page language="java" %&gt; <BR>&lt;p&gt;对不起，服务器正在运行时，请勿刷新页面，谢谢合作，如有不便敬请谅解&lt;/p&gt; <BR>&lt;p&gt;页面将于10秒后重新回到主页.......请等待！！！&lt;/p&gt; <BR><BR>&lt;%response.setHeader("Refresh","10;URL=default.jsp");%&gt; <BR>2用javaBean调用javascript指令 <BR>//jsp <BR>try{ <BR>studentID=(String)session.getAttribute("studentID"); <BR>if(studentID==null){ <BR>throw new Exception(); <BR>} <BR>}catch(Exception e){ <BR>Tools.showalert("您还没有登录，或连接超时，请重新登录!",out); <BR>Tools.showJS("window.open(´../login.jsp´,´_self´)",out); <BR>} <BR>//Bean <BR>import javax.servlet.jsp.JspWriter; <BR>public static void showalert(String msg, JspWriter out) <BR>{ <BR>try <BR>{ <BR>out.print(String.valueOf(String.valueOf((new StringBuffer("&lt;SCRIPT LANGUAGE=\"javascript\"\n&gt; alert(\"")).append(msg).append("\");\n").append("&lt;/SCRIPT&gt;\n")))); <BR>} <BR>catch(Exception e) <BR>{ <BR>System.out.println(e.toString()); <BR>} <BR>} <BR>3用javaBean 返回 <BR>public static void goback(JspWriter out) <BR>{ <BR>try <BR>{ <BR>out.print("&lt;SCRIPT LANGUAGE=\"javascript\"\n&gt; history.go(-1);\n&lt;/SCRIPT&gt;\n"); <BR>} <BR>catch(Exception e) <BR>{ <BR>System.out.println(e.toString()); <BR>} <BR>} <BR>4用bean 插入javascript <BR>public static void goback(JspWriter out) <BR>{ <BR>try <BR>{ <BR>out.print("&lt;SCRIPT LANGUAGE=\"javascript\"\n&gt; history.go(-1);\n&lt;/SCRIPT&gt;\n"); <BR>} <BR>catch(Exception e) <BR>{ <BR>System.out.println(e.toString()); <BR>} <BR>} <BR><img src ="http://www.blogjava.net/huhu/aggbug/5690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:22 <a href="http://www.blogjava.net/huhu/articles/5690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp2.0新特性</title><link>http://www.blogjava.net/huhu/articles/5687.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5687.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5687.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5687.html</trackback:ping><description><![CDATA[<P>JSP（JavaServer Pages）技术是对Servlet的进一步抽象，它由JCP（Java Community Process）开发，是用于生成动态内容的开放式的、可免费获取的规范，也是J2EE（Java 2 Enterprise Edition）规范的重要组成部分。许多商业应用服务器如BEA WebLogic、IBM WebSphere、Live Jrun和Orion都支持JSP技术。 </P>
<P>从机票预订系统、银行系统到购物系统，Web上到处都在应用JSP技术。新发布的2.0版是对JSP1.2的升级，增加了一些有趣的新特性。JSP2的目标是使动态网页的设计更加容易，而且无需学习Java编程语言。 </P>
<P>本文内容包括： </P>
<P>提供具有丰富示例代码的教程来使你熟悉JSP2.0 <BR>介绍JSP2.0的新特性 <BR>提供利用JSP2.0开发应用程序的一些体会 <BR>给出了一些示例代码，对这些代码稍加修改即可用于你自己的应用程序。 <BR>如果你还不熟悉JSP，那么直接从JSP2.0入手是一个不错的主意。但是如果希望学习JSP1.2，也许你需要从 JSP教程 开始学习。 </P>
<P>JSP 2.0 <BR>JSP 2.0是对JSP 1.2的升级，增加了几个有趣的新特性，可以使Web应用程序设计人员和开发人员的工作更容易一些。JSP 2.0的目标是比以前更易于使用，更重要的是无须学习Java语言本身就可以使用它。它增加了一种称为SimpleTag的新扩展机制来简化标签API（Tag API）。 </P>
<P>除了其他一些改进外，JSP 2.0引入的最主要的新特性包括： </P>
<P>一种简单的表达式语言（EL），能够用来容易地从JSP页面访问数据，这种表达式语言简化了基于JSP的不含脚本的应用程序的编写，不需要使用Java Scriptlet或者Java表达式； <BR>用于直接使用JSP技术来定义可重用的自定义行为的新语法，该语法使用.tag和.tagx文件，这类文件可由开发人员或者网页作者编写； <BR>3XML语法得到了实质性的改进，增加了新的标准文件扩展名（.tagx用于标签文件，.jspx用于JSP文件）。 <BR>本文主要讨论表达式语言、简化的标签API和标签文件。相信目前的JSP开发人员将会发现这些重要的特性不但有趣，而且非常有用。 </P>
<P>为何要从1.2跨越到2.0？ <BR>在Java规格请求（JSR 152）中版本号最初定为1.3。但是正如你将在后面看到的那样，由于这些新特性对JSP应用程序的开发模型产生了如此深刻的影响，专家组感到有必要把主版本号升级到2.0，这样才能充分反映这种影响。此外，新的版本号也有助于把开发人员的注意力吸引到这些有趣的新特性上来。令人欣慰的是， 所有合法的 JSP1.2 页面同时也是合法的JSP2.0 页面 。 </P>
<P>JSP 2.0起步 <BR>在着手学习JSP 2.0之前，你需要一个支持JSP2.0和Java Servlet 2.4规范的JSP环境。幸运的是，Jakarta Tomcat 5.0（alpha测试版）支持新的JSP2.0和Servlet 2.4规范，可以从http://jakarta.apache.org/builds/jakarta-tomcat/release/v5.0.4-alpha/下载并安装 Tomcat 5.0 。 </P>
<P>JSP表达式语言 <BR>向JSP网页传递信息是通过JSP scoped属性和请求参数完成的。专门为网页作者量身定做的一种表达式语言（EL）把JSP scoped属性提升为从业务逻辑向JSP页面传递信息的标准方式。但是要注意，尽管这种表达式语言是JSP的一个重要特性，它并不是一种通用的程序语言。它仅仅是一种数据访问语言，可以方便地访问和处理应用程序数据，而无需使用scriptlet或者请求时（request-time）表达式的值。 </P>
<P>在JSP2.0之前，网页作者只能使用表达式&lt;%= aName %&gt;访问系统的值，比如下面的例子： </P>
<P>&lt;someTags:aTag attribute="&lt;%= pageContext.getAttribute("aName") %&gt;"&gt; </P>
<P>或者使用自定义JavaBeans组件的值： </P>
<P>&lt;%= aCustomer.getAddress().getCountry() %&gt; </P>
<P>表达式语言允许网页作者使用简单的语法访问对象。比如要访问一个简单变量，可以像下面这样写： </P>
<P>&lt;someTags:aTag attribute="${aName}"&gt; </P>
<P>而访问嵌套的JavaBeans属性，则可以像下面这样写： </P>
<P>${aCustomer.address.country} </P>
<P>你可能会问，这不是JavaScript的语法吗？完全正确！如果你使用过JavaScript，就会感到非常轻松，因为表达式语言正是借用了访问结构化数据的JavaScript语法。 </P>
<P>注意： 表达式语言最初是作为JSP标准标签库（JSTL）1.0的一部分而开发的，JSTL是一种标准标签库，它提供对通用的、结构化的任务的支持，如迭代和条件、XML文档处理、国际化和利用SQL访问数据库等。JSTL规范是由JSR 52专家组开发的。关于JSTL的介绍，请参见 Faster Development with JSTL （使用JSTL加速开发）. </P>
<P>访问应用程序数据 <BR>可以使用点号运算符（.）访问作为对象属性的应用程序数据，也可使用方括号运算符[‘name']访问命名的数组元素。 </P>
<P>表达式${data}表示名为data的scoped变量。可以使用点号（.）或方括号（[]）运算符从集合中检索属性值： </P>
<P>点号运算符用于访问命名的属性，比如表达式${customer.name}表示scoped变量customer的name属性； <BR>方括号运算符可用于检索命名的属性，比如在${customer[“name”]}中。也可以通过${customers[0]}的形式来访问集合customers中的第一项。 <BR>表达式语言统一了对点号和方括号运算符的处理，因此${customer.name}与${customer[“name”]}是等价的。正如你看到的那样，表达式必须使用${和}包围起来。 </P>
<P>EL的标识符求值方式是使用PageContext.findAttribute(String)，把标识符作为一个属性来查找它的值。如果没有找到该属性，则返回null。 </P>
<P>运算符 <BR>表达式语言支持算术运算符、关系运算符和逻辑运算符，以完成大多数的数据处理操作。此外，它还提供了一个用于测试一个对象是否为空的特殊运算符。运算符如表1所示。你可以使用empty运算符判断某个集合或字符串是否为空。比方说，只有当要求的命名参数param没有给出时，表达式${empty param.name}才返回真。Empty运算符可以与“!”运算符一起使用，比如${!empty param.name}当要求的命名参数param存在时返回真。 </P>
<P>表 1 ：表达式语言运算符 <BR>&nbsp; <BR>运算符 <BR>&nbsp;说明 <BR>&nbsp; <BR>+ <BR>&nbsp;加 <BR>&nbsp; <BR>- <BR>&nbsp;减 <BR>&nbsp; <BR>* <BR>&nbsp;乘 <BR>&nbsp; <BR>/ 或 div <BR>&nbsp;除 <BR>&nbsp; <BR>% 或 mod <BR>&nbsp;模（求余） <BR>&nbsp; <BR>== 或 = <BR>&nbsp;等于 <BR>&nbsp; <BR>!= 或 != <BR>&nbsp;不等于 <BR>&nbsp; <BR>&lt; 或 lt <BR>&nbsp;小于 <BR>&nbsp; <BR>&gt; 或 gt <BR>&nbsp;大于 <BR>&nbsp; <BR>&lt;= 或 le <BR>&nbsp;小于等于 <BR>&nbsp; <BR>&gt;= 或 ge <BR>&nbsp;大于等于 <BR>&nbsp; <BR>&amp;&amp; 或 and <BR>&nbsp;逻辑与 <BR>&nbsp; <BR>|| or or <BR>&nbsp;逻辑或 <BR>&nbsp; <BR>! 或 not <BR>&nbsp;逻辑非 <BR>&nbsp; <BR>empty <BR>&nbsp;检查是否为空值 <BR>&nbsp; <BR>a ? b : c <BR>&nbsp;条件运算符 <BR>&nbsp; </P>
<P>隐含对象 <BR>除了运算符外，表达式语言还定义了一些隐含对象以支持网页作者访问需要的应用程序数据。表达式语言定义的隐含对象如表2所示，后面将给出使用这些隐含对象的一个例子。 </P>
<P>表 2 ：表达式语言中的隐含对象 <BR>&nbsp; <BR>隐含对象 <BR>&nbsp;内容 <BR>&nbsp; <BR>applicationScope <BR>&nbsp;应用程序范围内的scoped变量组成的集合 <BR>&nbsp; <BR>cookie <BR>&nbsp;所有cookie组成的集合 <BR>&nbsp; <BR>header <BR>&nbsp;HTTP请求头部，字符串 <BR>&nbsp; <BR>headerValues <BR>&nbsp;HTTP请求头部，字符串集合 <BR>&nbsp; <BR>initParam <BR>&nbsp;全部应用程序参数名组成的集合 <BR>&nbsp; <BR>pageContext <BR>&nbsp;当前页面的javax.servlet.jsp.PageContext对象 <BR>&nbsp; <BR>pageScope <BR>&nbsp;页面范围内所有对象的集合 <BR>&nbsp; <BR>param <BR>&nbsp;所有请求参数字符串组成的集合 <BR>&nbsp; <BR>paramValues <BR>&nbsp;所有作为字符串集合的请求参数 <BR>&nbsp; <BR>requestScope <BR>&nbsp;所有请求范围的对象的集合 <BR>&nbsp; <BR>sessionScope <BR>&nbsp;所有会话范围的对象的集合 <BR>&nbsp; </P>
<P>表达式语言的例子 <BR>如你所言，网页作者无须学习Java也能够使用这种表达式语言。示例代码1显示了一些表达式的例子和隐含对象的使用。 </P>
<P>代码示例1 : ex1.jsp </P>
<P>要运行这个例子，请参照以下步骤，这里我们假定Tomcat 5.0安装在c:\tomcat5.0下。 </P>
<P>切换目录到 c:\Tomcat5.0\webapps\jsp-examples <BR>创建新目录，名字可以是任意的，比如jsp2-tutorial <BR>切换到jsp2-tutorial <BR>把ex1.jsp复制并保存到该目录下 <BR>启动Tomcat 5服务器：指向“开始”-&gt;“程序”-&gt;“Apache Tomcat 5.0”，单击“Apache Tomcat 5.0”来启动Tomcat <BR>在浏览器中输入http://localhost:8080/jsp-examples/jsp2-tutorial/ex1.jsp <BR>你将看到类似图1所示的画面。使用表达式语言就这么简单！ </P>
<P><BR>图 1 ： JSP 表达式语言和隐含对象 </P>
<P>注意 : 在本文中，所有的JSP文件都保存在c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial目录下。 </P>
<P>填充表单例子 <BR>隐含对象$paran[var]可用于读取填充表单的数据。代码示例2给出了一个简单的表单，该表单提示用户输入一个名字。 </P>
<P>代码示例2 : form.jsp </P>
<P>&lt;HTML&gt; <BR>&lt;HEAD&gt; <BR>&lt;TITLE&gt;Form Content&lt;/TITLE&gt; <BR>&lt;/HEAD&gt; &lt;BODY&gt; &lt;H3&gt;Fill-out-form&lt;/H3&gt; <BR>&lt;P&gt; <BR>&lt;FORM action="form.jsp" method="GET"&gt; <BR>Name = &lt;input type="text" name="name" value="${param['name']}"&gt; <BR>&lt;input type="submit" value="Submit Name"&gt; &lt;/FORM&gt; &lt;P&gt; <BR>The Name is: ${param.name} &lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>在本例中，当用户输入名字并单击“提交”按钮时，输入的名字就会显示同一页面中的“The Name is:”字样后面，如图2所示。 </P>
<P>同样，运行这个例子只需要把form.jsp复制到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下并用浏览器打开它。 </P>
<P><BR>图 2 ：表单处理 </P>
<P>定义和使用函数 <BR>表达式语言允许你定义可在表达式中调用的函数。函数必须作为public类中的public static方法编写。函数一经定义，它的签名（signature）就映射到标签库描述符（TLD）中。 </P>
<P>为了说明函数的使用，我们举一个简单的例子，把两个数相加。首先要编写求两数之和的Java方法代码，如代码示例3所示，这里定义了一个静态方法，它接收两个字符串参数，把它们解析成整数并返回它们的和。 </P>
<P>代码示例3 : Compute.java </P>
<P>package jsp2.examples.el; import java.util.*; public class Compute { <BR>public static int add(String x, String y) { <BR>int a = 0; <BR>int b = 0; <BR>try { <BR>a = Integer.parseInt(x); <BR>b = Integer.parseInt(y); <BR>}catch(Exception e) {} <BR>return a + b; <BR>} <BR>} <BR>用javac把这段代码编译成功后，下一步就要把函数的签名映射到标签库。代码示例4说明了如何把add函数映射到包含函数实现和函数签名的类。后面将说明把这段代码添加到哪儿。 </P>
<P>代码示例4 : 函数描述符 </P>
<P>&lt;function&gt; <BR>&lt;description&gt;add x and y&lt;/description&gt; <BR>&lt;name&gt;add&lt;/name&gt; <BR>&lt;function-class&gt;jsp2.examples.el.Compute <BR>&lt;/function-class&gt; <BR>&lt;function-signature&gt;int <BR>add(java.lang.String,java.lang.String) <BR>&lt;/function-signature&gt; <BR>&lt;/function&gt; <BR>现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表单，用户输入两个数字并按下“求和”按钮，就会调用上面的函数并把两个数相加，结果在同一个页面中显示出来。 </P>
<P>代码示例5 : math.jsp </P>
<P>&lt;%@ taglib prefix="my" <BR>uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %&gt; &lt;HEAD&gt; <BR>&lt;TITLE&gt;Functions&lt;/TITLE&gt; <BR>&lt;/HEAD&gt; &lt;BODY&gt; &lt;H3&gt;Add Numbers&lt;/H3&gt; <BR>&lt;P&gt; <BR>&lt;FORM action="math.jsp" method="GET"&gt; <BR>X = &lt;input type="text" name="x" value="${param["x"]}"&gt; <BR>&lt;BR&gt; <BR>Y = &lt;input type="text" name="y" value="${param["y"]}"&gt; <BR>&lt;input type="submit" value="Add Numbers"&gt; <BR>&lt;/FORM&gt; &lt;P&gt; <BR>The sum is: ${my:add(param["x"],param["y"])} &lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>要运行这个例子： </P>
<P>复制Compute.java并保存到C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\classes\jsp2\examples\el下； <BR>使用javac编译Compute.java； <BR>编辑文件C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\jsp2\jsp2-example-taglib.tld，把代码示例4中的代码段添加到文件中最后一个&lt;/function&gt;标签之后，&lt;/taglib&gt;标签之前； <BR>复制math.jsp并保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下； <BR>用浏览器打开该文件。 <BR>如果一切正常，应该会看到类似如图3所示的窗口。 </P>
<P><BR>图 3 ：使用函数 </P>
<P>标签处理器 <BR>JSP 1.2中传统的标签处理API由于允许标签体中包含scriptlet而变得复杂，但是现在利用表达式语言可以编写不含scriptlet的JSP网页。最终，JSP 2.0引入了一种新的标签扩展机制，称为“简单标签扩展”，这种机制有两种使用方式： </P>
<P>Java开发人员可以定义实现接口javax.servlet.jsp.tagext.SimpleTag的类; <BR>不懂Java的网页编写人员则可以使用标签文件。 <BR>首先来看第一种方式，代码示例6给出了一个简单的标签处理器，它的作用仅仅是打印“This is my first tag! ”。 </P>
<P>代码示例6 : HelloTag.java </P>
<P>package jsp2.examples.simpletag; import javax.servlet.jsp.JspException; <BR>import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; /** <BR>* SimpleTag handler that prints "This is my first tag!" <BR>*/ <BR>public class HelloTag extends SimpleTagSupport { <BR>public void doTag() throws JspException, IOException { <BR>getJspContext().getOut().write("This is my first tag!"); <BR>} <BR>} <BR>编译成功后，下一步就要在TLD中定义一个标签描述符，下面是标签描述符的例子。 </P>
<P>代码示例7 : 标签描述符 </P>
<P>&lt;tag&gt; <BR>&lt;description&gt;Prints this is my first tag&lt;/description&gt; <BR>&lt;name&gt;hello&lt;/name&gt; <BR>&lt;tag-class&gt;jsp2.examples.simpletag.HelloTag&lt;/tag-class&gt; <BR>&lt;body-content&gt;empty&lt;/body-content&gt; <BR>&lt;/tag&gt; <BR>最后再编写一个使用上述标签的JSP页面文件，见代码示例8。 </P>
<P>代码示例8 : helloworld.jsp </P>
<P>&lt;%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %&gt; <BR>&lt;HTML&gt; <BR>&lt;HEAD&gt; <BR>&lt;TITLE&gt;Simple Tag Handler&lt;/TITLE&gt; <BR>&lt;/HEAD&gt; &lt;BODY&gt; <BR>&lt;H2&gt;Simple Tag Handler&lt;/H2&gt; <BR>&lt;P&gt; <BR>&lt;B&gt;My first tag prints&lt;/B&gt;: &lt;mytag:hello/&gt; <BR>&lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>要运行这个例子： </P>
<P>复制HelloTg.java并保存到C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\classes\jsp2\examples\simpletag下； <BR>使用javac编译HelloTag.java； <BR>把代码示例7中的标签描述符添加到文件C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\jsp2\jsp2-example-taglib.tld中的&lt;/taglib&gt;之前； <BR>复制helloworld.jsp并保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial目录中； <BR>用浏览器打开helloworld.jsp。 <BR>如果一切正常，应该会看到类似如图4所示的画面。 </P>
<P><BR>图 4 ：简单标签处理器 </P>
<P>标签文件 <BR>使用简单标签扩展机制的另一种方法是通过标签文件。标签文件是一种资源文件，网页作者可以利用它抽取一段JSP代码，通过定制功能来实现代码的复用。换句话说，标签文件允许JSP网页作者使用JSP语法创建可复用的标签库。标签文件的扩展名必须是“.tag”。 </P>
<P>为说明使用标签文件是多么容易，考虑一下代码示例9。没错，这就是一个标签文件！ </P>
<P>代码示例9 : greetings.tag </P>
<P>Hello there. How are you doing? <BR>一旦定义了标签文件，就可以在JSP网页的编写中使用这种定制的功能。比如代码示例10中的JSP网页。 </P>
<P>代码示例10 : chat.jsp </P>
<P>&lt;%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %&gt; <BR>&lt;HTML&gt; <BR>&lt;HEAD&gt; <BR>&lt;TITLE&gt;JSP 2.0 Examples - Hello World Using a Tag File&lt;/TITLE&gt; <BR>&lt;/HEAD&gt; <BR>&lt;BODY&gt; <BR>&lt;H2&gt;Tag File Example&lt;/H2&gt; <BR>&lt;P&gt; <BR>&lt;B&gt;The output of my first tag file is&lt;/B&gt;: &lt;tags:greetings/&gt; <BR>&lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>要运行这个例子： </P>
<P>复制标签文件greetings.tags并保存在c:\Tomcat5.0\webapps\jsp-examples\WEB-INF\tags 目录下； <BR>复制JSP网页文件char.jsp并保存在c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial 目录下； <BR>用浏览器打开chat.jsp文件。 <BR>如果一切正常，应该会看到类似如图5所示的窗口。 </P>
<P>图 5 ：简单的标签文件 </P>
<P>注意 : 重要的是要注意到这里没有为问候标签编写TLD，而是创建了一个标签文件并放在特殊的目录中，然后用taglib指令导入并直接使用它。 </P>
<P>另一个标签文件的例子 <BR>标签文件可以作为模板使用。考虑代码示例11中的标签文件display.tag，这个例子是根据Tomcat 5.0中的面板的例子改写的。指令attribute类似于TLD中的&lt;attribute&gt;元素，允许声明自定义的动作属性。 </P>
<P>代码示例11 : display.tag </P>
<P>&lt;%@ attribute name="color" %&gt; <BR>&lt;%@ attribute name="bgcolor" %&gt; <BR>&lt;%@ attribute name="title" %&gt; <BR>&lt;TABLE border="0" bgcolor="${color}"&gt; &lt;TR&gt; <BR>&lt;TD&gt;&lt;B&gt;${title}&lt;/B&gt;&lt;/TD&gt; <BR>&lt;/TR&gt; <BR>&lt;TR&gt; <BR>&lt;TD bgcolor="${bgcolor}"&gt; <BR>&lt;jsp:doBody/&gt; <BR>&lt;/TD&gt; <BR>&lt;/TR&gt; <BR>&lt;/TABLE&gt; <BR>代码示例12给出了使用上述标签的一个简单的JSP页面。 </P>
<P>代码示例12 : newsportal.jsp </P>
<P>&lt;%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %&gt; <BR>&lt;HTML&gt; <BR>&lt;HEAD&gt; <BR>&lt;TITLE&gt;Another Tag File Example&lt;/TITLE&gt; <BR>&lt;/HEAD&gt; <BR>&lt;BODY&gt; <BR>&lt;H2&gt;News Portal: Another Tag File Example&lt;/H2&gt; <BR>&lt;TABLE border="0"&gt; &lt;TR valign="top"&gt; <BR>&lt;TD&gt; <BR>&lt;tags:display color="#ff0000" bgcolor="#ffc0c0" <BR>title="Travel"&gt; <BR>Last French Concorde Arrives in NY&lt;br/&gt; <BR>Another Travel Headline&lt;br/&gt; <BR>Yet Another Travel Headline&lt;br/&gt; <BR>&lt;/tags:display&gt; <BR>&lt;/TD&gt; <BR>&lt;TD&gt; <BR>&lt;tags:display color="#00fc00" bgcolor="#c0ffc0" <BR>title="Technology"&gt; <BR>Java for in-flight entertainment&lt;BR&gt; <BR>Another Technology Headline&lt;BR&gt; <BR>Another Technology Headline&lt;BR&gt; <BR>&lt;/tags:display&gt; <BR>&lt;/TD&gt; <BR>&lt;TD&gt; <BR>&lt;tags:display color="#ffcc11" bgcolor="#ffffcc" <BR>title="Sports"&gt; <BR>American Football&lt;BR/&gt; <BR>NBA&lt;BR/&gt; <BR>Soccer&lt;BR/&gt; <BR>&lt;/tags:display&gt; <BR>&lt;/TD&gt; <BR>&lt;/TR&gt; <BR>&lt;/TABLE&gt; <BR>&lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>要运行这个例子： </P>
<P>复制文件display.tag并保存在c:\Tomcat5.0\webapps\jsp-examples\WEB-INF\tag 下； <BR>复制文件newsportal.jsp并保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下； <BR>用浏览器打开newsportal文件。 <BR>结果应该会得到与图6类似的画面。 </P>
<P><BR>图 6 ：把标签文件用作模板 </P>
<P>结论 <BR>JSP 2.0使得快速开发和维护动态网页比以前更加容易，尽管“Java”一词出现在JSP中，但使用JSP2.0，网页作者无须学习Java程序语言本身，就能开发出全新的动态网页。本文中的例子说明了使用JSP2.0的新特性开发动态网页是多么容易。 </P>
<P>更多信息 <BR>Fast Track JSP 1.2 <BR>JavaServer Pages Technology <BR>JavaServer Pages Specification (JSR 152) <BR>The Tomcat 5 Servlet/JSP Container <BR>JSP Developers Forum <BR>JavaServer Pages Standard Tag Library (JSTL) <BR>&nbsp;&nbsp; <BR></P><img src ="http://www.blogjava.net/huhu/aggbug/5687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:18 <a href="http://www.blogjava.net/huhu/articles/5687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中自定义标记符的使用</title><link>http://www.blogjava.net/huhu/articles/5686.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5686.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5686.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5686.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JSP中自定义标记符的使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/huhu/articles/5686.html'>阅读全文</a><img src ="http://www.blogjava.net/huhu/aggbug/5686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:17 <a href="http://www.blogjava.net/huhu/articles/5686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中取得当前绝对路径的方法</title><link>http://www.blogjava.net/huhu/articles/5678.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5678.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5678.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5678.html</trackback:ping><description><![CDATA[Asp中，我们可以用Server.Mappath(".")直接取到当前程序所在目录的绝对路径（也叫物理路径）， 
<P>但是在jsp中好像没有直接的方法可以取得当前目录的绝对路径。 <BR></P>
<P><FONT color=#0000ff>request.getRealPath()</FONT>只是取得根目录所对应的绝对路径，看了一下Servlet API文档，发现可以 </P>
<P>通过这种方式获得当前文件的绝对路径名，比如在我的cqq.jsp文件中这样写： <BR></P>
<P>&lt;% <BR><BR>String strAbsPath=application.getRealPath(request.getRequestURI()); <BR><BR>out.println(strAbsPath); <BR><BR>%&gt; <BR></P>
<P>其实jsp中的application对象就是Servlet中的ServerContext <BR></P>
<P>这样得到的路径就是 D:\aaa\bbb\ccc\cqq.jsp 这样的，如果我们不想要后面的文件名呢， <BR></P>
<P>就是我们想得到 D:\aaa\bbb\ccc\ 这个路径， 我们就可以直接用File类来操作了。</P>
<P><BR>完整的语句应该是这样的： <BR><FONT style="BACKGROUND-COLOR: #ff0000" color=#ffff00>String strAbsPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();</FONT> </P><img src ="http://www.blogjava.net/huhu/aggbug/5678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:03 <a href="http://www.blogjava.net/huhu/articles/5678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tag File简介</title><link>http://www.blogjava.net/huhu/articles/5671.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5671.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5671.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5671.html</trackback:ping><description><![CDATA[<SPAN class=javascript id=text57544>Tag File是從JSP 2.0開始新增的功能，主要的目的是讓撰寫JSP網頁的網頁設計人員即使在不懂Java語法的情況下，也可以使用JSP語法來自訂標籤，若能搭配JSTL（Java Standard Tag Library）或其它自訂標籤庫，不懂Java語法的JSP設計人員也可以設計出相當實用的自訂標籤。 <BR><BR>我們可以來設計一個簡單的Tag File，Tag File通常是存放在WEB-INF/tags/目錄下，下面是我們設計的簡單Tag File： <BR><PRE class=codeStyle>&lt;table border="1"&gt;
   &lt;tr&gt;&lt;td&gt;Hello! World!&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</PRE><BR><BR>假設我們的Tag File取名為hello.tag，*.tag是Tag File建議的副檔名，也可以是*.tagx，Tag File也可以包括其它的Tag File，如果是這樣的情況，建議可以用*.tagf作為副檔名。 <BR><BR>我們的Tag File中目前只有靜態的內容，事實上您可以在當中使用合法的JSP語法來撰寫，像是Scriptlet、EL、指令元素或動作元素等等，我們可以撰寫以下的JSP網頁來使用自訂的Tag File： <BR><PRE class=codeStyle>&lt;%@taglib prefix="demo" tagdir="/WEB-INF/tags" %&gt;
&lt;html&gt;
&lt;body&gt;
  &lt;demo:hello/&gt;
&lt;/body&gt;
&lt;/html&gt;</PRE><BR><BR>執行這個JSP網頁，將會傳回以下的內容： <BR><PRE class=codeStyle>&lt;html&gt;
&lt;body&gt;
&lt;table border="1"&gt;
   &lt;tr&gt;&lt;td&gt;Hello! World!&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</PRE><BR><BR>Tag File實際上會轉譯為Simple Tag，以Tomcat為例的話，您可以在work\Catalina\localhost\myjsp\org\apache\jsp\tag\web下找到轉譯之後的*.java與*.class檔案，名稱為hello_tag.java與hello_tag.class，是繼承SimpleTagSupport的類別。 <BR><BR>在Tag File中可以使用out、config、request、response、session、application、jspContext等隱含物件，前六個的使用與JSP網頁中所使用的隱含物件是相同的，jspContext在轉譯之後，實際上則是JspContext物件。 <BR><BR>在Tag File中可以使用&lt;jsp:invoke&gt;與&lt;jsp:doBody&gt;兩個標籤，前者可以用來處理Fragment，後者可以用來決定要不要處理標籤間的本體文字，這在之後我們會再介紹。 <BR><BR>在Tag File中可以使用的指令元素有taglib、include、tag、attribute、variable五個，前兩者的使用方式與在JSP網頁中是相同的，tag指令則類似於JSP網頁中的page指令，用於指定與Tag File相關的屬性（像是pageEncoding、body-content等），attribute用以指定標籤的屬性，而variable用於設定Tag File的Scripting Variable，以傳回JSP網頁中使用，後三者詳細的使用會在之後作介紹。 </SPAN><img src ="http://www.blogjava.net/huhu/aggbug/5671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 15:49 <a href="http://www.blogjava.net/huhu/articles/5671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>