﻿<?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-Java Tools-随笔分类-JSP</title><link>http://www.blogjava.net/simie/category/23730.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 29 Jul 2007 13:33:01 GMT</lastBuildDate><pubDate>Sun, 29 Jul 2007 13:33:01 GMT</pubDate><ttl>60</ttl><item><title> java中相对路径，绝对路径问题总结</title><link>http://www.blogjava.net/simie/archive/2007/07/29/133094.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Sun, 29 Jul 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/29/133094.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/133094.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/29/133094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/133094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/133094.html</trackback:ping><description><![CDATA[1.基本概念的理解
<p>　　绝对路径：绝对路径就是你的主页上的文件或目录在硬盘上真正的路径，(URL和物理路径)例如：<br>C:\xyz\test.txt&nbsp;代表了test.txt文件的绝对路径。<a href="http://www.sun.com/index.htm"><u><font color=#0000ff>http://www.sun.com/index.htm</font></u></a>也代表了一个<br>URL绝对路径。</p>
<p>　　相对路径：相对与某个基准目录的路径。包含Web的相对路径（HTML中的相对目录），例如：在<br>Servlet中，"/"代表Web应用的跟目录。和物理路径的相对表示。例如："./" 代表当前目录,<br>"../"代表上级目录。这种类似的表示，也是属于相对路径。</p>
<p>另外关于URI，URL,URN等内容，请参考RFC相关文档标准。</p>
<p>RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax, <br>(<a href="http://www.ietf.org/rfc/rfc2396.txt"><u><font color=#0000ff>http://www.ietf.org/rfc/rfc2396.txt</font></u></a>)</p>
<p><br>2.关于JSP/Servlet中的相对路径和绝对路径。</p>
<p>2.1服务器端的地址 </p>
<p>　　&nbsp;服务器端的相对地址指的是相对于你的web应用的地址，这个地址是在服务器端解析的<br>（不同于html和javascript中的相对地址，他们是由客户端浏览器解析的）也就是说这时候<br>在jsp和servlet中的相对地址应该是相对于你的web应用，即相对于<a href="http://192.168.0.1/webapp/"><u><font color=#0000ff>http://192.168.0.1/webapp/</font></u></a>的。 </p>
<p>　　其用到的地方有： <br>&nbsp;forward：servlet中的request.getRequestDispatcher(address);这个address是<br>在服务器端解析的，所以，你要forward到a.jsp应该这么写：<br>request.getRequestDispatcher(&#8220;/user/a.jsp&#8221;)这个/相对于当前的web应用webapp，<br>其绝对地址就是：<a href="http://192.168.0.1/webapp/user/a.jsp"><u><font color=#0000ff>http://192.168.0.1/webapp/user/a.jsp</font></u></a>。 <br>sendRedirect：在jsp中&lt;%response.sendRedirect("/rtccp/user/a.jsp");%&gt; </p>
<p>2.22、客户端的地址 <br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有的html页面中的相对地址都是相对于服务器根目录(<a href="http://192.168.0.1/"><u><font color=#0000ff>http://192.168.0.1/</font></u></a>)的，<br>而不是(跟目录下的该Web应用的目录)http://192.168.0.1/webapp/的。 <br>&nbsp;Html中的form表单的action属性的地址应该是相对于服务器根目录(<a href="http://192.168.0.1/"><u><font color=#0000ff>http://192.168.0.1/</font></u></a>)的，<br>所以，如果提交到a.jsp为：action＝"/webapp/user/a.jsp"或action="&lt;%=request.getContextPath()%&gt;"/user/a.jsp；<br>　　提交到servlet为actiom＝"/webapp/handleservlet" &nbsp;<br>&nbsp;　　Javascript也是在客户端解析的，所以其相对路径和form表单一样。 <br>&nbsp;</p>
<p>　　因此，一般情况下，在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上<br>&lt;%=request.getContextPath()%&gt;,以确保所引用的文件都属于Web应用中的目录。<br>另外，应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径，这样<br>当文件移动时，很容易出问题。</p>
<p><br>3. JSP/Servlet中获得当前应用的相对路径和绝对路径<br>3.1 JSP中获得当前应用的相对路径和绝对路径<br>&nbsp;根目录所对应的绝对路径:request.getRequestURI()<br>&nbsp;文件的绝对路径&nbsp;&nbsp;&nbsp; 　:application.getRealPath(request.getRequestURI());<br>&nbsp;当前web应用的绝对路径 :application.getRealPath("/");<br>&nbsp;取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()</p>
<p>3.2 Servlet中获得当前应用的相对路径和绝对路径<br>&nbsp;根目录所对应的绝对路径:request.getServletPath();<br>&nbsp;文件的绝对路径&nbsp;&nbsp;&nbsp; :request.getSession().getServletContext().getRealPath<br>(request.getRequestURI())&nbsp;&nbsp;&nbsp;<br>&nbsp;当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ServletContext对象获得几种方式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.http.HttpSession.getServletContext() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.jsp.PageContext.getServletContext() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.ServletConfig.getServletContext() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</p>
<p>4.java 的Class中获得相对路径，绝对路径的方法<br>4.1单独的Java类中获得绝对路径<br>　　根据java.io.File的Doc文挡，可知:<br>&nbsp;默认情况下new File("/")代表的目录为：System.getProperty("user.dir")。<br>&nbsp;一下程序获得执行类的当前路径<br>package org.cheng.file;<br>import java.io.File;</p>
<p>public class FileTest {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;System.out.println(FileTest.class.getClassLoader().getResource(""));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>　　System.out.println(ClassLoader.getSystemResource(""));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;System.out.println(FileTest.class.getResource(""));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;System.out.println(FileTest.class.getResource("/")); //Class文件所在路径&nbsp; <br>&nbsp;&nbsp;System.out.println(new File("/").getAbsolutePath());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;System.out.println(System.getProperty("user.dir"));&nbsp;&nbsp;&nbsp; <br>&nbsp;}<br>}</p>
<p>4.2服务器中的Java类获得当前路径（来自网络）<br>(1).Weblogic</p>
<p>WebApplication的系统文件根目录是你的weblogic安装所在根目录。<br>例如：如果你的weblogic安装在c:\bea\weblogic700.....<br>那么，你的文件根路径就是c:\.<br>所以，有两种方式能够让你访问你的服务器端的文件：<br>a.使用绝对路径：<br>比如将你的参数文件放在c:\yourconfig\yourconf.properties，<br>直接使用 new FileInputStream("yourconfig/yourconf.properties");<br>b.使用相对路径：<br>相对路径的根目录就是你的webapplication的根路径，即WEB-INF的上一级目录，将你的参数文件放</p>
<p>在yourwebapp\yourconfig\yourconf.properties，<br>这样使用：<br>new FileInputStream("./yourconfig/yourconf.properties");<br>这两种方式均可，自己选择。</p>
<p>(2).Tomcat</p>
<p>在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin</p>
<p>(3).Resin</p>
<p>不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET<br>的路径为根.比如用新建文件法测试File f = new File("a.htm");<br>这个a.htm在resin的安装目录下 </p>
<p>(4).如何读相对路径哪？</p>
<p>在Java文件中getResource或getResourceAsStream均可</p>
<p>例：getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web</p>
<p>发布根路径下WEB-INF/classes</p>
<p>默认使用该方法的路径是：WEB-INF/classes。已经在Tomcat中测试。</p>
<p>5.读取文件时的相对路径，避免硬编码和绝对路径的使用。（来自网络）<br>5.1 采用Spring的DI机制获得文件，避免硬编码。<br>&nbsp; &nbsp;参考下面的连接内容：<br>&nbsp; &nbsp;<a href="http://www.javajia.net/viewtopic.php?p=90213"><u><font color=#0000ff>http://www.javajia.net/viewtopic.php?p=90213</font></u></a>&amp;<br>5.2 配置文件的读取<br>&nbsp;参考下面的连接内容：<br>&nbsp;<a href="http://dev.csdn.net/develop/article/39/39681.shtm"><u><font color=#0000ff>http://dev.csdn.net/develop/article/39/39681.shtm</font></u></a><br>5.3 通过虚拟路径或相对路径读取一个xml文件，避免硬编码<br>&nbsp;参考下面的连接内容：<br>&nbsp;<a href="http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8"><u><font color=#0000ff>http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8</font></u></a><br>&nbsp;<br>6.Java中文件的常用操作（复制，移动，删除，创建等）（来自网络）<br>&nbsp;常用 java File 操作类 <br>&nbsp;<a href="http://www.easydone.cn/014/200604022353065155.htm"><u><font color=#0000ff>http://www.easydone.cn/014/200604022353065155.htm</font></u></a><br>&nbsp;<br>&nbsp;Java文件操作大全（JSP中）<br>&nbsp;<a href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html"><u><font color=#0000ff>http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html</font></u></a></p>
<p>&nbsp;java文件操作详解（Java中文网）<br>&nbsp;<a href="http://www.51cto.com/html/2005/1108/10947.htm"><u><font color=#0000ff>http://www.51cto.com/html/2005/1108/10947.htm</font></u></a></p>
<p>&nbsp;JAVA 如何创建\删除\修改\复制目录及文件<br>&nbsp;<a href="http://www.gamvan.com/developer/java/2005/2/264.html"><u><font color=#0000ff>http://www.gamvan.com/developer/java/2005/2/264.html</font></u></a></p>
<p>总结：<br>&nbsp;通过上面内容的使用，可以解决在Web应用服务器端，移动文件，查找文件，复制<br>&nbsp;删除文件等操作，同时对服务器的相对地址，绝对地址概念更加清晰。<br>建议参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.等内容了解透彻<br>对其他方面的理解可以更加深入和透彻。<br>==================================================================================</p>
<p>参考资料:<br>java/docs/</p>
<p>java.io.File<br>java.io.InputStream<br>java.io.OutputStream<br>java.io.FileInputStream<br>java.io.FileReader;<br>java.io.FileOutputStream<br>java.io.FileWriter;<br>java.net.URI<br>java.net.URL</p>
<p><br>绝对路径与相对路径祥解<br><a href="http://www.webjx.com/htmldata/2005-02-26/1109430310.html"><u><font color=#0000ff>http://www.webjx.com/htmldata/2005-02-26/1109430310.html</font></u></a></p>
<p>[『J道习练』]JSP和Servlet中的绝对路径和相对路径<br><a href="http://w3china.org/blog/more.asp?name=pcthomas&amp;id=9122&amp;commentid=12376"><u><font color=#0000ff>http://w3china.org/blog/more.asp?name=pcthomas&amp;id=9122&amp;commentid=12376</font></u></a></p>
<p>JSP,Servlet,Class获得当前应用的相对路径和绝对路径<br><a href="http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&amp;tID=886&amp;ccID=77"><u><font color=#0000ff>http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&amp;tID=886&amp;ccID=77</font></u></a></p>
<p>如何获得当前文件路径<br><a href="http://www.matrix.org.cn/resource/article/44/44113_java.html"><u><font color=#0000ff>http://www.matrix.org.cn/resource/article/44/44113_java.html</font></u></a></p>
<p>通过Spring注入机制，取得文件<br><a href="http://www.javajia.net/viewtopic.php?p=90213"><u><font color=#0000ff>http://www.javajia.net/viewtopic.php?p=90213</font></u></a>&amp;</p>
<p>配置文件的读取 <br><a href="http://dev.csdn.net/develop/article/39/39681.shtm"><u><font color=#0000ff>http://dev.csdn.net/develop/article/39/39681.shtm</font></u></a></p>
<p>读取配置文件,通过虚拟路径或相对路径读取一个xml文件，避免硬编码！ <br><a href="http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8"><u><font color=#0000ff>http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8</font></u></a></p>
<p>常用 java File 操作类<br><a href="http://www.easydone.cn/014/200604022353065155.htm"><u><font color=#0000ff>http://www.easydone.cn/014/200604022353065155.htm</font></u></a></p>
<p>Java文件操作大全<br><a href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html"><u><font color=#0000ff>http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html</font></u></a></p>
<p>Java文件操作详解<br><a href="http://www.51cto.com/html/2005/1108/10947.htm"><u><font color=#0000ff>http://www.51cto.com/html/2005/1108/10947.htm</font></u></a>&nbsp;</p>
<img src ="http://www.blogjava.net/simie/aggbug/133094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-29 11:08 <a href="http://www.blogjava.net/simie/archive/2007/07/29/133094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP语法的xml表达 </title><link>http://www.blogjava.net/simie/archive/2007/07/29/133091.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Sun, 29 Jul 2007 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/29/133091.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/133091.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/29/133091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/133091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/133091.html</trackback:ping><description><![CDATA[<font face="Courier New">大家总是不喜欢看到&lt;%和%&gt;在jsp页面上，其实我们可以使用比较优雅的xml方式来表达<br><font color=#990000>1</font><font color=#000000>，隐含的注释</font><br><font color=#000000>JSP语法：&lt;%--&nbsp;内容&nbsp;--%&gt;</font><br><font color=#000000>XML语法：无</font><br><font color=#990000>2</font><font color=#000000>，变量或函数的声明</font><br><font color=#000000>JSP语法:&lt;%!&nbsp;declaration;</font><font color=#000000>[</font><font color=#000000>declaration;</font><font color=#000000>]</font><font color=#000000>+...&nbsp;%&gt;</font><br><font color=#000000>例如：</font><br><font color=#000000>&lt;%!&nbsp;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>int&nbsp;</strong></font><font color=#000000>i=</font><font color=#990000>0</font><font color=#000000>;</font><font color=#7f0055><strong>int&nbsp;</strong></font><font color=#000000>a,b,c;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>Color&nbsp;red=</font><font color=#7f0055><strong>new&nbsp;</strong></font><font color=#000000>Color</font><font color=#000000>(</font><font color=#990000>255</font><font color=#000000>,</font><font color=#990000>0</font><font color=#000000>,</font><font color=#990000>0</font><font color=#000000>)</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>private&nbsp;static&nbsp;final&nbsp;</strong></font><font color=#000000>String&nbsp;OK=</font><font color=#2a00ff>"ok"</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>public&nbsp;</strong></font><font color=#000000>String&nbsp;getAnswer</font><font color=#000000>(){</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>return&nbsp;</strong></font><font color=#000000>OK;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>}</font><br><font color=#000000>%&gt;</font><br><font color=#000000>XML语法：</font><br><font color=#000000>&lt;jsp:declaration&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#000000>declartion;</font><font color=#000000>[</font><font color=#000000>declaration;</font><font color=#000000>]</font><font color=#000000>+...</font><br><font color=#000000>&lt;/jsp:declaration&gt;</font><br><font color=#000000>例如：</font><br><font color=#000000>&lt;jsp:declaration&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>int&nbsp;</strong></font><font color=#000000>i=</font><font color=#990000>0</font><font color=#000000>;</font><font color=#7f0055><strong>int&nbsp;</strong></font><font color=#000000>a,b,c;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>Color&nbsp;red=</font><font color=#7f0055><strong>new&nbsp;</strong></font><font color=#000000>Color</font><font color=#000000>(</font><font color=#990000>255</font><font color=#000000>,</font><font color=#990000>0</font><font color=#000000>,</font><font color=#990000>0</font><font color=#000000>)</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>private&nbsp;static&nbsp;final&nbsp;</strong></font><font color=#000000>String&nbsp;OK=</font><font color=#2a00ff>"ok"</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>public&nbsp;</strong></font><font color=#000000>String&nbsp;getAnswer</font><font color=#000000>(){</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>return&nbsp;</strong></font><font color=#000000>OK;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>}</font><br><font color=#000000>&lt;/jsp:declaration&gt;</font><br><font color=#990000>3</font><font color=#000000>，表达式</font><br><font color=#000000>JSP语法：&lt;%=expression%&gt;</font><br><font color=#000000>例如：</font><br><font color=#000000>&lt;%=Math.round</font><font color=#000000>(</font><font color=#000000>Math.random*</font><font color=#990000>100</font><font color=#000000>)</font><font color=#000000>%&gt;</font><br><font color=#000000>XML语法：</font><br><font color=#000000>&lt;jsp:expression&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>expression</font><br><font color=#000000>&lt;/jsp:expression&gt;</font><br><font color=#000000>例如：</font><br><font color=#000000>&lt;jsp:expression&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>Math.round</font><font color=#000000>(</font><font color=#000000>Math.random*</font><font color=#990000>100</font><font color=#000000>)</font><br><font color=#000000>&lt;/jsp:expression&gt;</font><br><font color=#ffffff></font><br><font color=#990000>4</font><font color=#000000>，代码片断</font><br><font color=#000000>JSP语法：&lt;%&nbsp;your&nbsp;java&nbsp;code&nbsp;%&gt;</font><br><font color=#000000>例如：</font><br><font color=#000000>&lt;%</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>String&nbsp;username=request.getParameter</font><font color=#000000>(</font><font color=#2a00ff>"username"</font><font color=#000000>)</font><font color=#000000>.trim</font><font color=#000000>()</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>String&nbsp;password=request.getParameter</font><font color=#000000>(</font><font color=#2a00ff>"password"</font><font color=#000000>)</font><font color=#000000>.trim</font><font color=#000000>()</font><font color=#000000>;</font><br><font color=#000000>%&gt;</font><br><font color=#000000>XMl语法：</font><br><font color=#000000>&lt;jsp:scriptlet&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>your&nbsp;java&nbsp;code</font><br><font color=#000000>&lt;/jsp:scriptlet&gt;</font><br><font color=#000000>例如：</font><br><font color=#000000>&lt;jsp:scriptlet&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>String&nbsp;username=request.getParameter</font><font color=#000000>(</font><font color=#2a00ff>"username"</font><font color=#000000>)</font><font color=#000000>.trim</font><font color=#000000>()</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;</font><font color=#000000>String&nbsp;password=request.getParameter</font><font color=#000000>(</font><font color=#2a00ff>"password"</font><font color=#000000>)</font><font color=#000000>.trim</font><font color=#000000>()</font><font color=#000000>;</font><br><font color=#000000>&lt;/jsp:scriptlet&gt;</font><br><font color=#990000>5</font><font color=#000000>，指令：include</font><br><font color=#000000>JSP语法：&lt;%@include&nbsp;file=</font><font color=#2a00ff>"relativeURL"</font><font color=#000000>%&gt;</font><br><font color=#000000>例如：&lt;%@include&nbsp;file=</font><font color=#2a00ff>"static_head.html"</font><font color=#000000>%&gt;</font><br><font color=#000000>XML语法：&lt;jsp:directive.include&nbsp;file=</font><font color=#2a00ff>"relativeURL"</font><font color=#000000>/&gt;</font><br><font color=#000000>例如：&lt;jsp:directive.include&nbsp;file=</font><font color=#2a00ff>"static_head.html"</font><font color=#000000>/&gt;</font><br><font color=#990000>6</font><font color=#000000>，指令：page</font><br><font color=#000000>JSP语法：&lt;%@page&nbsp;attribtes%&gt;</font><br><font color=#000000>例如：&lt;%@page&nbsp;</font><font color=#7f0055><strong>import</strong></font><font color=#000000>=</font><font color=#2a00ff>"java.util.HashMap"</font><font color=#000000>%&gt;</font><br><font color=#000000>XML语法：&lt;jsp:directive.page&nbsp;attribute/&gt;</font><br><font color=#000000>例如：&lt;jsp:directive.page&nbsp;</font><font color=#7f0055><strong>import</strong></font><font color=#000000>=</font><font color=#2a00ff>"java.util.HashMap"</font><font color=#000000>/&gt;</font><br><font color=#990000>7</font><font color=#000000>,指令：taglib</font><br><font color=#000000>JSP语法：&lt;%@taglib&nbsp;uri=</font><font color=#2a00ff>"URIForLibrary"&nbsp;</font><font color=#000000>prefix=</font><font color=#2a00ff>"tagPrefix"</font><font color=#000000>%&gt;</font><br><font color=#000000>XML语法：无</font><br><font color=#000000>对于jsp操作而言，本来就是xml格式。</font><br><font color=#000000>下面使用xml表达方式书写一个jsp页面</font><br><font color=#ffffff></font><br><font color=#000000>example.jsp</font><br><font color=#ffffff></font><br><font color=#000000>&lt;jsp:directive.page&nbsp;contentType=</font><font color=#2a00ff>"text/html;charset=GBK"&nbsp;</font><font color=#000000>/&gt;</font><br><font color=#000000>&lt;jsp:directive.page&nbsp;</font><font color=#7f0055><strong>import</strong></font><font color=#000000>=</font><font color=#2a00ff>"java.util.*,java.text.*"&nbsp;</font><font color=#000000>/&gt;</font><br><font color=#ffffff></font><br><font color=#000000>&lt;jsp:declartion&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>public&nbsp;</strong></font><font color=#000000>String&nbsp;getCustomDate</font><font color=#000000>(</font><font color=#000000>Date,date,String&nbsp;pattern</font><font color=#000000>){</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#000000>SimpleDateFormat&nbsp;format=</font><font color=#7f0055><strong>new&nbsp;</strong></font><font color=#000000>SimpleDateFormat</font><font color=#000000>()</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#000000>format.applyPattern</font><font color=#000000>(</font><font color=#000000>pattern</font><font color=#000000>)</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#7f0055><strong>return&nbsp;</strong></font><font color=#000000>format.format</font><font color=#000000>(</font><font color=#000000>date</font><font color=#000000>)</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#000000>}</font><br><font color=#000000>&lt;/jsp:declartion&gt;</font><br><font color=#000000>&lt;jsp:scriptlet&gt;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#000000>Date&nbsp;date=</font><font color=#000000>(</font><font color=#000000>Date</font><font color=#000000>)</font><font color=#000000>request.getAttribute</font><font color=#000000>(</font><font color=#2a00ff>"date"</font><font color=#000000>)</font><font color=#000000>;</font><br><font color=#ffffff>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#000000>String&nbsp;dateStr=getCustomDate</font><font color=#000000>(</font><font color=#000000>date,</font><font color=#2a00ff>"yyyy-MM-dd,hh:mm:ss"</font><font color=#000000>)</font><font color=#000000>;</font><br><font color=#000000>&lt;/jsp:scriptlet&gt;</font><br><font color=#000000>&lt;div&nbsp;style=</font><font color=#2a00ff>"font-size:11pt"</font><font color=#000000>&gt;&nbsp;</font><br><font color=#ffffff>&nbsp;&nbsp;</font><font color=#000000>显示时间：&lt;jsp:expression&gt;dateStr&lt;/jsp:expression&gt;</font><br><font color=#000000>&lt;/div&gt;</font></font> 
<img src ="http://www.blogjava.net/simie/aggbug/133091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-29 10:39 <a href="http://www.blogjava.net/simie/archive/2007/07/29/133091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp自定义错误页 </title><link>http://www.blogjava.net/simie/archive/2007/07/29/133086.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Sun, 29 Jul 2007 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/29/133086.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/133086.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/29/133086.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/133086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/133086.html</trackback:ping><description><![CDATA[<p>为了给浏览者一个友好的错误提示页面，我们可以象IIS一样自定义错误页面；</p>
<p>步骤如下：</p>
<p>一、打开WEB-INF文件夹下web.xml文件；</p>
<p>二、在里面新增：</p>
<p>''404页面不存在错误</p>
<p>&lt;error-page&gt;</p>
<p>&nbsp;&nbsp; &lt;error-code&gt;404&lt;/error-code&gt;</p>
<p>&nbsp;&nbsp; &lt;location&gt;/errorpage404.htm&lt;/location&gt;</p>
<p>&lt;/error-page&gt;</p>
<p>''505服务器内部错误</p>
<p>&lt;error-page&gt;</p>
<p>&nbsp;&nbsp; &lt;error-code&gt;505&lt;/error-code&gt;</p>
<p>&nbsp;&nbsp; &lt;location&gt;/errorpage505.htm&lt;/location&gt;</p>
<p>&lt;/error-page&gt;</p>
<p>''java.lang.NumberFormatException异常错误,依据这个标记你可以定义好多，you can any fire:)!@</p>
<p>&lt;error-page&gt;</p>
<p>&nbsp;&nbsp; &lt;exception-type&gt;java.lang.NumberFormatException&lt;/exception-type&gt;</p>
<p>&nbsp;&nbsp; &lt;location&gt;/exception.htm&lt;/location&gt;</p>
<p>&lt;/error-page&gt;</p>
<p>三、保存web.xml文件，reload服务即ok!</p>
<p>Good Luck!!</p>
<img src ="http://www.blogjava.net/simie/aggbug/133086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-29 10:05 <a href="http://www.blogjava.net/simie/archive/2007/07/29/133086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发一个调试 JSP 的 Eclipse 插件</title><link>http://www.blogjava.net/simie/archive/2007/07/03/127887.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Tue, 03 Jul 2007 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/03/127887.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127887.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/03/127887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127887.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文通过开发一个JSP 编辑器插件的示例，介绍了 Eclipse 中设置 JSP 断点的方法，以及如何远程调试 JSP。作为基础知识，本文的前两部分描述了 JAVA Debug 和 JSR-45 的基本原理。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/simie/archive/2007/07/03/127887.html'>阅读全文</a><img src ="http://www.blogjava.net/simie/aggbug/127887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-03 16:40 <a href="http://www.blogjava.net/simie/archive/2007/07/03/127887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP生成验证码源程序</title><link>http://www.blogjava.net/simie/archive/2007/07/03/127839.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Tue, 03 Jul 2007 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/03/127839.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127839.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/03/127839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127839.html</trackback:ping><description><![CDATA[<table borderColor=#666666 cellSpacing=4 borderColorDark=#cccccc cellPadding=0 width="100%" bgColor=#cccccc borderColorLight=#666666 border=1>
    <tbody>
        <tr>
            <td style="WORD-BREAK: break-all" align=left>&lt;%@&nbsp;page&nbsp;contentType="image/jpeg"&nbsp;import="java.awt.*,&nbsp;<br>java.awt.image.*,java.util.*,javax.imageio.*"&nbsp;%&gt;&nbsp;<br>&lt;%&nbsp;<br>//&nbsp;在内存中创建图象&nbsp;<br>int&nbsp;width=60,&nbsp;height=20;&nbsp;<br>BufferedImage&nbsp;image&nbsp;=&nbsp;new&nbsp;BufferedImage(width,&nbsp;height,&nbsp;<br>BufferedImage.TYPE_INT_RGB);&nbsp;<br><br>//&nbsp;获取图形上下文&nbsp;<br>Graphics&nbsp;g&nbsp;=&nbsp;image.getGraphics();&nbsp;<br><br>//&nbsp;设定背景色&nbsp;<br>g.setColor(new&nbsp;Color(0xDCDCDC));&nbsp;<br>g.fillRect(0,&nbsp;0,&nbsp;width,&nbsp;height);&nbsp;<br><br>//画边框&nbsp;<br>g.setColor(Color.black);&nbsp;<br>g.drawRect(0,0,width-1,height-1);&nbsp;<br><br>//&nbsp;取随机产生的认证码(4位数字)&nbsp;<br>String&nbsp;rand&nbsp;=&nbsp;request.getParameter("rand");&nbsp;<br>rand&nbsp;=&nbsp;rand.substring(0,rand.indexOf("."));&nbsp;<br>switch(rand.length())&nbsp;<br>{&nbsp;<br>case&nbsp;1:&nbsp;rand&nbsp;=&nbsp;"000"+rand;&nbsp;break;&nbsp;<br>case&nbsp;2:&nbsp;rand&nbsp;=&nbsp;"00"+rand;&nbsp;break;&nbsp;<br>case&nbsp;3:&nbsp;rand&nbsp;=&nbsp;"0"+rand;&nbsp;break;&nbsp;<br>default:&nbsp;rand&nbsp;=&nbsp;rand.substring(0,4);&nbsp;break;&nbsp;<br>}&nbsp;<br><br>//&nbsp;将认证码存入SESSION&nbsp;<br>session.setAttribute("rand",rand);&nbsp;<br><br>//&nbsp;将认证码显示到图象中&nbsp;<br>g.setColor(Color.black);&nbsp;<br>Integer&nbsp;tempNumber&nbsp;=&nbsp;new&nbsp;Integer(rand);&nbsp;<br>String&nbsp;numberStr&nbsp;=&nbsp;tempNumber.toString();&nbsp;<br><br>g.setFont(new&nbsp;Font("Atlantic&nbsp;Inline",Font.PLAIN,18));&nbsp;<br>String&nbsp;Str&nbsp;=&nbsp;numberStr.substring(0,1);&nbsp;<br>g.drawString(Str,8,17);&nbsp;<br><br>Str&nbsp;=&nbsp;numberStr.substring(1,2);&nbsp;<br>g.drawString(Str,20,15);&nbsp;<br>Str&nbsp;=&nbsp;numberStr.substring(2,3);&nbsp;<br>g.drawString(Str,35,18);&nbsp;<br><br>Str&nbsp;=&nbsp;numberStr.substring(3,4);&nbsp;<br>g.drawString(Str,45,15);&nbsp;<br><br>//&nbsp;随机产生88个干扰点，使图象中的认证码不易被其它程序探测到&nbsp;<br>Random&nbsp;random&nbsp;=&nbsp;new&nbsp;Random();&nbsp;<br>for&nbsp;(int&nbsp;i=0;i&lt;20;i++)&nbsp;<br>{&nbsp;<br>int&nbsp;x&nbsp;=&nbsp;random.nextInt(width);&nbsp;<br>int&nbsp;y&nbsp;=&nbsp;random.nextInt(height);&nbsp;<br>g.drawOval(x,y,0,0);&nbsp;<br>}&nbsp;<br><br>//&nbsp;图象生效&nbsp;<br>g.dispose();&nbsp;<br><br>//&nbsp;输出图象到页面&nbsp;<br>ImageIO.write(image,&nbsp;"JPEG",&nbsp;response.getOutputStream());&nbsp;<br>%&gt;</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/simie/aggbug/127839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-03 14:51 <a href="http://www.blogjava.net/simie/archive/2007/07/03/127839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet 中的汉字编码问题</title><link>http://www.blogjava.net/simie/archive/2007/07/03/127838.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Tue, 03 Jul 2007 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/03/127838.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127838.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/03/127838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127838.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <h1>JSP/Servlet 中的汉字编码问题</h1>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><img height=18 alt=developerWorks src="http://www-128.ibm.com/developerworks/cn/i/dw.gif" width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <table class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=0 width=150 border=0>
                            <tbody>
                                <tr>
                                    <td class=v14-header-1-small>文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td class=no-padding width=150>
                                    <table cellSpacing=0 cellPadding=0 width=143 border=0>
                                        <img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8>
                                        <form name=email action=https://www.ibm.com/developerworks/secure/email-it.jsp>
                                            <input type=hidden value="网上就 JSP/Servlet 中 DBCS字符编码问题有许多优秀的文章和讨论，本文对它们作一些整理，并结合IBM WebSphere Application Server3.5（WAS）的解决方法作一些说明，希望它不是多余的。" name=body><input type=hidden value="JSP/Servlet 中的汉字编码问题" name=subject><input type=hidden value=cn name=lang>
                                            <script language=JavaScript type=text/javascript>
                                            <!--
                                            document.write('
                                            <tr valign="top">
                                                <td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                                <td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td>
                                                <td width="122">
                                                <p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                                </td>
                                            </tr>
                                            ');
                                            //-->
                                            </script>
                                            <tbody>
                                                <tr vAlign=top>
                                                    <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                    <td width=16><img height=16 alt=将此页作为电子邮件发送 src="http://www.ibm.com/i/v14/icons/em.gif" width=16 vspace=3></td>
                                                    <td width=122>
                                                    <p><a class=smallplainlink href="javascript:document.email.submit();"><strong><font color=#5c81a7 size=2>将此页作为电子邮件发送</font></strong></a></p>
                                                    </td>
                                                </tr>
                                                <noscript>
                                                <tr valign="top">
                                                    <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td class="small" width="122">
                                                    <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                                    </td>
                                                </tr>
                                                </noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><br><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br></td>
                    </tr>
                </tbody>
            </table>
            <p>级别: 初级</p>
            <p><a href="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/index.html#author"><u><font color=#996699>IBM</font></u></a>, <br></p>
            <p>2001 年 3 月 01 日</p>
            <blockquote><em>网上就 JSP/Servlet 中 DBCS字符编码问题有许多优秀的文章和讨论，本文对它们作一些整理，并结合IBM WebSphere Application Server3.5（WAS）的解决方法作一些说明，希望它不是多余的。</em> </blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p><a name=N1003B><span class=atitle>问题的起源</span></a></p>
            <p>每个国家（或区域）都规定了计算机信息交换用的字符编码集，如美国的扩展 ASCII码, 中国的 GB2312-80，日本的 JIS 等，作为该国家/区域内信息处理的基础，有着统一编码的重要作用。字符编码集按长度分为 SBCS（单字节字符集），DBCS（双字节字符集）两大类。早期的软件（尤其是操作系统），为了解决本地字符信息的计算机处理，出现了各种本地化版本（L10N），为了区分，引进了 LANG, Codepage 等概念。但是由于各个本地字符集代码范围重叠，相互间信息交换困难；软件各个本地化版本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来，作一致处理，将特别的本地化处理内容降低到最少。这也就是所谓的国际化（I18N）。各种语言信息被进一步规范为 Locale 信息。处理的底层字符集变成了几乎包含了所有字形的 Unicode。</p>
            <p>现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础的，在软件运行时根据当时的 Locale/Lang/Codepage 设置确定相应的本地字符编码设置，并依此处理本地字符。在处理过程中需要实现 Unicode 和本地字符集的相互转换，甚或以 Unicode 为中间的两个不同本地字符集的相互转换。这种方式在网络环境下被进一步延伸，任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。</p>
            <p>Java 语言内部是用 Unicode 表示字符的，遵守 Unicode V2.0。Java 程序无论是从/往文件系统以字符流读/写文件，还是往 URL 连接写 HTML 信息，或从 URL 连接读取参数值，都会有字符编码的转换。这样做虽然增加了编程的复杂度，容易引起混淆，但却是符合国际化的思想的。</p>
            <p>从理论上来说，这些根据字符集设置而进行的字符转换不应该产生太多问题。而事实是由于应用程序的实际运行环境不同，Unicode 和各个本地字符集的补充、完善，以及系统或应用程序实现的不规范，转码时出现的问题时时困扰着程序员和用户。 <a name=2></p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10050><span class=atitle>GB2312-80，GBK，GB18030-2000 汉字字符集及 Encoding</span></a></p>
            <p>其实解决 JAVA 程序中的汉字编码问题的方法往往很简单，但理解其背后的原因，定位问题，还需要了解现有的汉字编码和编码转换。</p>
            <p>GB2312-80 是在国内计算机汉字信息技术发展初始阶段制定的，其中包含了大部分常用的一、二级汉字，和 9 区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集，这也是最基本的中文字符集。其编码范围是高位0xa1－0xfe，低位也是 0xa1-0xfe；汉字从 0xb0a1 开始，结束于 0xf7fe；</p>
            <p>GBK 是 GB2312-80 的扩展，是向上兼容的。它包含了 20902 个汉字，其编码范围是 0x8140-0xfefe，剔除高位 0x80 的字位。其所有字符都可以一对一映射到 Unicode 2.0，也就是说 JAVA 实际上提供了 GBK 字符集的支持。这是现阶段 Windows 和其它一些中文操作系统的缺省字符集，但并不是所有的国际化软件都支持该字符集，感觉是他们并不完全知道 GBK 是怎么回事。值得注意的是它不是国家标准，而只是规范。随着 GB18030-2000国标的发布，它将在不久的将来完成它的历史使命。</p>
            <p>GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字，增加了藏、蒙等少数民族的字形。GBK2K 从根本上解决了字位不够，字形不足的问题。它有几个特点，</p>
            <ul>
                <li>它并没有确定所有的字形，只是规定了编码范围，留待以后扩充。
                <li>编码是变长的，其二字节部分与 GBK 兼容；四字节部分是扩充的字形、字位，其编码范围是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39。
                <li>它的推广是分阶段的，首先要求实现的是能够完全映射到 Unicode 3.0 标准的所有字形。
                <li>它是国家标准，是强制性的。 </li>
            </ul>
            <p>现在还没有任何一个操作系统或软件实现了 GBK2K 的支持，这是现阶段和将来汉化的工作内容。</p>
            <p>Unicode 的介绍......就免了吧。</p>
            <p>JAVA 支持的encoding中与中文编程相关的有：(有几个在JDK文档中未列出)</p>
            <table cellSpacing=0 cellPadding=3 border=1>
                <tbody>
                    <tr vAlign=top>
                        <td>ASCII</td>
                        <td>7-bit, 同 ascii7</td>
                    </tr>
                    <tr vAlign=top>
                        <td>ISO8859-1</td>
                        <td>8-bit, 同 8859_1,ISO-8859-1,ISO_8859-1,latin1...</td>
                    </tr>
                    <tr vAlign=top>
                        <td>GB2312-80</td>
                        <td>同gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB......</td>
                    </tr>
                    <tr vAlign=top>
                        <td>GBK</td>
                        <td>(注意大小写),同MS936</td>
                    </tr>
                    <tr vAlign=top>
                        <td>UTF8</td>
                        <td>UTF-8</td>
                    </tr>
                    <tr vAlign=top>
                        <td>GB18030</td>
                        <td>(现在只有IBM JDK1.3.?有支持), 同Cp1392,1392</td>
                    </tr>
                </tbody>
            </table>
            <p>JAVA 语言采用Unicode处理字符. 但从另一个角度来说，在java程序中也可以采用非Unicode的转码，重要的是保证程序入口和出口的汉字信息不失真。如完全采用ISO-8859-1来处理汉字也能达到正确的结果。网络上流行的许多解决方法，都属于这种类型。为了不致引起混淆，本文不对这种方法作讨论。 </p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=3><span class=atitle>中文转码时'?'、乱码的由来</span></a></p>
            <p>两个方向转换都有可能得到错误的结果：</p>
            <ul>
                <li>Unicode--&gt;Byte, 如果目标代码集不存在对应的代码，则得到的结果是0x3f.
                <p>如： <br>"\u00d6\u00ec\u00e9\u0046\u00bb\u00f9".getBytes("GBK") 的结果是 "?&#236;&#233;F?&#249;", Hex 值是3fa8aca8a6463fa8b4. </p>
                <p>仔细看一下上面的结果，你会发现\u00ec被转换为0xa8ac, \u00e9被转换为\xa8a6... 它的实际有效位变长了！这是因为GB2312符号区中的一些符号被映射到一些公共的符号编码，由于这些符号出现在ISO-8859-1或其它一些SBCS字符集中，故它们在Unicode中编码比较靠前，有一些其有效位只有8位，和汉字的编码重叠(其实这种映射只是编码的映射，在显示时仔细不是一样的。Unicode 中的符号是单字节宽，汉字中的符号是双字节宽) . 在Unicode\u00a0--\u00ff 之间这样的符号有20个。了解这个特征非常重要！由此就不难理解为什么JAVA编程中，汉字编码的错误结果中常常会出现一些乱码(其实是符号字符), 而不全是'?'字符, 就比如上面的例子。</p>
                <li>Byte--&gt;Unicode, 如果Byte标识的字符在源代码集不存在，则得到的结果是0xfffd.
                <p>如： <br>Byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312"); </p>
                <p>结果是"?啊", hex 值是"\ufffd\u554a". 0x8140 是GBK字符，按GB2312转换表没有对应的值，取\ufffd. (请注意：在显示该uniCode时，因为没有对应的本地字符，所以也适用上一种情况，显示为一个"?".)</p>
                </li>
            </ul>
            <p>实际编程中，JSP/Servlet 程序得到错误的汉字信息，往往是这两个过程的叠加，有时甚至是两个过程叠加后反复作用的结果. </p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=4><span class=atitle>JSP/Servlet 汉字编码问题及在 WAS 中的解决办法</span></a></p>
            <p>
            <p><a name=N100EC><span class=smalltitle><strong><font face=Arial>4.1 常见的 encoding 问题的现象</font></strong></span></a></p>
            <p>网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser 或应用程序端，如: </p>
            <ul>
                <li>浏览器中看到的 Jsp/Servlet 页面中的汉字怎么都成了 &#8217;?&#8217; ?
                <li>浏览器中看到的 Servlet 页面中的汉字怎么都成了乱码？
                <li>JAVA 应用程序界面中的汉字怎么都成了方块？
                <li>Jsp/Servlet 页面无法显示 GBK 汉字。
                <li>JSP 页面中内嵌在&lt;%...%&gt;,&lt;%=...%&gt;等Tag包含的 JAVA code 中的中文成了乱码，但页面的其它汉字是对的。
                <li>Jsp/Servlet 不能接收 form 提交的汉字。
                <li>JSP/Servlet 数据库读写无法获得正确的内容。 </li>
            </ul>
            <p>隐藏在这些问题后面的是各种错误的字符转换和处理（除第3个外，是因为 Java font 设置错误引起的）。解决类似的字符 encoding 问题，需要了解 Jsp/Servlet 的运行过程，检查可能出现问题的各个点。</p>
            <p><a name=N10110><span class=smalltitle><strong><font face=Arial>4.2 JSP/Servlet web 编程时的 encoding 问题</font></strong></span></a></p>
            <p>运行于Java 应用服务器的 JSP/Servlet 为 Browser 提供 HTML 内容，其过程如下图所示：</p>
            <br><br><img height=181 alt="" src="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/image001.gif" width=807> <br>
            <p>其中有字符编码转换的地方有:</p>
            <ul>
                <li>
                <p>JSP 编译。Java 应用服务器将根据 JVM 的 file.encoding 值读取 JSP 源文件，编译生成 JAVA 源文件，再根据 file.encoding 值写回文件系统。如果当前系统语言支持 GBK，那么这时候不会出现 encoding 问题。如果是英文的系统，如 LANG 是 en_US 的 Linux, AIX 或 Solaris，则要将 JVM 的 file.encoding 值置成 GBK 。系统语言如果是 GB2312，则根据需要，确定要不要设置 file.encoding，将 file.encoding 设为 GBK 可以解决潜在的 GBK 字符乱码问题</p>
                <li>
                <p>Java 需要被编译为 .class 才能在 JVM 中执行，这个过程存在与a.同样的 file.encoding 问题。从这里开始 servlet 和 jsp 的运行就类似了，只不过 Servlet 的编译不是自动进行的。对于JSP程序, 对产生的JAVA 中间文件的编译是自动进行的(在程序中直接调用sun.tools.javac.Main类). 因此如果在这一步出现问题的话, 也要检查encoding和OS的语言环境，或者将内嵌在JSP JAVA Code 中的静态汉字转为 Unicode, 要么静态文本输出不要放在 JAVA code 中。对于Servlet, javac 编译时手工指定-encoding 参数就可以了。</p>
                <li>
                <p>Servlet 需要将 HTML 页面内容转换为 browser 可接受的 encoding 内容发送出去。依赖于各 JAVA App Server 的实现方式，有的将查询 Browser 的 accept-charset 和 accept-language 参数或以其它猜的方式确定 encoding 值，有的则不管。因此采用固定encoding 也许是最好的解决方法。对于中文网页，可在 JSP 或 Servlet 中设置 contentType="text/html; charset=GB2312"；如果页面中有GBK字符，则设置为contentType="text/html; charset=GBK"，由于IE 和 Netscape对GBK的支持程度不一样，作这种设置时需要测试一下。因为16位 JAVA char在网络传送时高8位会被丢弃，也为了确保Servlet页面中的汉字（包括内嵌的和servlet运行过程中得到的）是期望的内码，可以用 PrintWriter out=res.getWriter() 取代 ServletOutputStream out=res.getOutputStream(). PrinterWriter 将根据contentType中指定的charset作转换 (ContentType需在此之前指定！); 也可以用OutputStreamWriter封装 ServletOutputStream 类并用write(String)输出汉字字符串。对于 JSP，JAVA Application Server 应当能够确保在这个阶段将嵌入的汉字正确传送出去。</p>
                <li>
                <p>这是解释 URL 字符 encoding 问题。如果通过 get/post 方式从 browser 返回的参数值中包含汉字信息， servlet 将无法得到正确的值。SUN的 J2SDK 中，HttpUtils.parseName 在解析参数时根本没有考虑 browser 的语言设置，而是将得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题。因为这是设计缺陷，只能以 bin 方式重新解析得到的字符串；或者以 hack HttpUtils 类的方式解决。参考文章 2 均有介绍，不过最好将其中的中文 encoding GB2312、 CP1381 都改为 GBK，否则遇到 GBK 汉字时，还是会有问题。 Servlet API 2.3 提供一个新的函数 HttpServeletRequest.setCharacterEncoding 用于在调用 request.getParameter(&#8220;param_name&#8221;) 前指定应用程序希望的 encoding，这将有助于彻底解决这个问题。</p>
                </li>
            </ul>
            <p><a name=N10145><span class=smalltitle><strong><font face=Arial>4.3 IBM Websphere Application Server 中的解决方法</font></strong></span></a></p>
            <p>WebSphere Application Server 对标准的 Servlet API 2.x 作了扩展，提供较好的多语言支持。运行在中文的操作系统中，可以不作任何设置就可以很好地处理汉字。下面的说明只是对WAS是运行在英文的系统中，或者需要有GBK支持时有效。</p>
            <p>上述c,d情况，WAS 都要查询 Browser 的语言设置，在缺省状况下， zh, zh-cn 等均被映射为 JAVA encoding CP1381（注意： CP1381 只是等同于 GB2312 的一个 codepage，没有 GBK 支持）。这样做我想是因为无法确认 Browser 运行的操作系统是支持GB2312, 还是 GBK，所以取其小。但是实际的应用系统还是要求页面中出现 GBK 汉字，最著名的是朱总理名字中的&#8220;?F"(rong2 ，0xe946，\u9555)，所以有时还是需要将 Encoding/Charset 指定为 GBK。当然 WAS 中变更缺省的 encoding 没有上面说的那么麻烦，针对 a,b，参考文章 5，在 Application Server 的命令行参数中指定 -Dfile.encoding=GBK 即可； 针对 d，在 Application Server 的命令行参数中指定-Ddefault.client.encoding=GBK。如果指定了-Ddefault.client.encoding=GBK，那么c情况下可以不再指定charset。</p>
            <p>上面列出的问题中还有一个关于Tag&lt;%...%&gt;,&lt;%=...%&gt;中的 JAVA 代码里包含的静态文本未能正确显示的问题，在WAS中的解决方法是除了设置正确的file.encoding, 还需要以相同方法设置-Duser.language=zh -Duser.region=CN。这与JAVA locale的设置有关。</p>
            <p><a name=N10154><span class=smalltitle><strong><font face=Arial>4.4 数据库读写时的 encoding 问题</font></strong></span></a></p>
            <p>JSP/Servlet 编程中经常出现 encoding 问题的另一个地方是读写数据库中的数据。</p>
            <p>流行的关系数据库系统都支持数据库 encoding，也就是说在创建数据库时可以指定它自己的字符集设置，数据库的数据以指定的编码形式存储。当应用程序访问数据时，在入口和出口处都会有 encoding 转换。对于中文数据，数据库字符编码的设置应当保证数据的完整性. GB2312，GBK，UTF-8 等都是可选的数据库 encoding；也可以选择 ISO8859-1 (8-bit)，那么应用程序在写数据之前须将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符，读数据之后则需将两个字节合并起来，同时还要判别其中的 SBCS 字符。没有充分利用数据库 encoding 的作用，反而增加了编程的复杂度，ISO8859-1不是推荐的数据库 encoding。JSP/Servlet编程时，可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。</p>
            <p>然后应当注意的是读出来的数据的 encoding，JAVA 程序中一般得到的是 Unicode。写数据时则相反。</p>
            <p><a name=N10163><span class=smalltitle><strong><font face=Arial>4.5 定位问题时常用的技巧</font></strong></span></a></p>
            <p>定位中文encoding问题通常采用最笨的也是最有效的办法――在你认为有嫌疑的程序处理后打印字符串的内码。通过打印字符串的内码，你可以发现什么时候中文字符被转换成Unicode，什么时候Unicode被转回中文内码，什么时候一个中文字成了两个 Unicode 字符，什么时候中文字符串被转成了一串问号，什么时候中文字符串的高位被截掉了&#8230;&#8230;</p>
            <p>取用合适的样本字符串也有助于区分问题的类型。如：&#8221;aa啊aa?@aa&#8221; 等中英相间、GB、GBK特征字符均有的字符串。一般来说，英文字符无论怎么转换或处理，都不会失真（如果遇到了，可以尝试着增加连续的英文字母长度）。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N1016F><span class=atitle>结束语</span></a></p>
            <p>其实 JSP/Servlet 的中文encoding 并没有想像的那么复杂，虽然定位和解决问题没有定规，各种运行环境也各不尽然，但后面的原理是一样的。了解字符集的知识是解决字符问题的基础。不过，随着中文字符集的变化，不仅仅是 java 编程，中文信息处理中的问题还是会存在一段时间的。 </p>
            <br><br>
            <p><a name=resources><span class=atitle>参考资料 </span></a></p>
            <ul>
                <li><a href="http://www.ibm.com/developerworks/cn/java/java_chinese/index.html"><u><font color=#5c81a7>Java 编程技术中汉字问题的分析及解决</font></u></a> <br><br>
                <li><a href="http://oss.software.ibm.com/cvs/icu/~checkout~/icu/source/tools/makeconv/gb18030/gb18030.html"><u><font color=#5c81a7>GB18030</font></u></a> <br><br>
                <li><a href="http://www.ibm.com/software/webservers/appserv/doc/v35/ae/infocenter/was/040209.html"><u><font color=#5c81a7>Setting language encoding in web applications: Websphere applications Server</font></u></a> <br></li>
            </ul>
            <br><br>
            <p><a name=author><span class=atitle>关于作者</span></a></p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
                    </tr>
                    <tr vAlign=top align=left>
                        <td>
                        <p>&#160;</p>
                        </td>
                        <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
                        <td width="100%">
                        <p>IBM has authored this article</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/simie/aggbug/127838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-03 14:49 <a href="http://www.blogjava.net/simie/archive/2007/07/03/127838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库连接池+JavaBean+JSP+SQL Server+JDBC3.0的数据库分页技术</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127656.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127656.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127656.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127656.html</trackback:ping><description><![CDATA[<pre>主要特色：
1.使用最新的JDBC3.0数据库驱动。
2.大幅度减化了JSP的反复调用JavaBean,可以直接写SQL,无须再使用连接数据库连接池。
3.将大量的工作交给JavaBean做,JSP负责页面控制。
4.最大特色是极其简单,程序编写也极其简单,非常适合初学者。
5.使用的是tomcat数据库连接池,方便快速。
请提供E_mail,为大家分享，如有高手，请指点不是。
本人E_mail：c841@163.com,望多提意见。
****************************************文件名《page.jsp》*******************************************************************
文件名《page.jsp》
&lt;%@ page language="java" import="java.sql.*, my.*" %&gt;
&lt;%@ page contentType="text/html; charset=gb2312" %&gt;
&lt;jsp:useBean id="pagi" scope="page" class="my.Pagi"/&gt;
&lt;html&gt;
&lt;body&gt;
&lt;table  align="center" border=1&gt;
&lt;%
String CountQuery="select count(*) from 商品资料";
String query = "select * from 商品资料";
ResultSet rs = pagi.querySql(CountQuery,query, request);
String footer = pagi.PageFooter();
%&gt;
&lt;tr&gt;
&lt;td &gt;商品编号&lt;/font&gt;&lt;/td&gt;
&lt;td &gt;商品名称&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;%
if (pagi.intPageCount&gt;0)
{
int i=0;
while (rs.next())
{
i++;
if (i&gt;((pagi.intPage-1)*pagi.intPageSize) &amp;&amp;(i&lt;=pagi.intPage*pagi.intPageSize))
{
%&gt;
&lt;tr&gt;
&lt;td&gt;&lt;%=rs.getString(1)%&gt;&lt;/td&gt;
&lt;td&gt;&lt;%=rs.getString(2)%&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;%
}
}
}
out.println("&lt;tr&gt;&lt;td colspan=2&gt;"+footer+"&lt;/td&gt;&lt;/tr&gt;");
rs.close();
pagi.close_all();
%&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
****************************************文件名《pagi.java》*********************************************************
文件名《pagi.java》
package my;
import java.util.*;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import my.DB.*;
public class Pagi
{
ResultSet CountTopicrs=null; //初始化总记录数Rs变量
ResultSet Pagirs=null; //初始化分页时Rs变量
public int intCountTopic=0; //主题总数
public int intPageSize;//每页显示主题数
public int intPageCount;//总页数
public int intPage=1; //当前页数
public String nowPage; // int i;
public String HttpFile;//初始化当前页intPage变量，以准确便获取当前页。 //当前的地址栏的文件
DB db; //定义Linkdb类的一个对象。
public Pagi()//定义构造器，初始化每页显示的主题数和数据库的连接。
{
intPageSize=4;  //每页显示的记录数目
db = new DB();
}
//Countsql:总记录的Query字符串。[形式为select count(*) from tablename]
//Pagisql :要分页的Query字符串。[形式为select * from tablename where ...]
//request :参数传递过程中的变量。[用来控制翻页时的pages变量]
public ResultSet querySql(String Countsql,String Pagisql,HttpServletRequest request)throws Exception
{
HttpFile=request.getRequestURI();  //获取当前文件名。
nowPage=request.getParameter("pages");  //获取当前页，将数值赋予intPage变量。[分页栏中必须要有pages参数]
if (nowPage==null)
{
intPage=1;
}
else
{
intPage=Integer.parseInt(nowPage);
if (intPage&lt;1)
intPage=1;
}
CountTopicrs=db.executeQuery(Countsql); //@@@@@@@@@@@@获取总记录数的结果集。
if (CountTopicrs.next())
{
intCountTopic=CountTopicrs.getInt(1);
}
intPageCount = (intCountTopic+intPageSize-1)/intPageSize;  //获取总页数。
if (intPage&gt;intPageCount)//如果当前页大于总页数，则当前页等于总页数。
{
intPage=intPageCount;
}
CountTopicrs.close();  //关闭总主题数的数据集。
db.close_all();
Pagirs=db.executeQuery(Pagisql);  //@@@@@@@@@@@@@@@获取执行分页的结果集。
return Pagirs;
}//end querySql function.
public int getCountTopic()//获取记录总数。
{
return intCountTopic;
}
public int getPageCount() //获取总页数。
{
return intPageCount;
}
public int getIntPage()  //获取当前页数。
{
return intPage;
}
public String PageFooter()
{
String str = "";
int next, prev;
prev=intPage-1;
next=intPage+1;
str += "查询到&lt;font color=red&gt;"+getCountTopic()+"&lt;/font&gt;条记录"+
"    共&lt;font color=red&gt;"+getPageCount()+"&lt;/font&gt;页";
str +=" 第&lt;font color=red&gt;"+getIntPage()+"&lt;/font&gt;页 ";
if(intPage&gt;1)
str += " &lt;A href=" + HttpFile + "?pages=1"+"&gt;首页&lt;/A&gt; ";
else
str += " 首页 ";
if(intPage&gt;1)
str += " &lt;A href=" + HttpFile + "?pages=" + prev + "&gt;上一页&lt;/A&gt; ";
else
str += " 上一页 ";
if(intPage&lt;intPageCount)
str += " &lt;A href=" + HttpFile + "?pages=" + next + "&gt;下一页&lt;/A&gt; ";
else
str += " 下一页 ";
if(intPageCount&gt;1&amp;&amp;intPage!=intPageCount)
str += " &lt;A href=" + HttpFile + "?pages=" + intPageCount +
"&gt;尾页&lt;/A&gt;";
else
str += " 尾页 ";
return str;
}
public void close_all()
{
db.close_all();
}
}
************************************************文件名《DB.java》********************************************************
文件名《DB.java》
package my;
import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
//一个用于查找数据源的工具类。
public class DB {
private Connection con=null;
private Statement stmt=null;
ResultSet rs=null;
public  ResultSet executeQuery(String sql) throws Exception
{
rs=null;
try
{
Context initCtx = new javax.naming.InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/bn");
con=ds.getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery (sql);
}
catch(SQLException e){throw e;}
catch(NamingException e){throw e;}
return rs;
}
//执行Insert,Update语句
public void executeUpdate(String sql) throws Exception
{
stmt = null;
rs=null;
try
{
Context initCtx = new javax.naming.InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/bn");
con=ds.getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.executeQuery(sql);
stmt.close();
con.close();
}
catch(SQLException ex)
{
System.err.println("执行SQL语句出错: " + ex.getMessage());
}
}
// 关闭stmt和关闭连接
public void close_all()
{
try{
stmt.close();
con.close();
}
catch(SQLException e){e.printStackTrace();}
}
}
***************************************《tomcat中的数据库连接池的设置》********************************************************************************
&#8230;&#8230;
&#8230;&#8230;
&#8230;&#8230;
&lt;Context path="/SQL" docBase="D:\SQL_JSP" debug="0" reloadable="true" crossContext="true"&gt;
&lt;Resource name="jdbc/bn" auth="Container" type="javax.sql.DataSource"/&gt;
&lt;ResourceParams name="jdbc/bn"&gt;
&lt;parameter&gt;
&lt;name&gt;factory&lt;/name&gt;
&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;driverClassName&lt;/name&gt;
&lt;value&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;url&lt;/name&gt;
&lt;value&gt;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;username&lt;/name&gt;
&lt;value&gt;cyg&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;password&lt;/name&gt;
&lt;value&gt;325345353&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;maxActive&lt;/name&gt;
&lt;value&gt;20&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;maxIdle&lt;/name&gt;
&lt;value&gt;20&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;maxWait&lt;/name&gt;
&lt;value&gt;-1&lt;/value&gt;
&lt;/parameter&gt;
&lt;/ResourceParams&gt;
&lt;/Context&gt;
&lt;/Host&gt;
&lt;/Engine&gt;
&lt;/Service&gt;
&lt;/Server&gt;
</pre>
<img src ="http://www.blogjava.net/simie/aggbug/127656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 19:23 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet的重定向技术综述</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127536.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127536.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127536.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127536.html</trackback:ping><description><![CDATA[　　<strong>1.RequestDispatcher.forward()</strong><br><br>　　是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.<br><br>　　但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.<br><br>　　重定向后浏览器地址栏URL不变.<br><br>　　例:在servlet中进行重定向<br><br>　　public void doPost(HttpServletRequest request,HttpServletResponse response)<br><br>　　throws ServletException,IOException<br><br>　　{<br><br>　　response.setContentType("text/html; charset=gb2312");<br><br>　　ServletContext sc = getServletContext();<br><br>　　RequestDispatcher rd = null;<br><br>　　rd = sc.getRequestDispatcher("/index.jsp");　　 //定向的页面<br><br>　　rd.forward(request, response);<br><br>　　}<br><br>　　通常在servlet中使用，不在jsp中使用。<br><br>　　<strong>2.response.sendRedirect()</strong><br><br>　　是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.<br><br>　　重定向后在浏览器地址栏上会出现重定向页面的URL<br><br>　　例:在servlet中重定向<br><br>　　public void doPost(HttpServletRequest request,HttpServletResponse response)<br><br>　　throws ServletException,IOException<br><br>　　{<br><br>　　response.setContentType("text/html; charset=gb2312");<br><br>　　response.sendRedirect("/index.jsp");<br><br>　　}<br><br>　　由于response是jsp页面中的隐含对象，故在jsp页面中可以用response.sendRedirect()直接实现重定位。<br><br>　　注意：<br><br>　　(1).使用response.sendRedirect时，前面不能有HTML输出。<br><br>　　这并不是绝对的，不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制，一般在8K（我是说JSP　SERVER），这就意味着，除非你关闭了cache，或者你使用了out.flush()强制刷新，那么在使用sendRedirect之前，有少量的HTML输出也是允许的。<br><br>　　(2).response.sendRedirect之后，应该紧跟一句return;<br><br>　　我们已经知道response.sendRedirect是通过浏览器来做转向的，所以只有在页面处理完成后，才会有实际的动作。既然你已经要做转向了，那么后的输出还有什么意义呢？而且有可能会因为后面的输出导致转向失败。<br><br>　　比较：<br><br>　　(1).Request Dispatcher.forward()是容器中控制权的转向，在客户端浏览器地址栏中不会显示出转向后的地址；<br><br>　　(2).response.sendRedirect()则是完全的跳转，浏览器将会得到跳转的地址，并重新发送请求链接。这样，从浏览器的地址栏中可以看到跳转后的链接地址。<br><br>　　前者更加高效，在前者可以满足需要时，尽量使用RequestDispatcher.forward()方法.<br><br>　　注：在有些情况下，比如，需要跳转到一个其它服务器上的资源，则必须使用HttpServletResponse.sendRequest()方法。<br><br>　　<strong>3.&lt;jsp:forward page="" /&gt;</strong><br><br>　　它的底层部分是由RequestDispatcher来实现的，因此它带有RequestDispatcher.forward()方法的印记。<br><br>　　如果在&lt;jsp:forward&gt;之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。<br><br>　　另外要注意：它不能改变浏览器地址，刷新的话会导致重复提交<br><br>　　<strong>4.修改HTTP header的Location属性来重定向</strong><br><br>　　通过设置直接修改地址栏来实现页面的重定向。<br>jsp文件代码如下：<br><br>　　＜%<br><br>　　response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);<br><br>　　String newLocn = "/newpath/jsa.jsp";<br><br>　　response.setHeader("Location",newLocn);<br><br>　　%＞<br><br>　　<strong>5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面</strong><br><br>　　在html文件中，下面的代码：<br><br>　　&lt;meta http-equiv="refresh" content="300; url=target.jsp"&gt;<br><br>　　它的含义：在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间，以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。<br><br>　　由上可知，可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。<br><br>　　关键代码：<br><br>　　String content=stayTime+";URL="+URL;<br><br>　　response.setHeader("REFRESH",content);<br><br>　　如果总结得不够全面，请各位发表自己的意见或经验。
<img src ="http://www.blogjava.net/simie/aggbug/127536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 13:38 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中forword和sendRedirect的区别</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127532.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127532.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127532.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127532.html</trackback:ping><description><![CDATA[<p>1.RequestDispatcher.forward()</p>
<p>是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递.</p>
<p>但forward ()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如 servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.</p>
<p>重定向后浏览器地址栏URL不变.</p>
<p>例:servlet文件中重定向<br>CODE</p>
<p>public void doPost(HttpServletRequest request,HttpServletResponse response)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException,IOException</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("text/html; charset=gb2312");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext sc = getServletContext();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestDispatcher rd = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rd = sc.getRequestDispatcher("/index.jsp");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rd.forward(request, response);<br>}</p>
<p><br>2.response.sendRedirect()</p>
<p>是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,且在浏览器地址栏上会出现重定向页面的URL.</p>
<p>sendRedirect()可以重定向有frame的jsp文件.</p>
<p>例:servlet文件中重定向<br>CODE</p>
<p>public void doPost(HttpServletRequest request,HttpServletResponse response)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException,IOException</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("text/html; charset=gb2312");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect("/index.jsp");</p>
<p>}</p>
<img src ="http://www.blogjava.net/simie/aggbug/127532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 13:31 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA日期问题总结</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127518.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127518.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127518.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127518.html</trackback:ping><description><![CDATA[&nbsp;1、获取服务器端当前日期：<br>&lt;%@ page import="java.util.Date"%&gt;<br>&lt;%<br>Date myDate = new Date();<br>%&gt; <br>2、获取当前年、月、日：
<p>&lt;%@ page import="java.util.Date"%&gt;</p>
<p>&lt;%<br>Date myDate = new Date();<br>int thisYear = myDate.getYear() + 1900;//thisYear = 2003<br>int thisMonth = myDate.getMonth() + 1;//thisMonth = 5<br>int thisDate = myDate.getDate();//thisDate = 30<br>%&gt;</p>
<p><br>3、按本地时区输出当前日期</p>
<p>&lt;%@ page import="java.util.Date"%&gt;<br>&lt;%<br>Date myDate = new Date();<br>out.println(myDate.toLocaleString());<br>%&gt;</p>
<p><br>输出结果为：<br>2003-5-30 </p>
<p><br>4、获取数据库中字段名为"publish_time"、类型为Datetime的值</p>
<p><br>&lt;%@ page import="java.util.Date"%&gt;<br>&lt;%<br>...连接数据库...<br>ResultSet rs = ...<br>Date sDate = rs.getDate("publish_time");<br>%&gt;<br>[code]</p>
<p><br>5、按照指定格式打印日期</p>
<p><br>[code]<br>&lt;%@ page import="java.util.Date"%&gt;<br>&lt;%@ page import="java.text.DateFormat"%&gt;<br>&lt;%<br>Date dNow = new Date();</p>
<p>SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");<br>out.println("It is " + formatter.format(dNow));<br>%&gt;</p>
<p>&nbsp;</p>
<p>输出的结果为：<br>It is 星期五 2003.05.30 at 11:30:46 上午 CST <br>(更为详尽的格式符号请参看SimpleDateFormat类)</p>
<p><br>6、将字符串转换为日期</p>
<p>&lt;%@ page import="java.util.Date"%&gt;<br>&lt;%@ page import="java.text.DateFormat"%&gt;<br>&lt;%<br>String input = "1222-11-11";<br>SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");<br>Date t = null;</p>
<p>try{</p>
<p>&nbsp; t = formatter.parse(input);</p>
<p>&nbsp; out.println(t);</p>
<p>&nbsp; }catch(ParseException e){</p>
<p>&nbsp; out.println("unparseable using" + formatter);</p>
<p>&nbsp; }</p>
<p>%&gt;</p>
<p>输出结果为：<br>Fri Nov 11 00:00:00 CST 1222 </p>
<p><br>7、计算日期之间的间隔</p>
<p>&nbsp;</p>
<p>&lt;%@ page import="java.util.Date"%&gt;<br>&lt;%@ page import="java.text.DateFormat"%&gt;<br>&lt;%<br>String input = "2003-05-01";<br>SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");<br>Date d1 = null;<br>trycatch(ParseException e)</p>
<p>Date d2 = new Date();</p>
<p>long diff = d2.getTime() - d1.getTime();<br>out.println("Difference is " + (diff/(1000*60*60*24)) + " days.");<br>%&gt;</p>
<p><br>输出结果为：<br>Difference is 29 days. </p>
<p><br>8、日期的加减运算<br>方法：用Calendar类的add()方法</p>
<p><br>&lt;%@ page import="java.util.*"%&gt;<br>&lt;%@ page import="java.text.*"%&gt;<br>&lt;%<br>Calendar now = Calendar.getInstance();<br>SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");<br>out.println("It is now " + formatter.format(now.getTime()));<br>now.add(Calendar.DAY_OF_YEAR,-(365*2));<br>out.println("&lt;br&gt;");<br>out.println("Two years ago was " + formatter.format(now.getTime()));<br>%&gt;</p>
<p>&nbsp;</p>
<p>输出结果为：<br>It is now 星期五 2003.05.30 at 01:45:32 下午 CST <br>Two years ago was 星期三 2001.05.30 at 01:45:32 下午 CST </p>
<p><br>9、比较日期<br>方法：用equals()、before()、after()方法</p>
<p>&nbsp;</p>
<p>&lt;%@ page import="java.util.*"%&gt;<br>&lt;%@ page import="java.text.*"%&gt;<br>&lt;%<br>DateFormat df = new SimpleDateFormat("yyy-MM-dd");<br>Date d1 = df.parse("2000-01-01");<br>Date d2 = df.parse("1999-12-31");</p>
<p>String relation = null;<br>if(d1.equals(d2))<br>relation = "the same date as";<br>else if(d1.before(d2))<br>relation = "before";<br>else<br>relation = "after";<br>out.println(d1 +" is " + relation + ' ' + d2);<br>%&gt;</p>
<p><br>输出结果为：<br>Sat Jan 01 00:00:00 CST 2000 is after Fri Dec 31 00:00:00 CST 1999 </p>
<p><br>10、记录一件事所花费的时间<br>方法：调用两次System.getTimeMillis()方法，求差值</p>
<p>&nbsp;</p>
<p>&lt;%@ page import="java.text.*"%&gt;<br>&lt;%<br>long t0,t1;<br>t0 = System.currentTimeMillis();<br>out.println("Cyc starts at " + t0);<br>int k = 0;<br>for(int i =0;i&lt;100000;i++)<br>t1 = System.currentTimeMillis();<br>out.println("&lt;br&gt;");<br>out.println("Cyc ends at " + t1);<br>out.println("&lt;br&gt;");<br>out.println("This run took " + (t1-t0) + "ms.");<br>%&gt;</p>
<p><br>输出结果为：<br>Cyc starts at 1054275312432 <br>Cyc ends at 1054275312442 <br>This run took 10ms. </p>
<p>其它：如何格式化小数</p>
<p>&nbsp;</p>
<p>&lt;%@ page import="java.text.*"%&gt;<br>&lt;%<br>DecimalFormat df = new DecimalFormat(",###.00");<br>double aNumber = 33665448856.6568975;<br>String result = df.format(aNumber);<br>out.println(result);<br>%&gt;</p>
<p><br>输出结果为：<br>33,665,448,856.66</p>
<img src ="http://www.blogjava.net/simie/aggbug/127518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 13:01 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 编程技巧集锦（转载）</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127519.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127519.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127519.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127519.html</trackback:ping><description><![CDATA[<font size=4>1. 如何让选中的一行记录高亮显示？<br></font><a href="http://topic.csdn.net/t/20050105/09/3699823.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050105/09/3699823.html</u></font></a><br><font size=4>2. 如何在下拉列表框里选择一个值后跳出新窗口?<br></font><a href="http://topic.csdn.net/t/20050107/15/3707444.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050107/15/3707444.html</u></font></a><br><font size=4>3. 如何在JSP中启动execl?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4909154" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4909154</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4685297" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4685297</u></font></a><br><font size=4>4. 两级联动菜单<br></font><a href="http://topic.csdn.net/t/20040730/16/3227437.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20040730/16/3227437.html</u></font></a><br><font size=4>5. java中如何把一个目录下的文件移到另一个指定的目录？<br></font><a href="http://topic.csdn.net/t/20050112/13/3719237.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050112/13/3719237.html</u></font></a><br><font size=4>6. 如何制作表格线?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5130862" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5130862</u></font></a><br><font size=4>7. jsp如判别一个字符在A到Z之间?<br></font><a href="http://topic.csdn.net/t/20050113/08/3721286.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050113/08/3721286.html</u></font></a><br><font size=4>8. 得到一浮点数小数点后4位，如何写以函数截取为两位<br></font><a href="http://topic.csdn.net/t/20050117/14/3731712.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050117/14/3731712.html</u></font></a><br><font size=4>9. 整型转字符?<br></font><a href="http://topic.csdn.net/t/20030526/22/1837632.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030526/22/1837632.html</u></font></a><br><font size=4>10. 显示数据库的记录，点击哪个标题栏，就按照哪个标题排序<br></font><a href="http://topic.csdn.net/t/20041226/15/3677011.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20041226/15/3677011.html</u></font></a><br><font size=4>11. 制作两个按钮<br>？？<br>12. 用什么sql语句将数据库中的一条记录,复制为两条?<br></font><a href="http://topic.csdn.net/t/20050120/17/3741746.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050120/17/3741746.html</u></font></a><br><font size=4>13. 有兩個按鈕A,B,其中A按下去,A就不可以再按,另外B按下去,A可以再按..請問如何用javascript控制.?<br></font><a href="http://topic.csdn.net/t/20050120/17/3741568.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050120/17/3741568.html</u></font></a><br><font size=4>14. 请问jsp中的数据库的连接方式<br></font><a href="http://topic.csdn.net/t/20030107/11/1334377.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030107/11/1334377.html</u></font></a><br><font size=4>15. 在jsp中,怎么实现按回车就可提交表单?<br></font><a href="http://topic.csdn.net/t/20050121/11/3743133.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050121/11/3743133.html</u></font></a><br><font size=4>16. 在JSP中如何传递数组?<br></font><a href="http://topic.csdn.net/t/20030624/17/1952227.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030624/17/1952227.html</u></font></a><br><font size=4>17. 如何按地址取图片？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4894525" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4894525</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4990451" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4990451</u></font></a><br><font size=4>18. JSP中如何上传图片到数据库字段？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4923127" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4923127</u></font></a><br><font size=4>19. 页面自动刷新？<br></font><a href="http://topic.csdn.net/t/20040430/16/3025697.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20040430/16/3025697.html</u></font></a><br><font size=4>20. 表单自动提交？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4681334" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4681334</u></font></a><br><font size=4>21. 如何从JSP传数据的到JAVABEAN里?<br>这个不就是参数传递么？？<br>22. weblogic 数据池连接? 数据源 JNDI名字 mysource<br></font><a href="http://topic.csdn.net/t/20040915/22/3376617.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20040915/22/3376617.html</u></font></a><br><font size=4>23. 三级联动菜单?<br></font><a href="http://blog.csdn.net/overmind/archive/2005/10/27/517856.aspx" target=_blank><font color=#0000ff size=4><u>http://blog.csdn.net/overmind/archive/2005/10/27/517856.aspx</u></font></a><br><font size=4>24. 在JSP中如何调用浏览器中的"另存为"功能?<br></font><a href="http://topic.csdn.net/t/20050509/09/3990931.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050509/09/3990931.html</u></font></a><br><font size=4>25. 网页全屏显示<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5057245" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5057245</u></font></a><br><font size=4>26. 求两个日期相隔了多少天:输入时间格式为(yyyy-mm-dd)<br></font><a href="http://topic.csdn.net/t/20050516/10/4009546.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050516/10/4009546.html</u></font></a><br><font size=4>27. 上传文件对话框<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4961980" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4961980</u></font></a><br><font size=4>28. 分页测试<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4925123" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4925123</u></font></a><br><font size=4>29. 下载文件<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5019146" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5019146</u></font></a><br><font size=4>30. 简单汉字判断<br></font><a href="http://blog.csdn.net/duanxd/archive/2005/05/19/376481.aspx" target=_blank><font color=#0000ff size=4><u>http://blog.csdn.net/duanxd/archive/2005/05/19/376481.aspx</u></font></a><br><font size=4>31. 可否将JSP的变量或者bean传递给JAVASCRIPT使用？<br></font><a href="http://topic.csdn.net/t/20050520/14/4022667.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050520/14/4022667.html</u></font></a><br><font size=4>32. 怎么把一种格式（如yyyy-mm-dd）的日期变量转换成另外一种格式（如dd-mm-yyyy）的日期变量！<br></font><a href="http://topic.csdn.net/t/20050602/21/4055209.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050602/21/4055209.html</u></font></a><br><font size=4>33. 如何实现在页面上添加一行输入对话框<br>??<br>34. 如何制作验证码图片?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4857455" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4857455</u></font></a><font size=4> <br>35. 图片缩小放大功能<br></font><a href="http://topic.csdn.net/t/20041227/09/3678138.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20041227/09/3678138.html</u></font></a><br><font size=4>36. 如何点击输入框弹出日期选择？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5020494" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5020494</u></font></a><br><a href="http://www.dynarch.com/projects/calendar/" target=_blank><font color=#0000ff size=4><u>http://www.dynarch.com/projects/calendar/</u></font></a><br><font size=4>37. 如何在图片上传前查看自己要上传的图片?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4825282" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4825282</u></font></a><br><font size=4>38. 如何在图片排列的页面上选中一个图片,然后把它删掉?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5162107" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5162107</u></font></a><br><font size=4>39. 显示某目录下的所有文件<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5056503" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5056503</u></font></a><br><font size=4>40. 如何把复选框中选中的值直接显示在输入文本框中？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5004830" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5004830</u></font></a><br><font size=4>41. 如何选择路径下的文件直接显示文件内容?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5194181" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5194181</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5121413" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5121413</u></font></a><br><font size=4>42. 如何制作进度条?<br></font><a href="http://topic.csdn.net/t/20051120/03/4405364.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20051120/03/4405364.html</u></font></a><br><font size=4>43. 如何对较长字符省略显示?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5124078" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5124078</u></font></a><br><font size=4>44. 如何制作日历?<br>这个太多了<br>45. 点击文本弹出一个选择框，选中值后返回并显示<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4979197" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4979197</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4988006" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4988006</u></font></a><br><font size=4>46. 如何关闭框架页面回到没框架的页面?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4970057" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4970057</u></font></a><br><font size=4>47. 如何选中多条记录一次性删除?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4762839" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4762839</u></font></a><br><font size=4>48. 如何自动获取页面文件名？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4945500" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4945500</u></font></a><br><font size=4>49. 如何在JSP中调用ActiveX控件?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4919689" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4919689</u></font></a><br><font size=4>50. 如何使用SmartUpload实现文件上传?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4911791" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4911791</u></font></a><br><font size=4>51. 如何使用iReport和Jasperreport开发报表?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5038328" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5038328</u></font></a><br><font size=4>52. 如何使用iText生成PDF？<br></font><a href="http://www.lowagie.com/iText/tutorial/ch07.html" target=_blank><font color=#0000ff size=4><u>http://www.lowagie.com/iText/tutorial/ch07.html</u></font></a><font size=4>#htmlparsing<br></font><a href="http://java.ccidnet.com/art/3565/20050309/480327_1.html" target=_blank><font color=#0000ff size=4><u>http://java.ccidnet.com/art/3565/20050309/480327_1.html</u></font></a><br><font size=4>53. 如何制作图片水印？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5212770" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5212770</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4885889" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4885889</u></font></a><br><font size=4>54. 如何在页面中屏蔽键盘功能键？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4356360" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4356360</u></font></a><br><font size=4>55. 如何禁止用户复制网页内容？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4356360" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4356360</u></font></a><br><font size=4>56. 如何实现不在地址拦中显示当前URL？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4678351" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4678351</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4863808" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4863808</u></font></a><br><font size=4>57. 如何获取用户的真实IP地址？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4718686" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4718686</u></font></a><br><font size=4>58. 如何获取用户浏览器信息？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4987045" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4987045</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4898974" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4898974</u></font></a><br><font size=4>59. 如何获取当前绝对路径？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5157921" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5157921</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5178848" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5178848</u></font></a><br><font size=4>60. 如何将HTML文件转换成XML文件?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4542984" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4542984</u></font></a><br><font size=4>61. 如何结合XML和XSL输出HTML页面？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4355891" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4355891</u></font></a><br><font size=4>62. 如何制作动态树型菜单制作？<br></font><a href="http://www.blogjava.net/rickhunter/articles/59742.html" target=_blank><font color=#0000ff size=4><u>http://www.blogjava.net/rickhunter/articles/59742.html</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4966014" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4966014</u></font></a><br><font size=4>63. 如何制作类似QQ的短消息提示？<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4702037" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4702037</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5087584" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5087584</u></font></a><br><font size=4>64. 如何用jfreechat制作拄、饼、曲线图型?<br></font><a href="http://www.inspiresky.com/Article/ShowArticle.asp?ArticleID=731" target=_blank><font color=#0000ff size=4><u>http://www.inspiresky.com/Article/ShowArticle.asp?ArticleID=731</u></font></a><br><font size=4>65. 文本框怎么只容许输入数字?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4927727" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4927727</u></font></a><br><font size=4>66. 如何打开Word和Execl文件?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5194181" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5194181</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4685297" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4685297</u></font></a><br><font size=4>67. 如何生成Word 和 Excel文档？<br></font><a href="http://sourceforge.net/project/showfiles.php?group_id=15255" target=_blank><font color=#0000ff size=4><u>http://sourceforge.net/project/showfiles.php?group_id=15255</u></font></a><font size=4>&amp;release_id=167948<br>68. JSP如何读取Word内容?<br></font><a href="http://topic.csdn.net/t/20030217/13/1435281.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030217/13/1435281.html</u></font></a><font size=4>&nbsp;</font><br>
<img src ="http://www.blogjava.net/simie/aggbug/127519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 13:01 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp生成汉字验证码 (彩色)</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127515.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127515.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127515.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127515.html</trackback:ping><description><![CDATA[<span class=tpc_content><font size=2>一些网站采用了字母和数字的验证码，数字和字母加起来一共30多个，如果有心，还是能够通过方法识别出来。</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> O8&lt;@d3 </span><font size=2>&nbsp;<br>我在网上看到一篇文章"jsp彩色验证码"，我进行了加强，生成的验证码内容为汉字，可以方便应用在面向汉语网民的网站认证上。</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> oxcd:, Vc </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">iXV6:&amp;\9"r </span><font size=2>&nbsp;<br>当然，我还看到别人考虑的几种方法：</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> {i867@H_e </span><font size=2>&nbsp;<br>1.生成计算题，比如20+34*(23-12)=?，用户必须输入正确的答案才能通过验证，这个想法挺好，但是用户必须打开计算器进行计算，增加了用户的难度</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> dza^8ynu </span><font size=2>&nbsp;<br>2.问一些常见的问题，比如&#8220;人&#8221;这个字由几笔组成。这也是不错的想法，关键是必须有上万条的题库，而且题库的答案必须是明确的，简单易比较的，这个难度也较大。</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> |||o&lt; </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">ejas+ </span><font size=2>&nbsp;<br>下面是彩色汉字验证码的代码。</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> ,"-07[X </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">]j&amp;J&amp;.:&amp;, </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">dVTACb` </span><font size=2>&nbsp;<br>&lt;%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %&gt; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">YwpC}G;  </span><font size=2>&nbsp;<br>&lt;%! </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">(.&amp;vEwK </span><font size=2>&nbsp;<br>//create by smallnest </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">z(S Lcx </span><font size=2>&nbsp;<br>//email: </font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#109;&#97;&#108;&#108;&#110;&#101;&#115;&#116;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color=#0000ff size=2><u>smallnest@gmail.com</u></font></a><font size=2> </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&lt;p-Y a_&amp;u </span><font size=2>&nbsp;<br>//website:</font><a href="http://www.kuaff.com/" target=_blank><font color=#0000ff size=2><u>www.kuaff.com</u></font></a><font size=2> </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">hpC%no /s </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Du:x%[~] </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">99Ztr4E </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Jk)|S2 </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">: pZ&lt;K"Z-&amp; </span><font size=2>&nbsp;<br>//生成随机颜色 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">s*# ]mm.MD </span><font size=2>&nbsp;<br>Color getRandColor(Random random,int fc,int bc) </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">M-C|5ahf8B </span><font size=2>&nbsp;<br>{ </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">!DF}` d </span><font size=2>&nbsp;<br>if(fc&gt;255) fc=255; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">{+9C59]sA </span><font size=2>&nbsp;<br>if(bc&gt;255) bc=255; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">^k41]4 RD </span><font size=2>&nbsp;<br>int r=fc+random.nextInt(bc-fc); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">')/u5Y{fp </span><font size=2>&nbsp;<br>int g=fc+random.nextInt(bc-fc); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">F\(TcR( </span><font size=2>&nbsp;<br>int b=fc+random.nextInt(bc-fc); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">qQ5&gt; k=3 </span><font size=2>&nbsp;<br>return new Color(r,g,b); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">2Es&amp;*Kr+" </span><font size=2>&nbsp;<br>} </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> '0 )!e!= </span><font size=2>&nbsp;<br>%&gt; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">=H NQZD`e </span><font size=2>&nbsp;<br>&lt;% </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">q=X0lJ&lt;V </span><font size=2>&nbsp;<br>//设置页面不缓存 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Qsd{m_y# </span><font size=2>&nbsp;<br>response.setHeader("Pragma","No-cache"); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">p[brf&gt;x </span><font size=2>&nbsp;<br>response.setHeader("Cache-Control","no-cache"); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">h-r&lt;TW </span><font size=2>&nbsp;<br>response.setDateHeader("Expires", 0); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">hB~(UCtd </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">{m@moH 3N </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">"&gt;^0|,(e </span><font size=2>&nbsp;<br>// 设置图片的长宽 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">G"KO </span><font size=2>&nbsp;<br>int width=176, height=30; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">rl&gt; 1bV?8 </span><font size=2>&nbsp;<br>//设置备选汉字，剔除一些不雅的汉字 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&gt;22XQgGh </span><font size=2>&nbsp;<br>String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6"; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">=-/!18 </span><font size=2>&nbsp;<br>//备选汉字的长度 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">k63GRbd? </span><font size=2>&nbsp;<br>int length = base.length(); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">n\+47N*ze </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">,"jx! </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">2b8~3d[L </span><font size=2>&nbsp;<br>//创建内存图像 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">e/6VUo@&gt;% </span><font size=2>&nbsp;<br>BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">X/$V%6) </span><font size=2>&nbsp;<br>// 获取图形上下文 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">"g&amp;Xk0 </span><font size=2>&nbsp;<br>Graphics g = image.getGraphics(); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">NEE4{?Q? </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">k &gt;@l </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Q{AR6CRAt </span><font size=2>&nbsp;<br>//创建随机类的实例 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">ch6) "2 </span><font size=2>&nbsp;<br>Random random = new Random(); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&gt;&gt;#&gt;"&lt;CMT </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">K#]~p^Z} </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">aF@:;!cVu </span><font size=2>&nbsp;<br>// 设定图像背景色(因为是做背景，所以偏淡) </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">NAL2w3 </span><font size=2>&nbsp;<br>g.setColor(getRandColor(random,200,250)); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">{&lt;=!bYh </span><font size=2>&nbsp;<br>g.fillRect(0, 0, width, height); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">7@mFmb] -# </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">+.S``"' </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Eg^${%,d </span><font size=2>&nbsp;<br>//备选字体 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">RE]p3t|O </span><font size=2>&nbsp;<br>String[] fontTypes = {"\u5b8b\u4f53","\u65b0\u5b8b\u4f53","\u9ed1\u4f53","\u6977\u4f53","\u96b6\u4e66"}; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">b&lt;psU?/% _ </span><font size=2>&nbsp;<br>int fontTypesLength = fontTypes.length; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">YZ?KfO=r </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">6&lt; 1B; </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&lt;;G d~( </span><font size=2>&nbsp;<br>//在图片背景上增加噪点 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Q`6 A{@5Y </span><font size=2>&nbsp;<br>g.setColor(getRandColor(random,160,200)); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">8M`w </span><font size=2>&nbsp;<br>g.setFont(new Font("Times New Roman",Font.PLAIN,14)); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">S h (%oy&lt;+ </span><font size=2>&nbsp;<br>for (int i=0;i&lt;6;i++) </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">[NFmqEEanb </span><font size=2>&nbsp;<br>{ </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">_R6 Lr9q </span><font size=2>&nbsp;<br>g.drawString("*********************************************",0,5*(i+2)); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">goQ2Va+ </span><font size=2>&nbsp;<br>} </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">}):f;M* </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">9L+)0)( </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">+4vsFa6* </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">Fj%N4$?(m </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">+Sv2qb </span><font size=2>&nbsp;<br>//取随机产生的认证码(6个汉字) </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">%[B|3.e </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">=e?R(E^Y" </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">XSp~5|I </span><font size=2>&nbsp;<br>//保存生成的汉字字符串 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">p^ &gt;Q(g </span><font size=2>&nbsp;<br>String sRand=""; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">/0A5(P&amp;q/ </span><font size=2>&nbsp;<br>for (int i=0;i&lt;6;i++) </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">ypeul27H8 </span><font size=2>&nbsp;<br>{ </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">h570L^ </span><font size=2>&nbsp;<br>int start = random.nextInt(length); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">L[4Aolk:M </span><font size=2>&nbsp;<br>String rand=base.substring(start,start+1); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&amp;hA0:^ </span><font size=2>&nbsp;<br>sRand+=rand; </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">D/ ^Kl </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">$N^odf(2  </span><font size=2>&nbsp;<br>//设置字体的颜色 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">2A&lt;BW~3FPt </span><font size=2>&nbsp;<br>g.setColor(getRandColor(random,10,150)); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">C hhWE@! </span><font size=2>&nbsp;<br>//设置字体 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">6&lt;\w'- </span><font size=2>&nbsp;<br>g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,18 + random.nextInt(6))); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">ftVk!3e </span><font size=2>&nbsp;<br>//将此汉字画到图片上 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">dMjL#H} </span><font size=2>&nbsp;<br>g.drawString(rand,24*i+ 10 + random.nextInt(8),24); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">I_i 7 % </span><font size=2>&nbsp;<br>} </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">! [ $qI1 </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">X8H6Fki </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">eP{42 C0= </span><font size=2>&nbsp;<br>//将认证码存入session </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">kCl -?N{og </span><font size=2>&nbsp;<br>session.setAttribute("rand",sRand); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&lt;uT}CUy </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">lfKXsvP </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">+M'E6E%w </span><font size=2>&nbsp;<br>g.dispose(); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">*$4SR? </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">OIFYpaBXb </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">&lt;~[q5tC+ </span><font size=2>&nbsp;<br>//输出图象到页面 </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">/z &lt;4A^+ </span><font size=2>&nbsp;<br>ImageIO.write(image, "JPEG", response.getOutputStream()); </font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">L$ "5TP&lt; </span><font size=2>&nbsp;<br>%&gt;</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> &amp;+ Q :0Y </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">~ oNku2, </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> |D6AG!J </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">4f$X#: </span><font size=2>&nbsp;<br>===========================</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> qozOA`,l </span><font size=2>&nbsp;<br></font><span style="FONT-SIZE: 0pt; COLOR: #ffffff">/j|Au)P </span><font size=2>&nbsp;<br>注:此方法没有在本站JSP虚拟主机测试过,不知道性能如何,如果要用验证请看:</font><span style="FONT-SIZE: 0pt; COLOR: #ffffff"> ~J|X4&gt;.Vm&nbsp;</span><font size=2>&nbsp;<br></font></span>
<img src ="http://www.blogjava.net/simie/aggbug/127515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:57 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp表达式语言(EL)（转载）</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127514.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127514.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127514.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127514.html</trackback:ping><description><![CDATA[<p class=bodycopy align=left>Sun Microsystems 在 1997 年下半年推出了 Servlet API，将它定位为 CGI 开发人员使用的一种功能强大的工具，这些开发人员正在寻找比 CGI（通用网关接口）编程更高效和轻便的优秀解决方案。但是，开发人员很快就发现 Servlet API 有其自身的缺点，从代码的可维护性和可扩展性方面来看，该解决方案难以实施。在某种程度上，这种缺点促使团队开发一种允许在 HTML 中嵌入 Java 代码的解决方案 — JavaServer Pages (JSP) 因此而出现。</p>
<p class=bodycopy>不久以后，开发人员意识到将表达与商务逻辑混合在一起的复杂 JSP 页不易于理解和维护。不能编写 scriplet 的页面制作人员所面临的另一个问题是由于标准标记集而带来的 JSP 限制。这些限制使得难点变成利用 JSP 实施自定义标记的机制来创建 JSP 自定义标记。 </p>
<p class=bodycopy>JSP 标准标记库 (JSTL) 是自定义标记库的集合，它将许多 JSP 应用程序通用的核心功能封装为简单的标记。它不再需要使用 JSP scriptlet<br>和表达式，而使用表达式的更高级语法。它还实现了通用目的的功能，如迭代和条件化、数据管理格式化、XML 操作、数据库访问、国际化和对本地化信息敏感的格式化标记以及 SQL 标记。JSTL 1.0 推出了 EL 的概念，但只限于 JSTL 标记。在 JSP 2.0 中，您可以使用带模板文本的 EL，甚至可以通过 javax.servlet.jsp.el 获得编程方式的访问。<br><br>在我们了解 JSTL 如何适应环境以及与 JSTL 表达式语言相关的限制以后，我们来看 JSP 2.0 的重要优点之一 — JSP 表达式语言 (EL)。我们将特别涉及到以下内容：<br><br><a></a><a href="http://www.360doc.com/showWeb/0/25/380722.aspx#jeld"><font color=#800080><u>JSP 表达式语言定义</u></font></a><a href="http://www.360doc.com/showWeb/0/25/380722.aspx#jeld"><font color=#800080></font></a><br><a href="http://www.360doc.com/showWeb/0/25/380722.aspx#mteeisjp"><font color=#800080><u>在无脚本的 JSP 页面中支持 EL 的机制</u></font></a><br><a href="http://www.360doc.com/showWeb/0/25/380722.aspx#els"><font color=#800080><u>表达式语言语法</u></font></a><br><a href="http://www.360doc.com/showWeb/0/25/380722.aspx#veitje"><font color=#800080><u>JSP EL 中有效的表达式</u></font></a><br><a href="http://www.360doc.com/showWeb/0/25/380722.aspx#uee"><font color=#800080><u>使用 EL 表达式</u></font></a><br><br></p>
<h2><a name=uee></a>
<p class=bodycopy>表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言，它提供了在 JSP 中简化表达式的方法。它是一种简单的语言，基于可用的命名空间（PageContext 属性）、嵌套属性和对集合、操作符（算术型、关系型和逻辑型）的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。<br><br>EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。<br><br>脚本编制元素具有三个从属形式： <br><br></p>
<li class=bodycopy>声明
<li class=bodycopy>Scriptlet
<li class=bodycopy>表达式。<br><br>让我们来看代码中的这三种从属形式：
<p class=bodycopy>&nbsp;</p>
<div align=center>
<div align=left>
<pre> <br> <br><jsp:expression> table.getColumn( ) </jsp:expression> </pre>
</div>
</div>
<p class=bodycopy>在将 EL 添加到 JSP 工具包以后，可以使用更简单的语法来编写以上的代码，而获得与以上 JSP 元素相同的结果。EL 表达式的另一个优势是，可以在不允许使用上述任何脚本编制元素从属形式的无脚本的 JSP 页中使用它。但是必须注意，可以不使用三种脚本编制元素从属形式中的任一种来编写 JSP 页，而对 JSP 页是否应该为无脚本形式的选择则完全基于应用程序的需求。如果您希望明确分开表达与商务逻辑，则还可以选择将页面强制为无脚本形式。通过强制成为无脚本页面，必须通过其他元素（如 JavaBean、EL 表达式、自定义操作和标准标记库）提供 JSP 页的动态行为。 </p>
</h2>
<h2><a name=uee></a>
<p class=bodycopy>有两种机制可以确保页面不包含任何脚本编制元素。每种机制还提供在无脚本的 JSP 页中支持 EL 的方法。 </p>
<ul>
    <li class=bodycopy><strong>
    <h4>使用页面指示：</h4>
    </strong>在使用页面指示时，您可以通过将 isELEnabled 指示的值相应地设为&#8220;true&#8221;或&#8220;false&#8221;，指定是否支持 EL，如下所示：<br><br>
    <pre><br></pre>
    </li>
</ul>
<div align=left></div>
<ul>
    <li class=bodycopy><strong>
    <h4>使用部署描述符的元素：</h4>
    </strong>当使用部署描述符的元素时，您可以通过在 <el-enabled></el-enabled>标记间包含布尔值&#8220;true&#8221;或&#8220;false&#8221;，指定是否支持 EL，如下所示：<br>
    <pre>...<br><jsp-config></jsp-config><br>  <jsp-property-group></jsp-property-group><br>    <url-pattern></url-pattern>*.jsp<br><strong>    <el-enabled></el-enabled>true</strong><br>    true<br>  <br><br>....</pre>
    </li>
</ul>
</h2>
<h2><a name=uee></a>
<p class=bodycopy>JSP 表达式语言允许页面制作人员使用简单语法访问组件，如： <br></p>
<pre>   <br>${expr}</pre>
<p class=bodycopy>在以上的语法中，expr 代表有效的表达式。必须注意，该表达式可以与静态文本混合，还可以与其他表达式结合成更大的表达式。 </p>
</h2>
<h2><a name=uee></a>
<p class=bodycopy>有效表达式可以包含文字、操作符、变量（对象引用）和函数调用。我们将分别了解这些有效表达式中的每一种： </p>
</h2>
<h3>文字 </h3>
<p class=bodycopy>JSP 表达式语言定义可在表达式中使用的以下文字：<br><br></p>
<h2 class=parahead1>&nbsp;</h2>
<table cellSpacing=0 cellPadding=5 width=949 border=1>
    <tbody>
        <tr align=middle bgColor=#cccccc>
            <th class=bodycopy>文字</th>
            <th class=bodycopy>文字的值</th>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>Boolean</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>true 和 false</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>Integer</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>与 Java 类似。可以包含任何正数或负数，例如 24、-45、567</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>Floating Point</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>与 Java 类似。可以包含任何正的或负的浮点数，例如 -1.8E-45、4.567</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>String</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠，使用反斜杠字符作为转义序列。必须注意，如果在字符串两端使用双引号，则单引号不需要转义。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>Null</td>
            <td class=bodycopy>null</td>
        </tr>
    </tbody>
</table>
<p class=bodycopy>让我们来看一些使用文字作为有效表达式的示例：<br><br></p>
<pre>${false} <br>${3*8)</pre>
<h3>操作符</h3>
<p class=bodycopy>JSP 表达式语言提供以下操作符，其中大部分是 Java 中常用的操作符：</p>
<h2 class=parahead1>&nbsp;</h2>
<table cellSpacing=0 cellPadding=5 border=1>
    <tbody>
        <tr align=middle bgColor=#cccccc>
            <th class=bodycopy>术语</th>
            <th class=bodycopy>定义</th>
        </tr>
        <tr>
            <td class=bodycopy>
            <p>算术型</p>
            </td>
            <td class=bodycopy>
            <p>+、-（二元）、*、/、div、%、mod、-（一元）</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p>逻辑型</p>
            </td>
            <td class=bodycopy>
            <p>and、&amp;&amp;、or、||、!、not</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p>关系型</p>
            </td>
            <td class=bodycopy>
            <p>==、eq、!=、ne、<lt></lt>、gt、&lt;=、le、&gt;=、ge。可以与其他值进行比较，或与布尔型、字符串型、整型或浮点型文字进行比较。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p>空</p>
            </td>
            <td class=bodycopy>
            <p>空操作符是前缀操作，可用于确定值是否为空。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>条件型</td>
            <td class=bodycopy>A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 </td>
        </tr>
    </tbody>
</table>
<p class=bodycopy>让我们来看一些使用操作符作为有效表达式的示例： </p>
<pre>${ (6 * 5) + 5 } <br>${empty name}</pre>
<h3>隐式对象</h3>
<p class=bodycopy>JSP 表达式语言定义了一组隐式对象，其中许多对象在 JSP scriplet 和表达式中可用：</p>
<table cellSpacing=0 cellPadding=5 width=959 border=1>
    <tbody>
        <tr align=middle bgColor=#cccccc>
            <th class=bodycopy>术语</th>
            <th class=bodycopy>定义</th>
        </tr>
        <tr>
            <td class=bodycopy>
            <p>pageContext</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>JSP 页的上下文。它可以用于访问 JSP 隐式对象，如请求、响应、会话、输出、servletContext 等。例如，${pageContext.response} 为页面的响应对象赋值。</p>
            </td>
        </tr>
    </tbody>
</table>
<p class=bodycopy>此外，还提供几个隐式对象，允许对以下对象进行简易访问： </p>
<h2 class=parahead1>&nbsp;</h2>
<table cellSpacing=0 cellPadding=5 width=961 border=1>
    <tbody>
        <tr align=middle bgColor=#cccccc>
            <th class=bodycopy>术语</th>
            <th class=bodycopy>定义</th>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>param</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将 请求参数名称映射到单个字符串参数值（通过调用 ServletRequest.getParameter (String name) 获得）。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>paramValues</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将 请求参数名称映射到一个数值数组（通过调用 ServletRequest.getParameter (String name) 获得）。它与 param 隐式对象非常类似，但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>header</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将请求头名称映射到单个字符串头值（通过调用 ServletRequest.getHeader(String name) 获得）。表达式 ${header.name} 相当于 request.getHeader(name)。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>headerValues</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将 请求头名称映射到一个数值数组（通过调用 ServletRequest.getHeaders(String) 获得）。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>cookie</td>
            <td class=bodycopy>将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie，则应该使用 ${headerValues.name} 表达式。</td>
        </tr>
        <tr>
            <td class=bodycopy>initParam</td>
            <td class=bodycopy>将上下文初始化参数名称映射到单个值（通过调用 ServletContext.getInitparameter(String name) 获得）。 </td>
        </tr>
    </tbody>
</table>
<p class=bodycopy>除了上述两种类型的隐式对象之外，还有些对象允许访问多种范围的变量，如 Web 上下文、会话、请求、页面：</p>
<h2 class=parahead1>&nbsp;</h2>
<table cellSpacing=0 cellPadding=5 width=963 border=1>
    <tbody>
        <tr align=middle bgColor=#cccccc>
            <th class=bodycopy>术语</th>
            <th class=bodycopy>定义</th>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>pageScope</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将页面范围的变量名称映射到其值。例如，EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象，还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>requestScope</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将 请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如，EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象，还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。</p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>sessionScope</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如：</p>
            <p class=bodycopy><br>$sessionScope.name} <br></p>
            </td>
        </tr>
        <tr>
            <td class=bodycopy>
            <p class=bodycopy>applicationScope</p>
            </td>
            <td class=bodycopy>
            <p class=bodycopy>将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。</p>
            </td>
        </tr>
    </tbody>
</table>
<p class=bodycopy>必须注意，当表达式根据名称引用这些对象之一时，返回的是相应的对象而不是相应的属性。例如：即使现有的 pageContext 属性包含某些其他值，${pageContext} 也返回 PageContext 对象。 </p>
<p>&nbsp;</p>
<h2><a name=uee></a>
<p class=bodycopy>EL 表达式可用于两种情况：</p>
<ul>
    <li class=bodycopy>作为标准操作和自定义操作中的属性值<br><br>
    <li class=bodycopy>在 JSP 文件的模板文本中，如 HTML 或非 JSP 元素 — 在这种情况下，模板文本中的表达式被赋值并插入到当前的输出中。但是，必须注意，如果标记的主体被声明为与标记相关，则不会对表达式赋值。 </li>
</ul>
</h2>
<table>
    <tbody>
        <tr>
            <td></td>
        </tr>
    </tbody>
</table>
<script type=text/javascript><!--
google_ad_client = "pub-6625678643128649";
google_alternate_color = "FFFFFF";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--></script>
<!--
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
--></li>
<img src ="http://www.blogjava.net/simie/aggbug/127514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:54 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlets和JSP开发原则（转载）</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127513.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127513.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127513.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127513.html</trackback:ping><description><![CDATA[<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术是用<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发服务器端应用的主要技术，是开发商务应用表示端的标准。<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发者喜欢使用它有多种原因，其一是对于已经熟悉<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语言的开发者来说这个技术容易学习；其二是<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>把&#8220;一次编写，到处运行&#8221;的理念带入到Web应用中，实现了&#8220;一次编写，到处实现&#8221;。而且更为重要的是，如果遵循一些良好的设计原则的话，就可以把表示和内容相分离，创造出高质量的、可以复用的、易于维护和修改的应用程序。比方说，在HTML文档中如果嵌入过多的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码（scriptlet），就会导致开发出来的应用非常复杂、难以阅读、不容易复用，而且对以后的维护和修改也会造成困难。事实上，在CSDN的<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a><a class=channel_keylink href="http://bbs.bc-cn.net/"><u><font color=#0000ff>论坛</font></u></a>中，经常可以看到一些提问，代码很长，可以逻辑却不是很清晰，大量的HTML和<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码混杂在一起，让人看得一头雾水。这就是随意开发的弊端。<br><br>　　如果你已经基本了解<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的各项技术（最好也开发过一些Web应用），那么我们可以一起探讨一下如何开发&#8220;好&#8221;的应用的一些指导原则。我们首先对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术做一个浏览。<br><br>　<span style="FONT-WEIGHT: bold">　</span><a class=channel_keylink style="FONT-WEIGHT: bold" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a><span style="FONT-WEIGHT: bold">和</span><a class=channel_keylink style="FONT-WEIGHT: bold" href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a><span style="FONT-WEIGHT: bold">概览</span><br><br>　　早期的动态网页主要采用CGI（Common Gateway Interface，公共网关<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BD%D3%BF%DA"><u><font color=#0000ff>接口</font></u></a>）技术，你可以使用不同的语言编写CGI程序，如<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/vb/Index.html"><u><font color=#0000ff>VB</font></u></a>、C/<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/cjj/Index.html"><u><font color=#0000ff>C++</font></u></a>或<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/delphi/Index.html"><u><font color=#0000ff>Delphi</font></u></a>等。虽然CGI技术发展成熟且功能强大，但由于编程困难、效率低下、修改复杂等缺点，所以有逐渐被取代的趋势。在所有的新技术中，<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>具备更高效、更容易编程、功能更强、更安全和具有良好的可移植性，因而被许多人认为是未来最有发展前途的动态网站技术。<br><br>　　与CGI相似，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>支持请求/响应模型。当一个客户向服务器递交一个请求时，服务器把请求送给<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>负责处理请求并生成响应，然后送给服务器，再由服务器发送给客户。与CGI不同的是，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>没有生成新的进程，而是与HTTP Server处于同一进程中。它通过使用线程技术，减小了服务器的开销。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>处理请求的过程是这样的：当收到来自客户端的请求后，调用service方法，该方法中<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>先判断到来的请求是什么类型的（GET/POST/HEAD&#8230;），然后调用相应的处理方法（doGet/doPost/doHead&#8230;）并生成响应。<br><br>　　别看这么复杂，其实简单说来<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>就是一个<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>类。与一般类的不同之处是，这个类运行在一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>容器内，可以提供<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=session&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>session</font></u></a>管理和对象生命周期管理。因而当你使用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的时候，你可以得到<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>平台的所有好处，包括安全性管理、使用JDBC访问<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>以及跨平台的能力。而且，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>使用线程，因而可以开发出效率更高的Web应用。<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server Pages (<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>)<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术是J2EE的一个关键技术，它在更高一级的层次上抽象<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>。它可以让常规静态HTML与动态产生的内容相结合，看起来像一个HTML网页，却作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>来运行。现在有许多商业应用服务器支持<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术，比如BEA WebLogic、IBM WebSphere、 JRun等等。使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>比用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>更简单。如果你有一个支持<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>的Web服务器，并且有一个<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>文件，你可以把它放倒任何静态HTML文件可以放置的位置，不用编译，不用打包，也不用进行ClassPath的设置，就可以像访问普通网页那样访问它，服务器会自动帮你做好其他的工作。<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>工作原理<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a> 文件看起来就像一个普通静态HTML文件，只不过里面包含了一些<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码。它使用.jsp的后缀，用来告诉服务器这个文件需要特殊的处理。当我们访问一个<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面的时候，这个文件首先会被<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>引擎翻译为一个<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>源文件，其实就是一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>，并进行编译，然后像其他<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>一样，由<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>引擎来处理。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>引擎装载这个类，处理来自客户的请求，并把结果返回给客户，如下图所示： <br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130122992.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_1.jpg" align=middle vspace=1 border=1><br>图1： 调用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面的流程<br><br>　　以后再有客户访问这个页面的时候，只要该文件没有发生过更改，<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>引擎就直接调用已经装载的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>。如果已经做过修改的话，那就会再次执行以上过程，翻译、编译并装载。其实这就是所谓的&#8220;第一人惩罚&#8221;。因为首次访问的时候要执行一系列以上的过程，所以会耗费一些时间；以后的访问就不会这样了。 <br><strong><br>开发原则</strong><br><br>　　这一部分我们列出一些开发原则，重点是<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面。关于如何分离表现和内容的MVC因为要涉及到<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的整合，我们稍候再谈。 <br><br>　　不要在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面中嵌入过量的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码：对于非常简单或是测试性的代码，把所有的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a> 代码直接放入<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面内是没有问题的。但是这种方法不应该被过度使用，否则就会产生一大堆HTML和<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>混合起来的代码，让人难以阅读和理解。解决方法是写一个单独的类，用来执行相关的计算。一旦这个类测试通过，就可以把它放在任何执行同样计算的场合中。这样可以促进代码的复用。 <br><br>　　选择合适的包含（include）机制: 如果一个应用中每个页面有一样的抬头和底部，或者还有导航条，那么就应该把它们放到一个单独的文件中，然后在每一个页面中使用包含机制把它们加入到这个页面中：<br><br>Include 指令： ＜%@ include file="filename" %＞或等效xml语法<br>＜jsp:directive.includefile=&#8221;filename&#8221; /＞ <br><br>Include 动作： ＜jsp:include page="page.jsp" flush="true" /＞ <br><br>　　Include指令是当<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面翻译为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的时候包含另外一个文件，Include 动作是当请求时包含另外一个文件的输出。如果被包含的文件不是经常改动的时候，我建议使用Include 指令，这样速度更快。如果被包含的文件需要不时改动或者知道请求时才能决定需要包含的内容时，那么应该使用Include 动作。<br><br>　　如果你使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>标准标记库（<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server pages Standard Tag Library即JSTL）的话，那么还有第三中包含机制＜c:import＞，可以用来包含本地或者远程的资源。例如： <br><br>＜c:import url="./copyright.html"/＞<br>＜c:import url="http://www.somewhere.com/hello.xml"/＞<br><br>　　不要把业务逻辑和表示混合在一起： 复杂的应用涉及大量的代码，因而把业务逻辑和前端的表示相分离就显得格外重要，这种分离可以让任何一方的变化不会影响到另外一方。所以，所有的<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>代码都应该限制在表示层，可是如果这样的话，你如何实现你的业务逻辑呢？这就是<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean所做的事情。<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean技术是一个独立于平台的组件模型，它让开发者编写、测试通过一个组件后，可以随处使用，提高了复用性。在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中，<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean实现了业务逻辑部分，它把数据返回给<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面，由<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面负责格式化数据并输出到客户端的浏览器。在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面中使用<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean组件的好处是： <br><br>　　产生了可以复用的组件：任何应用都可以使用这些组件 <br><br>　　可以把业务逻辑和表示相分离：你可以修改数据的显示方式而不用考虑业务逻辑。这样做的结果也可以明确工作中开发人员的分工，网页开发人员可以把精力放到如何显示数据上，<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发者则更为关注业务逻辑的实现。 <br><br>　　对于<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean你不用提供源代码，这样你的代码就不会被浏览器网页的人轻易获得，可以保护你的劳动成果。 <br><br>　　如果你的应用中使用了EJB组件，那么业务逻辑就应该放置在EJB中，因为EJB模型提供了生命周期管理、事务管理以及多客户访问域对象（Entity Beans）。你可以仔细看一下Enterprise BluePrints中的例子，它就是这么做的。 <br><br>　　使用定制的标记： 上面我们已经讨论过，把所有<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码嵌入到<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面内并不合适，因为网页开发人员并不一定懂得<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语言，更难以理解<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语法。<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean可以封装很多<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码，不过在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面内使用<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean仍然要求页面开发人员了解一些<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语法。<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中包含了定制标记库的功能。<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发人员可以生成自己的标记库，这样网页设计人员就可以使用类似HTML的语法来使用这些标记。编写和使用自己定制的标记库可以在更大程度上促进业务逻辑和表示的分离。使用定制标记库主要有以下好处： <br><br>　　<strong>可以消除在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面中使用scriptlet</strong>　标记使用的任何参数都可以通过<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>传入，从而不需要使用<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码就可以达到希望的目的。 <br><br>　　<strong>可以简化使用</strong>　网页设计人员不需要学会使用<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语法，他们可以用类似HTML语法就可以使用标记。 <br>不懂<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>的网页设计人员可以使用标记库来完成单独使用HTML不能完成的任务。 <br><br>　　<strong>提高了复用性</strong>　标记库完全可以复用，这可以节省开发和测试的时间。Scriptlet代码只能在&#8220;拷贝粘贴&#8221;级别上进行&#8220;复用&#8221;。 <br><br>　　简单说来，你可以像用HTML构建表示层一样使用标记库完成非常复杂的任务。下面是表页标记库的一些注意事项： <br><br>　　1. 保持简洁性：如果一个标记需要好几个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>的话，那么尽可能把它分为几个标记。 <br><br>　　2. 保持复用性：同标记的使用人员（网页设计人员）多多交流，尽量开发出可以高度复用的标记库。 <br><br>　　3. 不要一切都从头开始：现在已经有一些可以免费使用的标记库，比如Jakarta Taglibs。如果你要用到一个标记，先看看是不是已经有现成的可以使用。 <br><br>　　不要&#8220;重新发明轮子&#8221;，不要一切从头开始： 通过定制组件可以提高复用性，不过定制组件仍然需要编写、测试和调试程序。问题是这个事情别人可能已经实现了，而且你的实现方式并不一定比人家做得更好。这就是<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>标准标记库（<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server Pages Standard Tag Library, JSTL）要做的事情（JSTL请参考JSTL官方网站）。JSTL提供了循环、读<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>、遍历各种<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/sjjg/Index.html"><u><font color=#0000ff>数据结构</font></u></a>、条件表达式求值等各种标记。它也提供了一些复杂的标记，甚至像解析<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>文档的标记它都有。所以如果你要用到一个标记的话，最好先看看有没有别人已经实现的可以使用，而不要次次从头开始，自己搞一套。 <br><br>　　使用JSTL表达使语言（JSTL Expression Language）： 传递给<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面的数据一般通过<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>作用域<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>或者请求参数来进行。专门为网页开发者设计的表达式语言（Expression Language, EL）把使用作用域<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>传递信息作为从业务逻辑向<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面传递信息的标准方式。这里要注意的是，EL只是<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中关键的一个方面，并不是一种通用的程序设计语言。相反，它只是一种数据访问语言，它可以简化应用程序的数据的访问，不用Scriptlet和请求时表达式求值就可以访问数据。<br><br>　　在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>中，网页设计师要使用表达式语法＜%= name %＞或<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean组件来取得某些变量或<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>的值，例如： <br><br>＜tagLib:tag attribute="＜%=<br><br>pageContext.getAttribute("name") %＞"＞<br><br>　　或 <br><br>＜%= aCustomerBean.getAddress().getCountry() %＞<br><br>　　表达使语言让网页设计师可以使用简化的语法来访问信息。如果你只是要访问一个简单的变量，你可以使用这样的语法：<br><br>＜tagLib:tag attribute="${name}"＞<br><br>　　如果你要访问一个嵌套<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属性</font></u></a>，你可以这样：<br><br>＜tagLib:tag attribute ="${<br><br>aCustomerBean.address.country}"＞<br><br>　　表达式语言（EL）借用了<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Script 的语法，所以如果你对<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Script 很熟悉的话，你就会觉得巨爽。<br><br>　　使用过滤器（filter）： 过滤器是一个对象，可以传输请求或修改响应。它可以在请求到达<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>之前对其进行预处理，而且能够在响应离开<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>之后对其进行后处理。所以如果你有几个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>需要执行同样的数据转换或页面处理的话，你就可以写一个过滤器类，然后在部署描述文件（web.xml）中把该过滤器与对应的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>联系起来。<br><br>　　创建过滤器其实很容易，你只须实现javax.servlet.Filter<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BD%D3%BF%DA"><u><font color=#0000ff>接口</font></u></a>及它的三个方法：<br><br>public void init(FilterConfig config)<br><br>public void doFilter(<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>Request req, <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>Response rep, <br><br>FilterChain chain)<br><br>public void destroy()<br><br>　　这样，你就可以完成你的过滤器。<br><br>使用可移植的安全模型：大部分的应用服务器都提供了安全模型，不过一般它们都是针对某一个服务器或某一个厂商专有的。如果你的应用需要移植的话，那么你的应用最好使用可以移植的安全模型。如果你的应用有一些预先定义的固定用户的话，那么你可以使用FROM验证和BASIC验证。可是如果你要动态生成客户的话（一般都是这种情况），你可能就需要使用服务器特定的API来创建和管理用户。这样当你的应用移植到另外一个服务器时，你可能就会碰到API不兼容的问题。这种情况下，最好的解决方法是使用适配器（Adapter）模式（如果你对设计模式不熟悉的话，请参看GoF的《设计模式》一书）。 <br><br>　　用<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>来保存持久性数据： <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>中可以使用HttpSession对象也就是会话对象来保存用户的临时数据。不过如果你想保存持久性数据的时候，你应该使用<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>，数据保存数据会更安全，而且对客户所用的浏览器没有什么要求。这样即使你的应用服务器由于某种原因崩溃了，你的数据依然良好。 <br><br>　　高速缓存页面： 应用程序中总有一些东西是相对固定的，而另外一些东西是经常变化的。你应该使用静态的HTML文档来存储那些相对固定的内容，这样客户端就可以进行高速缓存，客户每次访问你的应用时，只需访问已经改动的部分。这样可以加快客户的访问速度。 <br><br>　　使用连接池： 如果你要自己写<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>访问代码的话，我觉得使用你应该学会如何使用<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>连接池技术。每一个服务器都有针对<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>连接池的配置文档，你要学习一下如何使用。<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>连接池可以加速你的应用的数据访问的速度，而且由于服务器替你管理了<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>连接，这可以节省你的很多工作。 <br><br>　　缓存<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>的访问结果： 如果你的应用要对<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>进行频繁访问的话，你可以使用一个对象来缓存你的数据，这样你就可以节省大量访问<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>的开销。在《J2EE核心模式》和《实用J2EE设计模式编程指南》两本书中都有关于值对象模式（Value Object Pattern）的详细探讨，你可以参考这两本书来获得相应的知识。 <br><br>　　使用数据访问对象模式：如果你的应用需要访问多个<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>系统或者可能会移植到其它的存储系统中，那么你针对特定厂商的优化代码就可能会失效。使用通用的代码存在执行效率的问题，而使用优化代码又存在移植的问题。所以就产生了数据访问对象模式（Data Access Object Pattern, DAO），该模式既提供了各<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据库</font></u></a>厂商的适应性，又能利用到他们提供的独特的好处。按照<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%C3%E6%CF%F2%B6%D4%CF%F3"><u><font color=#0000ff>面向对象</font></u></a>的分离任务的原则，该模式将与企业信息系统（Enterprise Information System, EIS）通讯需要的逻辑隔离到它自己的类中。这样，事物对象，如<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>组件、<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean就可以利用数据访问对象（DAO）处理所有与EIS有关的事务。 <br><br>　　最好采用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>的<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法： <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中经常存在着两种完成同一个任务的语法，一种是常规的<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>语法，一种是对应的<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。虽然两种语法作用相同，你最好还是使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。存在两种语法的原因是，<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>语法可以与以前的代码兼容，而J2EE使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>作为其交换数据的核心，所以同时提供了<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。随着J2EE的发展，<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>的作用会越来越大，所以我建议你使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。 <br><br>　　研究Sun提供的J2EE BluePrints: Sun的Enterprise BluePrints 提供了大量指导原则、设计模式和很好的例子（宠物店，Pet Store）。你可以好好研究一下这些内容，这样可以提高你的设计和开发水平。 <br><br>　　<strong>整合<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a></strong><br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术规范种给出了两种使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>开发Web应用的方式，这两种方式可以归纳为模型一和模型二，这两种模型的主要差别在于它们处理业务的流程不同。模型一，如下图所示，称之为<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>+<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Beans模型。在这一模型中，<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面独自响应请求并将处理结果返回给客户，所有的数据通过<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean来处理，<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>实现页面的表现。<br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130123372.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_2.jpg" align=middle vspace=1 border=1><br>图2： <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>模型一 <br><br>　　从上图可以看出，模型一也实现了页面表现和业务逻辑相分离。然而使用这种方式就要在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面使用大量的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码，当需要处理的业务逻辑很复杂时，这种情况会变得非常糟糕。大量嵌入式代码使整个页面程序变得异常复杂。对于前端界面设计的网页开发人员来说，这简直是一场噩梦。所以，模型一不能满足大型应用的需要，但是对于小型应用，因为该模型简单，不用涉及诸多要素，从而可以很好地满足小型应用的需要，所以在简单应用中，可以考虑模型一。<br><br>　　模型二，如下图所示，称之为<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>+<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>+<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Beans模型。这一模型结合了<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>技术，充分利用了<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>两种技术原有的优势。这个模型使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术来表现页面，使用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>技术完成大量的事务处理，使用Bean来存储数据。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=Servlet&amp;Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>用来处理请求的事务，充当一个控制者的角色，并负责向客户发送请求。它创建<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>需要的Bean和对象，然后根据用户请求的行为，决定将哪个<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>页面发送给客户。<br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130123452.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_3.jpg" align=middle vspace=1 border=1><br>图3： <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>模型二<br><br>　　从开发的观点看，模型二具有更清晰的页面表现，清楚的开发角色的划分，可以充分利用开发团队中的网页设计人员和<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发人员。这些优势在大型项目中表现得尤为突出，网页设计人员可以充分发挥自己的美术和设计才能来充分表现页面，程序编写人员可以充分发挥自己的业务逻辑处理思维，实现项目中的业务处理。<br><br>　　另外，从设计结构来看，这种模型充分体现了模型视图控制器（MVC）的设计架构。事实上，现存的很多开发框架都是基于这种模型的，充分实现了MVC ，例如Apache Struts框架和<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server Faces框架 <br>
<img src ="http://www.blogjava.net/simie/aggbug/127513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:51 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 2.0的新特性</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127505.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127505.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127505.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127505.html</trackback:ping><description><![CDATA[SUN 的新版J2EE1.4提供了在J2EE中开发Web Service的基础，对开发工具做了一些重要的增强，在应用程序部署和服务器管理方面也提供了新的标准，在集成性和安全性方面有所增强，提升了J2EE开发Web应用程序的能力；在编程模型方面的重要变化包括JSP表达式语言、简化的标记库等；EJB 2.1中提供了新的timer服务，查询语言（QL）也有所增强；Jdbc3.0 API把通常的Jdbc API与扩充API结合起来；J2EE Connectors规范和独立于消息类型的EJB提供了对双向通信的支持。下面给大家重点介绍J2EE1.4中包含的JSP2.0、Servlet2.4、Jdbc3.0以及EJB2.1方面的新特性。
<p>&nbsp;&nbsp;&nbsp; JSP 2.0属于J2EE 1.4平台，它在JSP 1.2基础之上增加了新的功能。它保证了向下兼容，原先使用的JSP技术在JSP 2.0中都可以支持。JSP 2.0的新功能主要包括下面几部分：</p>
<h5>一）运行环境变化</h5>
<p><strong>1、web.xml格式变化</strong></p>
<p>我们知道JSP 1.2可以在Java 2标准版1.3版本运行，而JSP 2.0要求使用Java 2标准版1.4或更新版本，JSP 2.0使用由Servlet 2.4规定的Web程序部署描述格式。</p>
<p>在Web程序描述文件web.xml中需要使用xml schema打头的格式。在web.xml中主要的变化是所有有关JSP的设置信息要放在&lt;jsp-config&gt;标记中。下面程序例1显示了一个web.xml大致的样子。</p>
<p>&nbsp; <strong>&nbsp;&nbsp;例1：</strong></p>
<p>&nbsp;&nbsp;&nbsp; <font color=#0066ff>&lt;?xml version="1.0" encoding="IS0-8859-1"?&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; version="2.4"&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; .......</font></p>
<p><font color=#0066ff>&nbsp;&nbsp; &nbsp;&lt;jsp-config&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;taglib&gt;&nbsp;&nbsp;&nbsp; </font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; http://www.icconcept.com/ics/sample-taglib</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/taglib-uri&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; /WEB-INF/jsp/sample-taglib.tld</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/taglib-location&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/taglib&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; ........</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;jsp-property-group&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;description&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; For config the ICW sample application</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/description&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/jsp/datareset.jsp&lt;/url-pattern&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;el-ignored&gt;true&lt;／el-ignored&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;page-encoding&gt;ISO-8859-1&lt;/page-encoding&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;scripting-invalid&gt;true&lt;/scripting-invalid&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;include-prelude&gt;/jsp/prelude.jspf&lt;/include-prelude&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;include-coda&gt;/jsp/coda.jspf&lt;/include-coda&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/jsp-property-group&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/jsp-config&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/web-app&gt;</font></p>
<div>2、JSP设置</div>
<div>&nbsp;&nbsp; 在&lt;jsp-config&gt;标记提供了Web程序中JSP程序的设置信息。&lt;jsp-config&gt;包括&lt;taglib&gt;和&lt;jsp-property-group&gt;两类元素。&lt;taglib&gt;定义了Web程序使用的custom tag，它的用法和以前JSP 1.2中的用法相同。&lt;jsp-property-group&gt;定义了一组JSP的特性。这些特性实际上对应JSP的page directive定义的特性。通过&lt;jsp-property-group&gt;只不过可以方便地对多个具有相同属性的JSP统一定义。</div>
<div>&nbsp;&nbsp;&nbsp; &lt;jsp-property-group&gt;定义一个或多个URL样式，在&lt;jsp-property-group&gt;中定义的属性会适用于匹配这些URL样式的所有JSP文件。在&lt;jsp-property-group&gt;中的属性可以定义以下设置：</div>
<div>&nbsp;&nbsp;&nbsp; (1)允许或禁止使用表达式语言(EL)</div>
<div>&nbsp;&nbsp;&nbsp; 在&lt;jsp-property-group&gt;中可以设定是否允许对应&lt;url-pattern&gt;的JSP使用JSTL表达式语言(EL)。如果&lt;el-ignored&gt;属性标记被设定为false，JSP中的EL表达式会被处理；如果是true，Web容器会在转换JSP时忽略EL表达式。</div>
<div>&nbsp;&nbsp;&nbsp; (2)允许或禁止使用scripting</div>
<div>&nbsp;&nbsp;&nbsp; &lt;scripting-invalid&gt;属性可以允许或禁止使用JSP的脚本语言(scripting)。如果这个属性标记对应为true，即scripting元素被禁止，则JSP中不能使用scriptlet，scripting表达式和declaration，否则会有转换错误。当这个属性标记为false时，JSP可以像在1.2版本之前那样使用脚本语言。</div>
<div>&nbsp;&nbsp;&nbsp; (3)声明JSP编码</div>
<div>&nbsp;&nbsp;&nbsp; 通过&lt;page-encoding&gt;标记可以设置对应&lt;url-pattern&gt;的JSP网页的编码。这个属性对应每个JSP中的pageEncoding属性，Web容器将根据这个属性对JSP内容进行编码。</div>
<div>&nbsp;&nbsp;&nbsp; (4)对应隐含包括(Implicit Includes)</div>
<div>&nbsp;&nbsp;&nbsp; 在&lt;jsp-property-group&gt;中可以在对应JSP中加入抬头(preludes)和结尾(coda)，使用&lt;include-prelude&gt;和&lt;include-coda&gt;属性可以设定在JSP网页中包括的preludes和coda的jspf文件。这些文件的位置相对于当前Web程序的context。当有超过一个preludes或coda元素在&lt;jsp-property-group&gt;中时，JSP会按照其顺序加入到内容中。<br></div>
<h5>二）引入表达式语言(EL)</h5>
<p>JSP 2.0的一个主要特点是它支持表达语言(expression language)。JSTL表达式语言可以使用标记格式方便地访问JSP的隐含对象和JavaBeans组件，JSTL的核心标记提供了流程和循环控制功能。自制标记也有自定义函数的功能，因此基本上所有seriptlet能实现的功能都可以由JSP替代。在JSP 2.0中，建议尽量使用EL而使JSP的格式更一致。</p>
<p>在web.xml的&lt;jsp-property-group&gt;中可以控制一组JSP是否使用EL，在每个JSP中也可以指定是否该JSP使用EL。在page directive中的isELIgnored属性用来指定是否忽略。格式为：</p>
<p>&nbsp; &lt;%@ page isELIgnored＝"true|false"%&gt;</p>
<p>如果设定为真，那么JSP中的表达式被当成字符串处理。比如下面这个表达式&lt;p&gt;${2000 % 20}&lt;/p&gt;在isELIgnored＝"true"时输出为${2000 % 20}，而isELIgnored＝"false"时输出为100。Web容器默认isELIgnored＝"false"。</p>
<div>&nbsp;虽然JSP 2.0可以使JSP中完全使用表达语言而避免scriptlet，在实际编程中，应该根据程序的功能要求和编程人员的自身条件选择合适的方式。使用表达语言的JSP比较方便规整，但是由于需要将标记进行转换，在第一次被调用时会比较慢；有些编程人员由于对Java比较了解，因而更习惯JSP 1.2之前的编程方式，因此，在使用中应因地制宜地选择适用的编程方法。&nbsp;&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<h5>三）SimpleTag</h5>
<p>JSP 2.0中加入了新的创建自制标记的API，javax.servlet.jsp.tagext.SimpleTag定义了用来实现简单标记的接口。和JSP 1.2中的已有接口不同的是，SimpleTag接口不使用doStartTag()和doEndTag()方法，而提供了一个简单的doTag()方法。这个方法在调用该标记时只被使用一次。而需要在一个自制标记中实现的所有逻辑过程、循环和对标记体的评估等都在这个方法中实现。从这个方面来讲，SimpleTag和IterationTag可以达到同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来设置JSP内容的seUspBody()和getJspBody()方法。Web容器会使用setJspBody()方法定义一个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTag方法中根据需要多次调用getJspBody().invoke()方法以处理JSP内容。</p>
<p>&nbsp;例如，程序例2 SimpleTag根据指定的次数(times)进行循环并输出当前序号(sequence)。程序的结构比较简单，所有逻辑都在doTag方法中实现。</p>
<p><strong>例2：</strong></p>
<p>&nbsp; <font color=#0066ff>packageICW.taglib;</font></p>
<p><font color=#0066ff>&nbsp; importjavax.servlet.jsp.JspException;</font></p>
<p><font color=#0066ff>&nbsp; importjavax.servlet.jsp.tagext.SimpleTagSupport;</font></p>
<p><font color=#0066ff>&nbsp; importjava.util.HashMap;</font></p>
<p><font color=#0066ff>&nbsp; importjava.io.IOException;</font></p>
<p><font color=#0066ff>&nbsp; public class IterationSimpleTag extends SimpleTagSupport{</font></p>
<p><font color=#0066ff>&nbsp; privateint times;</font></p>
<p><font color=#0066ff>public void setTimes(int_times){</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; this.times=_times;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; public void doTag() throws JspException,IOException{</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; HashMapparams=new HashMap();</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; for(inti=0; i&lt;times;i++){</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; params.put("sequence",String.valueOf(i+1));</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; getJspBody().invoke(null,params);</font></p>
<p><font color=#0066ff>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &nbsp;}</font></p>
<div><font color=#0066ff>&nbsp;&nbsp;&nbsp; }</font>
<div>&nbsp;</div>
<div>这个标记的TLD文件内容如下，它使用了XML schcma定义标记的使用方法。</div>
<p>&nbsp;&nbsp;&nbsp; 程序例3如下：</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#0066ff>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;taglibxmlns="http://java.sun.com/xml/ns/i2ee"</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; xmlns:xsi="http://WWW.w3.org/2001/XMLSchema-instance"</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; xsl:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglihrary_2_0.xsd"</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; version="2.0"&gt;</font></p>
<p><font color=#0066ff>&nbsp; &lt;taglib&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;tiib-version&gt;1.0&lt;/tlib-version&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;short-name&gt;Jwad book simple tag&lt;/short-name&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;uri&gt;/JwadSimpleTag&lt;/uri&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;description&gt;Simple Tag Handler&lt;/description&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;tag&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;name&gt;iteration&lt;/name&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;tag-class&gt;ICW.taglib.<strong>IterationSimpleTag</strong>&lt;/tag-class&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;body-content&gt;scriptless&lt;/body-content&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;description&gt;Iteration Tag&lt;/description&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;variable&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;description&gt;Current iterationnumber&lt;/description&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;name-given&gt;sequence&lt;/name—given&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/variable&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;attribute&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;name&gt;times&lt;/name&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;required&gt;true&lt;/required&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/attribute&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/tag&gt;</font></p>
<div><font color=#0066ff>&nbsp;&nbsp;&nbsp;&lt;/taglib&gt;</font>
<div>&nbsp;</div>
<p>程序例4中的JSP使用上面例3中定义的IterationSimpleTag，它根据Web请求参数中给定的&#8220;times&#8221;的值进行一定次数的循环。在每次循环中将输出"sequence"的值。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>例4：</strong></p>
<p>&nbsp;&nbsp;&nbsp; <font color=#0066ff>&lt;%@ taglib prefix="ictag" uri="/WEB-INF/ics-jsp2.tld" %&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Simple Tag Sample&lt;/TITLE&gt;&lt;/HEAD&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;BODY&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;CENTER&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;FONT COLOR='#009999' SIZE='4' face='Arial'&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;STRONG&gt;Interation Simple Tag&lt;/STRONG&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp; &nbsp;&lt;/FONT&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/CENTER&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;HR&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;c:setvar="time" value="$"/&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;p&gt;&lt;B&gt;Reminder:&lt;/B&gt;&lt;/p&gt;&lt;br&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;ictag:iteration times="$"&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; This is the $ Of $ times of reminder&lt;br&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/ictag:iteration&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/body&gt;</font></p>
<div><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/html&gt;</font>
<div>&nbsp;</div>
<h5>四）使用JSP fragment</h5>
<p>&nbsp;JSP 2.0中的一个主要功能是JSP fragment，它的基本特点是可以使处理JSP的容器推迟评估JSP标记属性。我们知道一般JSP是首先评估JSP标记的属性，然后在处理JSP标记时使用这些属性，而JSP fragment提供了动态的属性。也就是说，这些属性在JSP处理其标记体时是可以被改变的。JSP需要将这样的属性定义为javax.servlet.jsp.tagext.JspFragment类型。当JSP标记设置成这种形式时，这种标记属性实际上的处理方法类似于标记体。在实现标记的程序中，标记属性可以被反复评估多次。这种用法称为JSP fragment。JSP fragment还可以定义在一个SimpleTag处理程序中使用的自制标记动作。像前面例子说明的，getJspBody返回一个JspFragment对象并可以在doTag方法中多次使用。需要注意的是，使用JSP fragment的JSP只能有一般的文本和JSP action，不能有scriptlet和scriptlet表达式。</p>
<p>&nbsp; 我们可以简单地认为JSP fragment是一段可以重复使用的JSP。一段JSP fragment可以被传递到另一个JSP中并被使用。与JSP include概念不同的是，JSP fragment一般功能比较短小简单而且重复使用率高。</p>
<p>&nbsp; JSP fragment一般在&lt;jsp:attribute&gt;标记体内或&lt;jspcbody&gt;标记体内定义。每次当含有JSP fragment的标记被使用时，Web容器生成一个JspFragment对象，这个对象和当前JSP的page scope联系起来。同时，这个JspFragment对象和包含它的父标记建立联系。JspFragment对象可以有两种调用方式：使用Java编写的标记处理程序，或者使用标记文件(tag file)。标记文件可以使用&lt;jsp:invoke&gt;，或者&lt;jsp:doBody&gt;动作使用JSP fragment。&nbsp; JSP标记文件可以和JSP fragment共同工作。CustomTag都是以编程方式实现的。JSP标记文件是用文本文件格式(JSP语法)实现自制标记，这也是JSP 2.0的一个主要新功能。一个标记文件可以对应一个标记，可以不需tld文件定义该标记的方法。这样，即使编程人员不熟悉Java，也可以使用JSP语法定义自己的标记。标记文件一般使用.tag为后缀并放在Web程序的/WEB-INF目录下。</p>
<div>&nbsp; 程序例5中的taskstatus.jsp使用了两个JSP fragment。这个JSP的功能是显示一组Task的名称和完成日期，它通过&lt;jsp:attribute name＝"..."&gt;定义了两段JSPfragment(名称为onSehedule和delayed)。在&lt;jsp:attribute&gt;标记内的JSP就是JSPfragment，而&lt;jsp:attribute&gt;标记被一个&lt;ietag:listTasks&gt;包围。这个标记是一个通过标记文件定义的自制标记，它的定义文件在/WEB-INF/tags目录下。标记文件的名称和标记名称一致为&#8220;listTasks.tag"。这个标记会使用到前面定义的两个JSP fragment。</div>
<div>&nbsp;</div>
<div><strong>&nbsp;例5:</strong></div>
<p>&nbsp; <font color=#0066ff>&lt;%@ taglib prefix="ictag" tagdir="/WEB-INF/tags" %&gt;</font></p>
<p><font color=#0066ff>&nbsp; &lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;JSP Fragment Sample&lt;/TITLE&gt;&lt;/HEAD&gt;</font></p>
<p><font color=#0066ff>&nbsp; &lt;BODY&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;CENTER&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;FONT COLOR='#009999' SIZE='4' face='Arial'&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;STRONG&gt;JSP Fragment Sample Using Tag Files&lt;/STRONG&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/FONT&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/CENTER&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;HR&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;h2&gt;Tasks&lt;/h2&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; <strong>&lt;ietag:listTasks&gt;</strong></font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; <strong>&lt;jsp:attribute name="onSchedule"&gt;</strong></font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;td&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; Name:$&lt;br/&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/td&gt;&lt;td&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; Date:$</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/td&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/jsp:attribute&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; <strong>&lt;jsp:attribute name="delayed"&gt;</strong></font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;td&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; Name:$&lt;br/&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/td&gt;&lt;td&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;font color="red"&gt;Plan:&lt;strike&gt; $&lt;/strike&gt;&lt;/font&gt;&lt;br/&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;b&gt;Actural:$&lt;/b&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/td&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/jsp:attribute&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/ictag:listTasks&gt;</font></p>
<p><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/BODY&gt;</font></p>
<div><font color=#0066ff>&nbsp;&nbsp;&nbsp; &lt;/HTML&gt;</font>
<div>&nbsp;</div>
<div>
<h5>五）其他特性</h5>
<p>&nbsp;JSP2.0还有一些其他特性变化，比如严格修正了I18N的语法规则，改进JSP对应XML语法从而允许使用namespaces等。这些并不是核心功能，大家可以参照java.sun.com的有关资料了解功能的细节，这里就不再阐述。</p>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/simie/aggbug/127505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:32 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet/JSF:标签库的深入研究</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127504.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127504.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127504.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127504.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">标签库Taglib</p>
<p style="TEXT-INDENT: 2em">标签被定义和分布在一个称为标签库的结构中，一个标签库是由元信息和类组成的集合：</p>
<p style="TEXT-INDENT: 2em">1.标签处理器：实现定制标签功能的Java类。</p>
<p style="TEXT-INDENT: 2em">2.标签附加信息（TEI）：向JSP容器提供边辑以确认标签属性和创建变量的类。</p>
<p style="TEXT-INDENT: 2em">3.标签库描述器（TLD）：描述单个标签和整个标签库属性的XML文档。</p>
<p style="TEXT-INDENT: 2em">标签处理器和标签附加信息需要定位在JSP容器类载入器可以找到的地方。标签库描述器可在URL指定的符意位置。JSP1.1规范要求JSP容器接受一个打包成因定结构的JAR文件的标签库。TLD必须是/META-INF目录中名为taglib.tld的文件，JAR文件则复制到/WEB-INF/lib目录下。</p>
<p style="TEXT-INDENT: 2em">一、标签实现</p>
<p style="TEXT-INDENT: 2em">1.开发步骤</p>
<p style="TEXT-INDENT: 2em">a.定义标签的名字、属性、声明的变量和标签体的内容。</p>
<p style="TEXT-INDENT: 2em">b.编写标签库描述器TLD。</p>
<p style="TEXT-INDENT: 2em">c.编写标签处理器。</p>
<p style="TEXT-INDENT: 2em">d.在JSP页面中使用标签。</p>
<p style="TEXT-INDENT: 2em">2.JSP页面在JSP容器中的转换步骤：</p>
<p style="TEXT-INDENT: 2em">JSP页面存在三种形式：jsp文件、java文件和class文件。</p>
<p style="TEXT-INDENT: 2em">a.指令元素<%@page%>、<%@include%>和<%@taglib%>向JSP容器提供转换时信息。</p>
<p style="TEXT-INDENT: 2em">b.HTML行在_jspService()方法中依顺序转换到out.print()语名中。</p>
<p style="TEXT-INDENT: 2em">c.脚本元素的声明被原封不动地复制到_jspService()方法外的源码中。</p>
<p style="TEXT-INDENT: 2em">d.脚本元素的表达式在_jspService()方法中依顺序转换到out.print()语名中。</p>
<p style="TEXT-INDENT: 2em">e.脚本元素的Scriptlet被原封不动地复制到_jspService()方法中。</p>
<p style="TEXT-INDENT: 2em">f.行为元素被转换为执行其功能的运行时逻辑代码。</p>
<p style="TEXT-INDENT: 2em">g.定制标签被扩展到调用其相应标签处理器中方法的Java语句中。</p>
<p style="TEXT-INDENT: 2em">3.标签在JSP容器中的转换步骤：</p>
<p style="TEXT-INDENT: 2em">a.JSP容器使用taglib指令元素定位标签库描述器，将页面中用到的定制标签和TLD相匹配。</p>
<p style="TEXT-INDENT: 2em">b.读取标签库描述器的标签列表和每一标签相关的类名字。</p>
<p style="TEXT-INDENT: 2em">c.在页面中遇到一个标签时，查找与具有指定名字的标签前缀相关的一个标签库。</p>
<p style="TEXT-INDENT: 2em">d.容器使用在TLD中找到的标签结构信息生成一系列完成标签功能的Java语句。</p>
<p style="TEXT-INDENT: 2em">二、标签库描述器（TLD）</p>
<p style="TEXT-INDENT: 2em">标签库描述器是一个描述整个标签库标记信息和库中每个标签处理器及其属性的XML文档。</p>
<p style="TEXT-INDENT: 2em">标签库描述器的DTD由一个简单的<taglib>元素组成，此元素包含下列一些子元素。</p>
<p style="TEXT-INDENT: 2em">整个标签库标记信息</p>
<p style="TEXT-INDENT: 2em">tlibversion标签库版本号。是一个点式十进制数，最多为4组小数点分隔的数字组成。</p>
<p style="TEXT-INDENT: 2em">jspversion标签库所需的JSP规范最低版本。例如JSP1.1</p>
<p style="TEXT-INDENT: 2em">shortname标签库的缩写名。JSP可以使用该名字作为库中标签的缺省前缀。</p>
<p style="TEXT-INDENT: 2em">uri标签库唯一URI的元素。典型URL位置来自可下载taglib的位置。</p>
<p style="TEXT-INDENT: 2em">info标签库描述信息。</p>
<p style="TEXT-INDENT: 2em">每个标签处理器及其属性</p>
<p style="TEXT-INDENT: 2em">tag在TLD中加入标签，描述组成库的每个标签。</p>
<p style="TEXT-INDENT: 2em">name与标签库的名字前缀一起使用的标签的名字，是JSP容器唯一的标签标识。</p>
<p style="TEXT-INDENT: 2em">tagclass实现标签的标签处理器类的全名。</p>
<p style="TEXT-INDENT: 2em">teiclass标签附加信息（TEI）类的全名。TEI类给出关于标签处理器创建变量及对标签司性执行的任意有效性验证的信息。</p>
<p style="TEXT-INDENT: 2em">bodycontent描述标签处理器如何使用标签体的内容。有三种取值：</p>
<p style="TEXT-INDENT: 2em">empty：表示标签体必须为空；</p>
<p style="TEXT-INDENT: 2em">JSP:表示脚本元素和模板及其它标签一样被评估。</p>
<p style="TEXT-INDENT: 2em">tagdependent：体内容被原封不动写入BodyContent，其它脚本元素以源码形式出现，而不被JSP容器解释。</p>
<p style="TEXT-INDENT: 2em">info标签的人工可读描述性信息。</p>
<p style="TEXT-INDENT: 2em">attribute使用标签时被编码的属性信息。用于定义标签的属性。</p>
<p style="TEXT-INDENT: 2em"><name>属性名</name>：属性的名字。</p>
<p style="TEXT-INDENT: 2em"><request>true|false</request>：属性在标签用到的位置是否要被编码。</p>
<p style="TEXT-INDENT: 2em"><rtxexpvalue>true|false</rtxexpvalue>：属性值能否用表达式指定。</p>
<p style="TEXT-INDENT: 2em">三、标签处理器</p>
<p style="TEXT-INDENT: 2em">标签处理器是通过实现JSP容器调用的一系列预定义方法执行定制标签行为的一个Java类。</p>
<p style="TEXT-INDENT: 2em">标签处理器实现了标签的行为，标签处理器是Java类。</p>
<p style="TEXT-INDENT: 2em">1.标签处理器的工作方式</p>
<p style="TEXT-INDENT: 2em">a.导入javax.servlet.jsp和javax.servlet.jsp.tagext包。</p>
<p style="TEXT-INDENT: 2em">b.实现javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口。</p>
<p style="TEXT-INDENT: 2em">c.继承TagSupport类或BodyTagSuppoert类。它们是上述接口的缺省实现。</p>
<p style="TEXT-INDENT: 2em">d.重载publicintdoStartTag()throwsJspException方法。</p>
<p style="TEXT-INDENT: 2em">2.标签处理器的接口与实现</p>
<p style="TEXT-INDENT: 2em">javax.servlet.jsp.tagext.Tag是实现标签的最基本的接口。</p>
<p style="TEXT-INDENT: 2em">javax.servlet.jsp.tagext.TagSupport是实现Tag接口的具体类。</p>
<p style="TEXT-INDENT: 2em">通常情况下继承tagSupport类而不直接实现Tag接口通常是有益的。除了对所有必需方法提供了缺省实现外、还保存了pageContext对象及对嵌套标签的支持。</p>
<p style="TEXT-INDENT: 2em">Tag接口包含4个常量，表示doStartTag()和doEndTag()方法可能的返回码。</p>
<p style="TEXT-INDENT: 2em">EVAL_BODY_INCLUDE当doStartTag()返回时，指明servlet应对标签体进行评估。</p>
<p style="TEXT-INDENT: 2em">SKIP_BODY当doStartTag()返回时，指明servlet应忽视标签体。</p>
<p style="TEXT-INDENT: 2em">EVAL_PAGE当doEndTag()返回时，指明页面其余部分应被评估。</p>
<p style="TEXT-INDENT: 2em">SKIP_PAGE当doEndTag()返回时，指明页面其余部分就被跳过。</p>
<p style="TEXT-INDENT: 2em">Tag接口的方法</p>
<p style="TEXT-INDENT: 2em">publicvoidsetPageContext(PageContextctx)生成的servlet在请求处理器执行其它任务前首先调用此方法，实现类应保存上下文对象以便它可以在标签生命期中使用。从页面上下文中标签处理器可以访问所有JSP隐含对象。</p>
<p style="TEXT-INDENT: 2em">publicvoidsetParent(Tagp)使用一个标答可以找到操作栈中它上面的标签。在setPageContext后立即调用。</p>
<p style="TEXT-INDENT: 2em">publicTaggetParent()返回父标签。</p>
<p style="TEXT-INDENT: 2em">publicintdoStartTag()throwsJsp在设置了页面上下文、父标签和开始标记中编码的属性后调用。返回码表明JSP实现servlet是否就评估标签体。</p>
<p style="TEXT-INDENT: 2em">publicintdoEndTag()throwsJspException当遇到结否标记时调用。返回码表明JSP是否就继纽页面的其余部份。</p>
<p style="TEXT-INDENT: 2em">publicvoidrelease()确保在页面退出前被调用。释放资源并重置标签处理器状态。</p>
<p style="TEXT-INDENT: 2em">TagSupport类的方法</p>
<p style="TEXT-INDENT: 2em">publicstaticTagfinAncestorWithClass(TagthisTag,Classcls)为所需的父标签处理器查找运行时标签栈。一个标签处理器可以提供其范围内子标签调用的方法。</p>
<p style="TEXT-INDENT: 2em">publicvoidsetId(Stringid)保存和检索在id属性中指定的名字。</p>
<p style="TEXT-INDENT: 2em">publicvoidsetValue(Stringname,Objecto)在本地哈希表中设置指定名字的值。</p>
<p style="TEXT-INDENT: 2em">publicObjectgetValue(Stringname)从本地哈希表中获取指定名称的值。</p>
<p style="TEXT-INDENT: 2em">publicvoidremoveValue(Stringname)从本地哈希表中删除指定名称的值。</p>
<p style="TEXT-INDENT: 2em">publicEnumerationgetValues()返回哈希表中关键字的一个枚举。</p>
<p style="TEXT-INDENT: 2em">3.标签处理器的生命期</p>
<p style="TEXT-INDENT: 2em">a.生成servlet需要创建标签处理器类的一个实例。实现方式通常是调用JSP容器的工厂类的一个方法，工厂类包含一个标签处理器实例池以使其可重用不再处于激活状态的对象。</p>
<p style="TEXT-INDENT: 2em">b.初始化标签处理器，使servlet获知其存在性。servlet通过调用标签处理器的两个方法实现此过程：setPageContext(PageContextctx)和setParent(Tagparent)。</p>
<p style="TEXT-INDENT: 2em">c.如果标签具有属性，属性的取值通过处理器提供setter方法传入到对象。属性setter方法是一个标签支持属性所需的唯一方法。</p>
<p style="TEXT-INDENT: 2em">d.页面的上下文和父标签已被调置，并已具备属性。此时调用标签处理器的doStartTag()方法，该方法可以读取这些变量并执行实现标答功能所需的计算和操作。doStartTag()方法必须返回一个整型数。返回EVAL_BODY_INCLUDE则正常处理标签体，返回SKIP_BODY则从初始JSP页面中直到此标签结束标记处的内容均被忽略。</p>
<p style="TEXT-INDENT: 2em">e.标签体被评估或忽视后调用标签处理器的doEndTag()方法，返回EVAL_PAGE则页面的其余部分被评估，返回SKIP_PAGE则servlet代码立即从_jspService()中返回。</p>
<p style="TEXT-INDENT: 2em">4.体标签处理器的接口与实现</p>
<p style="TEXT-INDENT: 2em">javax.servlet.jsp.tagext.BodyTag是Tag的子接口。</p>
<p style="TEXT-INDENT: 2em">javax.servlet.jsp.tagext.BodyTagSupport是实现BodyTag类。</p>
<p style="TEXT-INDENT: 2em">BodyContent是javax.servlet.jsp.JspWriter的子类，但与其父类有所区别。</p>
<p style="TEXT-INDENT: 2em">BodyContent对象的内容不自动写了入servlet的输出流，而是积累在一字符串缓存中。当标签体完成后其对象仍可在doEndTag()方法中可以应用，由getString()或getReader()方法操作。并在必要时修改及写入恢复的JspWriter输出流。</p>
<p style="TEXT-INDENT: 2em">BodyContent类的方法</p>
<p style="TEXT-INDENT: 2em">publicvoidflush()throwsIOException复写JspWrite.flush()方法以便它总是产生溢出。刷新写入已失效，因为它没有连接到将被写入的实际输出流中。</p>
<p style="TEXT-INDENT: 2em">publicvoidclearBody()重置BodyContent缓存为空。</p>
<p style="TEXT-INDENT: 2em">publicReadergetReader()返回Reader读取体内容。</p>
<p style="TEXT-INDENT: 2em">publicStringgetString()返回包含体内容的一个字符串。</p>
<p style="TEXT-INDENT: 2em">publicvoidwriteOut(Writew)将体内容写入指定输出。</p>
<div style="TEXT-INDENT: 2em">publicJspWritegetEnclosingWrite()返回栈中下一个更高的写入者对象（可能是另一个BodyContent对象）。</div>
<div>
<p style="TEXT-INDENT: 2em">BodyTag接口定义了一个新的整型常量</p>
<p style="TEXT-INDENT: 2em">EVAL_BODY_TAG当doStartTag()返回时，使得新的BodyContent对象被创建并与此标签处理器相关联。当doAfterBody()返回时，使得JSPservlet在修改完此标签控制的任意变量后再次评估体。</p>
<p style="TEXT-INDENT: 2em">BodyTag接口的方法</p>
<p style="TEXT-INDENT: 2em">publicvoidsetBodyContern(BodyContentout)在当前JspWriter已被写入，一个新的BodyContent在被创建后由Jspservlet调用，它发生在doStartTag()之后。</p>
<p style="TEXT-INDENT: 2em">publicvoiddoInitBody()throwsJspExceptionsetBodyContent()之后，体被评估前调用的生命期方法。如果多次评估体，此方法只调用一次。</p>
<p style="TEXT-INDENT: 2em">publicinitdoAfterBody()throwsJspException体被评估后，BodyContent写入者仍处于激活状态时调用的生命期方法。此方法必须返回EVAL_BODY_TAG或SKIP_BODY，若返回EVAL_BODY_TAG时体再次被评估。</p>
<p style="TEXT-INDENT: 2em">BodyTagSupport类的方法</p>
<p style="TEXT-INDENT: 2em">publicintdoStartTag()throwsJspException复写TagSupport中的doStartTag()方法。</p>
<p style="TEXT-INDENT: 2em">publicintdoEndTag()throwsJspException调用TagSupport中的doEndTag()方法，返回结果。</p>
<p style="TEXT-INDENT: 2em">publicvoidsetBodyContent(BodyContentout)在一保护成员变量bodyContent中保存新的体内容对象，子类可直接访问此对象。</p>
<p style="TEXT-INDENT: 2em">publicvoiddoInitBody()throwsJspException缺省什么都不做。被需要执行初始化的子类所复写。</p>
<p style="TEXT-INDENT: 2em">publicintdoAfterBody()throwsJspException每次体被评估后由JSPservlet调用，体同容对象仍处于激活状态。返回SKEP_BODY或EVAL_BODY_TAG则体再次被评估</p>
<p style="TEXT-INDENT: 2em">publicvoidrelease()设置bodyContent对象为null，然后调用super.release()。</p>
<p style="TEXT-INDENT: 2em">publicBodyContentgetBodyContent()返回bodyContent变量。子类已经可以访问保护变量，但此方法允许无关的标签处理类对此体内容发送输出。</p>
<p style="TEXT-INDENT: 2em">publicJspWritergetPreviousOut()在bodyContent变量上调用getEnclosingWriter()并返回结果的简便方法。</p>
<p style="TEXT-INDENT: 2em">5.体标签处理器的生命期</p>
<p style="TEXT-INDENT: 2em">a.生成servlet需要创建标签处理器类的一个实例。实现方式通常是调用JSP容器的工厂类的一个方法，工厂类包含一个标签处理器实例池以使其可重用不再处于激活状态的对象。</p>
<p style="TEXT-INDENT: 2em">b.初始化标签处理器，使servlet获知其存在性。servlet通过调用标签处理器的两个方法实现此过程：setPageContext(PageContextctx)和setParent(Tagparent)。</p>
<p style="TEXT-INDENT: 2em">c.如果标签具有属性，属性的取值通过处理器提供setter方法传入到对象。属性setter方法是一个标签支持属性所需的唯一方法。</p>
<p style="TEXT-INDENT: 2em">d.页面的上下文和父标签已被调置，并已具备属性。调用标签处理器的doStartTag()方法，该方法可以读取这些变量并执行实现标答功能所需的计算和操作。</p>
<p style="TEXT-INDENT: 2em">doStartTag()方法必须返回一个整型数。</p>
<p style="TEXT-INDENT: 2em">返回EVAL_BODY_TAG则正常处理标签体（跳到e）；</p>
<p style="TEXT-INDENT: 2em">返回SKIP_BODY则从初始JSP页面中直到此标签结束标记处的内容均被忽略。（跳到f）</p>
<p style="TEXT-INDENT: 2em">e.如果返回EVAL_BODY_TAG时，则正常处理标签体。</p>
<p style="TEXT-INDENT: 2em">e1.在栈中保存当前的JspWriter对象，创建新的BodyContent对象，并将其置为JSP页面的out对象保存在上下文范围内名为name的属性中。并调用它的setBodyContent()方法。</p>
<p style="TEXT-INDENT: 2em">e2.调用doInitBody()方法进行初始化。</p>
<p style="TEXT-INDENT: 2em">e3.处理标签体。将输出写入BodyContent对象中，此过程依赖于TLD的标签元素
<bodycontent>
，有三种可能取值。</p>
<p style="TEXT-INDENT: 2em">e4.调用doAfterBody()方法，将体内体内容写入JspWriter，可如下实现：</p>
<p style="TEXT-INDENT: 2em">JspWriterout=bodyContent.getEnclosingWriter();</p>
<p style="TEXT-INDENT: 2em">out.println(bodyContent.getString());//bodyContent.writeOut(out);</p>
<p style="TEXT-INDENT: 2em">bodyContent.clear();</p>
<p style="TEXT-INDENT: 2em">e5.doAfterBody()方法返回两种可能：</p>
<p style="TEXT-INDENT: 2em">返回EVAL_BODY_TAG时，再对标签体进行评估，这是数组和枚举被循环处理的典型情况。</p>
<p style="TEXT-INDENT: 2em">返回SKIP_PAGE时，继续页面的其余部份。</p>
<p style="TEXT-INDENT: 2em">e6.体内容完成，因此创建它的过程被反向：</p>
<p style="TEXT-INDENT: 2em">调用pageContent.popBody()方法检索前面的JspWriter对象。</p>
<p style="TEXT-INDENT: 2em">将写入者设置回out隐含对象。</p>
<p style="TEXT-INDENT: 2em">f.标签体被评估或忽视后调用doEndTag()方法，允许标签处理器像输出流发回内容。</p>
<p style="TEXT-INDENT: 2em">返回EVAL_PAGE则页面的其余部分被评估；</p>
<p style="TEXT-INDENT: 2em">返回SKIP_PAGE则servlet代码立即从_jspService()中返回。</p>
<p style="TEXT-INDENT: 2em">g.此时体的内容在受保护的bodyContent对象中仍然可用。</p>
<p style="TEXT-INDENT: 2em">可以将它写入servlet输出流中：</p>
<p style="TEXT-INDENT: 2em">JspWriterout=pageContext.getOut();</p>
<p style="TEXT-INDENT: 2em">out.println(bodyContent.getString());</p>
<p style="TEXT-INDENT: 2em">或者</p>
<p style="TEXT-INDENT: 2em">bodyContent.WriteOut(pageContext.getOut());</p>
<p style="TEXT-INDENT: 2em">6.标签附加信息类</p>
<p style="TEXT-INDENT: 2em">四、标签指令</p>
<p style="TEXT-INDENT: 2em">taglib指令元素的目的是指定TLD的位置，设置在页面上与标签区分开来的一个短别名。</p>
<p style="TEXT-INDENT: 2em">语法：<%@taglibprefix=&#8221;tagprefix&#8221;uri=&#8221;tagliburi&#8221;%></p>
<p style="TEXT-INDENT: 2em">属性：prefix：用于标识标签库的唯一标识。uri：标签库本身的URI。</p>
<p style="TEXT-INDENT: 2em">uri不必指向一个实际文件，它是JSP容器可以在web.xml中查找实际文件位置的唯一标识符。</p>
</div>
<img src ="http://www.blogjava.net/simie/aggbug/127504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:29 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中web配置:web.xml </title><link>http://www.blogjava.net/simie/archive/2007/07/02/127501.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127501.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127501.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127501.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127501.html</trackback:ping><description><![CDATA[常用的设定,详细请看:<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><u><font color=#800080>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</font></u></a>
<div><font color=#000080>XML声明，定义XML的版本、编码格式。还有最重要的schema的来源</font></div>
<div>&lt;?xml version="1.0" <font color=#800000>encoding</font>="UTF-8"?&gt;<br>&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br>&nbsp; <font color=#800000>.......</font><br>&lt;/web-app&gt;</div>
<div>&nbsp;</div>
<div>&lt;description&gt;</div>
<div>当servlet的URL定义为其他文件类型的扩展名,该文件类型将不能访问,而访问了servlet</div>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br>&nbsp; &lt;display-name&gt;myweb&lt;/display-name&gt;&lt;!--站点名称--&gt;<br>&nbsp; &lt;description&gt;这里是站点描述&lt;/description&gt;<br>&nbsp; &lt;icon&gt;<br>&nbsp;&nbsp;&nbsp; &lt;small-icon&gt;/images/small.gif&lt;/small-icon&gt;&lt;!--小图标的路径16*16,必须为gif jpge格式--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;large-icon&gt;/images/large.gif&lt;/large-icon&gt;&lt;!--大图标的路径32*32,必须为gif jpge格式--&gt;<br>&nbsp; &lt;/icon&gt;<br>&nbsp; &lt;!--如果存在&lt;distributable/&gt;则代表该站点能在多个JSP Container之间分散执行(分布式)--&gt;<br>&nbsp; &lt;distributable/&gt;<br><br><br><br><br>&nbsp; &lt;context-param&gt;&lt;!--环境参数,设置常量,取得常量&nbsp; this.getInitParameter("context");--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;param-name&gt;context&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;param-value&gt;10000&lt;/param-value&gt;<br>&nbsp; &lt;/context-param&gt;<br>&nbsp; &lt;filter&gt;&lt;!--声明filter--&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;filterName&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;filter.filterName&lt;/filter-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp; &lt;/filter&gt;<br>&nbsp; &lt;filter-mapping&gt;&lt;!--定义filter所对应的URL--&gt;<br>&nbsp;   &lt;filter-name&gt;filterName&lt;/filter-name&gt;<br>&nbsp;   &lt;url-pattern&gt;/filterName&lt;/url-pattern&gt;<br>&nbsp;   &lt;dispatcher&gt;REQUEST|INCLUDE|FORWARD|ERROR&lt;/dispatcher&gt;&lt;!--filter对应的请求方式,有4种方式,默认REQUEST--&gt;<br>&nbsp; &lt;/filter-mapping&gt;<br>&nbsp; &lt;listener&gt;&lt;!--设定Listener接口--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;listener.ListenerClassName&lt;/listener-class&gt;<br>&nbsp; &lt;/listener&gt;<br>&nbsp; &lt;servlet&gt;&lt;!--声明servlet的数据--&gt;<br>&nbsp;   &lt;servlet-name&gt;servletName&lt;/servlet-name&gt;<br>&nbsp;   &lt;servlet-class&gt;servlet.servletName&lt;/servlet-class&gt;<br>&nbsp;   &lt;init-param&gt;&lt;!--初始化参数,可以在init()中使用ServletConfig().getInitParamenter("name")取得--&gt;<br>&nbsp;&nbsp;&nbsp;   &lt;param-name&gt;name&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;   &lt;param-value&gt;123&lt;/param-value&gt;<br>&nbsp;   &lt;/init-param&gt;<br>&nbsp;   &lt;load-on-startup&gt;n&lt;/load-on-startup&gt;&lt;!--站点启动时,此servlet会被自动加载执行,1表示最早,2,3...--&gt;<br><br>&nbsp; &lt;/servlet&gt;<br>&nbsp; &lt;servlet-mapping&gt;&lt;!--定义servlet所对应的URL--&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;name&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/name&lt;/url-pattern&gt;<br>&nbsp; &lt;/servlet-mapping&gt;<br>&nbsp; &lt;session-config&gt;&lt;!--设置session超时时间（20分钟）默认按服务器配置--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;session-timeout&gt;20&lt;/session-timeout&gt;<br>&nbsp; &lt;/session-config&gt;<br>&nbsp; &lt;mime-mapping&gt;&lt;!--定义某个扩展名和某个MIME Type做映射--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;extension&gt;doc&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/vnd.ms-word&lt;/mime-type&gt;<br>&nbsp; &lt;/mime-mapping&gt;<br>&nbsp; &lt;welcome-file-list&gt;&lt;!--设置首页列表--&gt;<br>&nbsp;   &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br>&nbsp; &lt;/welcome-file-list&gt;<br>&nbsp; &lt;error-page&gt;&lt;!--将错误代码对应到WEB站点的资源路径--&gt;<br>&nbsp;   &lt;error-code&gt;错误代码&lt;/error-code&gt;Exception<br>&nbsp;   &lt;location&gt;/路径/&lt;/location&gt;<br><br>&nbsp; &lt;/error-page&gt;<br>&nbsp; &lt;error-page&gt;&lt;!--将异常的种类对应到WEB站点的资源路径--&gt;<br>&nbsp;   &lt;exception-type&gt;Exception&lt;/exception-type&gt;<br>&nbsp;   &lt;location&gt;/路径/&lt;/location&gt;<br><br>&nbsp; &lt;/error-page&gt;<br><br>&nbsp; &lt;jsp-config&gt;&lt;!--JSP的相关配置--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib&gt;&lt;!--JSP所用到的Tag Library--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;URI&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/lib/xxx.tld&lt;/taglib-location&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;jsp-property-group&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;此设定的说明&lt;/description&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;Name&lt;/display-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;URL&lt;/url-pattern&gt;&lt;!--此设定影响的范围--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;el-ignored&gt;true|false&lt;/el-ignored&gt;&lt;!--true表示不支持EL语法--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scripting-invalid&gt;encoding&lt;/scripting-invalid&gt;&lt;!--jsp的编码--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include-coda&gt;...jspf&lt;/include-coda&gt;&lt;!--JSP的结尾,扩展名.jspf--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/jsp-property-group&gt;<br>&nbsp; &lt;/jsp-config&gt;<br>&nbsp; &lt;resource-ref&gt;&lt;!--利用JNDI取得站点可利用的资源--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;description&gt;资源说明&lt;/description&gt;<br>&nbsp;&nbsp;&nbsp; &lt;res-ref-name&gt;资源名称&lt;/res-ref-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;res-type&gt;资源种类&lt;/res-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;res-auth&gt;Application|Container&lt;/res-auth&gt;&lt;!--资源经由什么许可--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;res-sharing-scope&gt;Shareable|Unshareable&lt;/res-sharing-scope&gt;&lt;!--资源是否可以共享,默认为Shareable--&gt;<br>&nbsp; &lt;/resource-ref&gt;<br>&lt;/web-app&gt;</pre>
<img src ="http://www.blogjava.net/simie/aggbug/127501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:22 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet2.5/jsp2.1的新特征</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127500.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:20:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127500.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127500.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127500.html</trackback:ping><description><![CDATA[<div>2005年9月26日，Sun公司和JSR154的专家组发布Servlet&nbsp;API的一个新的版本。在一般情况下，一个JSR的新版本仅仅包括对以前少数有名无实的规范进行去除更新。但这次，新版本中增加新的特征和变化，他们对Servlets的产生重要影响，使得Servlet的版本升到了 2.5。<br>在这篇文章里，我主要谈谈Servlet2.5版本中的新特征。描述每一个变化，阐述那些必要变化产生的背景，并展示如何在基于Servlet的项目中利用这些变化。　<br>事实上，这是我为JavaWorld提供的第六篇关于Servlet&nbsp;API更新资料的文章。这篇文章意在两个目的：从眼前来看，向你介绍 Servlet的新特征。从长远来看，是展现Servlet变化的历史概要，这样当你基于老的Servlet&nbsp;API版本进行编码的时候，你可以正确地决定哪些特征和功能你可以使用，而哪些特征和功能你不应该使用。你可以参考我先前写的关于Servlet的文章。<br>注意：当你想实践这些Servlet的新特征和功能时，你要知道的是：并不是所有的Servlet容器和Java企业级应用服务器都能立即适用于最新版的Servlet&nbsp;API，写这篇文章时（2006年1月2日），Jetty&nbsp;6&nbsp;server和Sun公司的GlassFish&nbsp;server是公认最好的支持Servlet2.5的容器，而Apache&nbsp;Tomcat5.5和Jboss&nbsp;4.0目前只支持Servlet2.4。<br>Servlet2.5一些变化的介绍：<br>1）&nbsp;&nbsp;&nbsp;&nbsp;基于最新的J2SE&nbsp;5.0开发的。<br>2）&nbsp;&nbsp;&nbsp;&nbsp;支持注释。<br>3）&nbsp;&nbsp;&nbsp;&nbsp;web.xml中的几处配置更加方便。<br>4）&nbsp;&nbsp;&nbsp;&nbsp;去除了少数的限制。<br>5）&nbsp;&nbsp;&nbsp;&nbsp;优化了一些实例<br><strong>J2SE&nbsp;5.0的产物：</strong><br>从一开始，Servlet&nbsp;2.5&nbsp;规范就列出J2SE&nbsp;5.0&nbsp;(JDK&nbsp;1.5)&nbsp;作为它最小的平台要求。它使得Servlet2.5只能适用基于J2SE&nbsp;5.0开发的平台，这个变动意味着所有J2SE5.0的新特性可以保证对Servlet2.5程序员有用。<br>传统意义上，Servlet和JEE版本一直与JDK的版本保持同步发展，但是这次，Servlet的版本跳过1.4版本。专家组认为版本的加速增长是正当的，因为J2SE5.0提出一个引人注目的，Servlet和JEE规范都要利用的特征??注释。<br><strong>注释：</strong><br>注释是作为JSR175的一部分提出的（一种为Java语言设计提供便利的Metadata）一种新的语言特色。它是利用Metadata为Java 编码结构（类，方法，域等等）装饰的一种机制。它不能像代码那样执行，但是可以用于标记代码，这个过程是基于Metadata信息的代码处理机，通过更新他们的事件行为来实现的。<br><br>我们可以凭借不同的技巧来注释类和方法，例如连续地标记接口或者是@deprecated&nbsp;Javadoc评论。这种新式的Metadata可以便利地提供了一种标准的机制来实现注释功能，以及通过库来创建用户自己的注释类型的变量。<br>下面是一个简单的Web&nbsp;service&nbsp;注释例子：<br>import&nbsp;javax.jws.WebService;<br>import&nbsp;javax.jws.WebMethod;<br>@WebService<br>public&nbsp;class&nbsp;HelloWorldService&nbsp;{<br>&nbsp;&nbsp;@WebMethod<br>&nbsp;&nbsp;public&nbsp;String&nbsp;helloWorld()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Hello&nbsp;World!";<br>&nbsp;&nbsp;}<br>}<br>@WebService和@WebMethod这两个注释类型，在JSR181（为Java平台提供的Web&nbsp;ServicesMetadata）有详细说明，可以像类一样的引用，标记这个类作为一个Web&nbsp;service并且标记它的helloWorld（）方法做为一个Web&nbsp;service方法。对于他们本身来说，注释只是写在那里并没有什么作用，好像在岗位上做记录一样，但是，一个容器一旦加载这个类并对那些注释进行二进制编码，就可以把这个类连到Web&nbsp;service上。<br>注释可以接受属性/值这些参数。它保存着参数的信息并且可以利用这些参数来更改被请求的事件行为。例如下面更高级的注释例子：<br>@WebService(<br>&nbsp;name&nbsp;=&nbsp;"PingService",<br>&nbsp;&nbsp;targetNamespace=http://acme.com/ping<br>)<br>@SOAPBinding(<br>&nbsp;&nbsp;style=SOAPBinding.Style.RPC,<br>&nbsp;&nbsp;use=SOAPBinding.Use.LITERAL<br>)<br>public&nbsp;class&nbsp;Ping&nbsp;{<br>&nbsp;&nbsp;@WebMethod(operationName&nbsp;=&nbsp;"Foo")<br>&nbsp;&nbsp;public&nbsp;void&nbsp;foo()&nbsp;{&nbsp;}<br>}<br>一旦加载了这个类，一个正确配置的容器就会识别出注释及其参数，并将这个做为一个PingService通过利用remote-procedure- call/literal的编码方式与一个Foo&nbsp;operation相连。实际上，注释便指明了类和类的容器之间的联系。<br><br>Java本身的规范（JSR175）仅仅有少量的注释类型变量。而这些有趣的注释类型变量主要来自于其他的JSRs：<br>"JSR&nbsp;250:&nbsp;Java平台的公共注释<br>"JSR&nbsp;220:&nbsp;企业级JavaBeans&nbsp;3.0&nbsp;<br>"JSR&nbsp;224:&nbsp;基于XML的Java&nbsp;API&nbsp;Web&nbsp;Services&nbsp;(JAX-WS)&nbsp;2.0&nbsp;<br>"JSR&nbsp;181:&nbsp;Java平台的Web&nbsp;Services&nbsp;Metadata&nbsp;<br>Servlet2.5中的注释：<br>回到Servlet2.5上来，一种新的规范描述了几种注释在Servlet环境中是如何工作的。功能弱的Servlet容器忽略了这些规范，然而JEE容器中的Servlet却严格遵守这些规范。<br><br>有的注释提供了在XML注册的可选择性，否则就要注册在配置文件web.xml中。有的作为容器的请求来执行其任务，否则就由Servlet亲自来执行。还有的注释两者都具备。<br><br>注释准确的定义不是完全固定的，因为Servlet本身并没有定义注释。它仅仅解释了它们如何影响Servlet环境，下面是注释的一个简要的概述，你可以看到在JEE5中它们的用途：<br><br>"@Resource&nbsp;and&nbsp;@Resources：@Resource位于类或变量中以对Servlet容器进行&#8220;资源注入&#8221;。当容器识别出这个注释时，它会在获得服务地位之前，用适当的值实现带注释的变量的重新注入。通过使用这种注释，你不必利用JNDI来查找命令和在配置文件web.xml中手动声明资源。服务器通过Servlet的自我调整来执行它的任务。变量的名称和类型由映像机制自动确定，尽管你可以利用注释的参数来超越这一限制。一个注入的资源可以是数据源，Java信息服务目的文件或者是环境设置的标量。下面是一个例子：<br>@Resource&nbsp;javax.sql.DataSource&nbsp;catalog;<br>public&nbsp;getData()&nbsp;{<br>&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;catalog.getConnection();<br>}<br>现在，在这段Servlet代码变成服务之前，容器会定位JNDI变量，并对于目录变量进行手动分配。<br>为了效率，仅仅某些类支持资源注入，这些类有：Servlets，Servlet过滤器，Servlet事件监听器，JSP标签操作器，JSP库事件监听器，用于处理beans的JSF，以及一些与Serlvets无关的类。<br>"@Resources注释与@Resource相似，但是它用于一组@Resource注释。它们都来自JSR250，是Java平台的公共注释。<br>"@PostConstruct&nbsp;and&nbsp;@PreDestroy：可以使方法成为带有生命周期的方法。@PostConstruct方法用于资源注入初始化之后。@PreDestroy方法用于Servlet脱离服务并释放注入的资源的时候。回收的方法必须是事实的方法，返回void并且不可以抛出任何异常。这些注释本质上使得任何方法都成为init()和destroy()的子方法，这些特征也来自与JSR250。<br>"@EJB：类似于@Resource，设计用于注入企业级的JavaBeans。比起@Resource，它略有不同，在于@EJB的参数特定设计用来定位EJB的参数。这个注释来自EJB3.0的规范。<br>"@WebServiceRef：与@Resource&nbsp;和&nbsp;@EJB相似，设计用于注入Web&nbsp;service参数。来自于JAX-WS2.0规范。<br>"@PersistenceContext,&nbsp;@PersistenceContexts,&nbsp;@PersistenceUnit,&nbsp;and&nbsp;@PersistenceUnits：这些注释来自EJB3.0规范来支持Java对象的持久化。<br>"@DeclareRoles:&nbsp;定义应用程序中安全角色的使用。当定义一个Servlet类时，在配置文件web.xml中&lt;security-role&gt;标签中对它进行设置，来自JSR250。<br>"&nbsp;@RunAs：用于声明哪个类应该执行。当定义一个Servlet类时，在配置文件web.xml中&lt;run-as&gt;标签中对它进行设置。来自于JSR250。
<p>注释的执行：<br>不论你使用注释与否??尤其在你不使用时??它对于理解服务器上程序的执行有着重要意义。为了让服务器识别类中的注释，它必须加载这些类，这就意味着服务器必须是启动着的，服务器通过WEB-INF/classes目录下和WEB－INF/lib目录下的所有类文件来查找注释。（每个规范下，服务器不必查找这两个目录以外的目录。）你可以通过下面的方法指明&lt;web-app&gt;根的属性而不必使用如何进行注释：<br>&lt;web-app&nbsp;xmlns="http://java.sun.com/xml/ns/javaee"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version="2.5"&nbsp;full="true"&gt;<br>&lt;/web-app&gt;<br>web.xml的便利：<br>Servlet2.5对于web.xml引入几个小的变动，使得它更加方便。<br>Servlet名称的通配符化：<br>首先，当你写&lt;filter-mapping&gt;,你现在可以在&lt;Servlet-name&gt;标签中使用*号来代表所有的Servlets。而以前，你必须一次把一个Servlet绑定到过滤器上，像这样：<br><br>&lt;filter-mapping&gt;<br>&nbsp;&nbsp;&lt;filter-name&gt;Image&nbsp;Filter&lt;/filter-name&gt;<br>&nbsp;&nbsp;&lt;Servlet-name&gt;ImageServlet&lt;/Servlet-name&gt;<br>&lt;/filter-mapping&gt;&nbsp;<br><br>现在，你可以一次绑定所有的Servlets：<br><br>&lt;filter-mapping&gt;<br>&nbsp;&nbsp;&lt;filter-name&gt;Image&nbsp;Filter&lt;/filter-name&gt;<br>&nbsp;&nbsp;&lt;Servlet-name&gt;*&lt;/Servlet-name&gt;&nbsp;&nbsp;&lt;!?新特征&nbsp;--&gt;<br>&lt;/filter-mapping&gt;<br><br>这有着很大用途，例如：<br><br>&lt;filter-mapping&gt;<br>&nbsp;&nbsp;&lt;filter-name&gt;Dispatch&nbsp;Filter&lt;/filter-name&gt;<br>&nbsp;&nbsp;&lt;Servlet-name&gt;*&lt;/Servlet-name&gt;<br>&nbsp;&nbsp;&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;<br>&lt;/filter-mapping&gt;<br><br>映射的复合模式：<br>其次，当我们写&lt;Servlet-mapping&gt;&nbsp;或者&nbsp;&lt;filter-mapping&gt;时，你现在可以在同一的标签中采用复合匹配的标准。以前一个&lt;Servlet-mapping&gt;只支持一个&lt;url-pattern&gt;元素，现在它不只支持一个，例如：<br>&lt;Servlet-mapping&gt;<br>&nbsp;&nbsp;&lt;Servlet-name&gt;color&lt;/Servlet-name&gt;<br>&nbsp;&nbsp;&lt;url-pattern&gt;/color/*&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&lt;url-pattern&gt;/colour/*&lt;/url-pattern&gt;<br>&lt;/Servlet-mapping&gt;<br><br>同样地，以前&lt;filter-mapping&gt;也是只支持一个&lt;url-pattern&gt;&nbsp;或者一个&nbsp;&lt;Servlet-name&gt;。现在它对于每个元素都可以支持任意多个：<br><br>&lt;filter-mapping&gt;<br>&nbsp;&nbsp;&lt;filter-name&gt;Multipe&nbsp;Mappings&nbsp;Filter&lt;/filter-name&gt;<br>&nbsp;&nbsp;&lt;url-pattern&gt;/foo/*&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&lt;Servlet-name&gt;Servlet1&lt;/Servlet-name&gt;<br>&nbsp;&nbsp;&lt;Servlet-name&gt;Servlet2&lt;/Servlet-name&gt;<br>&nbsp;&nbsp;&lt;url-pattern&gt;/bar/*&lt;/url-pattern&gt;<br>&lt;/filter-mapping&gt;<br><br>HTTP方法名：<br><br>最近，你可以将合法的HTTP/1.1方法名放进&lt;http-method&gt;元素中。当你使用这些方法时，&lt;http- method&gt;将指明&lt;security-constraint&gt;标记里的方法应该被应用。从以前来看，它仅限于HTTP/1.1的7 个标准方法：GET，POST，PUT，DELETE，HEAD，OPTIONS和TRACE。但是，HTTP/1.1允许对方法进行扩展，WebDAV 是用于这种扩展的普遍技术。在Servlet2.5中，你可以安全地约束任何可能的HTTP方法名，标准及扩展，包括WebDAV方法，例如：LOCK， UNLOCK，COPY及MOVE。<br>如果你写一个WebDAV的Servlet，你不必使用doLock()和doCopy()方法。你必须写自己的service()方法及分派request.getMethod()方法。正由于这种变化，你不必管理系统的安全性。<br>去除限制：<br><br>Servlet2.5去除了关于错误处理和回话跟踪的一些限制。对于错误处理，Servlet2.5之前，配置在&lt;error- page&gt;中的错误处理页面不能通过调用setStatus()方法来修改触发他们的错误代码，而Servlet2.5减弱了这一规范。这样的规范的产生于这样的观点，就是错误页面的工作是指出每个错误而不是修改错误。但是，实际使用中，错误页面不只是用于指出错误，而是还能做更多的事情，或许可以代替在线帮助来帮助用户解决问题。这个规范将不再限制错误页面所产生的反馈信息。<br><br>对于会话跟踪，Servlet2.5之前，调用RequestDispatcher.include()的Servlet不能设置响应的标题头，而 Servlet2.5减弱了这一规范。原规范的目的是使内部的Servlets限制在自己的页面空间中，不可以影响外部的页面。现在这个规范已经减弱，允许在内部的Servlet中使用request.getSession()命令，这个命令可以悄悄地创建一个会话跟踪cookie的标题头。逻辑上要求限制内部的资源，但逻辑上也要求这些限制不应该取消其启动session的这一功能。这个变动对于Portlet规范来说显得尤其重要。作用是：如果响应已经有效，则getSession()命令就会抛出一个IllegalStateException(异常)，而在此之前，就没有这个功能。<br><br><strong>优化：</strong><br>最近，新的规范优化了一些实例，使得Servlets更加方便而且保证了更好地按要求工作。<br><br><strong>终止响应：</strong><br>第一处优化细小又深奥，但做为规范中的一个例子还有蛮有趣的。Servlet2.4规范规定响应在这几种情况下应该是有效的，包括：在响应的 setContentLength方法中内容已经明确说明，以及内容已经写进了响应中。这种情况只有你的代码像下面这样才可以使响应重新定向：<br><br>response.setHeader("Host",&nbsp;"localhost")；<br>response.setHeader("Pragma",&nbsp;"no-cache")；<br>response.setHeader("Content-Length",&nbsp;"0")；<br>response.setHeader("Location",&nbsp;"http://www.apache.org")；<br><br>Servlet技术忽略特定区域的标题头，因为内容满足0字节长度，响应就会立即生效。而在它开始之前，响应就已失效了！Servlet容器通常拒绝执行这种行为，而Servlet2.5版本增加了&#8220;长度必须大于0&#8221;这个原则。<br>实例编码：<br><br>Servlet2.4规范规定必须在调用request.getReader()方法之前调用 request.setCharacterEncoding()方法。但是，如果你忽略这个原则而在其之后去调用 request.setCharacterEncoding()方法，那么会产生什么后果，这个问题规范里并没有说。为了简便，现在消除这种情况！<br>Cross-context&nbsp;sessions(不同上下文目录间的会话)：<br>最近，关于Cross-context会话处理的规则已经明确说明。当Servlets指派从一个上下文到其他上下文的请求时，这个规则就发挥了作用??在目标调用过程中，包括哪些会话。这个版本的出现使得一个上下文目录的主页里的portlets可以通过几种内部的命令来对别的上下文目录里的 portlets起作用。Servlet2.5明确指出一个上下文目录里的资源可以访问其他上下文目录的session(会话)，而不用考虑这个请求从哪里开始的。这意味着portlets可以脱离主页的范围而在自己的范围里运行，而且这个规范还会应用在不兼容的Serlvet容器中。<br>期待：<br><br>由于Servlet2.5版本要保持一些旧的性质，几个大的概念不得不延后到下一个阶段。它们包括：<br>"新的输入/输出(NIO)支持：使NIO通道更有利于Servlets进行客户端通信成为可能。<br>"过滤器wrap-under或wrap-over语义：有时用过滤器包装请求，和/或者响应对象去修改方法行为或者启用新的方法。当把这种包装和服务器对请求和响应的包装结合起来时，又应该怎么包装在一起？<br>"用于欢迎的Servlets文件：做为索引应该充当欢迎作用的文件吗？在此之前，这个回答是肯定的。但是规范没有明确说明如何使用这个功能，尤其在没有索引的情况下。<br>"用于欢迎的文件的分派规则：如何分派欢迎文件，这个细节并没有完全说明，而是遗留了一些开放的缺口来应对不兼容问题。<br>"登陆后选择默认页面：如果用户通过他们的书签访问Servlet的登陆页面，那么在成功登陆后页面应该转向哪里呢？这个问题至今尚未明确说明。<br>"用户的主题日志：在通过网站正确地注册之后，不通过传统地登陆方式没有办法使Servlet信任用户。<br>结束语：<br>如果抛开注释来看Servlet2.5的变化，可见在配置文件web.xml中去除了一些限制，是有利的，同时又优化了实例行为使其更适合更便于开发Web系统(网页)。<br>Servlet2.5中注释的作用更加戏剧化。Servlets本身不能声明注释类型的变量，甚至性能弱的Servlet容器都不支持注释。然而在 JEE5环境下的Servlets编写者可以看到，通过公共的注释及EJB3.0和JAX-WS2.0规范而引入的注释类型会对代码产生很大变化，并且这也将对Servlet如何管理外部资源，对象的持久化及EJB的构成产生重大影响</p>
<p>J2EE的两种重要的表现层技术JSP和JSF发布了新技术规范的预览版本，其中最重要的一点是两者将表达式语言（Expression Language，EL）部分合二为一。在不久的将来，这两种技术有可能更进一步地彼此融合，成为一种统一的表现层技术。然而在J2EE社群的普遍观点中，如果单单作为一种视图技术，JSP并不是最佳的选择，Velocity和XSLT等基于模板的视图技术通常比JSP更方便；而基于组件的JSF也面临广泛的信任危机。两者的组合是否能得到业界的认可，还需要时间的检验。</p>
<p><strong>jsp 2.1</strong></p>
<p><br>&nbsp;&nbsp;&nbsp; 我们很高兴向大家宣告，JavaServer Pages、JSR-245下开发的Faces.JavaServer Pages（JSP）2.1和JSR-252下开发的JavaServer Faces（Faces）1.2的新版规范的Early Draft Review发布。</p>
<p>&nbsp;&nbsp;&nbsp; JSP 2.1把Expression Language（EL）输出到它自己各自分离的文档中，在技术上，这些文档是JSP规范的子文档。这些统一的EL规范定义了一个更高层的java 包，javax.el。这个包与使用它的技术之间完全独立，并且允许此技术将自身插入EL处理过程。更改的JSP规范遵从使用标准化EL的规范。</p>
<p>&nbsp;&nbsp;&nbsp; 对于前面提到的JSR-252，这个规范并没什么新特性。Faces 1.2支持新的标准化EL，还包含一些bug修复的相关规范。</p>
<p>&nbsp;&nbsp;&nbsp; Faces和JSP在JSRs下的结盟带来了一些新功能，也为将来的发展打下了坚实的基础。例如，在同时使用Faces和JSP的web应用中，网页仅使用JSP（不包含任何faces内容）来访问Managed Beans成为可能。在JSP规范的附录E中和Faces规范的前言中都可以看到更改内容的细节。</p>
</div>
<img src ="http://www.blogjava.net/simie/aggbug/127500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:20 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>