# فناوری جاوا > برنامه‌نویسی جاوا > Java SE : نگارش استاندارد جاوا >  لپ كلام jndi

## maamiri

دوستان عزيز من هر كاري ميكنم نمي تونم به اسم jndi‌كه تو netbeans تعريف كردم دسترسي پيداكنم.منظورم از طريق application.ميشه دوستان عزيز يك مثال خيلي ساده لينك كنن كه توش يك application client از طريق  jndi‌به يك ejb module دسترسي پيدا ميكنه.البته اين مثال رو من پيدا كردم اما وقتي فايل كلاينت رو بيرون از netbeans  احرا ميكنم  err عدم دسترسي ميده.
http://www.netbeans.org/kb/61/javaee...ml:خجالت:

----------


## javaphantom

شما باید اول از همه مشخص کنید که web applicaton تون چی هست. بعد از اون که مشخص شد تازه یک سری تنظیمات ما داریم که بر اساس web application انجامی می دیم. بعد از اینکه این تنظمات انجام شد به سراغ JNDI می ریم. اگر دارید با ejb container کار می کنید باید مشخص کنید که دارید از session ها استفاده می کنید اونهم از remote یا ایینکه از message container.

مشخصات دقیق بدین راهنماییتون می کنم.

----------


## maamiri

فكر ميكنم اين مثالي كه تو لينك داده session  باشه.
خوب پس نتيجه اخلاقي اين ميشه كه  session رو توضيح بديد :لبخند گشاده!:

----------


## javaphantom

> فكر ميكنم اين مثالي كه تو لينك داده session  باشه.
> خوب پس نتيجه اخلاقي اين ميشه كه  session رو توضيح بديد


اینجا مگه آموزشگاست .

session در هرجا معنی  خواص خودشو داره. من نمی دونم مربوط به کدوم قسمت رو میخوای بدونی.
اگر منظورت session bean ها در EJB 3 هستند من به شما پیشنهاد می کنم با این پایه ضعیفی که داری بیخیال بشی و بری اول سراغ مطالب پایه ای تر و اولیه J2EE  بهتره.
نوشتن چند خط کد که معنیشم نمی فهمی و برای اجرای آنها دیگه  IDE و نمی دونم آموزش گام گام نمی تونه کمکت کنه.
باید بشنی وقت بزاری چندین کتاب بخونی بعد کمک بگیری.
خیلی مفهوم ها ست که باید بدونی. و واقعا من نمی تونم اینجا به همشون توضیح بدم. شما کتاب servlet & jsp ماله core java رو تهیه کن زبان اصلی. با مفاهیم اولیه j2ee آشنا بشو. با یک servlet container آشنا بشو مثل tomcat. تنظیمات و قابلیت ها رو یاد بگیر. پیاده سازی بکن بعد تازه وارد یک دنیای دیگه بشو. همین خودش یک ۲ سالی مشغولت می کنه. عوضش بعد از ۲ سال یک چیزخوب و قوی و با معلومات پر فیلتر شدی. این نظر من. با این تفاسیر برای اینکه باورت بشه که مطالبی که گفتم واقعیت داره من یک مثال ساده HelloWorld رو با ejb3 و session bean ها به اضافه مطلب jndi برای شما می نویسم.

 web application: glassfish 

در قسمت server و مربوط به فسمت  business کار که قرار چاپ کنه  hello world بعد اونو به سمت client پاس بده از طریق jndi از طرف client این business صدا می شه و رشته تولید شده به سمت client بر گردونده می  شه و درسمت کلات رشته hello world چاپ می شه.

در قسمت server
import javax.ejb.Remote;

@Remote
public interface HelloRemote {
    public String sayHelloWorld();
}
حالا نوبت نوشتن session bean هست که از طریق این interface مشخص می کنه که یک بصورت remote هست و باید یک متدود رو پیاده سازی کنه که همون چاپ کردن hellow world است.
این session بصورت stateless هست. طول عمر کوتاه ودر کنترل ejb container هست. یعنی این ejb container شما هست که بنا به در خواست client از اون instance  می گیره و بعدش هم خودش هر موقع که  بخواد دخلشو می یاره.
import javax.ejb.Stateless;

@Stateless
public claas HelloBean implements HelloRemote {
    public String sayHelloWorld() {
        return "Hello World";
    }
}

حالا بعد از compile  کردن این دوتا یک jar فایل درست می کنیم بعد این jar file رو deploy می کنیم توی web application نمون که ejb container داره. می ریم سراغ client و jndi
اول یک سری نتظمات مربوط به glassfish و بعد یک context که می رهه از طریق jndi اون object مورد نظر که همونی هست که توی EJB Container مون Deploy کردیم رو صدا می کنه و کار تمومه.

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;


/**
 *
 * @author root
 */
public class Main {

  
    public static void main(String[] s) throws Exception  {
        Properties prop = new Properties();
        prop.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactor  y");
        prop.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
        prop.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateF  actoryImpl");
        prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
        prop.setProperty("org.omg.CORBA.ORBInitialPort", "4325");
        
        Context ctx = new InitialContext(prop);
        HelloRemote h = (HelloRemote) ctx.lookup("HelloRemote");
        System.out.println(h.sayHelloWorld());
    }
}

بعد این فایل مثل حالت معمولی با javac کامپایل و اجرا می شه و میره از توی server و business رو صدا می کنه
الله اکبر داره.

----------


## maamiri

مرسيت باشه جوان
با اينكه زياد قرو لوند ميكني اما معلومه دلت پاكه
من چند ماهي ميشه كه دارم با اين jndiوejb سرو كله ميزنم.يه مثال ساده نياز داشتم كه دركش كنم.
هميشه سوال كردن از يك مبحث بصورت يك مثال دليل بر بيسوادي يا تنبلي نيست.خيلي وقتها آدما مطالعه ميكنن مثل من.من الان بيشتر از 3 مدل كتاب خوندم اما خداييش مطلب رو نگرفتم.شما هم بهتره از اين طعنه زدنهات دست برداري...
هر كس براي خودش شخصيتي داره
در هر صورت ممنون كه وقت گذاشتي و يك مثال برام آماده كردي

----------


## javaphantom

> مرسيت باشه جوان
> با اينكه زياد قرو لوند ميكني اما معلومه دلت پاكه
> من چند ماهي ميشه كه دارم با اين jndiوejb سرو كله ميزنم.يه مثال ساده نياز داشتم كه دركش كنم.
> هميشه سوال كردن از يك مبحث بصورت يك مثال دليل بر بيسوادي يا تنبلي نيست.خيلي وقتها آدما مطالعه ميكنن مثل من.من الان بيشتر از 3 مدل كتاب خوندم اما خداييش مطلب رو نگرفتم.شما هم بهتره از اين طعنه زدنهات دست برداري...
> هر كس براي خودش شخصيتي داره
> در هر صورت ممنون كه وقت گذاشتي و يك مثال برام آماده كردي


سوال کردن از یک مبحث یا سوال مربوط به یک مفهوم؟ این هم مطمعن باش که با مثال نمی تونی مفهوم رو درک کنی.
می دونی چرا مطلب رو نگرفتی چون من بازم می گم پایه ضعیف هست. پیش نیازهای کتاب رو رعایت نکردی.
طعنه نمی زنم. اتفاقا جزو معدود کسانی هستی توی این فروم که داری سوالهای خوب مطرح می کنی. من خیلی مشتاق هستم که بیشتر توی زمینه ejb و معماری چندلایه ای و چگونه طراحی و پیاده سازی بحث کنم تا اینکه بیام روش کامپایل کردن رو به یکی بگم. ولی اشتباه نکن که تدریس کردن هم جاش اینجا نیست. دوست دارم سوالها در سطح پیاده سازی باشه نه مفهوم های اولیه و تئوریک. می دونی دوست دارم exception بنادازی توی صفحه. بعد بگی من یک چند روزی هست دارم با این exception زندگی می کنم ولی نمی تونم از پسش بر بیام. اون موقعست که منم نا خودآگاه می ندازی تو هچل.
exception آدم و بزرگ  می کنه  :لبخند گشاده!: 
من به شخصیت هیچ کس توهین نکردم. اگر می گم بخون گفتم همیشه اولش به خودم می گم. بعد می آیام بکسی دیگه می گم. اگر فکر می کنی به شخصیت توهین شده من از تو معذرت می خوام. منظوری نداشتم.
طعنه می زنم که از لج منم که شده بری بخونی  :شیطان: 
بازم سوال داشتی بپرس مطمعن باش جواب از من داری

----------


## maamiri

یه سوال برام پیش اومده.به این کد نگاه کن .فرق این JNDI که شما گفتین با این یکی چیه؟



> java.lang.Object ejbHome =
>       initialContext.lookup(
>          "java:comp/env/com/mycompany/accounting/AccountEJB");
>    accountHome =
>       (AccountHome)javax.rmi.PortableRemoteObject.narrow  (ejbHome, AccountHome.class);


یچیزی هم قبلش بگم بجون آقا من کتاب می خونم .core j2ee و ‌دوتا کتاب دیگه اما مباحث jndi اون خیلی کمه.مباحث مربوط به remote و session رو هم بلدم.امامشکل من مربوط به این مبحثه.در مورد مثالی هم که آوردی یه مشکلی باهاش دارم .کتابخونه های من ناقصه

----------


## cups_of_java

> یه سوال برام پیش اومده.به این کد نگاه کن .فرق این JNDI که شما گفتین با این یکی چیه؟
> 
> یچیزی هم قبلش بگم بجون آقا من کتاب می خونم .core j2ee و ‌دوتا کتاب دیگه اما مباحث jndi اون خیلی کمه.مباحث مربوط به remote و session رو هم بلدم.امامشکل من مربوط به این مبحثه.در مورد مثالی هم که آوردی یه مشکلی باهاش دارم .کتابخونه های من ناقصه


مثالی که شما زدی برای گرفتن reference به شی Home برای دسترسی به  EJB های Remote هستش که در نسخه 2.1 کاربرد داشته. 

مثال javaphantom برای EJB3 هستش که دیگه از شی Home خبری نیست و کار برنامه نویس راحت تر شده.

----------


## javaphantom

> مثالی که شما زدی برای گرفتن reference به شی Home برای دسترسی به  EJB های Remote هستش که در نسخه 2.1 کاربرد داشته. 
> 
> مثال javaphantom برای EJB3 هستش که دیگه از شی Home خبری نیست و کار برنامه نویس راحت تر شده.


کلیت سوال مربوط به java naming and directory interface  هست. هیچ ربطی به معقوله ejb نداره که حالا بخواد مربوط به نسخه چندم ejb باشه.
وقتی صحبت از RMI   یا همون  Remote Method Invocation   می شه، سر کله jndi  هم پیدا می شه.

علت اینکه من به سراغ مثال از ejb شدم به این علت بود که از jndi به session پریدیم و من حدث زدم که شاید منظور از session ودر کنار اون jndi باید منظور اصلی ejb session باشه. برای همین به سراغ مثال از ejb شدم.

شما برای دسترسی به ejb session های remote باید از jndi استفاده کنید مخصوصا وقتی بخواهید مقداری بازگشتی داشته باشید یعنی مانند مثال من یک رشته از سمت server از طریق remote به سمت client بر گردونده بشه.

----------


## maamiri

من یه مشکلی دارم با jndi
وقتی اجرا میکنم این پیغام میاد
javax.naming.CommunicationException: Can't find SerialContextProvider [Root exception is org.omg.CORBA.COMM_FAILURE:
میشه کمکم کنید

----------


## javaphantom

> من یه مشکلی دارم با jndi
> وقتی اجرا میکنم این پیغام میاد
> javax.naming.CommunicationException: Can't find SerialContextProvider [Root exception is org.omg.CORBA.COMM_FAILURE:
> میشه کمکم کنید


کدی رو که نوشتی بفرست بیاد اینجا

----------


## maamiri

دقیقا هموناییه که تو مثال netbeans برات لینک کردم در اول این بحث
وقتی کد های properties شمارو وارد نمیکنم کار میکنه اما وقتی کد های قسمت properties رو وارد میکنم این پیغام خطا میاد که گفتم.
 :گیج:

----------


## maamiri

میشه بپرسم این شماره پورتی که دادید همون شماره پورت glassfish ؟
شماره پورت glassfish که رو سیستم من باز شده 10701

----------


## javaphantom

> میشه بپرسم این شماره پورتی که دادید همون شماره پورت glassfish ؟
> شماره پورت glassfish که رو سیستم من باز شده 10701



دوتا jar file باید به classpath برنامه client خودت اضافه کنی.
 میری  توی شاخه glassfish توی lib اونا این دوتا فایل appserv-rt.jar, javaee.jar
بعد از properties من استفاده کن

----------


## maamiri

ممنون از اینکه وقت میزاری.اما هنوزم مشکل داره.
وقتی با پورت ۴۳۲۵ تست میکنم این پیغام میاد
WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 4325"
اما وقتی با پورت ۱۰۷۰۱ تست میکنم م۱۰ ثانیه مکث میکنه و بعد این پیغام میاد
javax.naming.CommunicationException: Can't find SerialContextProvider [Root exception is org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 208 completed: Maybe]
اون فایهایی رو هم که گفتی تو شاخه lib  نرم افزارnetbeans خودم add کردم اما متاسفاهنه هنوز همین پیغام رو میده :خیلی عصبانی:

----------


## maamiri

منظورم شاخه libraries پروژه client تو netbeans بود :خجالت:

----------


## cups_of_java

> کلیت سوال مربوط به java naming and directory interface  هست. هیچ ربطی به معقوله ejb نداره که حالا بخواد مربوط به نسخه چندم ejb باشه.
> وقتی صحبت از RMI   یا همون  Remote Method Invocation   می شه، سر کله jndi  هم پیدا می شه.
> 
> علت اینکه من به سراغ مثال از ejb شدم به این علت بود که از jndi به session پریدیم و من حدث زدم که شاید منظور از session ودر کنار اون jndi باید منظور اصلی ejb session باشه. برای همین به سراغ مثال از ejb شدم.
> 
> شما برای دسترسی به ejb session های remote باید از jndi استفاده کنید مخصوصا وقتی بخواهید مقداری بازگشتی داشته باشید یعنی مانند مثال من یک رشته از سمت server از طریق remote به سمت client بر گردونده بشه.


حرف من سر JNDI نبود. سوال این بود که فرق این دو کاریرد JNDI چیه! منم گفتم که دومی مال زمانی بود که مجبور بودیم برای دسترسی به شی  HOME در EJB2.1 از narrow استفاده کنیم ولی در EJB3 (مثال شما) می شه بطور مستقیم cast کرد و با خود شی EJB کار کرد.

وگرنه ایشون باید بدونه که JNDI چیه و چه کاریرد هایی داره...!

----------


## javaphantom

> ممنون از اینکه وقت میزاری.اما هنوزم مشکل داره.
> وقتی با پورت ۴۳۲۵ تست میکنم این پیغام میاد
> WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 4325"
> اما وقتی با پورت ۱۰۷۰۱ تست میکنم م۱۰ ثانیه مکث میکنه و بعد این پیغام میاد
> javax.naming.CommunicationException: Can't find SerialContextProvider [Root exception is org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 208 completed: Maybe]
> اون فایهایی رو هم که گفتی تو شاخه lib  نرم افزارnetbeans خودم add کردم اما متاسفاهنه هنوز همین پیغام رو میده


خوبه داری پیش رفت می کنی. مشکل از نتظیمات glassfish. با browser میری توی نتظیمات glassfish
بصورت default توی glassfish در سطح admin روی port 4848 می باشد.
کافی توی  browsers توی address bar بزن یعنی بنویس localhost:4848 بعد صفحه تنظیم glassfish ظاهر می شه 
با زدن username & password برای سطح دسترسی admin که خودت قبلا تنظیم کردی وارد تنظیمات glassfish از طریق brower می شی. اون پایین سمت چب فسمت configuration کلیک می کنی بعد ORB بعد IIOP Listener بعد ORB-Listener-1 روی اون  کلیک می کنی صفحه جدید کنارت سمت راست refresh  می شه بعد Listener port رو به او عددی تغییر بده که توی properties  مقدار دادی . بعد save کن . دباره اجرا کن

----------


## maamiri

:بوس:  :لبخند:

----------


## javaphantom

> 


اینا یعنی چی؟ :قهقهه:   بدردت خوردم یا نه؟

----------


## maamiri

قربون پسر برم من ...
جواب داد..اونم چه جوابی ولی یه غلط املایی داشتید..البته ببخشیدا...شما جای استادمی اما خوب چون بقیه هم ممکنه بخوان استفاده کنن اینو گفتم.تو خط 
(HelloRemote) ctx.lookup("HelloRemote");
گفته بودید که درستش اینه
(HelloRemote) ctx.lookup("HelloBean");
.در ضمن من یک مشکلی دارم.وقتی کامپایل میکنم پیغام میاد که فایل HelloBean پیدا نشد.من این کارو کردم و مشکل حل شده.فکر کنم مشکل از netbeans  6.5 باشه چون تو 6.1 این مشکلو نداشتم.
@Stateless(mappedName="HelloBean")
در کل ممنون.خیلی کمک کردید.خداییش اینا رو من تو هیچ کتابی ندیدم که گفته باشه.لا اقل تو اون ۳ تا کتابی که من داشتم.یعنی اگه ۲ سال هم وقت میزاشتم باز به جواب نمی رسیدم بخدا.
بازم ممنون.من که دیگه ول کنت نیستم.کلی سوال دارم که به ترتیب ازت میپرسم.گیر بد کسی اوفتادی :لبخند گشاده!:  :تشویق:  :چشمک:  :بوس:  :قلب:

----------


## maamiri

:خیلی عصبانی:  :گریه: 
نه هنوز مشکل داره.تو commend وقتی فایل jar  مربوط به client رو اجرا میکنم این پیغام میاد
Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
 :گیج:

----------


## javaphantom

> نه هنوز مشکل داره.تو commend وقتی فایل jar  مربوط به client رو اجرا میکنم این پیغام میاد
> Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]


اون دوتا فایلی که بهت گفتم تو چندتا post قبل javaee.jar با یکی دیگه الان اسمش یادم نیست توی classpath اضافه کن.
قبلا netbeans برات handle می کرد حالا خودت باید بکنی.

در مورد اشکال دومی که گفتنی پیدا نمی کنه برای اینکه خودت اومد به یک اسم بی ربط map کردی بعد نزاشتیش توی web app من آدرس مستقیم بهت دادم برای همین map رو ایراد می گیره یعنی پیدا نمی کنه.
اگر مشکل غلط املایی دارم دیگه خودت درست کن. من اینرو که اجرا نمی کنم که ببنم کجا ایراد داره برای همین ممکنه غلط املایی پیدا کنی

----------


## maamiri

والا من كه تو پاراگراف دوم نفهميدم چي گفتي دوست عزيز
ميشه واضح تر توضيح بدي؟

----------


## javaphantom

> والا من كه تو پاراگراف دوم نفهميدم چي گفتي دوست عزيز
> ميشه واضح تر توضيح بدي؟


می ری توی جایی که glassfish رو داری .
توی folder ی که به نام lib هست در آدرس glassfish اونجا دوتا فایل جر رو به classpath سمتclient اضافه می کنی. این دوتا فایل عبارتند از

javaee.jar
appserv-rt.jar
توی netbeans خودش این کارو برات می کنه ولی اینجا چون دیگه خبری از اون نیست خودت باید به classpath سمت clinet اضافه کنی

----------


## maamiri

متاسفانه اين كارو كاردم جواب نداد...!! :افسرده: 
دليل ديگه اي هم ميتونه داشته باشه؟

----------


## javaphantom

> متاسفانه اين كارو كاردم جواب نداد...!!
> دليل ديگه اي هم ميتونه داشته باشه؟


یک کار مسخره چون من یادم نیست کدوم از jar فایلها رو نیز داری هرچی jar فایل توی فلدر lib ی توی glassfishت هست رو به classpath سمت client اضافه کن

----------


## maamiri

قبل از اينكه شما بگي ..اين كار رو انجام دادم...نشد  :ناراحت:  :خیلی عصبانی:

----------


## javaphantom

> قبل از اينكه شما بگي ..اين كار رو انجام دادم...نشد


jar فایلی که ساختی رو بزار توی سایت همراه با source تا بهت بگم چی کار باید بکنی

----------


## maamiri

لطفا آدرس mail تو بزار تا برات بفرستم.

----------


## javaphantom

> لطفا آدرس mail تو بزار تا برات بفرستم.


همینجام می تونستی بزاری ولی خوب 
javasurgeon@yahoo.com

----------


## maamiri

برات ميفرستم.اما يك سوال دارم ازت...
بجز اين روشي كه session روشهاي ديگه اي هم وجود داره؟اگه هست اسمشون رو بگو تا در باره شون مطالعه كنم. :متفکر: 
باز هم ممنون :قلب:

----------


## javaphantom

> برات ميفرستم.اما يك سوال دارم ازت...
> بجز اين روشي كه session روشهاي ديگه اي هم وجود داره؟اگه هست اسمشون رو بگو تا در باره شون مطالعه كنم.
> باز هم ممنون


اگر منظورت JNDI هست که کجاها بدرد می خوره اون بار توضیح دادم ولی خوب این بار بیشتر می گم
هر موقع که ما بخواهیم از یک JVM به یک یا چند JVM دیگه در تماس باشیم یعنی ارتباط داشته  باشیم سراغ   JNDI می ریم.
در RMI همانطور که گقتم چون بحث ارتباط بین دو JVM جدا از هم هست مثل همون چی که اول گفته هام بهش اشاره کردم سراغ JNDI می ریم.
اما چیزی که  ‌EJB یا همان Enterprise Java Beans ها رو بسیار قدرت مند کرده وباعث شده که هیچ تکنولوژی نتونه فعلا با اون مقابله کنه وجود container اون هست. شما وقتی که با EJB می خواهید کار کنید بصورت ناخودآگاه مجبوری  با خیلی از مفاهیم Java EE هم بصورت عملی و هم بصورت تئوری در گیر بشی. برای مثال همین JNDI+RMI و به دنبال اون JTA یاه همان Java Transaction API و بعد از اون بدون اینکه متوجه بشی JMS یا Java Message Service که همگی شامل تکنولوژی های Java EE هست و کلی مطلب پشتش هست که وقتی حساب می کنی می بینی بابا همون ASP عقب مونده بهتر از همشونه یا PHP. اکثر کسانی هم که من می بینم که در لایه JEE کار می کنند برای فرار از این مفهومات و تکنولوژی های J2EE  که پیش نیاز همه آنها داشتن سواد آکادمیک هم در معقوله سخت افزار و هم در معقوله نرم افزار + تجریه زیاد در مورد پیاده سازی وداشتن دانش در مورد تحلیل و طراحی سیستم های نرم افزاری هست. چون بسیار در این مطالب فقیر هستند البته به کسی بر نخوره من منطورم خودم هستش تصور و درکشون از تکنولوژی و زبان قابل فهم نیست بطوری که فقط طرف دنباله کد می گرده. برنامه ای نوشتم که این کار و می کنه. برنامه برای من بنویسد که این کار رو بکنه. نیاز به کد دارم. زبان جاوا قدرت مند چون بعد می بینی رفته کتاب نشته ترجمه کرده و به خیالش کلی کار انجام داده در صورتی که کسی که تحصیلات آکادمیک گزونده باشه می فهمه که چه زبانی خوب می گن و باید چه خصوصیاتی داشته باشه و انتخاب زبان خودش برای معمار و تیم طراحی یک هنره. نه اینکه طرف چون delphi بلده هرچی پروژ دید بگه من با delphi انجام می دم یا جاوا یا C#‎ یا هرچی. و طرف دائم دنبال کد باشه.
بحث بعدی که می خوام بگم اینکه چیزی که تکنولوژی های java EE رو پیاده سازی می کنه زبا جاواست. برای همینه که این زبان انقدررو به محبوبیت داره می ره و البته کامل بودن اون نسبت به دیگر زبانهای object orientedی. چون C#‎ هم کپی جاوا بصورت ناقص هست ولی چون از لجاظ تکنولوژی ضعیفه برای همین پروژهای سازمانی با اون پیاده سازی نمشه. 
بحث بعدی که می خوام بگم از همه اینها مهمتره و اون بحث استاندارد بودن هست. شما شاید توی یک شرکتی کار کنی که اون شرکت برای تامین یک سری از نیازهاش بشینه و یک سری component یا framework درست کنه. وقت می بره هزینه داره کار جای ارزش داره ولی یک ضعف بزرگ داره که همرو می بره زیر سوال و اون استاندارد نبودن محصول هست. چرا؟ چون یک محدود به همون شرکت و تیم اون شرکت هست. غیرقابل گشترش و قدرتمندتر شدن این محصول هست. چون تیم طراحی هر چی بلد بوده دیگه پیاده سازی کرده اون استاندارد نیست از بیرون هم نمی شه کاری کرد باید یک تیم بیاد کلی هزینه کنه تا ببینه داستان چی بوده و چی می خواد بشه. از همه مهمتر عدم پشتیانی از محصول هست. چون استاندارد نیست پشتیانی هم نمی شه صورت گرفت. کلی باید هزینه بشته که اون تیم محصول رو روپا نگه داره. کسانی که الان توی شرکتهای IT درحال کار هستند ۱۰۰٪ متوجه حرف من می شن. شرکت از محصول غیر استاندردش داره نون می خوره. تیم همه فکر و ذکرش محصول غیر استانداردش هست. در نتیجه همیشه داره عقب می ره. و بعد از یک مدت خودشو محصولش محو می شن تمام اینها رو گفتم که برم سراغ ejb و بگم این مصحول اسناندارد هست. مثلا فریم ورک ejb3 طبق استانداردهای JCP و تولید شرکت IBM  هست. بعد می بینی بیش از ۳۰۰ شرکت  ITو مخابراتی دارن روی این محصول کار می کند. براساس یکسری استاندارد که از طرف سان JCP داره مدیریت می شه درنتیجه پشتیانی هم بوجود می یاد و رقبا یکی یکی از گردونه خارج می شن.
ejb container خیلی از پیچیده گی های کد نویسی رو از بین برده ولی کلی مفهوم هم کنارش گذاشته + اینکه در صورتی که شما خواستید می تونید به لایه های پایین تر هم دسترسی داشته باشید. ejb3 بر اساس RMI هست + کلی از پیچیده گیهای RMI رو حل کرده. شما یک بار برو RMI بخون و با API های اون کار کن بعد بیا دباره سراغ EJB بعد می تونی ببینه کلی بیل زدن رو برات بیل زده ولی باز دستت باز هست. شرطش دونستن کد نیست. اشتباهی هست که کسانیکه تازه واحد C++‎ رو پاس کردن می خوان بیان سراغ جاوا همینه که فکر می کنند که جاوا یک زبانی آموزشی هست در صورتی که جاوا یک زبان تجاری هست و باید ازش پول درآورد. گاسلینگ کسی که تئوریزیسین سان هست خودش می گه زبان وسیلست، هدف نیست. دونستن مفاهیمه که می تونه به شما کمک کنه که یک پروژه رو جلو ببرید و از تکنولوژی درست استفاده کنید. کد زدن که کاره هیمن کسانی هست که توی این فروم هم زیاد هستند. دائم دنبال کد هستند. این آدمها رو کلا با ماهی ۵۰۰ با ۶۰۰ هزارتومان استخدادم می کنی می شینن برات کد می زنند. مثل کارگرهای ساختمان که دارن جوش می دن وآجر می دازن بالا.
من پیشنهادم به شما اینکه حالاکه تصمیم گرفتید بهصورت مفهومی جلو بیایید و فهمیدید که راه چاره کد نیست بلکه مطالعه هست
کتابهای زیادی هست که می تونم بهتون معرفی کنم که بخونید. ولی مهم اینه که من بدون شما چقدر از لحاظ پایه ای قوی هستید.
دنبال چی هستید؟
در مورد RMI مطالعه بکنید اونجاهم گیره JNDI می افتی و همچنین JMS همنطور

----------


## javaphantom

چیزی که یادم رفت بگم اینکه این بحث بین من وشما خصوصی شده. هیچ کس نمیاد یک نظری بده یا حرفی بزنه. در صورتکی این همه اساتید اینجا هستند. واقعا حیفه . من شاید درام اشتباه می گم یا دارم اشتباه راهنمایی می کنم؟!

----------


## maamiri

با همه حرفهايي كه زدي موافقم...من تازه به حرفت كه مي گفتي جاوا وسيلست و هدف نيست پي بردم...جاوا واقعا يك معماري بزرگه كه جزء به جزءش مهمه و بايد تمام اجزاء اون رو شناخت...
والا نمي خوام خالي ببندم و يا قلو كنم اما من تئوري جاوا رو بر عكس خيلي ها بلدم اما چطور پياده كردنش رو بلد نيستم...مثلا به همين jndi كه بحشو داريم ميكنيم نگاه كن من ميدونستم كه چيه و چيكار ميكنه اما روش پياده كردنش رو بلد نبودم.با اين اوصاف فكر ميكنم اينكه ميگيد 1 يا دو سال طول ميكشه تا آدم به يه جايي برسه در جاوا واقعا راسته..
اون چيزي رو هم كه گفتي اين بحث خصوصيه اشتباهه..اينقدر اين بحث كاربرديه كه متمعنم اگر كسي مثل من اين مشكل رو داشته باشه و بياد تو اين بخش حتما مثل من مشكلش حل ميشه
امروز persistence رو هم پياده كردم ...هم تونستمquery بگيرم و هم اطلاعات وارد ديتا بيس mysql بكنم...البته اون بحث قبلي بود كه قبلا پرسده بوم و جواب دادي ...كلي آدم كيف ميكنه وقتي به جواب ميرسه...اينهم به لطف و كمك شما بود....الان ميدونم از جاوا و مفاهيمش چيز زيادي نمي دونم و بايد كلي مطالعه داشته باشم...يك عالمه مممنون :قلب:  :تشویق:

----------


## cups_of_java

حرف های javaphantom درسته. بزار من نقطه نظرامو اضافه کنم.
اول اینکه Java EE فقط به EJB منتهی نمی شه. EJB قطره ای از این دریاست. درسته EJB استاندارده اما از اول اینقدر خشن و خشک بوده که مخالفانشم کم نبودن. امکاناتی که EJB می خواسته در اختیار نرم افزارهای سازمانی بزاره اینقدر وسیع و پیچیده بوده که در نسخه های ابتداییش نتونست اونا رو درست جمع کنه. EJB برای همه همیشه گنده بوده. سخت بوده. از هر جهت (هم پیاده سازی، هم تکنیکی و کاربردی) تمام تلاش Sun و بقیه تو JCP این بوده که EJB رو آسون کنن. طوری که پیچیدگی هاش رو بشه مدیریت کرد. کم کم دارن این کارو می کنن البته. اما همین مسائل به مرور زمان موج دیگه ای رو درست کرده که به جای استفاده از EJB از فریم ورک های غیر containerی مثل Spring استفاده می کنن که تعدادشون هم اصلن کم نیست. پیچیدگی و تنوع تو محیط های جاوا خیلی زیاده! برا همین هر کسی از پسش بر نمیآد. Springی ها هم به خاطر زیاد شدنشون به نوعی استاندارد شدن هرچند که تو SUN گروه JSR ندارن ;) وجود همین فریم ورک ها اصلن به Java EE کمک کرد تا بلوغ پیدا کنه. ایده های Hibernate و Spring و ... توی Java EE الان اومده در قالب JSR استاندارد شده! این خیلی قشنگه! تجارب موفق هستن که تکنولوژی رو می سازن!

در مورد Containerی بودن Java EE این که این روش خیلی مزایا داره اما معایبی هم داره (برا همین برخی نمی پسندش، البته واضحه وقتی تو می خوای کشتی سواری کنی باید منتظر دریا گرفتگی هم باشی)، هر دو طرف قضیه رو باید درک کرد. Containerی بودن تست و debug نرم افزار رو بسیار پیچیده و سخت تر می کنه. پیچیدگی های محیط اجرا رو بالا می بره و ... ولی خب بدون container هم گاهی اصلن نمی شه زنده موند ;)

حرف آخرم هم در مورد JNDI هستش. JNDI هیچی نیست جز یه سری API استاندارد و ساده برای دسترسی به سرویس ها و یا دایرکتوری ها. برای اینکه تو جاوا برای اتصال به سرویس هایی مثل Ldap، RMI، CORBA، DNS و یا هر سرویس دیگه ای مثل ConnectionPoolها و EJBها و ... یک و فقط یک راه ساده و استاندارد باشه JNDI رو طراحی کردن. JNDI باعث می شه کد تو بدون دونستن جزییات پیاده سازی سرویس (برای دسترسی به اون سرویس) بتونه به سرویس دسترسی داشته باشه. حالا تو RMI و یا EJB هم همین کاربرد رو داره. تا باهاش کار نکنی خوب برات جا نمی افته در حالی که چیز خاصی نیست.

----------


## maamiri

میدونم که مثلا میشه از jndi برای اتصال به ldap استفاده کرد و مجوزهای سرور مثل یوزرنیم و پسوورد رو از اون گرفت برای همین یک سرور ldap روی لینوکس ubuntu در خونه راه انداختم که بعدا به اون join بشم از ejb اما فعلا تو پیاده کردن jndi مشکل دارم.
javaphantom  عزیز متوجه شدی مشکل من در پیاده کردن jndi چی بوده.فایل رو mail کردم :ناراحت:

----------


## javaphantom

> میدونم که مثلا میشه از jndi برای اتصال به ldap استفاده کرد و مجوزهای سرور مثل یوزرنیم و پسوورد رو از اون گرفت برای همین یک سرور ldap روی لینوکس ubuntu در خونه راه انداختم که بعدا به اون join بشم از ejb اما فعلا تو پیاده کردن jndi مشکل دارم.
> javaphantom  عزیز متوجه شدی مشکل من در پیاده کردن jndi چی بوده.فایل رو mail کردم


من از کسی  ‌emailی دریافت نکردم :متفکر:

----------


## maamiri

فكر كنم آدرسي كه دادي اشتباهه..لطف كن يك بار ديگه چك كن آدرس و mailات رو..من دوباره فرستادم...ممنون

----------


## javaphantom

> فكر كنم آدرسي كه دادي اشتباهه..لطف كن يك بار ديگه چك كن آدرس و mailات رو..من دوباره فرستادم...ممنون


همانطور که گفتم مشکل شما بخاطر نتظیمات classpath هست. این IDE ها سم هستند برای کسانی که حتی ۲ بار بصورت syntaxی یک پروژه را تا مرحله اجرا نیاورده باشند. من به شما خرده نمی گیرم چون واقعا حق دارید.

من دیروز یک email خصوصی از جناب mazdadoost گرفتم که حرفهای خیلی خوبی زده بود و ای کاش اونرا ایجا یک بار دیگه برای همه بازتاب می کرد.

بگذریم بریم سراغ جواب.
آقا توی netbeans در قسمت client تون وقتی clean and build  می کنی یک فلدر کنار باقی داستانت درست می کنه به نام dist که وقتی وارد این فلدر می شی یک jar فایل می بینی. شما بیا کنار این jar فایل یک فلدر درست کن  با نام lib داخل این فلدر lib بیا این سه تا jar فایل رو کپی کن. از توی glassfish/lib همون دوتا فایل appserv-rt.jar و javaee.jar بعد برو توی پروژه ejb ی که ساختی، اونم یک فلدر به نام dist درست کرده که یک jar فایل با نام EJBHello برات ساخته دیگه ، اون jar فایل هم کپی کن کنار اون دوتا توی فلدر  lib خوب. این مرحله اول.
مرحله دوم بر می گرد به زمان java se و jar فایل درست کردن. دیگه ربطی به زبان نداره.
با یک برنامه که بتونه rar فایل باز کنه پروزه client رو که در کنار فلدر lib هست باز کن. وارد فلدر META-INFش بشو بعد اونجا یک فایل هست به نام MANIFEST.MF وارد اون فایل بشو در آخرین خط این فایل class-path رو معرفی کن چه جوری ؟ این جوری
Class-Path: lib/appserv-rt.jar lib/javaee.jar lib/EJBHello.jar 

نکات زیر رو حتما چک کن. بعد نوشتن این مزخرافات حتما یک enter بزن که یک خط پایین بیایی. بعد فایل رو save کن.
نکته بعدی مطمعن شو که فایل تو، توی jar فایل save یا همان update شده. البته بستگی به نرم افزاری داره که داره داخل جر فایل رو بهت نشون می ده.
بعد مطمعن شو که ejb تو در web app ی که داری deploy شده
بعد با دستور
java -jar ApplicationClientHello.jar درهمون فلدر dist که مربوط به client هست برنامت رو اجرا کن

----------


## maamiri

ممنون از اين كه وقت گذاشتي برام...
من تقريبا اين كار ها رو انجام دادم بجز تغييرات در فايل manifist...يك كار ديگه كه من اشتباه كردم اين بود كه classpath رو از داخل terminal لينوكسم انجام مي دادم نه دا خل فايل..ممنون .مرحله به مرحله چك ميكنم. :تشویق: 
 :بوس:

----------


## maamiri

فکر کنم من یکمی بدشانسم :متعجب: 
آدرسا رو set کردم آما این پیغام میاد.
Could not find the main class: applicationclienthello.Main lib/appserv-rt.jar lib/javaee.jar lib/EJBHello.jar. Program will exit


یکم این ور و اون ور سایتها رو جستجو کردم .همه همین جوری آدرس دادن.پس مشکل از چیه؟ :گریه: آخه وقتی آدرس درسته چرا میگه فایلها پیدا نشد؟ها ها :گیج: 
خل میشوم... :خیلی عصبانی:

----------


## javaphantom

> فکر کنم من یکمی بدشانسم
> آدرسا رو set کردم آما این پیغام میاد.
> Could not find the main class: applicationclienthello.Main lib/appserv-rt.jar lib/javaee.jar lib/EJBHello.jar. Program will exit
> 
> 
> یکم این ور و اون ور سایتها رو جستجو کردم .همه همین جوری آدرس دادن.پس مشکل از چیه؟آخه وقتی آدرس درسته چرا میگه فایلها پیدا نشد؟ها ها
> خل میشوم...


می خوای برات یک برنامه خودم بنویسم با  source ش برات بزارم؟ :لبخند گشاده!:

----------


## maamiri

ممنون .یه جای قزیه میلنگه...
 :قهقهه:

----------


## maamiri

دیدی یک جای قزیه میلنگه... :قهقهه:  :گریه: 
باید دوتا فایل دیگه هم به نامهای appserv-deployment-client.jar    appserv-ext.jar
اضافه می کردم...به هر حال الان مشکلم حل وشد.. :لبخند گشاده!: 
این جریان باعث شد که با deploy کردن و manifest و خیلی چیزای دیگه بیشتر آشنا بشم.
دمت گرم داداش  :قلب:  :بوس: 
بوس بوس

----------

