জেএসপি / ইএলে স্থিত পদ্ধতিটি কীভাবে কল করবেন?


88

আমি জেএসপিতে নতুন। আমি মাইএসকিউএল এবং আমার জেএসপি পৃষ্ঠাগুলি সংযুক্ত করার চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করে। তবে আমার যা করা দরকার তা এখানে। আমার কাছে "ভারসাম্য" নামে একটি সারণী বৈশিষ্ট্য রয়েছে। এটি পুনরুদ্ধার করুন এবং "পরিমাণ" নামক একটি নতুন মান গণনা করতে এটি ব্যবহার করুন। (আমি "ব্যালেন্স" মুদ্রণ করছি না)।

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

মনে হচ্ছে জেএসটিএল ট্যাগগুলির মধ্যে স্ক্রিপ্টলেট সন্নিবেশ করা সম্ভব নয়।

উত্তর:


133

আপনি সরাসরি ইলে স্ট্যাটিক পদ্ধতিতে আবেদন করতে পারবেন না। EL কেবল উদাহরণ পদ্ধতিগুলি চাওয়া হবে।

আপনার ব্যর্থ স্ক্রিপ্টলেট প্রচেষ্টা হিসাবে, আপনি স্ক্রিপ্টলেট এবং ইএল মিশ্রণ করতে পারবেন না । এক বা অন্যটি ব্যবহার করুন। যেহেতু scriptlets হয় নিরুৎসাহিত এক দশক ধরে, আপনি একটি এল-একমাত্র সমাধান লাগিয়া থাকা উচিত।

আপনি মূলত 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)}">
    

@ বালুসসি যদি আমার জেএসপির কিছু মূল্য থাকে (গণনা করা) হয় এবং আমি সেটিকে পরামিতি হিসাবে প্রেরণ করতে চাই ??
শ্রীরাম

7
@ শ্রীরাম: প্রথমত, আপনি কি নিশ্চিত যে আপনি জেএসপি কে এইচটিএমএল / জেএস দিয়ে বিভ্রান্ত করছেন না? আপনি যেভাবে প্রশ্নটি রেখেছেন তা ইঙ্গিত দেয় যে আপনি মনে করছেন যে জেএসপি ওয়েব ব্রাউজারে চলছে যদিও এটি সম্পূর্ণ অসত্য। জেএসপি একটি এইচটিএমএল / সিএসএস / জেএস কোড প্রযোজক। এখানেই শেষ. এটি আপনাকে আপনার প্রশ্ন এবং পদ্ধতির বিষয়ে কিছু ভাবনা দেয়।
BalusC

আমি যা খুঁজছিলাম :)
আলিওপি

@ ফিলিপরেগো: উত্তরের কোডটি কেবল প্রশ্নের মধ্যে থাকা কোডের ভিত্তিতে।
বালুসসি

61

আরেকটি পদ্ধতির মধ্যে রয়েছে স্প্রিং স্পেল ব্যবহার:

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

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

আপনি যদি alচ্ছিক এড়িয়ে যান var="rowBalance"তবে <s:eval>প্রকাশের ফলাফলটি আউটপুট প্রিন্ট করবে।


এটি আরও ভাল! অন্যদের জন্য আপনি স্থির পদ্ধতিতে string "the_string_argument \" (সারি.বালেন্স অংশের পরিবর্তে) যুক্ত করে স্ট্রিং সরবরাহ করতে পারেন। এটি কেবলমাত্র যদি আপনার পদ্ধতিতে স্ট্রিং বাদ দেয়। ;) চিয়ার্স!
ot

4
আপনি একক উদ্ধৃতিতে স্ট্রিংগুলি পাস করতে পারেন যেমন 'the_string_argument'- পালানোর সাথে নাচের দরকার নেই।
dma_k

শীতল, যা আমার জন্য বসন্তে কাজ করেছিল ... আমি আগ্রহী ছিলাম যদি 2 টি ক্লাস করা সম্ভব হত ... কেবলমাত্র একটি টি () দিয়ে ধরে নিয়ে সংঘাতের উপসর্গ করা দরকার ... এটি আমি যা করছিলাম তার জন্য এটি কাজ করেছিল: < s: ইভাল এক্সপ্রেশন = "টি (org.jsoup.Jsoup)। ক্ল্যান (অরিজিন_সেক্সট, টি (org.jsoup.safety.Whitelist)। নোন ())" var = "পাঠ্য_স্ট্রিপড_এইচটিএমএল" /> এর সমতুল্য: স্ট্রিং টেক্সট_স্ট্রিপড_এইচটিএমএল = জসপ ou পরিষ্কার (অরিজিন_সেক্সট, হোয়াইটলিস্ট.নোন ());
আর্মিফদা

@ এমএসএনজেল: এই বিষয়ে অন্যান্য উত্তর পরীক্ষা করুন।
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: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();
    }
}

আমি ক্লাসের নামে "স্ট্যাটিক" ব্যতীত কোডে কোনও স্থির কীওয়ার্ড দেখতে পাচ্ছি না।
উলুক বাই

4
@ উলুকবিয়, এটি Settings.reset()একটি স্ট্যাটিক পদ্ধতি কল। লুকাস প্রতিটি স্ট্যাটিক পদ্ধতির জন্য একটি অ-স্থিতিশীল পদ্ধতি সহ একটি মোড়কের মতো ম্যানেজডবিয়ান তৈরির প্রস্তাব দেয়, যেটি EL থেকে কল করতে চায়। এটি একটি কার্যকর সমাধান।
ভেসেভলড গোলোভানভ

3

EL 2.2 এর কল করার পদ্ধতিগুলির ইনবিল্ড প্রক্রিয়া রয়েছে। আরও এখানে: ওরাকল সাইট । তবে স্থির পদ্ধতিতে এটির অ্যাক্সেস নেই। যদিও আপনি এটি কল্পনা করতে পারেন এটি অবজেক্ট রেফারেন্সের মাধ্যমে via তবে আমি এই নিবন্ধে বর্ণিত আরেকটি সমাধান ব্যবহার করছি: EL থেকে স্ট্যাটিক পদ্ধতিটি কল করা


4
আমি দৃ would়ভাবে বলতে চাই যে EL 2.2 সত্যিই একটি স্ট্যাটিক পদ্ধতি কল করার জন্য একটি বিল্ট-ইন সমর্থন যুক্ত করে। সমাধানগুলি অনুরোধ প্রসঙ্গে একটি শিম রাখার উপর ভিত্তি করে এবং (কুরুচিপূর্ণ) অনুকরণগুলি মানচিত্র + প্রয়োজনীয় পরামিতিগুলি ডিरेফারিংয়ের সময় পাস করা হয়। এই পদ্ধতির অতিরিক্ত বোঝা হ'ল একটিকে অনুরোধের প্রসঙ্গে ম্যাসেজ করা প্রয়োজন (উদাঃ <web-app> → <filter>)।
dma_k

2

আপনি যদি struts2 ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন

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

এবং তারপরে html বা html ট্যাগ বৈশিষ্ট্যে 'myVar' উল্লেখ করুন ${myVar}


4
স্ট্রুটস জেএসপি নয়, অনুরোধকারী বলেছেন।
বোগদান.মুষ্টিটা

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;
    }
}

এক্সএইচটিএমএল, উদাহরণস্বরূপ একটি কমান্ডবুটনে:

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

EL (2.2) পদ্ধতির এক্সপ্রেশনগুলিতে পরিবর্তনশীল আর্গুমেন্ট ব্যবহার করা সম্ভব নয়।
রবার্ট কর্নমেসার

হাই রবার্ট, দুঃখিত আপনি ঠিক কী বোঝাতে চেয়েছেন, আমি সেই কোডটি দীর্ঘকাল ব্যবহার করেছি, এবং আমি নিশ্চিত যে এটি কার্যকর হয়েছে। আমার ভুল কোথায়?
জুয়ান

আমি actuall বৈশিষ্ট এটি কিন্তু 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

স্ট্রুটস 2 বা ওয়েব ওয়ার্ক 2 এ আপনি এটি ব্যবহার করতে পারেন:

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

তারপরে #tourLanguageআপনার জেএসপিতে রেফারেন্স

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.