JSP.13.8 مثال على أن سيناريو معالج العلامات البسيط لا يعمل؟

StackOverflow https://stackoverflow.com/questions/624607

  •  05-07-2019
  •  | 
  •  

سؤال

تم إجراء هذا الاختبار من خلال القراءة سؤال في منتديات صن جافا واعتقدت أنني سأحاول ذلك.يحتوي قسم مواصفات JSP2.0 JSP.13.8 على "مثال لسيناريو معالج العلامات البسيط".قمت بنسخ أجزاء التعليمات البرمجية ولصقها وحاولت تشغيلها.

بيئة:1.5

الكود الذي أختبره:صفحة جي اس بي:

<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:simpletag x="10">
<jsp:attribute name="y">20</jsp:attribute>
<jsp:attribute name="nonfragment">
Nonfragment Template Text
</jsp:attribute>
<jsp:attribute name="frag">
Fragment Template Text ${var1}
</jsp:attribute>
<jsp:body>
Body of tag that defines an AT_BEGIN
scripting variable ${var1}.
</jsp:body>
</my:simpletag>

وملف العلامة:

<%-- /WEB-INF/tags/simpleTag.tag --%>
<%@ attribute name="x" %>
<%@ attribute name="y" %>
<%@ attribute name="nonfragment" %>
<%@ attribute name="frag" fragment="true" %>
<%@ variable name-given="var1" scope="AT_BEGIN" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Some template text.
<c:set var="var1" value="${x+y}"/>
<jsp:invoke fragment="frag" varReader="var1"/>
Invoke the body:
<jsp:doBody/>

يتم نسخ هذا الرمز مباشرة من نسخة PDF لمواصفات JSP2.0.
وهو متوفر أيضًا كجزء من JSP-API هناتم إجراء تغيير طفيف - لقد قمت بتغيير اسم ملف العلامة من simpletag.tag إلى simpleTag.tag لمطابقة استدعاءه في JSP.
لقد حاولت أيضًا النسخ من ملف PDF الخاص بالمواصفات (ضبط علامات الاقتباس حسب الضرورة) - نفس النتيجة.

java.lang.ClassCastException:

تبين أن Line62 من JSP الذي تم إنشاؤه هو:var1 = (java.lang.String) _jspx_page_context.findAttribute("var1");

حسنًا، أستطيع أن أفهم ClassCastException - فهو يعتقد أن var1 يجب أن يكون سلسلة، والسمة الفعلية هي StringReader.ولكن لماذا هو StringReader؟أين تم إنشاء المتغير؟ولماذا يحاول القيام بهذه المهمة أصلاً؟

لو سمحتم هل من الممكن ان يرشدني احدكم الى الاتجاه الصحيح؟ما هو الخطأ في الكود/الإعداد؟هل هذه مشكلة معروفة؟لقد بحثت في Google عن ذلك ولكن لم أتمكن من العثور على أي شيء على ما يبدو.

شكرا ، evnafets


التحرير مع القرار:حدث ClassCastException بسبب السطر الموجود في العلامة:

<jsp:invoke fragment="frag" varReader="var1"/>

كما ذكر هنا تحدد سمة varReader السمة لتخزين نتيجة التقييم كقارئ StringReader.حدث الاستثناء بسبب محاولة التعليمات البرمجية التي أنشأها Tomcat استرداد قيمة "var1" وإحالتها إلى سلسلة.نظرًا لأن السلسلة ليست StringReader، فقد أثارت استثناءً في تلك المرحلة.

لست متأكدًا مما إذا كان خطأ الترميز هو أنه كان ينبغي عليهم استخدام السمة "var" بدلاً من السمة "varReader"، أو أنه لا ينبغي عليهم استخدام أي منهما وقاموا بتقييمها كما هي.تؤدي إزالة هذه السمة إلى طباعة الجزء بالكامل، ثم النص الأساسي بقيمة "var1":

نص قالب جزء 30.استدعاء الجسم:نص العلامة الذي يحدد متغير البرمجة النصية AT_BEGIN 30

يؤدي إنشاء السمة var="var1" إلى تنفيذ الجزء وتخزين النتيجة في var1.يتم بعد ذلك تقييم الجسم بهذه القيمة الجديدة لـ var1 مما يؤدي إلى:

استدعاء الجسم:نص العلامة الذي يحدد متغير البرمجة النصية AT_BEGIN Fragment Template Text 30

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

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

المحلول

من مرجع بناء الجملة يمكنك أن ترى أن إما var أو varReader هو

اسم السمة المحددة النطاق لتخزين نتيجة استدعاء الجزء فيها

لذلك أخشى أن نموذج التعليمات البرمجية يحتوي على خطأ.إذا كنت بحاجة إلى كتابة نتيجة jsp:invocation مباشرةً إلى الصفحة، فلن تحتاج إلى تعيينها إلى var.

هل يمكنك محاولة استبعاد السمة "varReader"؟

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