﻿<?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-iNeo-随笔分类-J2EE</title><link>http://www.blogjava.net/iNeo/category/5413.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:42:41 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:42:41 GMT</pubDate><ttl>60</ttl><item><title>用XML和XSL来生成动态页面[Z]</title><link>http://www.blogjava.net/iNeo/archive/2005/12/07/22835.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Wed, 07 Dec 2005 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2005/12/07/22835.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/22835.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2005/12/07/22835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/22835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/22835.html</trackback:ping><description><![CDATA[<DIV align=justify>
<P>xml（可扩展标记语言）看起来可能像某种w3c标准——现在没有什么实际影响，即使以后能派上用场，也是很久以后的事。但实际上，它现在已经得到了应用。所以，不要等到xml已被加进了你最喜爱的html编辑器中才开始使用它。它现在就可以解决各种内部问题和b2b系统问题。 </P>
<P>在sparks.com，我们使用xml来标准化从java对象到html数据显示等不同系统之间的数据表示。 </P>
<P>特别需要指出的是，我们发现，只要以非常基本的xml结构来实现标准化，就可以更容易地共享和操作数据。在这一过程中，我们发现了使用xml的很多有效方法。下面详细介绍我们现在的应用情况。 </P>
<P>标准化<BR>在使用xml之前，建立与你要使用的信息不同的xml数据格式。 </P>
<P>生成动态xml<BR>从数据库中生成html并不新鲜，但生成xml却很新鲜。这里我们介绍具体的生成步骤。 </P>
<P>用xsl作为模板语言<BR>xsl（可扩展样式表语言）是定义xml数据显示格式的好方法，如果写成几个静态模板会更有效。 </P>
<P>生成html<BR>xml加上xsl就等于html。这听起来似乎不对，但用户所见的我们的html页面其实就是xml和xsl共同产生的效果。 </P>
<P><BR>一、标准化</P>
<P>xml的能力来自于它的灵活性。但不幸的是，它有时太灵活了，以至于你会面对一个空白的页面，发愁该怎么解决问题。 </P>
<P>在任何xml的项目中，第一步工作都是创建标准的数据格式。为此你要作出以下决定： </P>
<P>• 要涉及哪些数据<BR>• 是否要使用dtd（文件类型定义）<BR>• 是否要使用dom（文档对象模型）或sax（xml的简化api）解析</P>
<P>确定数据：<BR>因为没有标准的xml格式，开发者可以自由地开发自己的格式。然而，如果你的格式只能被一个应用程序识别，那么你只能运行这个程序来使用该格式。如果还有其他程序也能读懂你的xml格式，那显然会更有帮助。如果某个xml格式被修改，则使用它的系统可能也需要被修改，所以你应该建立尽可能完整的格式。因为大多数系统忽略它们无法识别的标签，所以改变一个xml格式的最安全的方法是添加标签，而不是修改标签。 </P>
<P>单击此处查看xml数据格式实例 </P>
<P>在sparks.com，我们查看了不同的产品展示需要的所有产品数据。尽管并不是所有的页面都使用全部数据，但我们还是由此开发出适用于所有数据的非常完整的xml数据格式。例如，我们的产品明细信息页面显示的数据要比产品浏览页面多。然而，我们在这两种情况下仍然使用相同的数据格式，因为每个页面的xsl模板都只使用它所需要的字段。 </P>
<P>是否使用dtd<BR>在sparks.com，我们使用组织良好的xml，而不使用仅仅是正确的xml，因为前者不需要dtd。dtd在用户点击和看到页面之间加入了一个处理层。我们发现这一层需要太多的处理。当然，在以xml格式与其他公司通信时，使用dtd还是很不错的。因为dtd能在发送和接受时能保证数据结构正确。 </P>
<P>选择解析引擎<BR>现在，可以使用的解析引擎有好几个。选择哪一个几乎完全取决于你的应用需要。如果你决定使用dtd，那么这个解析引擎必须能使你的xml被dtd验证。你可以将验证另放到一个进程中，但那样会影响性能。 </P>
<P>sax和dom是两个基本的解析模型。sax基于事件，所以在xml被解析时，事件被发送给引擎。接下来，事件与输出文件同步。dom解析引擎为动态xml数据和xsl样式表建立层次树状结构。通过随机访问dom树，可以提供xml数据，就象由xsl样式表来决定一样。sax模型上的争论主要集中于对dom结构的内存降低过度和加快xsl样式表解析时间缩短方面。 </P>
<P>然而，我们发现使用sax的很多系统并没有充分发挥它的能力。这些系统用它来建立dom结构并通过dom结构来发送事件。用这种方法，在任何xml处理之前必须从样式表中建立dom，所以性能会下降。 </P>
<P>二、生成动态xml</P>
<P>一旦建立了xml格式，我们需要一种能够将其从数据库中动态移植的方法。 </P>
<P>生成xml文档相对来说比较简单，因为它只需要一个可以处理字符串的系统。我们建立了一个使用java servlet、enterprise javabean server、jdbc和rdbms（关系型数据库管理系统）的系统。 </P>
<P>• servlet通过把生成xml文档的任务交给enterprise javabean (ejb)来处理产品信息请求。<BR>• ejb使用jdbc从数据库里查询所需的产品详细信息。<BR>• ejb生成xml文件并把它传递给servlet。<BR>• servlet调用解析引擎，从xml文件和静态的xsl样式表中创建html输出。 </P>
<P>（有关xsl应用的其他信息，请参阅用xsl作为模板语言。） </P>
<P>生成xml的例子<BR>在java中创建xml文档字符串的真正代码可以分成几个方法和类。 </P>
<P>启动xml生成过程的代码放在ejb方法里。这一实例会立即创建一个stringbuffer，以便存储生成的xml字符串。 </P>
<P>stringbuffer xml = new stringbuffer(); <BR>xml.append(xmlutils.begindocument("/browse_find/browse.xsl", "browse", request)); <BR>xml.append(product.toxml()); <BR>xml.append(xmlutils.enddocument("browse");<BR>out.print(xml.tostring());</P>
<P><BR>后面的三个xml.append()变元本身就是对其他方法的调用。 <BR>产生文件头<BR>第一个附加方法调用xmlutils类来产生xml文件头。我们的java servlet中的代码如下： </P>
<P>public static string begindocument(string stylesheet, string page)<BR>{ <BR>&nbsp;&nbsp;&nbsp; stringbuffer xml = new stringbuffer(); <BR>&nbsp;&nbsp;&nbsp; xml.append("<?xml version=\"1.0\"?>\n")<BR>&nbsp;&nbsp;&nbsp; .append("<?xml-stylesheet href=\"")<BR>&nbsp;&nbsp;&nbsp; .append(stylesheet).append("\"") <BR>&nbsp;&nbsp;&nbsp; .append(" type =\"text/xsl\"?&gt;\n"); <BR>&nbsp; xml.append("&lt;").append(page).append("&gt;\n"); <BR>&nbsp; return xml.tostring(); <BR>} </P>
<P>这段代码生成了xml文件头。<?xml>标签把本文件定义为支持1.0版本的xml文件。第二行代码指向用以显示数据的正确样式表的位置。最后包括进去的是项级标签（本实例中为<BROWSE>）。在文件末尾，只有<BROWSE>标签需要被关闭。 </P>
<P></P>
<P>填入产品信息<BR>完成了文件头后，控制方法会调用java对象来产生它的xml。本例中调用的是product对象。product对象使用两个方法来产生它的xml表示。第一个方法toxml()通过产生<PRODUCT>和</PRODUCT>标签来建立product节点。然后它会调用internalxml()，这样就能提供产品xml所需的内容。internalxml()是一系列的stringbuffer.append()调用。stringbuffer也被转换成字符串并返回给控制方法。 <BR>public string toxml()<BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp; stringbuffer xml = new stringbuffer("<PRODUCT>\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append(internalxml()); <BR>&nbsp;&nbsp;&nbsp; xml.append("</PRODUCT>\n"); <BR>&nbsp;&nbsp;&nbsp; return xml.tostring(); <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>public string internalxml() <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp; stringbuffer xml = new<BR>&nbsp;&nbsp;&nbsp; stringbuffer("\t")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(producttype).append("\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t").append(idvalue.trim())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t").append(idname.trim())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t").append(page.trim())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("\n"); <BR>厖?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml.append("\t").append(amount).append("\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t").append(vendor).append("\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t").append(pubdesc).append("\n"); <BR>&nbsp;&nbsp;&nbsp; xml.append("\t").append(vendesc).append("\n"; <BR>厖?<BR>&nbsp;&nbsp;&nbsp; return xml.tostring(); <BR>} </P>
<P><BR>关闭文件<BR>最后，xmlutils.enddocument()方法被调用。这个调用关闭xml标签（本例中为），并最终完成架构好的xml文件。来自控制方法的整个stringbuffer也转换成字符串，并返回给处理最初http请求的servlet。 </P>
<P>三、用xsl作为模板语言</P>
<P>为了得到html输出，我们把生成的xml文件和控制xml数据如何表示的xsl模板相结合。我们的xsl模板由精心组织的xsl和html标签组成。 </P>
<P>开始建模板<BR>我们的xsl模板开始部分与下面这段代码类似。第一行代码为必需代码，将本文件定义为xsl样式表。xmlns:xsl=属性引用本文件所使用的xml名称空间，而version=属性则定义名称空间的版本号。在文件的末尾，我们关闭标签。 </P>
<P>由<?XML:NAMESPACE PREFIX = XSL /><XSL:TEMPLATE>开始的第二行代码确定了xsl模板的模式。match属性是必需的，在这里指向xml标签<BASKETPAGE>。在我们的系统里，<BASKETPAGE>标签里包含<PRODUCT> 标签，这使得xsl模板可以访问嵌在<PRODUCT>标签内的产品信息。我们又一次必须在文件末尾关闭<XSL:TEMPLATE>标签。 </P>
<P>接下来，我们来看一看组织良好的html。由于它将被xml解析引擎处理，所以必须符合组织良好的xml的所有规则。从本质上来讲，这意味着所有的开始标签必须有对应的结束标签。例如，通常不被结束的 
<P>标签，必须用</P>关闭。 <BR><XSL:STYLESHEET transform? xsl 1999 www.w3.org http: xmlns:xsl="<A href="><U><FONT color=#0000ff>http://www.w3.org/1999/xsl/transform</FONT></U></A>" <BR>version="1.0"&gt;<XSL:TEMPLATE match="basketpage">?br&gt; </XSL:TEMPLATE></XSL:STYLESHEET><BR>在模板的主体内，有很多xsl标签被用于为数据表示提供逻辑。下面解释两个常用的标签。 <BR>choose<BR><XSL:CHOOSE>标签类似于传统编程语言中if-then-else结构的开始部分。在xsl中，choose标签表示在代码进入的部分中，赋值将触发动作的发生。拥有赋值属性的<XSL:WHEN>标签跟在choose标签后面。如果赋值是正确的，位于<XSL:WHEN>的开始和结束标签之间的内容将被使用。如果赋值错误，就使用<XSL:OTHERWISE>的开始和结束标签之间的内容。整个部分用</XSL:CHOOSE>来结束。 
<P>在这个例子里，when标签会为quantity标签检查xml。如果quantity标签里含有值为真的error属性，quantity标签将会显示列在下面的表格单元。如果属性的值不为真，xsl将会显示otherwise标签间的内容。在下面的实例里，如果error属性不真，则什么都不会被显示。 </P></TD></TR></TBODY></TABLE></DIV></XSL:OTHERWISE></XSL:WHEN></XSL:WHEN></XSL:TEMPLATE></XSL:TEMPLATE><img src ="http://www.blogjava.net/iNeo/aggbug/22835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2005-12-07 11:47 <a href="http://www.blogjava.net/iNeo/archive/2005/12/07/22835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE学习[z]</title><link>http://www.blogjava.net/iNeo/archive/2005/12/05/22491.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Mon, 05 Dec 2005 00:56:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2005/12/05/22491.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/22491.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2005/12/05/22491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/22491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/22491.html</trackback:ping><description><![CDATA[J2EE学习者越来越多，其本身技术也在不断的发展，涌现出各种概念。作为Web服务的重要平台，本文将从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。 
<P>　　首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。</P>
<P>　　J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S(Browser浏览器/Server服务器)结构，而J2EE主要是指B/S结构的实现。</P>
<P>　　J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。</P>
<P>　　J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准:WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。</P>
<P>　　这三种技术的每个技术在应用时都涉及两个部分:容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持(除了JDK/<A class=bluekey href="http://www.yesky.com/key/2913/2913.html" target=_blank>J2SE</A>以外)。</P>
<P>　　Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。</P>
<P>　　谈到JavaBeans技术，就涉及到组件构件技术(component)，这是Java的核心基础部分，很多软件设计概念(设计模式)都是通过JavaBeans实现的。</P>
<P>　　JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术(也就是Jsp/Servlet)调用，那么JavaBeans就运行在J2EE的Web容器中;如果它被EJB调用，它就运行在EJB容器中。</P>
<P>　　EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。</P>
<P>　　至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术:EJB和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说:这个JavaBeans是你为这个应用程序单独开发创建的。</P>
<P>　　J2EE应用系统开发工具有很多:如JBuilder、Eclipse等，这些IDE首先是<A class=bluekey href="http://www.yesky.com/key/3201/3201.html" target=_blank>Java开发工具</A>，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要lomboz<A class=bluekey href="http://www.yesky.com/key/2627/2627.html" target=_blank>插件</A>)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。</P>
<P>　　J2EE容器分为WEB容器和EJB容器，<A class=bluekey href="http://www.yesky.com/key/2648/2648.html" target=_blank>Tomcat</A>/Resin是Web容器;JBoss是EJB容器+Web容器等，其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品Websphere/Weblogic等和JBoss属于同一种性质。</P>
<P>　　J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。</P>
<P>　　如果你的J2EE应用系统的数据库连接是通过<A class=bluekey href="http://www.yesky.com/key/3962/3962.html" target=_blank>JNDI</A>获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。</P>
<P>　　衡量J2EE应用系统设计开发水平高低的标准就是:解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。 
<DIV class=right>共2页。</DIV><img src ="http://www.blogjava.net/iNeo/aggbug/22491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2005-12-05 08:56 <a href="http://www.blogjava.net/iNeo/archive/2005/12/05/22491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP里request变量列表</title><link>http://www.blogjava.net/iNeo/archive/2005/12/01/22114.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Thu, 01 Dec 2005 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2005/12/01/22114.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/22114.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2005/12/01/22114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/22114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/22114.html</trackback:ping><description><![CDATA[<P>&lt;% <BR>out.println("Protocol: " + request.getProtocol() + " "); <BR>out.println("Scheme: " + request.getScheme() + " "); <BR>out.println("Server Name: " + request.getServerName() + " " ); <BR>out.println("Server Port: " + request.getServerPort() + " "); <BR>out.println("Protocol: " + request.getProtocol() + " "); <BR>out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo() + " "); <BR>out.println("Remote Addr: " + request.getRemoteAddr() + " "); <BR>out.println("Remote Host: " + request.getRemoteHost() + " "); <BR>out.println("Character Encoding: " + request.getCharacterEncoding() + " "); <BR>out.println("Content Length: " + request.getContentLength() + " "); <BR>out.println("Content Type: "+ request.getContentType() + " "); <BR>out.println("Auth Type: " + request.getAuthType() + " "); <BR>out.println("HTTP Method: " + request.getMethod() + " "); <BR>out.println("Path Info: " + request.getPathInfo() + " "); <BR>out.println("Path Trans: " + request.getPathTranslated() + " "); <BR>out.println("Query String: " + request.getQueryString() + " "); <BR>out.println("Remote User: " + request.getRemoteUser() + " "); <BR>out.println("Session Id: " + request.getRequestedSessionId() + " "); <BR>out.println("Request URI: " + request.getRequestURI() + " "); <BR>out.println("Servlet Path: " + request.getServletPath() + " "); <BR>out.println("Accept: " + request.getHeader("Accept") + " "); <BR>out.println("Host: " + request.getHeader("Host") + " "); <BR>out.println("Referer : " + request.getHeader("Referer") + " "); <BR>out.println("Accept-Language : " + request.getHeader("Accept-Language") + " "); <BR>out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding") + " "); <BR>out.println("User-Agent : " + request.getHeader("User-Agent") + " "); <BR>out.println("Connection : " + request.getHeader("Connection") + " "); <BR>out.println("Cookie : " + request.getHeader("Cookie") + " "); <BR>out.println("Created : " + session.getCreationTime() + " "); <BR>out.println("LastAccessed : " + session.getLastAccessedTime() + " "); <BR><BR>%&gt; <BR><BR>运行结果： <BR><BR>Protocol: HTTP/1.1 <BR>Scheme: http <BR>Server Name: 192.168.0.1 <BR>Server Port: 8080 <BR>Protocol: HTTP/1.1 <BR>Server Info: JavaServer Web Dev Kit/1.0 EA (JSP 1.0; Servlet 2.1; Java 1.2; Windows NT 5.0 x86; java.vendor=Sun Microsystems Inc.) <BR>Remote Addr: 192.168.0.106 <BR>Remote Host: abc <BR>Character Encoding: null <BR>Content Length: -1 <BR>Content Type: null <BR>Auth Type: null <BR>HTTP Method: GET <BR>Path Info: null <BR>Path Trans: null <BR>Query String: null <BR>Remote User: null <BR>Session Id: To1010mC466113890241879At <BR>Request URI: /c.jsp <BR>Servlet Path: /c.jsp <BR>Accept: */* <BR>Host: 192.168.0.1:8080 <BR>Referer : null <BR>Accept-Language : zh-cn <BR>Accept-Encoding : gzip, deflate <BR>User-Agent : Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) <BR>Connection : Keep-Alive <BR>Cookie : SESSIONID=To1010mC466113890241879At <BR>Created : 965764522168 <BR>LastAccessed : 965775587088。</P><img src ="http://www.blogjava.net/iNeo/aggbug/22114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2005-12-01 13:55 <a href="http://www.blogjava.net/iNeo/archive/2005/12/01/22114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat5的web应用启动顺序详解[转]</title><link>http://www.blogjava.net/iNeo/archive/2005/11/30/21987.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Wed, 30 Nov 2005 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2005/11/30/21987.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/21987.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2005/11/30/21987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/21987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/21987.html</trackback:ping><description><![CDATA[<DIV id=title>
<H2>Tomcat5的web应用启动顺序详解</H2><A href="http://www.matrix.org.cn/user.shtml;jsessionid=DE0D65CF0430A032FB113D13C4775B6F?userid=66080">cleverpig</A> 发表于2005-11-29 作者:cleverpig 来自:Matrix 评价:3/1 评论数:0 点击数:211 [<A href="http://www.matrix.org.cn/favorite.shtml;jsessionid=DE0D65CF0430A032FB113D13C4775B6F?type=article&amp;title=Tomcat5的web应用启动顺序详解&amp;url=http%3A%2F%2Fwww.matrix.org.cn%2FarticleView.shtml%3Fid%3D44001">收藏</A>] </DIV>
<DIV id=divnormal>
<DIV id=articleview_centerad></DIV>
<DIV id=articleview_summary>摘要：<BR>应用Tomcat对于我们来讲实在是司空见惯了,但是对于每个使用者来讲,应该了解其运转的机制也是必不可少的,本人在维护"apache开源项目"论坛时遇到此问题，并略作研究，望与大家共讨、分享。<BR><BR><BR>本文Matrix永久镜像：<A href="http://www.matrix.org.cn/resource/article/44/44001_Tomcat5_web_start.html">http://www.matrix.org.cn/resource/article/44/44001_Tomcat5_web_start.html</A> <BR>说明：本文可能由Matrix原创，也可能由Matrix的会员整理，或者由<BR>Matrix的Crawler在全球知名Java或者其他技术相关站点抓取并永久<BR>保留镜像，Matrix会保留所有原来的出处URL，并在显著地方作出说明，<BR>如果你发觉出处URL有误，请联系Matrix改正.<BR></DIV></DIV>
<DIV id=divarticlecontent>
<CENTER><SPAN style="FONT-SIZE: 20px"><B>Tomcat5的web应用启动顺序详解</B></SPAN></CENTER><BR>
<CENTER>作者：cleverpig</CENTER><BR><BR><SPAN style="COLOR: red">版权声明：本文可以自由转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</SPAN><BR>作者:cleverpig(<A href="http://blog.matrix.org.cn/page/cleverpig" target=_new>http://blog.matrix.org.cn/page/cleverpig</A>)<BR>原文:[http://www.matrix.org.cn/resource/article/43/43987_JGroups.html]http://www.matrix.org.cn/resource/article/43/43987_JGroups.html[/url]<BR>关键字:tomcat,web,启动顺序<BR><BR><SPAN style="COLOR: blue">摘要：</SPAN><BR><BR>&nbsp;&nbsp; 应用Tomcat对于我们来讲实在是司空见惯了,但是对于每个使用者来讲,应该了解其运转的机制也是必不可少的,本人在维护"apache开源项目"论坛时遇到此问题，并略作研究，望与大家共讨、分享。<BR><BR><SPAN style="COLOR: blue">一、配置自动部署时的web应用加载顺序：</SPAN><BR><BR>&nbsp;&nbsp; 当tomcat的server.xml中对虚拟主机（Host）配置中autoDeploy=true和unpackWARs=true时，如：<BR>server.xml<BR><PRE class=overflow title="pre code"><BR>...<BR>&lt;Host name="localhost" debug="0" appBase="webapps"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<BR>...<BR></PRE><BR><BR>&nbsp;&nbsp; 下面的部署顺序在Tomcat启动时发生：<BR><BR>&nbsp;&nbsp; 1。任何具有上下文描述符（Context Descriptors）的web应用首先被部署，tomcat在$CATALINA_HOME/conf/[enginename]/[hostname]/目录中罗列出所有的以xml为结尾的文件，将其作为web应用的上下文描述符，并按照文件名排序逐一部署。<BR><BR>&nbsp;&nbsp; <SPAN style="COLOR: red">注意作为上下文描述符的文件名可以不为web应用名，因为tomcat会读取其中的内容来判断，但是改变上下文描述符的文件名会使部署的顺序发生变化。</SPAN><BR><BR>如：<BR>$CATALINA_HOME\conf\Catalina\localhost\devoffer.xml<BR><BR><PRE class=overflow title="pre code"><BR>&lt;?xml version='1.0' encoding='utf-8'?&gt;<BR>&lt;Context docBase="E:/eclipse3.1RC3/workspace/devOfferProject/web" path="/devoffer" useNaming="false" workDir="work\Catalina\localhost\devoffer"&gt;<BR>&lt;/Context&gt;<BR></PRE><BR><BR>上面的上下文描述符说明了devoff这个web应用的docBase和部署的path以及其工作目录。<BR><BR>&nbsp;&nbsp; 2。另外，位于$CATALINA_HOME/webapps/[webappname]/META-INF/目录中的context.xml也作为上下文描述符使用,在处理了上文所说的位于$CATALINA_HOME/conf/[enginename]/[hostname]/目录中的上下文描述符后,tomcat将部署这些在web应用的META-INF目录中的context.xml。加载顺序按照应用名的字母顺序。<BR><BR>&nbsp;&nbsp; 3。没有上下文描述符的已经被展开的web应用将按照其应用名顺序逐个被部署，如果其中的一个web应用关联着一个在appBase（一般为"$CATALINA_HOME/webapps"目录）中的WAR文件，则当WAR文件比相对应的被展开的web应用新时，那个被展开的web应用将被删除，tomcat将WAR文件展开并部署作为替换旧的web应用。<BR><BR>&nbsp;&nbsp; 4。在执行了1-3步后，tomcat将部署在appBase中的WAR文件。<BR><BR>&nbsp;&nbsp; <SPAN style="COLOR: red">请注意：在每个应用被部署后，tomcat为没有上下文描述符的web应用建立上下文描述符。</SPAN><BR><BR><BR><SPAN style="COLOR: blue">二、非自动部署配置下的应用加载顺序：</SPAN><BR><BR>&nbsp;&nbsp; 此时完全按照在tomcat manager中人工部署顺序。<BR><BR><SPAN style="COLOR: blue">三、参考资源：</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://tomcat.apache.org/tomcat-5.5-doc/deployer-howto.html" target=_new>http://tomcat.apache.org/tomcat-5.5-doc/deployer-howto.html</A><BR><BR><SPAN style="COLOR: blue">四、参加讨论：</SPAN><BR><A href="http://www.matrix.org.cn/thread.shtml?topicId=32324&amp;forumId=17" target=_new>http://www.matrix.org.cn/thread.shtml?topicId=32324&amp;forumId=17</A><BR></DIV><img src ="http://www.blogjava.net/iNeo/aggbug/21987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2005-11-30 16:28 <a href="http://www.blogjava.net/iNeo/archive/2005/11/30/21987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你能过关吗?J2EE面试题</title><link>http://www.blogjava.net/iNeo/archive/2005/11/29/21808.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Tue, 29 Nov 2005 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2005/11/29/21808.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/21808.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2005/11/29/21808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/21808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/21808.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=6 width="98%" background=http://www.pconline.com.cn/images/point.gif border=0>
<TBODY>
<TR>
<TD align=middle colSpan=3>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle><B class="art_title f18">你能过关吗?J2EE面试题集锦(附答案)</B></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=555>出处：CSDN[ 2005-11-24 10:00:55 ] </TD>
<TD class=555 align=middle>作者：metaphy </TD>
<TD class=555 align=right>责任编辑：xietaoming</TD></TR></TBODY></TABLE>
<DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px" align=center>
<SCRIPT src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.sywz.btxf.&amp;media=js&amp;pid=cs.pconline.rjzx.biaoti."></SCRIPT>
<A href="http://adv.pconline.com.cn/adpuba/click?adid=14535&amp;id=pc.rjzx.sywz.btxf." target=_blank><IMG height=60 src="http://image.pconline.com.cn/ad/200508/chiju_468x60.gif" width=468 border=0></A></DIV>
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
<TBODY>
<TR>
<TD class=article width="100%" height=62>
<P>/**<BR>&nbsp;* By metaphy 2005-11-12<BR>&nbsp;* Version: 0.01<BR>&nbsp;* 注:题目答案来源于metaphy过去的知识或网络,metaphy不能保证其正确或完整性,仅供参考<BR>**/</P>
<P><IFRAME id=ad_top name=ad_top align=left marginWidth=0 marginHeight=0 src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.sywz.hzh.&amp;media=html&amp;pid=cs.pconline.rjzx.hzh." frameBorder=0 width=320 scrolling=no height=280></IFRAME><STRONG>一、基础问答</STRONG></P>
<P>　　<STRONG>1.下面哪些类可以被继承?</STRONG></P>
<P>　　　java.lang.Thread (T)<BR>　　　java.lang.Number (T)<BR>　　　java.lang.Double (F)<BR>　　　java.lang.Math&nbsp; (F)<BR>　　　java.lang.Void&nbsp; (F)<BR>　　　java.lang.Class&nbsp; (F)<BR>　　　java.lang.ClassLoader (T)</P>
<P>　　<STRONG>2.抽象类和接口的区别</STRONG></P>
<P>　　(1)接口可以被多重implements,抽象类只能被单一extends<BR>　　(2)接口只有定义,抽象类可以有定义和实现<BR>　　(3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)</P>
<P>　　<STRONG>3.Hashtable的原理,并说出HashMap与Hashtable的区别</STRONG></P>
<P>　　HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.<BR>HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.</P>
<P>　　<STRONG>4.forward和redirect的区别</STRONG></P>
<P>　　forward: an internal transfer in servlet<BR>　　redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等</P>
<P>　　<STRONG>5.什么是Web容器?</STRONG></P>
<P>　　实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.</P>
<P>　　6.解释下面关于J2EE的名词</P>
<P>　　(1)JNDI:Java Naming &amp; Directory Interface,JAVA命名目录服务.主要提供的功能是：提供一个目录系统，让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能.<BR>　　(2)JMS：Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.<BR>　　(3)JTA：Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.<BR>　　(4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.<BR>　　(5)RMI:Remote Method Interface,远程方法调用</P>
<P>　　<STRONG>7.EJB是基于哪些技术实现的？并说 出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别.</STRONG></P>
<P>　　EJB包括Session Bean、Entity Bean、Message Driven Bean，基于JNDI、RMI、JAT等技术实现.</P>
<P>　　SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个由现有企业应用程序实现的实体.</P>
<P>　　Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行，不同的是 Stateful Session Bean 可以记录呼叫者的状态，因此通常来说，一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫 Stateless Session Bean 的时候，EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之，很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时，会是同一个 Bean 的 Instance 在执行.从内存方面来看， Stateful Session Bean 与 Stateless Session Bean 比较， Stateful Session Bean 会消耗 J2EE Server 较多的内存，然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.</P>
<P>　　<STRONG>8.XML的解析方法</STRONG></P>
<P>　　Sax,DOM,JDOM</P>
<P>　　<STRONG>9.什么是Web Service?</STRONG></P>
<P>　　Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。<BR>Web Service所使用的是Internet上统一、开放的标准，如HTTP、XML、SOAP（简单对象访问协议）、WSDL等，所以Web Service可以在任何支持这些标准的环境（Windows,Linux）中使用。</P>
<P>　　注：SOAP协议（Simple Object Access Protocal,简单对象访问协议）,它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下，软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性，这有助于大量异构程序和平台之间的互操作性，从而使存在的应用程序能够被广泛的用户访问。</P>
<P>　　优势：</P>
<P>　　(1).跨平台。<BR>　　(2).SOAP协议是基于XML和HTTP这些业界的标准的，得到了所有的重要公司的支持。<BR>　　(3).由于使用了SOAP，数据是以ASCII文本的方式而非二进制传输，调试很方便；并且由于这样，它的数据容易通过防火墙，不需要防火墙为了程序而单独开一个“漏洞”。<BR>　　(4).此外，WebService实现的技术难度要比CORBA和DCOM小得多。<BR>　　(5).要实现B2B集成，EDI比较完善与比较复杂；而用WebService则可以低成本的实现，小公司也可以用上。<BR>　　(6).在C/S的程序中，WebService可以实现网页无整体刷新的与服务器打交道并取数。</P>
<P>　　缺点：</P>
<P>　　(1).WebService使用了XML对数据封装，会造成大量的数据要在网络中传输。<BR>　　(2).WebService规范没有规定任何与实现相关的细节，包括对象模型、编程语言，这一点，它不如CORBA。</P>
<P>　　<STRONG>10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?</STRONG></P>
<P>　　答：多线程有两种实现方法，分别是继承Thread类与实现Runnable接口<BR>　　同步的实现方面有两种，分别是synchronized,wait与notify</P>
<P>　　<STRONG>11.JSP中动态INCLUDE与静态INCLUDE的区别？</STRONG> </P>
<P>　　动态INCLUDE用jsp:include动作实现</P>
<P>&lt;jsp:include page="included.jsp" flush="true"/&gt;</P>
<P>　　它总是会检查所含文件中的变化，适合用于包含动态页面，并且可以带参数</P>
<P>　　静态INCLUDE用include伪码实现,定不会检查所含文件的变化，适用于包含静态页面</P>
<P>　　&lt;%@ include file="included.htm" %&gt;<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
<TBODY>
<TR>
<TD class=article width="100%" height=62>
<P></P>
<P><STRONG>二、Java编程与程序运行结果</STRONG></P>
<P>　　<STRONG>1.Java编程,打印昨天的当前时刻</STRONG></P>
<P class=code>public class YesterdayCurrent{<BR>&nbsp; public void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; Calendar cal = Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp; cal.add(Calendar.DATE, -1);<BR>&nbsp;&nbsp;&nbsp; System.out.println(cal.getTime());<BR>&nbsp; }<BR>}</P>
<P>　　<STRONG>2.文件读写,实现一个计数器</STRONG></P>
<P class=code>&nbsp; public int getNum(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stri="";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader in = new BufferedReader(new FileReader(f));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((stri=in.readLine())!=null){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = Integer.parseInt(stri.trim());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void setNum(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = getNum();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false)));&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(String.valueOf(i));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //可能是编码的原因，如果直接写入int的话，将出现java编码和windows编码的混乱，因此此处写入的是String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>　　<STRONG>3. 指出下面程序的运行结果:</STRONG></P>
<P class=code>class A{<BR>&nbsp;&nbsp;&nbsp; static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("1");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public A(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("2");<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>class B extends A{<BR>&nbsp;&nbsp;&nbsp; static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("a");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public B(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("b");<BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>}<BR>public class Hello{<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] ars){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A ab = new B(); //执行到此处,结果: 1a2b<BR>&nbsp;ab = new B(); //执行到此处,结果: 1a2bab<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P>　　注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造</P>
<P>　　<STRONG>4.写一个Singleton模式的例子</STRONG></P>
<P class=code>public class Singleton{<BR>&nbsp;private static Singleton single = new Singleton();<BR>&nbsp;private Singleton(){}<BR>&nbsp;public Singleton getInstance(){<BR>&nbsp; return single;<BR>&nbsp;}<BR>}</P>
<P><STRONG>三、数据库</STRONG></P>
<P>　　<STRONG>1.删除表的重复记录</STRONG></P>
<P>　　如果记录完全相同才算重复记录,那么:&nbsp; (sql server2000下测试通过)</P>
<P class=code>select distinct * into #tmpp from tid<BR>delete from tid&nbsp;&nbsp;&nbsp;&nbsp; <BR>insert into tid select * from #tmpp<BR>drop table #tmpp</P>
<P>　　如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)</P>
<P class=code>delete from tableA where id not in<BR>(select id = min(id) from tableA group by name)</P>
<P>　　<STRONG>2.delete from tablea&nbsp;&amp; truncate table tablea的区别</STRONG></P>
<P>　　truncate 语句执行速度快,占资源少,并且只记录页删除的日志；<BR>　　delete 对每条记录的删除均需要记录日志</P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/iNeo/aggbug/21808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2005-11-29 12:33 <a href="http://www.blogjava.net/iNeo/archive/2005/11/29/21808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>