استدعاء إجراء الفول المُدار بواسطة JSF عند تحميل الصفحة

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

سؤال

هل هناك طريقة لتنفيذ إجراء الفول المُدار بواسطة JSF عند تحميل الصفحة؟

إذا كان ذلك مناسبًا، فأنا أستخدم حاليًا JSF 1.2.

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

المحلول

جى اس اف 1.0 / 1.1

ما عليك سوى وضع المنطق المطلوب في مُنشئ وحدة الطلب ذات النطاق المرتبط بصفحة JSF.

public Bean() {
    // Do your stuff here.
}

جي إس إف 1.2 / 2.x

يستخدم @PostConstruct طريقة مشروحة على طلب أو عرض الفول النطاق.سيتم تنفيذه بعد البناء و تهيئة/إعداد كافة الخصائص المدارة والتبعيات المحقونة.

@PostConstruct
public void init() {
    // Do your stuff here.
}

يوصى بهذا بشدة بدلاً من المُنشئ في حالة كنت تستخدم إطار عمل إدارة الفول الذي يستخدم الوكلاء، مثل CDI، لأنه قد لا يتم استدعاء المُنشئ في الأوقات التي تتوقعها.

جى اس اف 2.0 / 2.1

بدلا من ذلك، استخدم <f:event type="preRenderView"> في حال كنت تنوي التهيئة بناءً على <f:viewParam> أيضًا، أو عندما يتم وضع الحبة في نطاق أوسع من نطاق العرض (والذي بدوره يشير إلى مشكلة في التصميم، ولكن هذا جانبًا).وإلا أ @PostConstruct جيد تمامًا أيضًا.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

جي إس إف 2.2+

بدلا من ذلك، استخدم <f:viewAction> في حال كنت تنوي التهيئة بناءً على <f:viewParam> أيضًا، أو عندما يتم وضع الحبة في نطاق أوسع من نطاق العرض (والذي بدوره يشير إلى مشكلة في التصميم، ولكن هذا جانبًا).وإلا أ @PostConstruct جيد تمامًا أيضًا.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

لاحظ أن هذا يمكن أن يعود أ String حالة الملاحة إذا لزم الأمر.سيتم تفسيره على أنه إعادة توجيه (لذلك لا تحتاج إلى ملف ?faces-redirect=true هنا).

public String onload() { 
    // Do your stuff here.
    // ...
    return "some.xhtml";
}

أنظر أيضا:

نصائح أخرى

هناك طريقة أخرى سهلة وهي استخدام طريقة إطلاق النار قبل عرض العرض.هذا أفضل من postConstruct لأنه بالنسبة لـ sessionScope، سيتم تشغيل postConstruct مرة واحدة فقط في كل جلسة.سيتم تفعيل هذا في كل مرة يتم فيها تحميل الصفحة.هذا بالطبع مخصص فقط لـ JSF 2.0 وليس لـ JSF 1.2.

هذه هي الطريقة للقيام بذلك -

<html xmlns:f="http://java.sun.com/jsf/core">
      <f:metadata>
          <f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
      </f:metadata>
</html>

وفي myController.java

 public void onPageLoad(){
    // Do something
 }

تحرير - على الرغم من أن هذا ليس حلاً للسؤال الموجود في هذه الصفحة، إلا أنني أضيف هذا فقط للأشخاص الذين يستخدمون إصدارات أعلى من JSF.

يحتوي JSF 2.2 على ميزة جديدة تنفذ هذه المهمة باستخدام viewAction.

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>

ويتم تشغيلPostConstruct مرة واحدة في البداية عندما فول مكون. الحل هو إنشاء خاصية غير المستخدمة وهل العمل الخاص بك في طريقة حاصل لهذه المنشأة وإضافة هذه الخاصية إلى ملف .xhtml الخاصة بك مثل هذا:

<h:inputHidden  value="#{loginBean.loginStatus}"/>

ووفي التعليمات البرمجية الفول بك:

public void setLoginStatus(String loginStatus) {
    this.loginStatus = loginStatus;
}

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}

واصفا عمل الفول من سمة سوف تكون فكرة جيدة، والحفاظ على تشغيل آلي = "صحيح" المثال التالي

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top