চ মতে এনাম মানগুলি কীভাবে ব্যবহার করবেন: সিলেক্ট আইটেম


103

আমি একটি নির্বাচনীমেনু ড্রপডাউন করতে চাই যাতে আমি আমার প্রশ্নের উপর একটি স্থিতি নির্বাচন করতে পারি। যদি এনামগুলির ক্রম পরিবর্তন হয় এবং তালিকাটি বৃহত্তর হয় তবে কী ঘটেছিল তা বিবেচনা করে চ: সিলেক্ট আইটেমটি আরও নমনীয় করে তোলা সম্ভব? এবং আমি এই আরও ভাল করতে পারে? এবং প্রশ্নটি থাকা আইটেমটি কী স্বয়ংক্রিয়ভাবে "নির্বাচন" করা সম্ভব?

এনাম ক্লাস

public enum Status {
    SUBMITTED,
    REJECTED,
    APPROVED
}

প্রশ্ন সত্তা

@Enumerated(EnumType.STRING)
private Status status;

JSF

<div class="field">
    <h:outputLabel for="questionStatus" value="Status" />
    <h:selectOneMenu id="questionStatus" value="#{bean.question.status}" >
        <f:selectItem itemLabel="Submitted" itemValue="0" />
        <f:selectItem itemLabel="Rejected" itemValue="1" />
        <f:selectItem itemLabel="Approved" itemValue="2" />
    </h:selectOneMenu>
    <hr />
</div>

উত্তর:


210

জেএসএফের একটি বিল্টিন রূপান্তরকারী রয়েছে enum, সুতরাং এটি করা উচিত:

@ManagedBean
@ApplicationScoped
public class Data {

    public Status[] getStatuses() {
        return Status.values();
    }

}

সঙ্গে

<h:selectOneMenu value="#{bean.question.status}" >
    <f:selectItems value="#{data.statuses}" />
</h:selectOneMenu>

(দ্রষ্টব্য: যেহেতু JSF 2.0 সেখানে কোন প্রয়োজন একটি প্রদান আর ছোট SelectItem[]বা List<SelectItem>, একটি T[]এবং List<T>পাশাপাশি গৃহীত হয় এবং আপনি বর্তমান আইটেমটি অ্যাক্সেস করতে পারেন varঅনুষঙ্গ)

যদি আপনি জেএসএফ ইউটিলিটি লাইব্রেরি ওমনিফিস ব্যবহার করেন তবে আপনি বিনের<o:importConstants> পরিবর্তে ব্যবহার করতে পারেন ।

<o:importConstants type="com.example.Status" />

<h:selectOneMenu value="#{bean.question.status}" >
    <f:selectItems value="#{Status}" />
</h:selectOneMenu>

আপনি যদি লেবেলগুলিকেও নিয়ন্ত্রণ করতে চান তবে আপনি এগুলি Statusএনামে যুক্ত করতে পারেন :

public enum Status {

    SUBMITTED("Submitted"),
    REJECTED("Rejected"),
    APPROVED("Approved");

    private String label;

    private Status(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

}

সঙ্গে

<f:selectItems value="#{data.statuses}" var="status"
    itemValue="#{status}" itemLabel="#{status.label}" />

অথবা, আরও ভাল, এনামকে স্থানীয়করণের সংস্থান বান্ডেলের একটি সম্পত্তি কী (EL 3.0 প্রয়োজনীয়) করুন:

<f:selectItems value="#{data.statuses}" var="status"
    itemValue="#{status}" itemLabel="#{text['data.status.' += status]}" />

রিসোর্স বান্ডেলের সাথে সম্পর্কিত একটি প্রোপার্টি ফাইলে এটির সাথে #{text}

data.status.SUBMITTED = Submitted
data.status.REJECTED = Rejected
data.status.APPROVED = Approved

বালুসসি, একটি বিষয় কি কোনও প্রশ্নের ডিফল্ট হিসাবে স্থিতিটি "নির্বাচন" করা / দেখার পক্ষে সম্ভব (উদাহরণস্বরূপ আপনি যখন কোনও প্রশ্ন সম্পাদনা করছেন তখন আপনি ইতিমধ্যে কোনও কিছুর সাথে প্রশ্নের স্থিতি সেট করে
রেখেছেন

উপরের উদাহরণে, জেএসএফ #{bean.question.status}একটি বৈধ এনাম মান থাকায় এটি ডিফল্টরূপে এটি করবে । আপনার questionযথাযথ স্থিতির সম্পত্তি পূর্বনির্ধারিত রয়েছে তা নিশ্চিত করার জন্য আপনার কিছু করার প্রয়োজন হবে না ।
বালুসসি

@ বালুসসি জেএসএফ থেকে অর্ডিনাল মান কীভাবে অ্যাক্সেস করবেন?
জ্যাকট্রেড

2
যদি, আমার মতো আপনিও এর জন্য একটি সংখ্যা ফর্ম্যাট ব্যতিক্রম পান += statusতবে .concat(status)@ জিলিটকার পরামর্শ অনুসারে ব্যবহার করার চেষ্টা করুন ।
হুইসলিং_মারমোট

আপনি যদি java.util.List পছন্দ করেন তবে আপনি কেবল <স্ট্যাটাস> তালিকায় getStatuses () রিটার্ন টাইপ পরিবর্তন করতে পারেন এবং Arrays.asList (স্থিতি.মূল্য ()) এ ফিরে যেতে পারেন;
stakahop

16

স্থানীয়করণের জন্য আমরা এই সমাধানটিও ব্যবহার করতে পারি:

public enum Status { SUBMITTED, REJECTED, APPROVED }

data.status.SUBMITTED=Submitted
data.status.REJECTED=Rejected
data.status.APPROVED=Approved

<h:selectOneMenu value="#{bean.question.status}" >
    <f:selectItems
        value="#{data.statuses}"
        var="status"
        itemValue="#{status}"
        itemLabel="#{text['data.status.'.concat(status)]}" />
</h:selectOneMenu>

সুতরাং এনুমে স্থানীয়করণের স্ট্রিংগুলির সংস্থানের জন্য হার্ডকোড নেই।


1
মনে রাখবেন যে এই বাক্য গঠনটি কেবল EL 2.2 থেকে সমর্থিত যা "তুলনামূলকভাবে" নতুন। অন্যথায় আপনি সর্বদা কাস্টম ইএল ফাংশনটি দখল <c:set>বা <ui:param>হোমব্রু করতে পারেন ।
বালুসসি

ধন্যবাদ বালুসকে। বিন ব্যাকিং বিন (উদাহরণস্বরূপ মান = "# {org.myproject.Status.values}") ব্যবহার করে এনাম ক্লাসের সাথে কোনওভাবে # {ডেটা.স্ট্যাটগুলি uses প্রতিস্থাপন করা সম্ভব?
জিলিটকা

@ বালুসসি আপনি কি নিশ্চিত? আমি জিএফ 3.1.2 (মোজারার জেএসএফ 2.1.6) ব্যবহার করছি।
জিলিটকা

4

আপনি এনামগুলিকে মোড়ানো দৃষ্টান্তগুলির <f:selectItems value="#{carBean.carList}" />একটি তালিকা ব্যবহার করতে এবং ফিরে পেতে SelectItemপারেন ( Status.values()সমস্ত সম্ভাব্য মান পেতে ব্যবহার করুন )।


2

এনাম মানগুলি পেতে আপনি নিম্নলিখিত ইউটিলিটি এল ফাংশনটি ব্যবহার করতে পারেন এবং SelectOneMenuউদাহরণস্বরূপ এগুলি ব্যবহার করতে পারেন । মটরশুটি এবং বয়লারপ্লেট পদ্ধতি তৈরি করার দরকার নেই।

public final class ElEnumUtils
{
    private ElEnumUtils() { }

    /**
     * Cached Enumerations, key equals full class name of an enum
     */
    private final static Map<String, Enum<?>[]> ENTITY_ENUMS = new HashMap<>();;

    /**
     * Retrieves all Enumerations of the given Enumeration defined by the
     * given class name.
     *
     * @param enumClassName Class name of the given Enum.
     *
     * @return
     *
     * @throws ClassNotFoundException
     */
    @SuppressWarnings("unchecked")
    public static Enum<?>[] getEnumValues(final String enumClassName) throws ClassNotFoundException
    {
        // check if already cached - use classname as key for performance reason
        if (ElEnumUtils.ENTITY_ENUMS.containsKey(enumClassName))
            return ElEnumUtils.ENTITY_ENUMS.get(enumClassName);

        final Class<Enum<?>> enumClass = (Class<Enum<?>>) Class.forName(enumClassName);

        final Enum<?>[] enumConstants = enumClass.getEnumConstants();

        // add to cache
        ElEnumUtils.ENTITY_ENUMS.put(enumClassName, enumConstants);

        return enumConstants;
    }
}

এটি একটি ট্যাগলিব ফাইলে এল ফাংশন হিসাবে নিবন্ধন করুন:

<function>
    <description>Retrieves all Enumerations of the given Enumeration defined by the given class name.</description>
    <function-name>getEnumValues</function-name>
    <function-class>
        package.ElEnumUtils
    </function-class>
    <function-signature>
        java.lang.Enum[] getEnumValues(java.lang.String)
    </function-signature>
</function>

এবং অবশেষে এটিকে কল করুন:

<p:selectOneMenu value="#{bean.type}">
    <f:selectItems value="#{el:getEnumValues('package.BeanType')}" var="varEnum" 
        itemLabel="#{el:getEnumLabel(varEnum)}" itemValue="#{varEnum}"/>
</p:selectOneMenu>

বালুসসি উত্তরের সাথে পরিচিত আপনি স্থানীয় উত্সযুক্ত এনাম লেবেলগুলির সাথে একটি সংস্থান বান্ডেল ব্যবহার করা উচিত এবং ক্লিনার কোডের জন্য আপনি এই জাতীয় ক্রিয়াও তৈরি করতে পারেন getEnumLabel(enum)


একটি "ফাংশন" (পদ্ধতি বেশি), যখন আপনি ব্যবহার করতে পারেন জন্য কোন প্রয়োজন নেই #{myBundle[enumName.i18nKey]}এবং তারপর বৈশিষ্ট্যাবলী হিসাবে আপনার শুমার মধ্যে i18n কী করা: BLA_TYPE("SOME_BLA_TYPE_KEY")দ্বারা BLA_TYPEenum ব্যবহার করা হয় এবং SOME_BLA_TYPE_KEYi18n চাবিকাঠি।
রোল্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.