EL এ ধ্রুবকগুলি কীভাবে রেফারেন্স করবেন?


106

আপনি কীভাবে কোনও জেএসপি পৃষ্ঠায় ইএল সহ একটি ধ্রুবককে উল্লেখ করতে পারেন?

Addressesএকটি ধ্রুবক নামের সাথে আমার একটি ইন্টারফেস রয়েছে URL। আমি জানি যে আমি এটিকে স্ক্রিপ্টলেট দিয়ে রেফারেন্স করতে পারি: <%=Addresses.URL%>তবে আমি কীভাবে এটি ব্যবহার করে করব?

উত্তর:


155

EL 3.0 বা আরও নতুন

আপনি যদি ইতিমধ্যে জাভা EE 7 / EL 3.0 এ থাকেন তবে @page importEL স্কোপে ক্লাস ধ্রুবকগুলিও আমদানি করবে।

<%@ page import="com.example.YourConstants" %>

এটি কভারগুলির অধীনে আমদানি করা হবে ImportHandler#importClass()এবং হিসাবে উপলব্ধ হবে ${YourConstants.FOO}

নোট করুন যে সমস্ত java.lang.*শ্রেণীর ইতিমধ্যে পরোক্ষভাবে আমদানিকৃত এবং তাই মত পাওয়া যায় ${Boolean.TRUE}এবং ${Integer.MAX_VALUE}। এটির জন্য কেবলমাত্র সাম্প্রতিক সংস্করণগুলির মধ্যে বাগ রয়েছে বলে জাভা EE 7 কনটেইনার সার্ভারের প্রয়োজন। যেমন গ্লাস ফিশ 4.0 এবং টমক্যাট 8.0.0-1x ব্যর্থ হয় তবে গ্লাস ফিশ 4.1+ এবং টমক্যাট 8.0.2x + কাজ করে। এবং আপনাকে একেবারে নিশ্চিত করতে হবে যে আপনার web.xmlসার্ভার দ্বারা সমর্থিত সর্বশেষ সার্ভলেট সংস্করণ অনুসারে ঘোষিত হয়েছে। এইভাবে web.xmlযা সার্ভারলেট 2.5 বা ততোধিক পুরানো হিসাবে ঘোষিত হয়েছে তার সাথে সার্লেটlet 3.0+ বৈশিষ্ট্যগুলির কোনওটিই কাজ করবে না।

এছাড়াও নোট করুন যে এই সুবিধাটি কেবল জেএসপিতে উপলব্ধ এবং ফেসলেটগুলিতে নয়। জেএসএফ + ফেসলেটগুলির ক্ষেত্রে, আপনার সেরা বাজি নীচের মত ওমনিফিস<o:importConstants> ব্যবহার করছে :

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

বা একটি EL প্রসঙ্গ শ্রোতা যুক্ত করুন যা ImportHandler#importClass()নীচের মতো কল করে:

@ManagedBean(eager=true)
@ApplicationScoped
public class Config {

    @PostConstruct
    public void init() {
        FacesContext.getCurrentInstance().getApplication().addELContextListener(new ELContextListener() {
            @Override
            public void contextCreated(ELContextEvent event) {
                event.getELContext().getImportHandler().importClass("com.example.YourConstants");
            }
        });
    }

}

EL 2.2 বা তার বেশি বয়সী

এটি EL 2.2 এবং তার চেয়েও পুরনো ক্ষেত্রে সম্ভব নয় । বিভিন্ন বিকল্প রয়েছে:

  1. Map<String, Object>আপনি প্রয়োগের সুযোগের মধ্যে রেখেছেন এমন একটি এগুলিকে রাখুন । এল ইন, মানচিত্র মান দ্বারা স্বাভাবিক জাভা বিন পথ প্রবেশযোগ্য ${map.key}বা ${map['key.with.dots']}

  2. ব্যবহারের <un:useConstants>এর Unstandard taglib (maven2 রেপো এখানে ):

    <%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
    <un:useConstants className="com.example.YourConstants" var="constants" />

    এইভাবে তারা সাধারণ জাভাবেন উপায়ে প্রবেশযোগ্য ${constants.FOO}

  3. এই নিবন্ধের নীচে কোথাও বর্ণিত হিসাবে জাভরঞ্চের সিসিসি ব্যবহার করুন ।<ccc:constantsMap>

    <%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
    <ccc:constantsMap className="com.example.YourConstants" var="constants" />

    এইভাবে তারা যথারীতি জাভাবেন উপায়ে অ্যাক্সেসযোগ্য ${constants.FOO}

  4. আপনি যদি জেএসএফ <o:importConstants>2 ব্যবহার করেন তবে আপনি ওমনিফিস ব্যবহার করতে পারেন ।

    <html ... xmlns:o="http://omnifaces.org/ui">
    <o:importConstants type="com.example.YourConstants" />

    এইভাবে তারা যথারীতি জাভাবেন উপায়ে অ্যাক্সেসযোগ্য #{YourConstants.FOO}

  5. একটি মোড়কের ক্লাস তৈরি করুন যা জাভাবেইন-স্টাইলের গেটর পদ্ধতির মাধ্যমে তাদের প্রদান করে।

  6. একটি কাস্টম ইএল রেজোলভার তৈরি করুন যা প্রথমে একটি ধ্রুবকের উপস্থিতি স্ক্যান করে এবং যদি অনুপস্থিত থাকে, তবে ডিফল্ট সমাধানকারীকে প্রেরণ করুন, অন্যথায় পরিবর্তে স্থির মান প্রদান করে।


4
আমি এই প্রশ্নটি খুঁজে পেয়েছি কারণ ফর্ম: বিকল্প ট্যাগ সহ স্থির তালিকা ক্ষেত্রটি ব্যবহার করার চেষ্টা করার সময় আমার একই সমস্যা ছিল। আমি স্থিতিশীল তালিকার প্রত্যাবর্তনকারী একটি অ স্থিতিশীল গিটার যুক্ত করে এটি কাজ করতে সক্ষম হয়েছি। এটা একটু ক্লদগি তবে আরে, এটাই তোমার জন্য জেএসপি বিকাশ!
spaaarky21

1
মটরশুটি বসন্তের মাধ্যমে পরিচালিত হলে জেএসএফের জন্য এটি কীভাবে কনফিগার করতে হয় তার কোনও উদাহরণ রয়েছে? অগ্রিম THX।
লজার

2
@ লজার: আমি স্প্রিং করি না।
বালাসসি

2
জাকার্তা unstandard-taglibপ্রকল্পটি কি এখনও বেঁচে আছে? কিছু বিকল্প আছে?
ডেভিওহ

1
এনামদের জন্য এই কৌশলগুলি লাভ করার কোনও উপায় আছে কি?
নিক্লাস পিটার

11

নিম্নলিখিতটি সাধারণভাবে EL এর ক্ষেত্রে প্রযোজ্য নয়, কেবল স্পেল (স্প্রিং ইএল) এর ক্ষেত্রে (টমক্যাট 7.৩.২.২০১RE এর রিয়েলএইএস দিয়ে পরীক্ষা করা হয়েছে)। আমি মনে করি যে কেউ এখানে জেএসপি এবং ইএল অনুসন্ধান করে তবে (তবে বসন্তের সাথে জেএসপি ব্যবহার করে) এটি এখানে উল্লেখ করার উপযুক্ত।

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:eval var="constant" expression="T(com.example.Constants).CONSTANT"/>

9

আপনি Configurationসার্ভলেট প্রসঙ্গে সাধারণত কোনও ধরণের ধ্রুবককে কোনও অবজেক্টে (যার গিটার এবং সেটটার থাকে) রাখুন এবং এগুলি দিয়ে অ্যাক্সেস করুন${applicationScope.config.url}


Jsp এর কথা বলতে গেলে এখানে কোনও নবজাতকের বিট- আপনি কি আরও পুরোপুরি ব্যাখ্যা করতে পারবেন?
তাউ-নিউট্রিনো

1
@ টাউ-নিউট্রিনো: এটি আসলে সহজ। urlএকটি স্ট্রিং সম্পত্তি হিসাবে একটি শ্রেণি তৈরি করুন , এটির নাম দিন Configuration, তা ইনস্ট্যান্ট করুন এবং urlআপনার যা পছন্দ তা সেট করুন । এর পরে সেই Configurationবস্তুটি সেট করে ServletContext। এমন কিছু করুন servletContext.setAttribute("config", config),। এবং আপনি সেখানে যান।
আদিল আনসারী

আপনার প্রস্তাবিত সমাধানের মধ্যে পার্থক্য কী এবং কেবল একটি বৈশিষ্ট্য হিসাবে ধ্রুবক যুক্ত করা ServletContext? আপনি কি আরও পরিচ্ছন্নভাবে ধ্রুবকগুলিকে শ্রেণিবদ্ধ করতে পারেন তা কি এটি? যেমন: applicationScope.config.urlবনাম applicationScope.url
তারাভ

7

আপনি পারবেন না। এটি জাভা বিন সম্মেলন অনুসরণ করে। সুতরাং আপনার অবশ্যই এটির জন্য একটি গেটর থাকতে হবে।


5

স্থির বৈশিষ্ট্যগুলি EL তে অ্যাক্সেসযোগ্য নয়। আমি যে কার্যকারিতাটি ব্যবহার করি তা হ'ল একটি স্থিতিশীল ভেরিয়েবল তৈরি করা যা স্থির মানকে নিজেকে নির্ধারণ করে।

public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;

আমি গেমটার এবং সেটার তৈরি করতে লম্বোক ব্যবহার করি যাতে এটি বেশ ভাল। আপনার EL দেখতে এই রকম:

${bean.manager_role}

Http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el এ সম্পূর্ণ কোড


5

আমি প্রয়োগ করেছি:

public interface Constants{
    Integer PAGE_SIZE = 20;
}

-

public class JspConstants extends HashMap<String, String> {

        public JspConstants() {
            Class c = Constants.class;
            Field[] fields = c.getDeclaredFields();
            for(Field field : fields) {
                int modifier = field.getModifiers();
                if(Modifier.isPublic(modifier) && Modifier.isStatic(modifier) && Modifier.isFinal(modifier)) {
                    try {
                        Object o = field.get(null);
                        put(field.getName(), o != null ? o.toString() : null);
                    } catch(IllegalAccessException ignored) {
                    }
                }
            }
        }

        @Override
        public String get(Object key) {
            String result = super.get(key);
            if(StringUtils.isEmpty(result)) {
                throw new IllegalArgumentException("Check key! The key is wrong, no such constant!");
            }
            return result;
        }
    }

পরবর্তী পদক্ষেপটি servlerContext এ এই শ্রেণীর উদাহরণ দিন

public class ApplicationInitializer implements ServletContextListener {


    @Override
    public void contextInitialized(ServletContextEvent sce) {
        sce.getServletContext().setAttribute("Constants", new JspConstants());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }
}

ওয়েব.এক্সএমএলে শ্রোতাদের যুক্ত করুন

<listener>
    <listener-class>com.example.ApplicationInitializer</listener-class>
</listener>

jsp এ অ্যাক্সেস

${Constants.PAGE_SIZE}

4

আমি শুরুতে আমার জেএসপিতে একটি ধ্রুবকটি সংজ্ঞায়িত করছি:

<%final String URI = "http://www.example.com/";%>

আমি আমার জেএসপিতে মূল ট্যাগলিব অন্তর্ভুক্ত করেছি:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

তারপরে, আমি নীচের বিবৃতিটি দিয়ে EL এর কাছে ধ্রুবকটি উপলব্ধ করি:

<c:set var="URI" value="<%=URI%>"></c:set>

এখন, আমি এটি পরে ব্যবহার করতে পারি। এখানে একটি উদাহরণ, যেখানে মানটি ডিবাগিংয়ের উদ্দেশ্যে এইচটিএমএল মন্তব্য হিসাবে লেখা হয়েছে:

<!-- ${URI} -->

আপনার ধ্রুবক শ্রেণীর সাহায্যে, আপনি কেবল নিজের ক্লাসটি আমদানি করতে পারেন এবং স্থানীয় ভেরিয়েবলগুলিকে ধ্রুবককে বরাদ্দ করতে পারেন। আমি জানি যে আমার উত্তরটি এক ধরণের দ্রুত হ্যাক, তবে যখন কেউ সরাসরি জেএসপিতে কনস্ট্যান্টদের সংজ্ঞায়িত করতে চায় তখন প্রশ্নটিও বাধা দেয় umps


1
আপনি যদি এলএল ভেরিয়েবলগুলি আরম্ভ করেন তবে লোল কেন স্ক্রিপ্টলেটগুলি সরাসরি ব্যবহার করবেন না?
নবীন

শীর্ষে তিনটি লাইন একটি জগাখিচুড়ি হ'ল এবং তারপরে পুরো জেএসপি-র জুড়ে EL সাফ করুন ^^
koppor

1
@ কপ্পুর আমি অনুমান করি আমি কেবল ব্যবহার করতে যাচ্ছি <%=URI%>: পি
নবীন

1
আমার এমন একটি জায়গা ছিল যেখানে ডাইরেক্ট <%=URI%>কাজ করেনি, তবে এই কৌশলটি করেছিল।
englebart

3

হ্যা, তুমি পারো. আপনার একটি কাস্টম ট্যাগ প্রয়োজন (যদি আপনি এটি অন্য কোথাও খুঁজে না পান)। আমি এটি করেছি:

package something;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.taglibs.standard.tag.el.core.ExpressionUtil;

/**
 * Get all class constants (statics) and place into Map so they can be accessed
 * from EL.
 * @author Tim.sabin
 */
public class ConstMapTag extends TagSupport {
    public static final long serialVersionUID = 0x2ed23c0f306L;

    private String path = "";
    private String var = "";

    public void setPath (String path) throws JspException {
        this.path = (String)ExpressionUtil.evalNotNull ("constMap", "path",
          path, String.class, this, pageContext);
    }

    public void setVar (String var) throws JspException {
        this.var = (String)ExpressionUtil.evalNotNull ("constMap", "var",
          var, String.class, this, pageContext);
    }

    public int doStartTag () throws JspException {
        // Use Reflection to look up the desired field.
        try {
            Class<?> clazz = null;
            try {
                clazz = Class.forName (path);
            } catch (ClassNotFoundException ex) {
                throw new JspException ("Class " + path + " not found.");
            }
            Field [] flds = clazz.getDeclaredFields ();
            // Go through all the fields, and put static ones in a Map.
            Map<String, Object> constMap = new TreeMap<String, Object> ();
            for (int i = 0; i < flds.length; i++) {
                // Check to see if this is public static final. If not, it's not a constant.
                int mods = flds [i].getModifiers ();
                if (!Modifier.isFinal (mods) || !Modifier.isStatic (mods) ||
                  !Modifier.isPublic (mods)) {
                    continue;
                }
                Object val = null;
                try {
                    val = flds [i].get (null);    // null for static fields.
                } catch (Exception ex) {
                    System.out.println ("Problem getting value of " + flds [i].getName ());
                    continue;
                }
                // flds [i].get () automatically wraps primitives.
                // Place the constant into the Map.
                constMap.put (flds [i].getName (), val);
            }
            // Export the Map as a Page variable.
            pageContext.setAttribute (var, constMap);
        } catch (Exception ex) {
            if (!(ex instanceof JspException)) {
                throw new JspException ("Could not process constants from class " + path);
            } else {
                throw (JspException)ex;
            }
        }
        return SKIP_BODY;
    }
}

এবং ট্যাগ বলা হয়:

<yourLib:constMap path="path.to.your.constantClass" var="consts" />

সমস্ত পাবলিক স্ট্যাটিক চূড়ান্ত ভেরিয়েবলগুলি তাদের জাভা নাম অনুসারে একটি মানচিত্রে স্থাপন করা হবে, যদি তাই হয়

public static final int MY_FIFTEEN = 15;

তারপরে ট্যাগটি এটি একটি পূর্ণসংখ্যার মধ্যে আবদ্ধ করবে এবং আপনি এটি কোনও জেএসপিতে উল্লেখ করতে পারেন:

<c:if test="${consts['MY_FIFTEEN'] eq 15}">

এবং আপনি লেখক লিখতে হবে না!


3

আপনি পারেন। অনুসরণ করার চেষ্টা করুন

 #{T(com.example.Addresses).URL}

টমগেট 7 এবং জাভা 6 এ পরীক্ষিত


3
এটি স্পেলের মতো দেখায় এবং EL এর মতো নয়। আমি কি ভুল করছি? এছাড়াও, এটি একটি পুরানো টমক্যাট 5.5 এ কাজ করবে?
পাইট্রি

2

এমনকি এটি কিছুটা দেরিতে জেনেও, এবং এটি জেনেও কিছুটা হ্যাক - আমি পছন্দসই ফলাফল অর্জনের জন্য নিম্নলিখিত সমাধানটি ব্যবহার করেছি। আপনি যদি জাভা-নামকরণ-সম্মেলনের প্রেমিকা হন তবে আমার পরামর্শটি এখানে পড়া বন্ধ করুন ...

ধরণের শ্রেণিবিন্যাস তৈরির জন্য খালি শ্রেণি দ্বারা দলবদ্ধ করে কনস্ট্যান্টগুলি সংজ্ঞায়িত করা, এর মতো ক্লাস থাকা:

public class PERMISSION{
    public static class PAGE{
       public static final Long SEE = 1L; 
       public static final Long EDIT = 2L; 
       public static final Long DELETE = 4L; 
       ...
    }
}

জাভাটির মধ্যে থেকে PERMISSION.PAGE.SEEমানটি পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে1L

ইএল-এক্সপ্রেশনগুলির মধ্যে থেকে অদ্ভুত অ্যাক্সেস-সম্ভাবনা অর্জনের জন্য, আমি এটি করেছি: (যদি কোনও কোডিং-godশ্বর থাকে - তবে তিনি আশা করি আমাকে ক্ষমা করতে পারেন: ডি)

@Named(value="PERMISSION")
public class PERMISSION{
    public static class PAGE{
       public static final Long SEE = 1L; 
       public static final Long EDIT = 2L; 
       public static final Long DELETE = 4L; 
       ...

       //EL Wrapper
       public Long getSEE(){
           return PAGE.SEE;
       }

       public Long getEDIT(){
           return PAGE.EDIT;
       }

       public Long getDELETE(){
           return PAGE.DELETE;
       }
    }

    //EL-Wrapper
    public PAGE getPAGE() {
        return new PAGE();
    }
}

অবশেষে, EL- এক্সপ্রেশনটি অ্যাক্সেস করার জন্য একই রকম Longহয়: #{PERMISSION.PAGE.SEE}- জাভা এবং EL- অ্যাক্সেসের জন্য সমতা। আমি জানি এটি কোনও সম্মেলনের বাইরে, তবে এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে।


2

@ বোজো ইতিমধ্যে একটি দুর্দান্ত উত্তর সরবরাহ করেছে

আপনি সার্ভলেট প্রসঙ্গে সাধারণত কনফিগারেশন অবজেক্টে (যা গিটার এবং সেটটার রয়েছে) এ ধরণের ধ্রুবক স্থাপন করেন এবং তাদের $ {অ্যাপ্লিকেশনস্কোপ.কম.ইগ্ল ur দিয়ে অ্যাক্সেস করেন them

যাইহোক, আমি মনে করি যে একটি উদাহরণের প্রয়োজন তাই এটি কিছুটা আরও স্পষ্টতা এনে কারও সময় সাশ্রয় করে

@Component
public Configuration implements ServletContextAware {
    private String addressURL = Addresses.URL;

    // Declare other properties if you need as also add corresponding
    // getters and setters

    public String getAddressURL() {
        return addressURL;
    }

    public void setServletContext(ServletContext servletContext) {
        servletContext.setAttribute("config", this);
    }
}

0

এমন একটি কর্মপরিকল্পনা রয়েছে যা আপনি যা চান তা ঠিক নয় তবে আপনাকে বেশ ন্যূনতম উপায়ে স্পর্শ করা স্ক্রিপ্টলেটগুলির সাথে প্রায় একইভাবে সক্রিয় করতে দেয়। আপনি কোনও জেএসটিএল ভেরিয়েবলের মান রাখতে স্ক্রিলেটলেটটি ব্যবহার করতে পারেন এবং পৃষ্ঠায় পরে জেএসটিএল কোডটি ব্যবহার করতে পারেন।

<%@ taglib prefix="c"       uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.whichever.namespace.Addresses" %>
<c:set var="ourUrl" value="<%=Addresses.URL%>"/>
<c:if test='${"http://www.google.com" eq ourUrl}'>
   Google is our URL!
</c:if>

1
কেন এটি নিচে ভোট হয়েছে তা আমি দেখতে পাচ্ছি না। # 3 ইন বিকল্প হিসাবে এটি একই প্যাটার্ন: স্ট্যাকওভারফ্লো.com
মার্কাস জুনিয়াস ব্রুটাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.