كيفية إنشاء طلب GET مع المعلمات باستخدام JSF وقواعد التنقل؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لإنشاء رابط html باستخدام h:outputLink أو علامة JSF أخرى أو رمز لإنشاء طلب غير وجوه (HTTP GET) مع معلمات الطلب؟

على سبيل المثال لدي قاعدة التنقل التالية

<navigation-rule>
    <navigation-case>
        <from-outcome>showMessage</from-outcome>
        <to-view-id>/showMessage.jsf</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

في صفحتي أرغب في إخراج كود html التالي:

<a href="/showMessage.jsf?msg=23">click to see the message</a>

يمكنني فقط كتابة كود html في الصفحة، ولكنني أريد استخدام قاعدة التنقل من أجل تحديد جميع عناوين url في ملف واحد قابل للتكوين.

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

المحلول

هذه فكرة تثير الاهتمام.سأكون فضوليًا لمعرفة كيف يتم ذلك عمليًا.

الحصول على قواعد الملاحة

يتم التعامل مع الملاحة بواسطة NavigationHandler.ليس من الصعب الحصول على NavigationHandler، لكن واجهة برمجة التطبيقات (API) لا تكشف عن القواعد التي تستخدمها.

كما أرى، يمكنك:

  1. تحليل faces-config.xml عند التهيئة وتخزين القواعد في سياق التطبيق (سهل)
  2. قم بتنفيذ NavigationHandler الخاص بك والذي يتجاهل القواعد الموجودة في faces-config.xml أو يكملها بملف القواعد الخاص بك ويكشف مجموعة القواعد الخاصة به بطريقة ما (قابلة للتطبيق، ولكنها تتطلب القليل من العمل)
  3. يسخر بنفسك FacesContext وتمريره إلى معالج التنقل الموجود (من الصعب حقًا جعل كائنين FacesContext يتعايشان في نفس مؤشر الترابط وغير فعالين للغاية)

الآن، لديك مشكلة أخرى أيضا.أين ستحتفظ بالخرائط للبحث عن وجهات النظر؟رمز الثابت لهم في الفول؟

استخدام قواعد الملاحة

يمكنني التفكير في طريقتين يمكنك من خلالهما إنشاء عناوين URL تحتوي على معلمات من الواجهة الخلفية.كلاهما يتضمن تحديد حبة من نوع ما.

<managed-bean>
    <managed-bean-name>navBean</managed-bean-name>
    <managed-bean-class>foo.NavBean</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

مصدر:

package foo;

import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

public class NavBean implements Serializable {

    private String getView() {
        String viewId = "/showMessage.faces"; // or look this up somewhere
        return viewId;
    }

    /**
     * Regular link to page
     */
    public String getUrlLink() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        String navUrl = context.getExternalContext().encodeActionURL(
                extContext.getRequestContextPath() + viewId);
        return navUrl;
    }

    /**
     * Just some value
     */
    public String getValue() {
        return "" + System.currentTimeMillis();
    }

    /**
     * Invoked by action
     */
    public String invokeRedirect() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        try {
            String charEncoding = extContext.getRequestCharacterEncoding();
            String name = URLEncoder.encode("foo", charEncoding);
            String value = URLEncoder.encode(getValue(), charEncoding);
            viewId = extContext.getRequestContextPath() + viewId + '?' + name
                    + "=" + value;
            String urlLink = context.getExternalContext().encodeActionURL(
                    viewId);
            extContext.redirect(urlLink);
        } catch (IOException e) {
            extContext.log(getClass().getName() + ".invokeRedirect", e);
        }
        return null;
    }

}

يحصل

بالنسبة لطلب GET، يمكنك استخدام UIParameters لتعيين القيم والسماح للعارض ببناء قائمة المعلمات.

<h:outputLink value="#{navBean.urlLink}">
    <f:param name="foo" value="#{navBean.value}" />
    <h:outputText value="get" />
</h:outputLink>

بريد

إذا كنت تريد تعيين عنوان URL إلى طريقة عرض أثناء إجراء POST، فيمكنك القيام بذلك باستخدام إعادة توجيه في إجراء (يتم استدعاؤه بواسطة زر أو رابط أمر).

<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
    <h:outputText value="post" />
</h:commandLink>

ملحوظات

لاحظ أن ExternalContext.encodeActionURL يستخدم لترميز السلسلة.تعد هذه ممارسة جيدة لإنتاج تعليمات برمجية قابلة للنقل عبر السياقات (المداخل، وما إلى ذلك).سوف تستخدم encodeResourceURL إذا كنت تقوم بترميز رابط لصورة أو ملف تنزيل.

نصائح أخرى

حاولت استخدام PrettyFaces؟إنه امتداد JSF مفتوح المصدر مصمم خصيصًا لجعل صفحات JSF القابلة للإشارة المرجعية / JSF مع طلبات GET ممكنة.

PrettyFaces - تحسين محركات البحث (SEO) والمعلمات الديناميكية والإشارات المرجعية والتنقل لـ JSF / JSF2

هل فكرت في النموذج؟

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>

يمكنك استخدام CommandLink مع علامات المعلمات المتداخلة.هذا هو في الأساس نفس ما قاله hubbardr أعلاه:

<h:form>
  <h:commandLink value="click here" action="${handler.outcome}">
    <f:param name="msgId" value="${bean.id}" />
  </h:commandLink>
</h:form>

ثم في حبة الدعم الخاصة بك عليك القيام بما يلي:

Map requestMap = FacesContext.getCurrentInstance()
                 .getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");

ثم افعل كل ما عليك القيام به.

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