jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks

          http://hi.baidu.com/yanhua365/blog/item/a05930ad04b777094a36d662.html

          頁面中太多的自定義標簽會不會影響性能?

          太多的自定義標簽(尤其是這種包含了一部分業務邏輯的標簽)會不會影響性能呢?下面一段文字是我以前寫的,可以說明一些問題,但真正對性能會不會產生太大的影響,還要看具體的情況,如果有必要的話,做一下性能測試得出的結果才是可靠的。

          我們知道,JSP歸根到底是Servlet,也就是說最終是要編譯成Servlet的。如果是在Servlet的service方法中new一個Tag處理類來處理出現的標簽的話,那就意味著每一次客戶的請求都會生成新的Tag處理類,這樣對服務器的性能和資源影響都很大。而如果把Tag處理類的對象做為Servlet的一個屬性的話,又會遇到線程安全等問題。據說,不同的JSP容器有不同的處理方式,有的容器下,一個頁面上出現太多的自定義標簽,響應速度就會很慢。真擔心太多的JSP和太多的自定義標簽會使服務器承受不了啊。--今天突然想到,可以看一下Tomcat是怎么把包含有自定義標簽的JSP頁面編譯成Servlet的,也許就清楚自定義標簽對性能的影響有多大了!
          原來,Tomcat用了緩沖池的概念來解決。。。
          比如我在JSP中用到了一個Struts標簽<html:text property="username"></html:text>那么,在對應的JSP編譯的Servlet中會有一個這樣的屬性private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_html_text_property;可以看出來,這是Tomcat提供的一個標簽處理的緩沖池,在下面會用到它。在Servlet中會生成下面這個方法:
           private boolean _jspx_meth_html_text_0(javax.servlet.jsp.tagext.JspTag _jspx_th_html_form_0, PageContext pageContext)
                    throws Throwable {
              JspWriter out = pageContext.getOut();
              /* ----  html:text ---- */
              org.apache.struts.taglib.html.TextTag _jspx_th_html_text_0 = (org.apache.struts.taglib.html.TextTag) _jspx_tagPool_html_text_property.get(org.apache.struts.taglib.html.TextTag.class);
              _jspx_th_html_text_0.setPageContext(pageContext);
              if (_jspx_th_html_form_0 instanceof javax.servlet.jsp.tagext.SimpleTag)
                _jspx_th_html_text_0.setParent(new javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) _jspx_th_html_form_0));
              else
                _jspx_th_html_text_0.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_html_form_0);
              _jspx_th_html_text_0.setProperty("username");
              int _jspx_eval_html_text_0 = _jspx_th_html_text_0.doStartTag();
              if (_jspx_th_html_text_0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
                return true;
              _jspx_tagPool_html_text_property.reuse(_jspx_th_html_text_0);
              return false;
            }
          可以看出,在這個方法中,對標簽處理類做了緩沖池處理,可以大大提高性能。
          當然,_jspx_tagPool_html_text_property這個Servlet的屬性,要在初始化時賦值,在最后釋放掉。
          public void _jspInit() {
                  _jspx_tagPool_html_text_property = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());

           public void _jspDestroy() {
                  _jspx_tagPool_html_text_property.release();

          需要說明的是,這種緩沖池是在這個JSP生命周期的范圍內的,也就是說,另一個JSP頁面用到了相同的標簽,也會重新建立一個緩沖池,和這個頁面毫無關系。還有一點,就是在同一個JSP頁面中,也不是一個標簽對應一個緩沖池,比如說我用到了link標簽的兩種形式,它們屬性的個數是不一樣的:
             <html:link action="/test">Test with a link</html:link>
              <html:link action="/test" paramId="username" paramName="haha">
          那就會生成兩個緩沖池:
              private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_html_link_action;
             private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_html_link_paramName_paramId_action;
          這樣,雖然服務器上會有很多這樣的緩沖池,不過相對于每次請求創建Tag處理類來說,這不算什么,大大提高了性能和利用了服務器資源。
          我們這里說的都是Tomcat的解決方案,至于其它容器,也許有不同的解決方案。

          posted on 2008-03-05 16:10 jinfeng_wang 閱讀(1310) 評論(0)  編輯  收藏 所屬分類: java 、ZZ
          主站蜘蛛池模板: 江北区| 周至县| 共和县| 五家渠市| 察隅县| 天峨县| 股票| 来安县| 大余县| 永泰县| 赫章县| 正阳县| 安乡县| 赣榆县| 卢湾区| 汪清县| 兰坪| 梁山县| 德惠市| 浪卡子县| 化州市| 唐山市| 定陶县| 峨山| 寻乌县| 万源市| 镇坪县| 东阳市| 中江县| 桃园市| 怀宁县| 上杭县| 海丰县| 普定县| 吉木萨尔县| 永新县| 江陵县| 夏邑县| 长汀县| 左权县| 河间市|