JSF / FICELETS: تعيين سمة "الإجراء" إلى سلسلة تقييم ديناميكيا

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

سؤال

في تطبيق JSF / FICELETS الخاص بي، أريد إنشاء درب فتات الخبز ديناميكيا من قائمة معرفات الصفحة باستخدام علامة مخصصة:

<foo:breadcrumbs trail="foo,bar,baz"/>

هذا يجب أن يولد شيئا مثل:

<h:commandLink action="foo" ... />
<h:commandLink action="bar" ... />
<!-- (etc.) -->

يبدو رمزي شيء مثل هذا:

<ui:repeat value="#{fn:split(trail, ',')}" var="key">
    <h:commandLink action="#{key}" ... /> 
</ui:repeat>

المشكلة مع هذا الرمز هو ذلك #{key} يتم تفسيره كطريقة ملزمة. ومع ذلك، أريد فقط قيمة سلسلة #{key} ليتم إرجاع نتيجة الملاحة. كيف يمكنني تحقيق ذلك؟


الشيء الوحيد الذي يمكن أن أفكر فيه هو خلق دمية تمكنت الفول الذي لديه outcome الحقل ومعالج العمل، واستدعاءها مثل ذلك:

<h:commandLink action="#{dummy.click}" ...>
    <f:setPropertyActionListener target="#{dummy.outcome}" value="#{key}" />
</h:commandLink>

مع الطبقة وهمية المعرفة مثل ذلك:

public class Dummy {

    private String outcome;

    public String click() {
        return outcome;
    }

    public void setOutcome(String outcome) {
        this.outcome = outcome;
    }

    public void getOutcome() {
        return outcome;
    }
}

يبدو أن هذا قبيح، وأنا لا أعرف ما إذا كان الأمر سيعمل.

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

المحلول

منذ طرح هذا السؤال، اكتشفت حلا واضحا بسيطا للغاية.

يجب أن تقبل الطريقة التي يعد هدف عمل JSF أي حجج وإرجاع سلسلة. اتضح أن فئة السلسلة لديها بالفعل طريقة تتوافق هذا التوقيع - toString()!

لذلك، لقد غيرت حلقة UI إلى ما يلي:

<ui:repeat value="#{fn:split(trail, ',')}" var="key">
    <h:commandLink action="#{key.toString}" ... /> 
</ui:repeat>

هذا يسمح للتقييم ديناميكيا key أن تكون نتيجة عمل JSF، ولا تتطلب أي فئات إضافية أو قرصنة قبيحة.

نصائح أخرى

بضعة طرق في الربيع إلى الذهن.

الخيار 1

عصا مع الأوامر وقراءة var مباشرة من خريطة الطلب في ملزمة الإجراء:

public String click() {
  FacesContext context = FacesContext.getCurrentInstance();
  ExternalContext extContext = context.getExternalContext();
  Map<String, Object> reqMap = extContext.getRequestMap();
  return (String) reqMap.get("uirepeatVar");
}

(حيث يكون المكرر لديه السمة var="uirepeatVar".)


الخيار 2

التبديل إلى الإخراج وبناء الحصول على روابط على الخادم:

public List<String> getViewUrls() {
  List<String> views = Arrays.asList("/index.xhtml", "/idtable.xhtml");

  List<String> urls = new ArrayList<String>();
  FacesContext context = FacesContext.getCurrentInstance();
  Application application = context.getApplication();
  ViewHandler viewHandler = application.getViewHandler();
  for (String view : views) {
    String url = viewHandler.getActionURL(context, view);
    urls.add(url);
  }
  return urls;
}

رأي:

<ui:repeat value="#{breadcrumbBean.viewUrls}" var="url">
  <h:outputLink value="#{url}">#{url}</h:outputLink> <br />
</ui:repeat>

لماذا لا تنشئ مكون مخصص ينشئ كائنات H: CommandLink برمجيا؟ ربما سيكون الحل "الأنظف".

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