خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف أحمد مناع في السبت يونيو 29, 2013 12:17 pm

 بسم الله الرحمن الرحيم

اهلا وسهلا بكم أخوانى الكرام ....منذ فترة سأل الزميل reno.vinoos عن كيفية فتح صفحة ويب من الجوال وقد قامت الاخت زهراء مشكورة برفع مثال مفتوح المصدر على المنتدى ...لكن ربما يكون المثال قد أحتوى على كثر من الاكواد و الشفرات التى قد يصعب علينا فهمها ....حاولت بقدر الامكان أن اشرح طريقة الاتصال بالويب على الرابط التالى  لكن الشرح كان يخلوا من كيفية دعم ملفات html ....اليوم ان شاء الله تعالى سنتعلم سويا كيفية فتح موقع بتنسيق html وذلك من خلال المكتبة lwuit و ذلك على النحو التالى :

1_ قم بإنشاء مشروع جديد مع إزالة الخيار Create Hello MIDlet

2_ قم بتحميل المكتبة lwuit من المرفقات ووضعها فى مجلد المشروع ثم قم بادراج المكتبة الى المشروع و ذلك عن طريق تحديد ايقونة Resources فى القائمة الجانبية للمشروع ومن القائمة التى ستظهر أختر الامر Add jar سيتم فتح لك مربع حوارى للتنقل بين الملفات على جهازك أختر منها أختر المكتبة lwuit ثم ok لتجد المكتبة قد اضيفتت للمشروعك .

3_ نقوم بإنشاء فئة MIDlet وذلك من خلال تحديد ايقونة التطبيق ثم كليك يمين ومن القائمة التى ستظهر أختر الامر New ثم الامر MIDlet


سيظهر لك مربع حوارى يطالبك ببعض المعلومات كأسم الملف MIDlet و اسم الكلاس الخاص ب MIDlet ويمكنك تغير البيانات الافتراضية أو تركها كما هى إن شئت ثم قم بالنقر على زر الامر (finsh ) ليتم فتح صفحة كتابة الشفرة كما فى الصور التالية :


4_ نقوم بإستيراد المكتبات التالية :

أ_ استيراد الكائنات التابعة للمكتبة lwuit

الرمز:
import com.sun.lwuit.Display;
import com.sun.lwuit.html.DocumentInfo;
import com.sun.lwuit.html.DocumentRequestHandler;
import com.sun.lwuit.html.HTMLComponent;
import com.sun.lwuit.layouts.GridLayout;
import com.sun.lwuit.Form;

ويمكن ملاحظة أن تلك المكتبة ليس فقط لدعم ملفات html بل يمكنك استخدامها لانشاء نافذة وقوائم ....الخ وسيتم شرح المكتبة فى درس أخر ان شاء الله تعالى :

ب_ استيراد الكائنات التابعة للمكتبة java.IO

الرمز:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

ج _ استيراد الكائنات التابعة للمكتبة microedition.io

الرمز:
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;


5_ لكى نستطيع قراءة ملفات HTML من أي مصدر محلي أو بعيد من خلال المكتبة lwuit يجب تنفيذ واجهة DocumentRequestHandler لذلك سنقوم بانشاء فئة وليكن بأسم HttpRequestHandler تتضمن تلك الوجهة وذلك باستخدام الكود التالى :

الرمز:
class HttpRequestHandler implements DocumentRequestHandler {

ويجب ملاحظة أن برنامجنا يحتوى على عدة فئات مجتمعة فى ملف واحد و بالتالى فإن الفئة الرئسية التى تحتوى على الدالة main تبدأ بمحدد الوصول public class أى أن الفئة عامه ...وتبدأ جميع الفئات الاخرى بالكلمة المحجوزة class فقط كما هو ظاهر أعلاه

وايضا للإعلان عن الفئة التي تطبق واجهة كما فى مثالنا الحالى يجب تتضمين شرط تنفذ في تعريف فئة أى استخدام الامر implements كما هو ظاهر اعلاه

6_بداخل الفئة السابقة HttpRequestHandler سنقوم بأنشاء طريقة وليكن بأسم getDomainForLinks لها المعامل (URL)والهدف من ذلك الطريقة هو التأكد من صلاحية الرابط المدخل و الحاق بروتوكل الانترنت https أو http للرابط اذ لم يقم المستخدم بادخالة و ذلك على النحو التالى :


الرمز:
static String getDomainForLinks(String url) {
      
String domain = null;
              
 if (url.startsWith("file:")) {
            return "localhost"; // Just a common name to store local files under
        }
 int index = -1;
        if (url.startsWith("http://")) {
            index = 7;
        } else if (url.startsWith("https://")) {
            index = 8;
        }
        if (index != -1) {
            domain = url.substring(index);
            index = domain.indexOf('/');
            if (index != -1) {
                domain = domain.substring(0, index);
            }
        }
        return domain;
    }

7_ بداخل تلك الفئة ايضا سنقوم بتنفيذ واجهة DocumentRequestHandler وذلك من خلال الاسلوب التالى:


الرمز:
public InputStream resourceRequested(DocumentInfo docInfo) {


8_ بداخل الواجهة السابقة سنقوم بكتابة الكود التالى :


الرمز:
InputStream is = null;
        String url = docInfo.getUrl();
        String linkDomain = getDomainForLinks(url);
        String params = docInfo.getParams();
        if ((!docInfo.isPostRequest()) && (params != null) && (!params.equals(""))) {
            url = url + "?" + params;
        }

        try {
            HttpConnection hc = (HttpConnection) Connector.open(url);
            String encoding = null;
            if (docInfo.isPostRequest()) {
                encoding = "application/x-www-form-urlencoded";
            }
            if (!docInfo.getEncoding().equals(DocumentInfo.ENCODING_ISO)) {
                encoding = docInfo.getEncoding();
            }
            String domain = linkDomain;
            domain = domain.substring(domain.indexOf('.'));

            if (encoding != null) {
                hc.setRequestProperty("Content-Type", encoding);
            }

            if (docInfo.isPostRequest()) {
                hc.setRequestMethod(HttpConnection.POST);
                byte[] paramBuf = params.getBytes();
                hc.setRequestProperty("Content-Length", "" + paramBuf.length);
                OutputStream os = hc.openOutputStream();
                os.write(paramBuf);
                os.close();
            }

            String contentTypeStr = hc.getHeaderField("content-type");
            if (contentTypeStr != null) {
                contentTypeStr = contentTypeStr.toLowerCase();

                if (docInfo.getExpectedContentType() ==
DocumentInfo.TYPE_HTML) { //We perform these checks only for text (i.e.
main page), for images/css we just send what the server sends and "hope
for the best"
                    if (contentTypeStr != null) {
  
                      if ((contentTypeStr.startsWith("text/")) ||
(contentTypeStr.startsWith("application/xhtml")) ||
(contentTypeStr.startsWith("application/vnd.wap"))) {
                            docInfo.setExpectedContentType(DocumentInfo.TYPE_HTML);
                        } else if (contentTypeStr.startsWith("image/")) {
                            docInfo.setExpectedContentType(DocumentInfo.TYPE_IMAGE);
                            hc.close();
                        } else {
                            hc.close();
                        }
                    }
                }

                if ((docInfo.getExpectedContentType() == DocumentInfo.TYPE_HTML) ||

                        (docInfo.getExpectedContentType() ==
DocumentInfo.TYPE_CSS)) { // Charset is relevant for HTML and CSS only
                    int charsetIndex = contentTypeStr.indexOf("charset=");
                    if (charsetIndex != -1) {
                        String charset = contentTypeStr.substring(charsetIndex + 8);
                        docInfo.setEncoding(charset.trim());
                    }
                }
            }
            int response = hc.getResponseCode();
            if (response / 100 == 3) { // 30x code is redirect
                String newURL = hc.getHeaderField("Location");
                if (newURL != null) {
                    hc.close();
                    docInfo.setUrl(newURL);
                    return resourceRequested(docInfo);
                }
            }
            is = hc.openInputStream();

        } catch (IOException e) {
            System.out.println("HttpRequestHandler->IOException: " + e.getMessage());
        } catch (IllegalArgumentException e) { // For malformed URL
            System.out.println("HttpRequestHandler->IllegalArgumentException: " + e.getMessage());
        }
        return is;
    }


نستخدم الكود السابق للحصول على InputStream من الوثيقة المحدد من خلال رابط الموقع...وهى الملفات HTML ...حيث يتم تخزين المعلومات الوثيقة المطلوبة في كائن DocumentInfo، والتي يتم ملؤها تلقائيا باستخدام HTMLComponent. القيم DocumentInfo يمكن استخدامها لتحديد مسار المستند أو اسم الملف ....الخ

ولمعرفة كيفية قراءة الملفات من خلال المكتبة JAVA.IO يمكنك زيارة الدرس الموجود على الرابط هذا

9_ داخل الطريقة void startApp نقطة البداية للتطبيق نقوم بكتابة الكود التالى :


الرمز:
public void startApp() {
        Display.init(this);
        HttpRequestHandler handler = new HttpRequestHandler();
        HTMLComponent htmlC = new HTMLComponent(handler);
        htmlC.setPage("http://google.com");

        Form form = new Form("MyTitle");
        form.setLayout(new GridLayout(1, 1));
        form.addComponent(htmlC);
        form.show();
    }

_ فى السطر الثانى من الكود قمنا باستخدام الكائن Display و الذى يقوم بتهئة المورد MIDlet فى بداية التطبيق

_ السطر الثالث اشتقاق كائن جديد من HttpRequestHandler ....وايضا السطر الرابع الاعلان عن الكائن HTMLComponent و اشتقاق كائن جديد منه مع تمرير الكائن المشتق من HttpRequestHandler الية ....السطر الخامس أستخدمنا الطريقة setPage التابعة للكائن HTMLComponent و التى تقبل نص تحتوي على URL الخاص الموقع المراد فتحة ...

السطر السادس قمنا بإنشاء نافذة باستخدام المكتبة lwuit.Form وذلك الاحتواء صفحة HTML باستخدام الطريقة addComponent


و اليكم الكود بالكامل لفتح صفحة ويب للجولات :


الرمز:
import javax.microedition.midlet.*;
import com.sun.lwuit.Display;
import com.sun.lwuit.html.DocumentInfo;
import com.sun.lwuit.html.DocumentRequestHandler;
import com.sun.lwuit.html.HTMLComponent;
import com.sun.lwuit.layouts.GridLayout;
import com.sun.lwuit.Form;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;


 class HttpRequestHandler implements DocumentRequestHandler {

    static String getDomainForLinks(String url) {
        String domain = null;
        if (url.startsWith("file:")) {
            return "localhost"; // Just a common name to store local files under
        }
        int index = -1;
        if (url.startsWith("http://")) {
            index = 7;
        } else if (url.startsWith("https://")) {
            index = 8;
        }
        if (index != -1) {
            domain = url.substring(index);
            index = domain.indexOf('/');
            if (index != -1) {
                domain = domain.substring(0, index);
            }
        }
        return domain;
    }

    public InputStream resourceRequested(DocumentInfo docInfo) {
        InputStream is = null;
        String url = docInfo.getUrl();
        String linkDomain = getDomainForLinks(url);
        String params = docInfo.getParams();
        if ((!docInfo.isPostRequest()) && (params != null) && (!params.equals(""))) {
            url = url + "?" + params;
        }

        try {
            HttpConnection hc = (HttpConnection) Connector.open(url);
            String encoding = null;
            if (docInfo.isPostRequest()) {
                encoding = "application/x-www-form-urlencoded";
            }
            if (!docInfo.getEncoding().equals(DocumentInfo.ENCODING_ISO)) {
                encoding = docInfo.getEncoding();
            }
            String domain = linkDomain;
            domain = domain.substring(domain.indexOf('.'));

            if (encoding != null) {
                hc.setRequestProperty("Content-Type", encoding);
            }

            if (docInfo.isPostRequest()) {
                hc.setRequestMethod(HttpConnection.POST);
                byte[] paramBuf = params.getBytes();
                hc.setRequestProperty("Content-Length", "" + paramBuf.length);
                OutputStream os = hc.openOutputStream();
                os.write(paramBuf);
                os.close();
            }

            String contentTypeStr = hc.getHeaderField("content-type");
            if (contentTypeStr != null) {
                contentTypeStr = contentTypeStr.toLowerCase();

                if (docInfo.getExpectedContentType() ==
DocumentInfo.TYPE_HTML) { //We perform these checks only for text (i.e.
main page), for images/css we just send what the server sends and "hope
for the best"
                    if (contentTypeStr != null) {
  
                      if ((contentTypeStr.startsWith("text/")) ||
(contentTypeStr.startsWith("application/xhtml")) ||
(contentTypeStr.startsWith("application/vnd.wap"))) {
                            docInfo.setExpectedContentType(DocumentInfo.TYPE_HTML);
                        } else if (contentTypeStr.startsWith("image/")) {
                            docInfo.setExpectedContentType(DocumentInfo.TYPE_IMAGE);
                            hc.close();
                        } else {
                            hc.close();
                        }
                    }
                }

                if ((docInfo.getExpectedContentType() == DocumentInfo.TYPE_HTML) ||

                        (docInfo.getExpectedContentType() ==
DocumentInfo.TYPE_CSS)) { // Charset is relevant for HTML and CSS only
                    int charsetIndex = contentTypeStr.indexOf("charset=");
                    if (charsetIndex != -1) {
                        String charset = contentTypeStr.substring(charsetIndex + 8);
                        docInfo.setEncoding(charset.trim());
                    }
                }
            }
            int response = hc.getResponseCode();
            if (response / 100 == 3) { // 30x code is redirect
                String newURL = hc.getHeaderField("Location");
                if (newURL != null) {
                    hc.close();
                    docInfo.setUrl(newURL);
                    return resourceRequested(docInfo);
                }
            }
            is = hc.openInputStream();

        } catch (IOException e) {
            System.out.println("HttpRequestHandler->IOException: " + e.getMessage());
        } catch (IllegalArgumentException e) { // For malformed URL
            System.out.println("HttpRequestHandler->IllegalArgumentException: " + e.getMessage());
        }
        return is;
    }
}

public class web extends MIDlet {

    public void startApp() {
        Display.init(this);
        HttpRequestHandler handler = new HttpRequestHandler();
        HTMLComponent htmlC = new HTMLComponent(handler);
        htmlC.setPage("http://google.com");

        Form form = new Form("MyTitle");
        form.setLayout(new GridLayout(1, 1));
        form.addComponent(htmlC);
        form.show();
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
}



و النتيجة كما فى الصور التالية





وفى النهاية ارجوا أن اكون قد وفقت فى الشرح و اعتذر لكم مقدما لعدم قدرتى على شرح بعض الاكواد شرح وافى و ذلك لكونى لاول مرة أتعامل مع المكتبة lwuit



ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف أحمد مناع في السبت يونيو 29, 2013 12:33 pm

المكتبة LWUIT_MIDP فى المرفقات
المرفقات
LWUIT_MIDP.zip لا تتوفر على صلاحيات كافية لتحميل هذه المرفقات.(709 Ko) عدد مرات التنزيل 16

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف أيمن الإبراهيم في السبت يونيو 29, 2013 10:31 pm

مشكور جدا على الشرح

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف لمار عادل في الإثنين يوليو 01, 2013 8:58 am

فيه خطأ بيظهر فى الكود ومش عارفة اية السبب ؟

لمار عادل
..
..

تاريخ التسجيل : 29/05/2013
المساهمات : 28
النقاط : 46
التقيم : 2
الدولة : مصر
الجنس : انثى

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف أحمد مناع في الثلاثاء يوليو 02, 2013 6:46 am

لمار عادل كتب:فيه خطأ بيظهر فى الكود ومش عارفة اية السبب ؟

 الاخت لمار بداية صباح الخيرات ......هل من الممكن تطلعينا على هذا الخطأ لكى يتثنى لنا الاجابة ؟

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف أيمن الإبراهيم في الجمعة سبتمبر 06, 2013 11:44 am

ممكن استاذ احمد تحميل المشروع كامل ولك جزيل الشكر

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مستعرض ويب للجولات باستخدام المكتبة lwuit

مُساهمة من طرف أحمد مناع في السبت سبتمبر 07, 2013 8:46 am

أيمن الإبراهيم كتب:ممكن استاذ احمد تحميل المشروع كامل ولك جزيل الشكر
أرجوا المعذرة فضاء الحفظ للمرفقات قد انتهى ......لذلك جارى حل مشكلة فضاء الحفظ للمرفقات و سيتم رفع المشروع فى اقرب وقت ممكن .......

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى