जेएसपी / ईएल में एक स्थिर विधि कैसे कॉल करें?


88

मैं JSP में नया हूँ। मैंने MySQL और मेरे JSP पृष्ठों को जोड़ने का प्रयास किया और यह ठीक काम करता है। लेकिन यहां मुझे वही करने की जरूरत है। मेरे पास "संतुलन" नामक एक तालिका विशेषता है। इसे पुनः प्राप्त करें और "राशि" नामक एक नए मूल्य की गणना करने के लिए इसका उपयोग करें। (मैं "बैलेंस" नहीं छाप रहा हूं)।

 <c:forEach var="row" items="${rs.rows}">
        ID: ${row.id}<br/>
        Passwd: ${row.passwd}<br/>
        Amount: <%=Calculate.getAmount(${row.balance})%>
 </c:forEach>

ऐसा लगता है कि JSTL टैग में स्क्रिप्ट्स डालना संभव नहीं है।

जवाबों:


133

आप सीधे ईएल में स्थिर तरीकों को लागू नहीं कर सकते। ईएल केवल उदाहरण के तरीकों का आह्वान करेगा।

आपके असफल स्क्रिप्टलेट प्रयास के अनुसार, आप स्क्रिप्टलेट और ईएल को नहीं मिला सकते हैं । एक या दूसरे का उपयोग करें। चूंकि स्क्रिप्टलेट एक दशक में हतोत्साहित होते हैं , इसलिए आपको ईएल-ओनली समाधान से चिपके रहना चाहिए।

आपके पास मूल रूप से 2 विकल्प हैं (दोनों को मानते हुए balanceऔर Calculate#getAmount()हैं double)।

  1. बस इसे एक आवृत्ति विधि में लपेटें।

    public double getAmount() {
        return Calculate.getAmount(balance);
    }
    

    और इसके बजाय इसका उपयोग करें:

    Amount: ${row.amount}
    

  2. या, Calculate#getAmount()एक EL फ़ंक्शन के रूप में घोषित करें । पहले एक /WEB-INF/functions.tldफ़ाइल बनाएँ :

    <?xml version="1.0" encoding="UTF-8" ?>
    <taglib 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
    
        <display-name>Custom Functions</display-name>    
        <tlib-version>1.0</tlib-version>
        <uri>http://example.com/functions</uri>
    
        <function>
            <name>calculateAmount</name>
            <function-class>com.example.Calculate</function-class>
            <function-signature>double getAmount(double)</function-signature>
        </function>
    </taglib>
    

    और इसे निम्नानुसार उपयोग करें:

    <%@taglib uri="http://example.com/functions" prefix="f" %>
    ...
    Amount: ${f:calculateAmount(row.balance)}">
    

@BalusC क्या होगा अगर मेरे jsp के पास कुछ मूल्य है (गणना) और मैं इसे एक पैरामीटर के रूप में भेजना चाहता हूँ ??
श्रीराम

7
@ श्रीराम: सबसे पहले, क्या आप सुनिश्चित हैं कि आप HTML / JS के साथ JSP को भ्रमित नहीं कर रहे हैं? जिस तरह से आप सवाल डालते हैं, वह इंगित करता है कि आपको लगता है कि जेएसबी वेबब्रोज़र में चलता है, जबकि यह पूरी तरह से असत्य है। JSP एक HTML / CSS / JS कोड निर्माता है। बस इतना ही। इससे आपको अपने प्रश्न और दृष्टिकोण के बारे में सोचने के लिए कुछ देना चाहिए।
बालुसक

मैं क्या देख रहा था :)
एलोपी

@PhilipRego: उत्तर में कोड केवल प्रश्न में कोड पर आधारित है।
बालुसक

61

स्प्रिंग स्पेल का उपयोग करने के लिए एक और तरीका है:

<%@taglib prefix="s" uri="http://www.springframework.org/tags" %>

<s:eval expression="T(org.company.Calculate).getAmount(row.balance)" var="rowBalance" />
Amount: ${rowBalance}

यदि आप वैकल्पिक छोड़ते हैं var="rowBalance"तो <s:eval>आउटपुट के लिए अभिव्यक्ति का परिणाम प्रिंट करेगा।


यह और भी बेहतर है! दूसरों के लिए आप स्थैतिक विधि में एक स्ट्रिंग प्रदान कर सकते हैं \ "the_string_argument \" (row.balance भाग के बजाय) को जोड़कर। यह केवल तभी है जब आपका तरीका स्ट्रिंग्स को एक्सेप्ट करता है। ;) चीयर्स!
डेसपोट

3
आप एकल उद्धरणों में तार पारित कर सकते हैं 'the_string_argument'- भागने के साथ नृत्य करने की कोई आवश्यकता नहीं है।
dma_k

कूल, जो मेरे लिए स्प्रिंग में काम करता था ... मैं उत्सुक था कि क्या 2 कक्षाएं करना संभव था ... बस एक टी के साथ क्लॉस को उपसर्ग करने की आवश्यकता है () मुझे लगता है ... यह मेरे लिए काम कर रहा था: < s: eval अभिव्यक्ति = "T (org.jsoup.Jsoup) .clean (Origin_text, T (org.jsoup.safety.Whitelist) .none ())" var = "text_stripped_html" /> के बराबर: स्ट्रिंग text_stripped_html = Jsoup। स्वच्छ (मूल_टेक्स्ट, व्हाइटलिस्ट.नोन ());
सेना की सेना 12

@msangel: इस विषय में अन्य उत्तरों की जाँच करें।
dma_k

5

यदि आपका जावा क्लास है:

package com.test.ejb.util;

public class CommonUtilFunc {

    public static String getStatusDesc(String status){

        if(status.equals("A")){
            return "Active";
        }else if(status.equals("I")){
            return "Inactive";
        }else{
            return "Unknown";
        }
    }
}

तब आप स्थैतिक विधि 'getStatusDesc' को JSP पृष्ठ में नीचे कह सकते हैं।

JSTL का उपयोग करें JSP पृष्ठ के शीर्ष पर कक्षा पाने के लिए उपयोग करें:

<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>

तब फ़ंक्शन को कॉल करें जहां आपको अभिव्यक्ति भाषा का उपयोग करना आवश्यक है:

<table>
    <td>${cmnUtilFunc.getStatusDesc('A')}</td>
</table>

यह मेरे लिए मददगार है। महान!!
अबू बकर सिद्दीक

4

बीन जैसे स्टैटिकइंटरफेस भी इस्तेमाल किया जा सकता है

<h:commandButton value="reset settings" action="#{staticinterface.resetSettings}"/>

और बीन

package com.example.common;

import com.example.common.Settings;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name = "staticinterface")
@ViewScoped
public class StaticInterface {

    public StaticInterface() {
    }

    public void resetSettings() {
        Settings.reset();
    }
}

मुझे क्लास के नाम में "स्टेटिक" को छोड़कर कोड में कोई भी स्थिर कीवर्ड नहीं दिखाई दे रहा है।
उलूक बाय

2
@UlukBiy, Settings.reset()एक स्टेटिक मेथड कॉल है। लुकास प्रत्येक स्थिर विधि के लिए एक गैर-स्थिर विधि के साथ एक रैपर-जैसे प्रबंधित प्रबंधित करने का प्रस्ताव रखता है, जिसे कोई ईएल पर कॉल करना चाहता है। यह एक वैध समाधान है।
वेसेवोलॉड गोलोवानोव

3

ईएल 2.2 में कॉलिंग के तरीकों का इनबिल्ट मैकेनिज्म है। यहाँ अधिक: oracle साइट । लेकिन इसकी स्थैतिक विधियों तक कोई पहुंच नहीं है। यद्यपि आप इसे ऑब्जेक्ट रेफरेंस के माध्यम से कॉल कर सकते हैं। लेकिन मैं इस लेख में वर्णित एक और समाधान का उपयोग करता हूं: ईएल से एक स्टेटिक विधि कॉलिंग


1
मुझे लगता है कि ईएल 2.2 वास्तव में एक स्थिर विधि को कॉल करने के लिए एक समर्थन जोड़ता है। समाधान अनुरोध संदर्भों में एक बीन लगाने पर आधारित है और (बदसूरत) एक नक्शा + आवश्यक मापदंडों को निष्क्रिय कर दिया जाता है। इस दृष्टिकोण का अतिरिक्त बोझ यह है कि किसी को अनुरोध संदर्भ (जैसे <web-app> → <filter>) में मालिश करने की आवश्यकता होती है ।
dma_k 14

2

यदि आप स्ट्रट्स 2 का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं

<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>

और फिर 'myVar' को html या html टैग विशेषता के रूप में देखें ${myVar}


1
स्ट्रट्स जेएसपी नहीं है, जैसे पूछने वाले ने कहा।
bogdan.mustiata

2

@ लुकास जवाब के आधार पर आप उस बीन और कॉल विधि का उपयोग प्रतिबिंब द्वारा कर सकते हैं:

@ManagedBean (name = "staticCaller")
@ApplicationScoped
public class StaticCaller {
private static final Logger LOGGER = Logger.getLogger(StaticCaller.class);
/**
 * @param clazz
 * @param method
 * @return
 */
@SuppressWarnings("unchecked")
public <E> E call(String clazz, String method, Object... objs){
    final ClassLoader loader = Thread.currentThread().getContextClassLoader();
    final List<Class<?>> clasesparamList = new ArrayList<Class<?>>();
    final List<Object> objectParamList = new ArrayList<Object>();
    if (objs != null && objs.length > 0){
        for (final Object obj : objs){
            clasesparamList.add(obj.getClass());
            objectParamList.add(obj);
        }
    }
    try {           
        final Class<?> clase = loader.loadClass(clazz);
        final Method met = clase.getMethod(method, clasesparamList.toArray(new Class<?>[clasesparamList.size()]));
            return (E) met.invoke(null, objectParamList.toArray());
        } catch (ClassNotFoundException e) {
            LOGGER.error(e.getMessage(), e);
        } catch (InvocationTargetException e) {
            LOGGER.error(e.getMessage(), e);
        } catch (IllegalAccessException e) {
            LOGGER.error(e.getMessage(), e);
        } catch (IllegalArgumentException e) {
            LOGGER.error(e.getMessage(), e);
        } catch (NoSuchMethodException e) {
            LOGGER.error(e.getMessage(), e);
        } catch (SecurityException e) {
            LOGGER.error(e.getMessage(), e);
        }
        return null;
    }
}

उदाहरण के लिए कमांड में xHTML,:

<p:commandButton action="#{staticCaller.call('org.company.Calculate', 'getAmount', row.balance)}" process="@this"/>

EL (2.2) विधि अभिव्यक्तियों में चर तर्कों का उपयोग करना संभव नहीं है।
रॉबर्ट कॉर्नमेसर

हाय रॉबर्ट, खेद है कि आप वास्तव में क्या मतलब है, मैं एक लंबे समय के लिए उस कोड का उपयोग किया है, और मुझे यकीन है कि यह काम है। मेरी गलती कहाँ है?
जुआन

मुझे एक्ट्यूअल युक्ति का पता नहीं है, लेकिन जैसा कि BalusC का उल्लेख है यहां stackoverflow.com/questions/15560508/… यह कारण है SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost/127.0.0.1:8080-5) java.lang.IllegalArgumentException: wrong number of arguments
रॉबर्ट कॉर्नमेसर

हां, आप EL पर परिवर्तनशील तर्कों का उपयोग नहीं कर सकते। लेकिन आप उस विधि का उपयोग EL से कर सकते हैं। इसका उपयोग अंतिम तर्क के रूप में एक सरणी पास करने में किया जा सकता है। इस मामले में यह निरर्थक नहीं है क्योंकि अंतिम तर्क के रूप में पारित एक वस्तु है।
जुआन

1
<c:forEach var="row" items="${rs.rows}">
        ID: ${row.id}<br/>
        Passwd: ${row.passwd}<br/>
<c:set var="balance" value="${row.balance}"/>
        Amount: <%=Calculate.getAmount(pageContext.getAttribute("balance").toString())%>
 </c:forEach>

इस समाधान में, हम एक चर के लिए मान (मुख्य टैग के माध्यम से) असाइन कर रहे हैं और फिर हम उस चर के मान को परिमार्जन में ला रहे हैं।


0

Struts2 या Webwork2 में, आप इसका उपयोग कर सकते हैं:

<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>

फिर #tourLanguageअपने जेएसपी में संदर्भ दें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.