سؤال

أفكر في إنشاء بعض علامات JSP التي ستعطي دائمًا نفس المخرجات.على سبيل المثال:

<foo:bar>baz</foo:bar>

سوف يخرج دائما:

<div class="bar">baz</div>

هل هناك أي طريقة لجعل علامة JSP تتصرف تمامًا مثل الإخراج الثابت في servlet الذي تم إنشاؤه؟

على سبيل المثال:

out.write("<div class=\"bar\">");
...
out.write("</div>");

بدلاً من

x.y.z.foo.BarTag _jspx_th_foo_bar_0 = new x.y.z.foo.BarTag();
_jspx_th_foo_bar_0.setPageContext(pageContext);
_jspx_th_foo_bar_0.setParent(null);
_jspxTagObjects.push(_jspx_th_foo_bar_0);
int _jspx_eval_foo_bar_0 = _jspx_th_foo_bar_0.doStartTag();
etc...
etc...
etc...

خلفية

أنا قلق بشأن الأداء.لم أختبر هذا بعد، ولكن يبدو أن servlet الذي تم إنشاؤه يفعل الكثير لشيء بسيط جدًا، والأداء مهم جدًا.

ولكن إذا كان servlet يتصرف كما لو أن المخرجات قد تمت كتابتها مباشرة في JSP، فإن تكلفة الإنتاج ستكون صفرًا.

أرى بعض المزايا من خلال القيام بذلك.يمكنني تغيير HTML الثابت أو حتى التغيير إلى شيء أكثر ديناميكية، دون تحرير كل مدخل.في الإعداد الخاص بنا، من السهل تغيير علامة، ولكن تغيير كل JSP يستخدم عنصرًا معينًا يستغرق وقتًا طويلاً.

وهذا يعني أيضًا أنه يمكنني إجبار المطورين على عدم كتابة شيء من هذا القبيل

<div class="bar" style="whatever">...</div>

هناك المزيد من المزايا، ولكن إذا كان الأمر يكلف الأداء على خوادم الإنتاج، فمن المحتمل ألا يستحق ذلك.

هل كانت مفيدة؟

المحلول 2

لقد قمت بإجراء اختبار الأداء.هناك اختلاف بسيط في الأداء، لذلك لا توجد مشكلة.

كيف قمت بإجراء الاختبار

لقد قمت بإنشاء 500 علامة فردية (برمجيًا) في إحدى مكتبات العلامات لدينا.(لذلك فهو ملفوف في جرة وما إلى ذلك) يبدو كل هذا ، مع الرقم باعتباره الفرق الوحيد:

package XX.XX.XX.XX

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class Test0001Tag extends TagSupport {

    public Test0001Tag() {
    }

    public int doStartTag() throws JspException {

        try {
            pageContext.getOut().print("<div class=\"Test0001\">");
        } catch (IOException e) {
            throw new JspException(e);
        }
        return EVAL_BODY_INCLUDE;
    }

    public int doEndTag() throws JspException {
        try {
            pageContext.getOut().print("</div>");
        } catch (IOException e) {
            throw new JspException(e);
        }
        return EVAL_PAGE;
    }

    public void release() {
        super.release();
    }
}

ثم 500 إدخال في TLD مثل هذا:

<tag>
   <name>test0001</name>
   <tagclass>XX.XX.XX.XX.Test0001Tag</tagclass>
   <bodycontent>JSP</bodycontent> 
</tag>

ثم حصلت على ملف JSP يحتوي على رمز صغير فيه، وقمت بعمل نسختين:واحد به HTML ثابت والآخر به علامات.

الذي يحتوي على HTML ثابت:

<!-- 
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<div class="Test0001">X</div>
<div class="Test0002">X</div>
<div class="Test0003">X</div>
...
<div class="Test0498">X</div>
<div class="Test0499">X</div>
<div class="Test0500">X</div>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
 -->

الذي يحمل العلامات:

<!-- 
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<bddesign:test0001>X</bddesign:test0001>
<bddesign:test0002>X</bddesign:test0002>
<bddesign:test0003>X</bddesign:test0003>
...
<bddesign:test0498>X</bddesign:test0498>
<bddesign:test0499>X</bddesign:test0499>
<bddesign:test0500>X</bddesign:test0500>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
 -->

تم تقديم الحلقة لأن كلاهما خرج بصفر مللي ثانية.(لسوء الحظ ، أقوم بتشغيل Windows في العمل ، لذلك لا أحصل على الكثير من الدقة هنا.) حقيقة أن 500 علامة لم تجعل تأخيرًا قادرًا على التدبير يمكن الإجابة بما فيه الكفاية ، لكنني أردت المزيد ، حتى لو كان التكرار يسمح بذلك بعض التحسين.

نتيجة 500000 علامة:

  • علامات JSP:15-19 ثانية
  • علامات HTML:12-16 ثانية

إذن هناك فرق، لكنني أعتقد أنه غير مهم مقارنة بكل شيء آخر يحدث بدءًا من نقرات المستخدم وحتى ظهور الإجابة على الشاشة.

أفكار أخرى

بقدر ما أعرف فإن التفاصيل في Windows تبلغ حوالي 15-16 مللي ثانية.لذا فإن "0 مللي ثانية" تعني في الواقع "<16 مللي ثانية".تأخير أقل من 16/500 مللي ثانية.العلامة مقبولة تماما.

لقد حاولت باستخدام 1000 علامة، لكن مترجم JSP لم يكن سعيدًا جدًا بذلك.لقد قمت بتقليص عدد العلامات إلى 500 علامة لأن البديل كان تغيير الإعداد الذي من شأنه أن يبطل نتائجي.

لقد جعلت HTML الذي تم إنشاؤه عبارة عن تعليق HTML، لأن المتصفح موجود على نفس الجهاز الفعلي مثل خادم الاختبار، وكنت أخشى أن يستغرق المتصفح الكثير من وقت عرض وحدة المعالجة المركزية، حتى مع وحدة المعالجة المركزية ثنائية النواة.كان الحل السهل هو التعليق على HTML.

نصائح أخرى

وأنا واثق تماما وضرب يكون الأداء negligeble النظر الرمز الذي أظهر فقط.

كنت أتساءل...لماذا لا تستخدم مجرد قديم عادي يشمل?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top