??xml version="1.0" encoding="utf-8" standalone="yes"?>伊人久久精品,ga∨成人网,青青草视频一区http://www.aygfsteel.com/huamengxing/category/25401.html专注于javazh-cnTue, 11 Sep 2007 16:01:47 GMTTue, 11 Sep 2007 16:01:47 GMT60JSP的运行内q?/title><link>http://www.aygfsteel.com/huamengxing/archive/2007/09/10/144037.html</link><dc:creator>华梦?/dc:creator><author>华梦?/author><pubDate>Mon, 10 Sep 2007 08:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/huamengxing/archive/2007/09/10/144037.html</guid><wfw:comment>http://www.aygfsteel.com/huamengxing/comments/144037.html</wfw:comment><comments>http://www.aygfsteel.com/huamengxing/archive/2007/09/10/144037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/huamengxing/comments/commentRss/144037.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/huamengxing/services/trackbacks/144037.html</trackback:ping><description><![CDATA[ <table class="pageSpaceNewsSeparator" cellspacing="0" cellpadding="1" width="100%" border="0"> <tbody> <tr> <td> <table cellspacing="0" cellpadding="5" width="100%" border="0"> <tbody> <tr> <td class="titleNews">JSP的运行内q?/td> </tr> </tbody> </table> </td> </tr> <tr> <td> <table cellspacing="0" cellpadding="4" width="100%" border="0"> <tbody> <tr> <td class="titleNewsRemark" height="72"> <p> <font color="#f26c4f">文章作者:</font> <br />责Q~辑Q?font color="#000000"></font> 录入旉Q?004-11-1 18:26:13 来源Q第七频?br />频道声明Q本频道的文章除部分特别声明止转蝲的专E外Q可以自p{?但请务必注明出出处和原始作?文章版权归本频道与文章作者所?对于被频道{载文章的个h和网?我们表示深深的谢? </p> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <table height="117" cellspacing="5" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="content" id="fontzoom" style="WORD-WRAP: break-word" height="40"> <span id="wmqeeuq" class="myp11"> <font id="zoom">l常有朋友问PJSP和Servlet之间有什么区别,两者之间又有什么联p?其实Servlet技术的出现旉很早Q是当时ZJava?a ><u><font color="#0000ff">服务?/font></u></a>端应用而开发的。大安知道Applet是应用小E序QServlet是<a ><u><font color="#0000ff">服务?/font></u></a>端小E序了。但在Microsoft公司的ASP技术出现后Q用Servletq行响应输出时一行行的输句就昑־非常W拙Q对于复杂布局或者显C页面更是如此。JSP是Z满q种需求在Servlet技术之上开发的。可见,JSP和Servlet之间有着内在的血~关p,在学习JSPӞ如果能够抓住q种联系Q就能更深刻地理解JSP的运行机理,辑ֈ事半功倍的效果?<br /><br />本文通过对一个JSPq行q程的剖析,深入JSPq行的内q,q从全新的视角阐qC些JSP中的技术要炏V?<br /><br /><b>HelloWorld.jsp </b><br /><br />我们以Tomcat 4.1.17<a ><u><font color="#0000ff">服务?/font></u></a>ZQ来看看最单的HelloWorld.jsp是怎么q行的?<br /><br />代码清单1QHelloWorld.jsp <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>HelloWorld.jsp <% String message = "Hello World!"; %> <%=message%></ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  q个文g非常单,仅仅定义了一个String的变量,q且输出。把q个文g攑ֈTomcat的webapps\ROOT\目录下,启动TomcatQ在览器中讉Khttp://localhost:8080/HelloWorld.jspQ浏览器中的输出为“HelloWorld!?<br /><br />  让我们来看看Tomcat都做了什么。{到Tomcat的\work\Standalone\localhost\_目录下,可以扑ֈ如下的HelloWorld_jsp.javaQ这个文件就是Tomcat解析HelloWorld.jsp时生成的源文Ӟ <br /><br />  代码清单2QHelloWorld_jsp.java <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import org.apache.jasper.runtime.*; public class HelloWorld_jsp extends HttpJspBase { ...... public void _jspService(HttpServletRequest request, HttpServletResponse response)throws java.io.IOException, ServletException { JspFactory _jspxFactory = null; javax.servlet.jsp.PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html;charset=ISO-8859-1"); pageContext = _jspxFactory.getPageContext(this, request, <br />response,null, true, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; String message = "Hello World!"; out.print(message); } catch (Throwable t) { out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (pageContext != null) pageContext.handlePageException(t); } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); } } }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  从上面可以看出,HelloWorld.jsp在运行时首先解析成一个JavacHelloWorld_jsp.javaQ该cȝ承于org.apache.jasper.runtime.HttpJspBase基类QHttpJspBase实现了HttpServlet接口。可见,JSP在运行前首先编译ؓ一个ServletQ这是理解JSP技术的关键?<br /><br />  我们q知道JSP面中内|了几个对象Q如pageContext、application、config、page、session、out{,你可能会奇怪,Z么在JSP中的代码片断中可以直接用这些内|对象。观察_jspService()ҎQ实际上q几个内|对象就是在q里定义的。在对JSP文g中的代码片断q行解析之前Q先对这几个内置对象q行初始化?<br /><br />  首先Q调用JspFactory的getDefaultFactory()Ҏ获取容器实现Q本文中指Tomcat 4.1.17Q的一个JspFactory对象的引用。JspFactory是javax.servlet.jsp包中定义的一个抽象类Q其中定义了两个静态方法set/getDefaultFactory()。setҎ由JSP容器QTomcatQ实例化该页面ServletQ即HelloWorld_jspc)的时候置入,所以可以直接调用JspFactory.getDefaultFactory()Ҏ得到q个JSP工厂的实现类。Tomcat是调用org.apache.jasper.runtime.JspFactoryImplcR?<br /><br />  然后Q调用这个JspFactoryImpl的getPageContext()ҎQ填充一个PageContextq回Qƈ赋给内置变量pageConext。其它内|对象都l由该pageContext得到。具体过E见上面的代码,q里不再赘述。该面Servlet的环境设|完毕,开始对面q行解析。HelloWorld.jsp面仅仅定义了一个String变量Q然后直接输出。解析后的代码如下: <br /><br />  代码清单3QJSP面解析后的代码片断 <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>String message = "Hello World!"; out.print(message);</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  <b>定制标签的解析过E?/b><br /><br />  在一个中大型的Web应用中,通常使用JSP定制标签来封装页面显C逻辑。剖析容器对定制标签的解析过E,Ҏ们深入理解定制标{q行机理非常有帮助。下面我们以Struts1.1b中附带的struts-example应用的主运行ؓ例加以说明?<br /><br />  包含定制标签的index.jsp <br /><br />  Struts1.1b的下载地址是http://jakarta.apache.org/struts/index.html。将下蝲的包解压Q在webapps目录下可以找到struts-example.war。将该War包拷贝到Tomcat的webapps目录下,Tomcat会自动安装此应用包。在览器中通过http://localhost:8080/struts-example讉Kstruts-example应用Q将昄应用的首(见图1Q?<br /><br /><img style="WIDTH: 424px; HEIGHT: 316px" height="355" src="http://www.channel7.cn/Files/RoUpimages/3a7a240873.gif" width="474" /><br /><br />  图一 应用的首?<br /><br />  代码清单4Qindex.jsp <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code><%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <html:html locale="true"> <head> <title><bean:message key="index.title"/></title> <html:base/> </head> <body bgcolor="white"> …? </body> </html:html></ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>  我们仅以index.jsp中的<bean:message/>标签的解析ؓ例进行分析,看容器是怎样把这个自定义标签解析成HTML输出的。上面代码省略了面的其它显C部分。首先,查看上面览器中面的源文gQ?/ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code><html lang="zh"> <head> <title>MailReader Demonstration Application (Struts 1.0)</title> </head> <body bgcolor="white"> …? </body> </html></ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>  可见Q容器已l把<bean:message key="index.title"/>替换成一个字Ԍ昄为页面的标题?/ccid_code><br /><br />  解析q程 <br /><br />  那么QJSP容器是怎样完成解析的呢Q查看在工作目录jakarta-tomcat-4.1.17\work\Standalone\localhost\struts-example下解析后的index_jsp.java文gQ?<br /><br />  代码清单5Qindex_jsp.java <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import org.apache.jasper.runtime.*; public class index_jsp extends HttpJspBase { //为所有的定制标签定义处理器池cȝ引用 private org.apache.jasper.runtime.TagHandlerPool Q? _jspx_tagPool_bean_message_key; …? //面cL造方? public index_jsp() { _jspx_tagPool_bean_message_key = new org.apache.jasper.runtime.TagHandlerPool(); …? } public void _jspService(HttpServletRequest request,   HttpServletResponse response)   throws java.io.IOException, ServletException { …? _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html;charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this,   request, response,null, true, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; …? if (_jspx_meth_html_html_0(pageContext)) return; …? } //面在处理退出时释放所有定制标{属? public void _jspDestroy() { _jspx_tagPool_bean_message_key.release(); …? } }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  生成的index_jsp.javal承于org.apache. jasper.runtime.HttpJspBase。研I这个文件ؓ我们了解定制标签的运行机理提供了途径?<br /><br /><ccid_code>  从上面可以看出,Tomcat在解析一个JSP面Ӟ首先为每一个定制标{֮义ƈ实例化了一个TagHandlerPool对象。页面的处理Ҏ覆盖父类的_ jspService()ҎQ_jspServiceҎ首先初始化环境,为内|对象赋倹{由于index.jsp面整体׃?lt;html:html/>标签包裹QTomcatҎ一个标{N产生一个私有方法加以实现?lt;html:html/>标签的处理方法是_jspx_meth_html_html_0()。这个方法的命名规范大家也可以从q里看出Q就是“_jspx_meth Q?标签的前~ Q?标签?Q?该标{֜JSP面同类标签中出现的序号”。其它标{N被包含在该标{中Q所以其它标{֜_jspx_meth_html_html_0()Ҏ中进行解析。具体的代码实现请参见赛q网http://linux.ccidnet.com期刊览2003q第6期?/ccid_code><br /><br /><ccid_code>  在_jspx_meth_html_html_0()Ҏ中,首先从_jspx_tagPool_html_html_locale池中得到一个org.apache.struts.taglib.html.HtmlTag的实例,然后讄q个tag实例的页面上下文及上U标{,׃html:html标签是页面的最层标签Q所以它的parent是null。然后对该标{内容q行解析。HTML代码直接输出Q下面主要看?lt;html:html></html:html>标签之间包含?lt;bean:message key="index.title"/>标签的解析。对bean:message标签的解析类ghtml:htmlQTomcat也将其放入一个单独的Ҏ_jspx_meth_bean_message_0()中进行?/ccid_code><br /><br />  bean:message标签的解?<br /><br />  代码清单7Q_jspx_meth_bean_message_0()Ҏ片断 <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>//对message定制标签的处理方? private boolean _jspx_meth_bean_message_0( javax.servlet.jsp.tagext.Tag _jspx_th_html_html_0, javax.servlet.jsp.PageContext pageContext) throws Throwable { JspWriter out = pageContext.getOut(); /* ---- bean:message ---- */ org.apache.struts.taglib.bean.MessageTag _jspx_th_bean_message_0 = (org.apache.struts.taglib.bean.MessageTag) _jspx_tagPool_bean_message_key.get( org.apache.struts.taglib.bean.MessageTag.class); _jspx_th_bean_message_0.setPageContext(pageContext); _jspx_th_bean_message_0.setParent(_jspx_th_html_html_0); _jspx_th_bean_message_0.setKey("index.title"); int _jspx_eval_bean_message_0 = _jspx_th_bean_message_0.doStartTag(); if (_jspx_th_bean_message_0.doEndTag()== javax.servlet.jsp.<br />tagext.Tag.SKIP_PAGE) return true; _jspx_tagPool_bean_message_key.reuse(_jspx_th_bean_message_0); return false; }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>  同样Q对html:bean也需要从池中得到一个标{的实例,然后讄环境。这里不再赘q。我们只专注对MessageTag定制标签cȝD的处理部分。定制标{的开发不在本文讨围之内。在index.jsp中定义了一个bean:message标签Qƈ讄了一个属性:<bean:message key="index.title"/>。Tomcat在解析时Q调用MessageTag对象的key属性设|方法setKey()Q将该属性置入。然后调用MessageTag的doStartTag()和doEndTag()ҎQ完成解析。如果doEndTag()Ҏ的返回gؓjavax.servlet.jsp.tagext.Tag. SKIP_PAGEQ表明已l完成解析,q回trueQTomcat立卛_止剩余页面代码的执行Qƈq回。否则把该MessageTag的实例放回池中?/ccid_code><br /><br />  <b>标签cd象实例的池化</b><br /><br />  Z提高q行效率QTomcatҎ有的定制标签c进行了池化Q池化工作由org.apache.jasper. runtime.TagHandlerPoolcd成。TagHandlerPoolcM要有两个ҎQ代码如下: <br /><br />  代码清单8QTagHandlerPool.java <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>public class TagHandlerPool { private static final int MAX_POOL_SIZE = 5; private Tag[] handlers; public synchronized Tag get(Class handlerClass) throws JspException {……} public synchronized void reuse(Tag handler) {……} }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  TagHandlerPool单地实现了对标签cȝ池化Q其中MAX_POOL_SIZE是池的初始大,handlers是一个Tag的数l,存储标签cȝ实例。get(Class handlerClass)得到一个指定标{的实例,如果池中没有可用实例Q则新实例化一个。reuse(Tag handler)把handler对象攑֛池中?<br /><br />  xQ我们对JSP在容器中的运行过E已l了然于怺。虽然每UJSP容器的解析结果会有差异,但其中的原理都雷同。对于编写JSP应用Q我们ƈ不需要干涉容器中的运行过E,但如果你Ҏ个底层的q行机制比较熟悉Q就能对JSP/Servlet技术有更深的认识?<br /></font> </span> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/huamengxing/aggbug/144037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/huamengxing/" target="_blank">华梦?/a> 2007-09-10 16:53 <a href="http://www.aygfsteel.com/huamengxing/archive/2007/09/10/144037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>目部v问题http://www.aygfsteel.com/huamengxing/archive/2007/08/30/141244.html华梦?/dc:creator>华梦?/author>Thu, 30 Aug 2007 03:12:00 GMThttp://www.aygfsteel.com/huamengxing/archive/2007/08/30/141244.htmlhttp://www.aygfsteel.com/huamengxing/comments/141244.htmlhttp://www.aygfsteel.com/huamengxing/archive/2007/08/30/141244.html#Feedback0http://www.aygfsteel.com/huamengxing/comments/commentRss/141244.htmlhttp://www.aygfsteel.com/huamengxing/services/trackbacks/141244.html
卛_在当前目录下得到test.war
随后可以把test.war上传到服务器


在server.xmld

<Context path="" docBase="PEP" debug="0" reloadable="false">
    <ResourceLink global="jdbc/PathPlat" name="jdbc/PathPlat" type="javax.sql.DataSource"/>
   </Context>

这D代码中?br /><Context path="/manager" docBase="manager" debug="0" privileged="true"/>
拯一下ƈ修改Qpath="" 为war路径QdocBase=""Z的war的文件名?br /> 使用不带M?jar 命o我们可以看到 jar 命o的用法如下:

  jar {ctxu}[vfm0M] [jar-文g] [manifest-文g] [-C 目录] 文g?...

  其中 {ctxu} ?jar 命o的子命oQ每?jar 命o只能包含 ctxu 中的一个,它们分别表示Q?

   -c 创徏新的 JAR 文g?

   -t 列出 JAR 文g包的内容列表

   -x 展开 JAR 文g包的指定文g或者所有文?

   -u 更新已存在的 JAR 文g?(d文g?JAR 文g包中)

     [vfm0M] 中的选项可以任选,也可以不选,它们?jar 命o的选项参数

   -v 生成详细报告q打印到标准输出

   -f 指定 JAR 文g名,通常q个参数是必ȝ

   -m 指定需要包含的 MANIFEST 清单文g

   -0 只存储,不压~,q样产生?JAR 文g包会比不用该参数产生的体U大Q但速度更快

   -M 不生所有项的清单(MANIFEST〕文Ӟ此参C忽略 -m 参数

     [jar-文g] 即需要生成、查看、更新或者解开?JAR 文g包,它是 -f 参数的附属参?

     [manifest-文g] ?MANIFEST 清单文gQ它?-m 参数的附属参?

     [-C 目录] 表示转到指定目录下去执行q个 jar 命o的操作。它相当于先使用 cd 命o转该目录下再执行不带 -C 参数?jar 命oQ它只能在创建和更新 JAR 文g包的时候可用。  



]]>
վ֩ģ壺 | | | Զ| | Ϫ| ̨| ŷ| | | α| | | | ʯ| ʳ| ʯɽ| ¹| | | ɽ| ۷| ¬| ʶ| Զ| ˼| | | | ˮ| ζ| Į| | ׶| ʼ| Т| | | ƽ| | γ|