سؤال

في JSP يمكنني الرجوع الملكية حبة باستخدام العلامة $ {object.property}

هل هناك طريقة للتعامل مع الخصائص التي قد لا توجد؟ لدي صفحة JSP التي تحتاج إلى التعامل مع أنواع مختلفة. مثال:

public class Person {
    public String getName()
}
public class Employee extends Person {
    public float getSalary()
}

في JSP أريد أن عرض جدول للأشخاص الذين يعانون من الأعمدة الاسم والراتب. إذا كان الشخص غير موظف الراتب ثم يجب أن تكون فارغة. وHTML صف واحد قد تبدو مثل:

<tr>
    <td><c:out value="${person.name}"></td>
    <td><c:out value="${person.salary}"></td>
</tr>

ومما يؤسف له إذا لم يكن الشخص الموظف ثم فإنه لا يمكن العثور على الرواتب ويحدث خطأ. كيف لي أن حل هذا في JSP؟

وتحرير: هل هناك على instanceof حدد في JSP العلامة لغة

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

المحلول

ومجرد استخدام المشغل فارغة EL IF كان سمة بنطاق، للأسف سيكون لديك للذهاب مع توضيح التعبير باستخدام employee.salary مع <ج: الصيد>:

<c:catch var="err">
    <c:out value="${employee.salary}"/>
</c:catch>

إذا كنت حقا بحاجة <م> instanceof ، قد تفكر في علامة مخصصة.

نصائح أخرى

إذا كنت تريد الطبقة، ومجرد استخدام ${person.class}. يمكنك أيضا استخدام ${person.class.name eq 'my.package.PersonClass'}

ويمكنك أيضا استخدام "الافتراضي" على ج: خروج

 <c:out value='${person.salary}' default="Null Value" />

وموجزة، ولكن دون رادع.

<tr>
    <td>${person.name}</td>    
    <td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>
<اقتباس فقرة>   

هل هناك الاختيار instanceof في JSP العلامة اللغة؟

وليس في لحظة كتابة هذه السطور. قرأت في مكان ما أن لديهم محفوظة ذلك، <م> instanceof الكلمة، في EL، قد يكون في المستقبل. وعلاوة على ذلك، هناك مكتبة المتاحة التي لديها هذه العلامة المحددة. ننظر في ذلك قبل اتخاذ قرار لإنشاء بعض العلامة المخصصة لنفسك. هنا هو الرابط، Unstandard مكتبة العلامة .

وأسلوب واحد سيكون لإنشاء مكتبة العلامة المخصصة واستخدام التعدد داخله للتعامل مع الحالة التي يكون فيها Person <م> هو واحد Employee.

وأنا لم تفعل هذا في حين لJSP، ولكن كثيرا ما تستخدم تقنية مماثلة في GSP (رائع / الكؤوس المقدسة صفحات الملقم).

وعلى خلاف ذلك، كنت قد وضعت بعض المنطق في JSP (ليست مثالية) لاختبار Employee نيس:

<% 
   String salary
   if (person instanceof Employee) {
       salary = person.salary
   } else {
       salary = "" // or '&nbsp;'
   }
%>
<td><c:out value="${salary}"></td>

هل يمكن أن يكون دائما حقل نوع.

public class Person {
    public String getType() { return "Person"; }
    public String getName()
}
public class Employee extends Person {
    public String getType() { return "Employee"; }
    public float getSalary()
}

وJSP لديك ستبدو

<tr>
    <td><c:out value="${person.name}"></td>
    <td><c:if test="'Employee' eq person.type"><c:out value="${person.salary}"></c:if></td>
</tr>

وبالطبع الطبقة الدرجة بالفعل هذا ...

<tr>
    <td><c:out value="${person.name}"></td>
    <td><c:if test="'Employee' eq person.class.simpleName"><c:out value="${person.salary}"></c:if></td>
</tr>

هل يمكن أن يكون أيضا ` 'طريقة isEmployee ().

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