Связь между JavaScript и PHP через JSON и XMLHttpRequest

👁 426 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан и впервые использован Дугласом Крокфордом.
Несмотря на происхождение от JavaScript, формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих языков существует готовые методы для создания и обработки данных в формате JSON.

Предисловие

В данной статье расматриватся способы взаимодействия между сервером на языке PHP и клиентом на JavaSript.  Связующим звеном между двумя языками может выступать очень удобный формат обмена — JSON. Рассмотрим основные методы и принцип передачи.

Передача данных в формате JSON

Для передачи данных из JavaScript в PHP можно использовать 2 подхода:

  1. реализовать весь код на «голом» JavaScript при помощи объекта XMLHttpRequest;
  2. использовать готовую JavaScript — библиотеку, к примеру jQuery.

1. Реализация запроса на XMLHttpRequest. «Голый» подход

При использовании подхода на голом JavaScript необходимо использовать объект XMLHttpRequest.

Объект XMLHttpRequest (или, сокращенно, XHR) дает возможность браузеру делать HTTP-запросы к серверу без перезагрузки страницы. Несмотря на слово XML в названии, XMLHttpRequest может работать с данными в любом текстовом формате, и даже c бинарными данными. Использовать его очень просто. Различают два использования XmlHttpRequest: синхронное и асинхронное.

Кросбраузерный код для получения объекта XMLHTTPRequest. Хоть сейчас и решены большинство не стыковок совместимости одного и того же кода между разными браузерами, но все же остается проблема и главная причина этому Internet Explorer, который «плывет своим течением». Для решения данной проблемы можно создать кроссбраузерный код, который может выглядеть как:

   function getXmlHttpObject(){
        var xmlHttpObject;
        try {
          xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
          try {
            xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {
            xmlHttpObject = false;
          }
        }
        if (!xmlHttpObject && typeof XMLHttpRequest!=='undefined') {
          xmlHttpObject = new XMLHttpRequest();
        }
        return xmlHttpObject;
    }

Выше приведенный код возвратит объект XMLHttpRequest, соответствующий текущему браузеру.
Синхронный режим. Выше мы привели пример функции, который получает объект XMLHttpRequest, теперь давайте будем использовать ее. Синхронный режим означает, что каждая последующая конструкция кода не будет выполнена, до тех пор, пока текущая не будет закончена. Синхронная передача — это false в 3-м параметре метода open(METHOD, URL, false). В этом примере через XMLHTTPRequest с сервера запрашивается страница example.php, и текст ответа сервера показывается через alert():

    var xmlhttp = getXmlHttpObject();
    var getData = "message=Hello! it is my message!&result=ok";
    xmlhttp.open('GET', 'example.php?'+getData, false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send(null);//Используется только для передачи методом POST
    if(xmlhttp.status >= 200 && xmlhttp.status < 400) {
        var data = JSON.parse(xmlhttp.responseText);//Переводим из JSON в Object
        alert(data.message);//Выводим второй параметр
        alert(data.result);//Выводим первый параметр
    }else
    {
       alert("Error!");//Если ошибка
    }

Следующий способ передачи данных и приема — это использование метода get. Использование get — это простейший способ передачи несложного запроса GET на сервер без необходимости использовать более сложную функцию $.ajax. Он допускает возможность использования одной функции, которая может быть вызвана после окончания запроса (только удачного запроса).

  var jsonData = {"message":"Hello! it is my message!", "result":"ok"};
   var jqxhr = $.get( "example.php", jsonData);
        jqxhr.done(function(responseText) {
        var data = JSON.parse(responseText);//Переводим из JSON в Object
        alert(data.message);//Выводим второй параметр
        alert(data.result);//Выводим первый параметр
    });
    jqxhr.fail(function() {
         alert( "Error!" );//Ошибка
    });
    jqxhr.always(function() {
         alert( "Finished!" );//Сеанс закончен
    });

Наиболее гибкий подход передачи данных методом GET и синхронным способом позволяет метод ajax

   var jsonData = {"message":"Hello! it is my message!", "result":"ok"};
   var getData = "message=Hello! it is my message!&result=ok";
   $.ajax({ url: "example.php", 
        method:"GET",
        async: false,
        data: getData,//или jsonData
        success: function(responseText) {
                var data = JSON.parse(responseText);//Переводим из JSON в Object
                alert(data.message);//Выводим второй параметр
                alert(data.result);//Выводим первый параметр
            },
        error:function(){
               alert( "Error!" );//Ошибка 
           },
        complete:function(){
               alert( "Finished!" );//Сеанс закончен
           }
        });

Серверный PHP код принимает GET — данные от клиента и пересылает обратно клиенту в формате JSON:

//Получаем GET - данные
$message = filter_input(INPUT_GET, "message");//$message = $_REQUEST["message"];
$result = filter_input(INPUT_GET, "result");//$message = $_REQUEST["result"];
//Пересылаем данные в формате JSON
echo json_encode(array("result"=>$result, "message"=>$message));

 

Как прикрепить домен к VPS через IP VPS и NS — сервера регистратора

👁 428 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

На данный момент многие пользователи, когда доходят до того, что границы обычного хостинга исчерпывают свои возможности для нестандартных проектов, переходят на выделенные сервера VPS/VDS. Если кратко, то это голая консольная операционка, чаще всего Ubuntu или Debian, которая работает на виртуальной машине на сервере. Вот для вас и выделяется отдельная такая операционка, на которой ничего нету и вам надо на ней установить все своими руками. В данной статье не будут объяснения как именно добавлять сайт или настроить бд, а покажем как прикрепить сторонний домен к данному голому серверу, если компания, предоставляющая данный сервер, не имеет собстенного NS — сервера. NS — сервер — это сервер, который содержит локальные доменные имена, в данном случае, в пределах зоны выделения доменов или серверов данной фирмой.

Если бы ваша фирма, которая предлагает вам услуги VPS предоставляла еще и NS-сервера, то вам было бы достаточно добавить их в специальной панели у регистратора доменного имени и можно было бы запросто прикрепить данный домен к IP VPS, но бывает так, что данные сервера отсуствуют у фирмы и задачу прикрепления надо решить вам самим.

Предисловие

Существуют несколько способов как прикрепить домен к своему VPS:

  • использовать DNS самой компании, которая предоставляет NS-сервера;
  • использовать сторонние организации, которые предоставляют NS-сервера. Ярым примером можно назвать бесплатную услугу от Яндекса или другие, возможный список которых нашел на Хабре;
  • использовать свои собственный DNS на вашем VDS — придется самим разбираться как это делать и что устанавливать;
  • использовать бесплатный DNS Вашего регистратора, прописав лишь IP своего сервера в настройках делигирования домена;

Самый простой способ — это последний способ. Его легко настроить и он вполне рабочий. Для того чтобы перейти к делу вам необходимо настроить сайт на VDS без доменного имени и убедиться что на сайт можно зайти набрав IP — адрес сервера. Если кратко, то как вариант установить VESTA и настроить все через него. Данная контрольная панель бесплатная и для ее установки набираем в консоли:


curl -O http://vestacp.com/pub/vst-install.sh

Если неизвестная команда curl, устанавливаем curl:

 apt-get curl

Далее устанавливаем скачанный выше VESTA:


sudo bash vst-install.sh

В ходе установки указываем свой рабочий e-mail и соглащаемся со всеми условиями, если таковые будут и на финише мы увидим окно:

vesta-finish-install

т.е. Vesta покажет вам IP-фдрес для доступа к контрольной панели вашего сервера и тот же адрес со всеми данными для входа будет отправлен вам на E-mail, который вы указывали в ходе установки. Далее на контрольной панели Vesta создаем WEB — сайт:

vesta-create-web

Создаем БД тоже и загружем таблицы, если сайт переносится и переходим в раздел DNS. В данном разделе надо добавить доменные имена для сайтов, которые у вас будут на VPS, а их количество зависит от хостов в разделе WEB контрольной панели:

vesta-create-dns

Итак, у нас все есть на VPS и сайт доступен по IP адресу VPS. Осталось прикрепить доменное имя к сайтам.

Необходимо отметить, что сервер может иметь несколько доменных имен, но один IP — адрес. Данный адрес VPS необходимо нам сейчас прописать в настройках делегирования доменного имени сайта регистратора.

Идем на панель управления регитратора доменного имени и нет разницы у кого вы регистрируете данная функция должна быть у всех и все должны предоставить собственные NS — сервера, которые мы не трогаем. Удаляем старый IP, который был там, если вы регистрировали на него хостинг и добавляем новый IP от вашего VPS, как ниже:hoster-add-ip-of-vps

После того, когда все прописано необходимо подождать пока переделегируется домен на новый IP адрес вашего сервера. Это может занять от 20 минут до нескольких часов и все, домен привязан к серверу.

Переменные в C#. Способы объявления массивов

👁 589 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

В C# имеется богатый набор способов объявления этих массивов и иногда путаешься, когда разные языки программирования мелькают перед глазами через промежутки времени, ведь нет же такого, чтобы современный программист работал только с одним языком, а разные языки — это разная философия и методология, хоть и есть одинаковые понятия, подходы и схожесть синтаксиса. Разработчики всегда ищут облегчение процесса и за все время существования C# таких облегчений накопилось столько, что один и тот же вариант можно сделать несколькими способами.

Вступление

Данная статься будет организована попунктно — сначала рассмотрим обобщенно про массивы, а далее перейдем к многомерностям. Данная статья не последняя, могут быть продолжения по схожим тематикам, а C# есть много механизмов, относящихся к структурам(structure), спискам(List), словарям(Dictionary), хэш-таблицы(хэш-таблицы), потокобезопасные коллекции(Concurrent), строго типизированные коллекции(Generic), коллекциям объектной модели(ObjectModel), специализированные коллекции(Specialized). Ну в общем, тема большая и без грамотного составления структуры обучения будет очень сложно все это понять.

Способы объявления и инициализации одномерных массивов в C#

Давайте сразу скажем, что в C# имеются 5 способов объявления и инициализации массивов:

  1. Инициализировать при объявлении без спецификация ранга. При данном подходе индекс во второй части опускается и он берется автоматом при подсчете значений инициализации:
    int[] myArray = new int[] { 1, 3, 5, 7, 9};

     

  2. Инициализация без указания повтора типа переменных после равенства. При данном походе размер массива также, как и в первом случае, рассчитывается автоматом, исходя из количества значений, участвующих в инициализации переменных внутри массива:
    string[] myArray = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

     

  3. Можно объявить переменную массива без инициализации, но при присвоении массива этой переменной нужно использовать оператор new:
    int[] myArray;
    myArray = new int[] { 1, 3, 5, 7, 9 };

     

  4. В C# массивом может быть не только любой базовый тип, но и класс. В понимании C# типом считается и класс, в том числе:
    class MyType{
        public string mField;
    }
    MyType[] myArray = new MyType[10];
    MyType myTypeVar0 = new MyType();
    myTypeVar0.mField = "Text 0";
    MyType myTypeVar1 = new MyType();
    myTypeVar1.mField = "Text 1";
    ...
    myArray[0]=myTypeVar0;
    myArray[1]=myTypeVar1;
    ...
  5. В C# массив может принимать любой тип данных, если при инициализации указать тип object. Данный тип является родоначальником всех типов и поэтому может принимать любой тип:
    object[] myArray = new object[]{1, "text", 1.2, 'A'};

Способы объявления и инициализации многомерных массивов в C#

На самом деле, тут не будет какой-то новый подход инициализации многомерных массивов, потому что нет отличий от одномерных. Создавая многомерный массив мы должны понимать, что создаем те же одномерные массивы, но в комплексе одной переменной.

  1. Многомерный массив в C# может иметь много измерений до бесконечности, но больше 2-х на практике редко используются:
    int[] myArray1 = new int[4];//Массив 1-го измерения
    int[,] myArray2 = new int[4, 5];//Массив 2-го измерения
    int[,,] myArray3 = new int[4, 5, 7];//Массив 3-го измерения
    int[,,,] myArray4 = new int[4, 5, 7, 9];//Массив 4-го измерения
    ...

     

  2. Массив можно инициализировать при объявлении, как показано в следующем примере:
    int[,] myArray2 = new int[2, 2]{{1, 5}, {6, 8}};//Массив 2-го измерения

     

  3. Можно опустить указание размерности:
    int[,] myArray2 = new int[ , ]{{1, 5}, {6, 8}};//Массив 2-го измерения

     

  4. Если нужно создать переменную массива без инициализации, то необходимо использовать оператор new:
    int[,] myArray2;
     myArray2 = new int[ , ]{{1, 5}, {6, 8}};//Массив 2-го измерения

     

  5. Следующий пример присваивает значение конкретному элементу массива:
    int[,] myArray2 = new int[2 , 2];//Массив 2-го измерения
    myArray2[1, 2] = 10;//Инициализируем отдельный элемент в массиве

     

Способы объявления и инициализации массивы массивов в C#

Массив массивов — это массив, элементы которого сами являются массивами. Элементы массива массивов могут иметь различные размеры и измерения. Массивы массивов иногда также называются «невыровненными массивами». В следующих примерах показано, как выполняется объявление, инициализация и доступ к массивам массивов.

  1. Ниже показано объявление одномерного массива, включающего три элемента, каждый из которых является одномерным массивом целых чисел:
    int[][] myArray = new int[3][];

     

  2. Перед использованием jaggedArray его элементы нужно инициализировать. Сделать это можно следующим образом:
    myArray[0] = new int[5];
    myArray[1] = new int[4];
    myArray[2] = new int[2];

     

  3. Для заполнения элементов массива значениями можно также использовать инициализаторы, при этом размер массива знать не требуется:
    myArray[0] = new int[] { 1, 3, 5, 7, 9 };
    myArray[1] = new int[] { 0, 2, 4, 6 };
    myArray[2] = new int[] { 11, 22 };

     

  4. Также массив можно инициализировать путем объявления:
     int[][] myArray = new int[][] 
    {
        new int[] {1,3,5,7,9},
        new int[] {0,2,4,6},
        new int[] {11,22}
    };

     

  5. Также можно использовать сокращенную форму. Обратите внимание, что при инициализации элементов оператор new опускать нельзя, так как инициализации по умолчанию для этих элементов не существует:
      int[][] myArray = 
    {
        new int[] {1,3,5,7,9},
        new int[] {0,2,4,6},
        new int[] {11,22}
    };

     

  6. Разреженный массив является массивом массивов и поэтому его элементы являются ссылочными типами и инициализируются значением null:
    myArray[0][1] = 77;
    myArray[2][1] = 88;

     

  7. Массивы массивов можно смешивать с многомерными массивами. Ниже показано объявление и инициализация одномерного массива массивов, состоящего из трех двумерных элементов различного размера:
    int[][,] myArray = new int[3][,] 
    {
        new int[,] { {1,3}, {5,7} },
        new int[,] { {0,2}, {4,6}, {8,10} },
        new int[,] { {11,22}, {99,88}, {0,9} } 
    };

     

  8. Доступ к отдельным элементам выполняется как показано в примере ниже, где отображено значение элемента [1,0] первого массива (значение 5):
    System.Console.Write("{0}", myArray[0][1, 0]);

     

  9. Метод Length возвращает число массивов, содержащихся в массиве массивов. Например, если объявить предыдущий массив, мы получим следующее:
    System.Console.WriteLine(myArray.Length);

Часть 1. Что такое RSA

👁 147 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи факторизации больших целых чисел. Криптосистема RSA стала первой системой, пригодной и для шифрования, и для цифровой подписи. Алгоритм используется в большом числе криптографических приложений, включая PGP, S/MIME, TLS/SSL, IPSEC/IKE и других или читайте далее из Wikipedia.

Как появился RSA?

Дата начала данного алгоритма уходит к далекому 1976 году, когда в ноябре этого года появилась опубликованная статья Уитфилда Диффи и Мартина Хеллмана под заголовком «Новые направления в криптографии» (англ. New Directions in Cryptography). В то пору, это был новый подход в криптографии, перевернувший представление о криптографических системах, заложив основы к использованию открытых ключей в криптографии.

Разработанный впоследствии алгоритм Диффи — Хеллмана позволял двум сторонам получить общий секретный ключ, используя незащищенный канал связи. Однако этот алгоритм не решал проблемуаутентификации. Без дополнительных средств пользователи не могли быть уверены, с кем именно они сгенерировали общий секретный ключ.

Изучив эту статью, трое учёных Рональд Ривест, Ади Шамир и Леонард Адлеман из Массачусетского технологического института (MIT) приступили к поискам математической функции, которая бы позволяла реализовать сформулированную Уитфилдом Диффи и Мартином Хеллманом модель криптографической системы с открытым ключом. После работы над более чем 40 возможными вариантами им удалось найти алгоритм, основанный на различии в том, насколько легко находить большие простые числа и насколько сложно раскладывать на множители произведение двух больших простых чисел, получивший впоследствии название RSA. Система была названа по первым буквам фамилий её создателей.

В августе 1977 года в колонке «Математические игры» Мартина Гарднера в журнале Scientific American, с разрешения Рональда Ривеста появилось первое описание криптосистемы RSA. Читателям также было предложено дешифровать английскую фразу, зашифрованную описанным алгоритмом.

Описание и понимание алгоритма RSA

Алгоритм RSA основан на трудности разложения на множители больших чисел, которые имеют 2 и только 2 фактора (простых чисел). Система работает на открытом и закрытом ключах (Public and Private keys). Открытый ключ доступен для всех. С этим ключом пользователь может зашифровать данные, но не может расшифровать их и это может только пользователь, у кого закрытый ключ, который, с помощью этого ключа, умеет расшифровать их . Конечно, теоретически их может расшифровать и обычный пользователь с публичным ключом, но это экстремально сложно — генерировать закрытый ключ из открытого. Данный метод зашифровки и расшифровки данных пользователей носит название алгоритма RSA, который очень популярен в зашифровке данных на данный момент. Безопасность RSA зависит от вычислительной сложности факторизации больших чисел.

Генерация двух больших простых чисел

Для того, чтобы привести простой пример будем использовать небольшие цифры, но отметим, что в реальности это не безопасно. Чтобы найти случайные простые числа, мы начнем с случайного числа и поднимемся по возрастанию до нечетного числа, пока мы не найдем простое число. Пусть имеем:


p = 7
q = 19

Пусть n = p*q:


n = p*q = = 7 * 19 = 133

Пусть m = (p – 1)(q – 1):


m = (p – 1)(q – 1) = (7 – 1)(19 – 1) = 6 * 18 = 108

Возьмем маленькие числа e до значения числа m. Числа e – простые по отношению к m и не превышают его значение, это означает, что большое число, которое может точно разделиться как e, так и на m (их наибольший общий делитель, или НОД) равен 1. Алгоритм Евклида используется для поиска наибольшего общего делителя двух чисел, но детали здесь опускаются. Отсюда имеем:


e = 2 => gcd (e, 108) = 2 (нет)
e = 3 => gcd (e, 108) = 3 (нет)
e = 4 => gcd (e, 108) = 4 (нет)
e = 5 => gcd (e, 108) = 1 (да!)

 Находим такое число d, что d*e % m = 1(т.е., чтобы он разделился без остатка). Это эквивалентно нахождению d, удовлетворяющую d*e = 1 + n*m, где n – любое целое число. Мы можем переписать это как d = (1 + n*m) / e. Теперь мы работаем через значения n до целочисленного решения, т.е. пока не будет найдено целочисленное деление:


n = 0 => d = 1 / 5 (нет)
n = 1 => d = 109 / 5 (нет)
n = 2 => d = 217 / 5 (нет)
n = 3 => d = 325 / 5 = 65 (да!)

Для выполнения этого действия с большими числами необходимо использовать алгоритм Евклида.

Открытый ключ (Public key) будет равен:


n = 133
e = 5

 Закрытый ключ (Private key) будет равен:


n = 133
d = 65

Небольшой пример зашифровки и дешифровки алгоритмом RSA

Зашифровка. Сообщение должно быть числом, меньшим, чем p и q. Тем не менее, на данный момент мы не знаем р или q, поэтому на практике нижняя граница р и q должны быть опубликованы. Это может быть несколько ниже их реального значения и поэтому не является главным вопросом безопасности. Для этого примера, будем использовать сообщение «6».


C = p * e % n = 65 % 133 = 7776 % 133 = 62

Дешифровка. Это работает очень похоже на процесс шифрования, но включает в себя большое распределение, которое разбивается на несколько шагов.


P = C*d % n = 6265 % 133 = 62 * 6264 % 133 = 62 * (622)32 % 133 = 62 * 384432 % 133 = 62 * (3844 % 133)32 % 133 = 62 * 12032 % 133

Теперь повторим последовательность операций, снижения 6265 до 12032, чтобы уменьшить показатель до 1.


...= 62 * 3616 % 133 = 62 * 998 % 133 = 62 * 924 % 133 = 62 * 852 % 133 = 62 * 43 % 133 = 2666 % 133 = 6

И то, что получилось мы ставим в начало открытого текста, вот так алгоритм и работает.

Графический редактор на JavaScript. Часть 1. Введение

👁 388 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Данный цикл статей будет относится к проектированию простого графического редактора на основе клиентского языка JavaScript и серверного языка PHP. Графический редактор будет иметь возможность создавать простейшие примитивы: линия, эллипс, прямоугольник, многоугольник. Опишем возможность добавления, редактирования и удаления примитивов из текстового файла. Прорисовка примитивов будет производиться средствами HTML5 Canvas. HTML5 интегрирован с языком JavaScript и позволяет нам напрямую использовать API Canvas.

1. Клиентская часть на JavaScript

Клиентская часть, как известно, выполняется в браузера удаленного пользователя и для того, чтобы пользователь имел возможность редактировать файл на сервере необходимо будет иметь постоянную связь с PHP скриптом, для передачи параметров интерактивного редактирования примитива. Для этого будем использовать технологию ассинхроной связи с сервером AJAX. Для кроссбраузерной совместимости будем сразу использовать какую-нибудь библиотеку JavaScript, чтобы не отвлекаться на ненужные приемы совместимости и лучщим решением будет jQuery.

2. Серверная часть на PHP

Серверная часть будет написана на PHP. Необходимость в использовании PHP обусловлено тем, что JavaScript не имеет возможности работать с файлами: записывать, удалять, редактировать… Поэтому использование серверного языка — это одна из необходимостей для создания и редактирования графического файла, в котором будут храниться наши данные.

3. Расширение файла

Для того, чтобы сохранить наши примитивы для передачи между пользователями будем использовать обычный текстовый файл с расширением *.sgf(Simple Graphic Format). Название расширения не играет роли, можно любое, которое угодно вам и от этого файл не перестает быть текстовым. Другое дело — это , если бы мы использовали бинарный файл с 16-ричными значениями, но нас сейчас интересует первый вариант в виду легкости разработки и быстроты реализации.

4. Стрктура файла

Файл является собственным, структурированным, а это значит, что он не стнадартизирован как xml, хотя, можно было бы и его использовать, но не будем плодить копию SVG, а создадим свою структуру с нуля, чтобы лучше понять процесс разработки

Диалоговое окно открытия и сохранения файла в JavaFX

👁 884 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 4,00 из 5)
Загрузка...

Иногда в программе требуется реализовать диалоговое окно, которое будет открывать или сохранять файл и для таких целей в JavaFX есть отдельный класс FileChooser. Данный класс реализует данные диалоговые окна посредством вызова методов showOpenDialog() или showSaveDialog().

1. Открытие файла определенного расширения

Ниже покажем пример кода реализации диалогового окна открытия файла определенного расширения или списка расширений

@FXML
private void hndlOpenFile(ActionEvent event) {
        FileChooser fileChooser = new FileChooser();//Класс работы с диалогом выборки и сохранения
        fileChooser.setTitle("Open Document");//Заголовок диалога
        FileChooser.ExtensionFilter extFilter = 
        new FileChooser.ExtensionFilter("HTML files (*.html)", "*.html");//Расширение
        fileChooser.getExtensionFilters().add(extFilter);
        File file = fileChooser.showOpenDialog(CodeNote.mainStage);//Указываем текущую сцену CodeNote.mainStage
        if (file != null) {
            //Open
            System.out.println("Процесс открытия файла");
        }
}

2. Диалоговое окно сохранения файла определенного расширения

Ниже покажем пример кода реализации диалогового окна сохранения файла определенного расширения или списка расширений

@FXML
private void hndlOpenFile(ActionEvent event) {
    FileChooser fileChooser = new FileChooser();//Класс работы с диалогом выборки и сохранения
    fileChooser.setTitle("Save Document");//Заголовок диалога
    FileChooser.ExtensionFilter extFilter = 
    new FileChooser.ExtensionFilter("HTML files (*.html)", "*.html");//Расширение
    fileChooser.getExtensionFilters().add(extFilter);
    File file = fileChooser.showSaveDialog(CodeNote.mainStage);//Указываем текущую сцену CodeNote.mainStage
    if (file != null) {
        //Save
        System.out.println("Процесс открытия файла");
    }
}

3. Дополнительно

Для того, чтобы открывать или сохранять несколько видов расширений необходимо использовать мульти-фильтр

fileChooser.getExtensionFilters().addAll(
    new FileChooser.ExtensionFilter("All Images", "*.*"),
    new FileChooser.ExtensionFilter("HTML Documents", "*.html"),
    new FileChooser.ExtensionFilter("JPG", "*.jpg"),
    new FileChooser.ExtensionFilter("PNG", "*.png")
);

Для того, чтобы открывать несколько файлов необходимо использовать диалоговое окно мульти-выборки, который вызывается посредством метода showOpenMultipleDialog

List<File> list =
    fileChooser.showOpenMultipleDialog(CodeNote.mainStage);
    if (list != null) {
    for (File file : list) {
    openFile(file);
    }
}

Для того, чтобы узнать какое расширение выбрано в процессе сохранения или открытия используем getSelectedExtensionFilter(), а для того, чтобы сравнить существующие расширения используем метод getExtensionFilters().get(index), где index — порядковый номер регистрированного расширения

if(fileChooser.getSelectedExtensionFilter().equals(fileChooser.getExtensionFilters().get(0))){
    if (!file.getPath().endsWith(".html")) {
        file = new File(file.getPath() + ".html");
    }
        System.out.println("Процесс сохранения html файла");
    }else if(fileChooser.getSelectedExtensionFilter().equals(fileChooser.getExtensionFilters().get(1)))
    {
    if (!file.getPath().endsWith(".png")) {
        file = new File(file.getPath() + ".png");
    }
    System.out.println("Процесс сохранения png файла");
}

Создание архитектуры масштабируемого приложения Node.js

👁 628 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 1,50 из 5)
Загрузка...

Понятие «Архитектура приложения»

Любая программа, будь то десктопная или WEB, должна иметь определенные правила оформления кода: классов, файлов, методов, частей и т.д. Это делается, скорее всего, для того, чтобы увеличить производительность труда разработчиков и уменьшить риск возникновения непредвиденной работы программы, которую можно быстро идентифицировать и отладить. Существуют несколько подходов того, как должна строиться архитектура WEB — приложения, в частности, эти же правила можно перенести и на приложения Node.js — это MVC, HMVC, MOVE и другие. В данной же статье рассмотрим простейший пример реализации архитектуры приложения на основе модели MVC (Model-View-Controller). Не будем придумывать что такое MVC,  а приведем цитату первого абзаца из Википедии:

Model-view-controller (MVC, «модель-представление-поведение», «модель-представление-контроллер», «модель-вид-контроллер») — схема использования нескольких шаблонов проектирования, с помощью которых модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Данная схема проектирования часто используется для построения архитектурного каркаса, когда переходят от теории к реализации в конкретной предметной области

Модель MVC, как и любая другая, — это такая вещь, которая призвана упростить разделение труда разработчиков. Так, если одна группа разрабатывает интерфейс, другая — пишет код, третья — разрабатывает модель взаимодействия и хранения, то MVC с легкостью может все это соединить воедино, чтобы получить рабочее приложение и наоборот — может разделить так, что одна модель может иметь несколько представлений, к примеру, одни и те же данные из БД выводятся на одной странице сайта в виде круговой диаграммы, а в другой -в виде таблицы, но данные неизменны или другой пример, где один и тот же запрос пользователя может воздействовать на модель по разному в различных представления, в зависимости от настроек контроллера и вида. По способу взаимодействия MVC можно подразделить на MVC с пассивной моделью, где данные отправляет на вид контроллер и с активной моделью, где данные отправляет на вид сама модель

mvc-active-passive-model

Это не единственное отличие, которое может быть в MVC, их ровно столько, сколько может позволить себе любой разработчик, но концепция MVC едина для всех.

Модульность в Node.js

Прежде чем рассмотрим реализацию архитектуры приложения в Node.js, давайте обсудим про модульность в Node.js. Как известно Node.js — это модульная платформа, в котором все работает по принципу лего. Даже простой пример

var http = require('http');//Подключаем модуль приема и отправки по протоколу Http 
//Создаем объект нового сервера 
http.createServer(function (req, res) { //Передаем заголовок res.writeHead(200, {'Content-Type': 'text/plain'}); //Выводим запись 
res.end('Hello World\n'); }).listen(1337, '127.0.0.1');//Указываем адрес хоста 
//Уведомляем в консоли о том, что запущен наш сервер console.log('Server running at http://127.0.0.1:1337/');

подключает модуль http для приема и отправки запросов, который находиться в составе Node.js,  а другой модуль, к примеру, fs нужен Node.js для работы с файловой системой компьютера и он тоже входит в стандартный набор Node.js, но это не значит, что платформа Node.js содержит модули для решения всех задач, которые встречаются у разработчиков, к примеру, в стандартный состав Node.js не входит модуль для работы с сокетами и для этого нам надо его установить через консоль командой

npm install socket.io

Отсюда мы понимаем, что для того чтобы создать масштабируемое приложение нам будет необходимо разделить его на отдельные модули и подключать их к программе по мере необходимости и Node.js позволяет нам создавать собственные модули. Для примера разделим выше приведенный простой код на модули и получим идентичный результат. Чтобы разбить код на модули нам необходимо создавать файлы модулей, к примеру, мы создадим новый модуль под названием server в файле serevr.js и поместим в нее весь код работы с запросами к серверу, а в файле index.js мы запустим наш пользовательский модуль server.  Название модуля соответствует названию файла без расширения .js, код в файле server.js будет следующим

 

var http = require('http');//Подключаем модуль протокола http

function start()//Создаем метод запуска модуля
{
	function onRequest(req, res){
	  //Передаем заголовок
	  res.writeHead(200, {'Content-Type': 'text/plain'});
	  //Выводим запись
	  res.end('Hello World from Server!\n');
	}
	//Указываем адрес хоста
	http.createServer(onRequest).listen(1337, '127.0.0.1');
}
//Указываем, что данный метод доступен из вне
exports.start = start;

А в файле index.js запишем код подключения модуля server и ее запуска

var server = require('./server');//Подключаем наш модуль server
server.start();//Запускаем наш модуль сервер
//Уведомляем в консоли о том, что запущен наш сервер
console.log('Server running at http://127.0.0.1:1337/');

Запускаем наш пример командой

node [ваш путь]/server.js

если все запустилось удачно, то будет следующее сообщение в консоли

start-node-js-hello-world-result

 

После этого идем в браузер и набираем адрес нашего запущенного хоста

http://127.0.0.1:1337/

node-js-h-w-module-from-server

На этом пример создания простого модуля закончено.

Роутер и обработка запросов

В предыдущем пункте мы использовали такую функцию, как onRequest(req, res), где req(request) — объект запроса пользователя, а res(response) — это ответ пользователю. Не имеет значения как называется данная функция, она передается как параметр, для нас важны параметры, которые передаются в данную функцию. Данная функция еще называется функцией обратного вызова(callback), которая работает ассинхронно. Чтобы соответствовать уровню MVC нам необходимо определять получаемые запросы из параметра req  и передавать в параметр  res ответ в виде вида страницы. А вид страницы — это сверстанный HTML файл, и таких файлов столько, сколько необходимо для нашего приложения и пользователь видит только их. Обычно, данные файлы расположены в отдельной папке. Чтобы узнать какой запрос с POST и GET данными отправил пользователь, нам необходим роутер, который будет проверять и выдавать ту информацию, которую мы позволили нашему приложению. Продолжение следует…