1. Введение. 1.1. Презентация Я написал это небольшое руководство для людей, которые хотят научится создавать динамические приложения пользуясь GWT (Google Web Toolkit) в AMP (Apache MySQL PHP) среде. Основная идея в том, чтобы написать небольшой и очень простое приложение с использованием PHP и MySQL на стороне сервера, GWT для реализации интерфейса, JSON для обмена данными между клиентской и северной частями.
1.2. О JSON JSON (JavaScript Object Notation) - это легкий и удобный формат обмена данными. Отличительной чертой является то, что он прост и понятен для человека. Этот формат легко обрабатывается и генерируется программами. Он основан на языке JavaScript, Standard ECMA-262 3rd Edition — December 1999. JSON — это текстовый формат, не зависящий от языка программирования. JSON использует соглашения близкие к Си-подобным языкам, включая C, C++, C#, Java, JavaScript, Perl, Python, и много других. Все это делает JSON идеальным языком для обмена данными. Вы можете найти много полезной информации о JSON здесь www.json.org (и тут: ru.wikipedia.org/wiki/JSON)
1.3. О GWT GWT (Google Web Toolkit) - это инструмент позволяющий легко создавать AJAX (ru.wikipedia.org/wiki/AJAX) приложения на языке JAVA, проще говоря, GWT “переводит” ваш JAVA код в HTML и JavaScript. Подробнее о GWT можно прочесть по адресу http://code.google.com/webtoolkit/
1.4. Об этом руководстве Мы сделаем небольшое приложение для поиска информации по сотрудникам в базе данных MySQL, используя в качестве параметра поиска имя сотрудника.
2. Работа над серверной частью. 2.1. База данных Нам нужна всего одна таблица, которая будет называться ‘directory’, и которую мы заполним информацией о сотрудниках:
2.2. PHP скрипт Для доступа к данным базы напишем PHP скрипт. Он будет выбирать данные и преобразовывать в JSON формат. Для этого будем использовать JSON PHP class, который можно скачать отсюда http://pear.php.net/pepr/pepr-proposal-show.php?id=198. Этот класс позволяет преобразовывать значения из PHP в JSON формат и отправлять их браузеру. Файл ‘index.php’ будет содержать следующий код:
1. < ? 2. 3. // вызов JSON.php 4. require_once(”JSON.php”); 5. 6. // коннект к базе 7. 8. $conector = mysql_connect(’localhost’, ‘root’, ‘juan’) or die(mysql_error()); 9. mysql_select_db(’JSONPHP’) or die(mysql_error()); 10. 11. //формируем запрос 12. 13. $sqlQuery = “SELECT * FROM directory WHERE name LIKE ‘”. $_REQUEST[’tosearch’]. “%’”; 14. $dataReturned = mysql_query($sqlQuery) or die(mysql_error()); 15. $i = 0; 16. 17. while($row = mysql_fetch_array($dataReturned)){ 18. 19. // заполняем массив $value данными. 20. 21. $value{”item”}{$i}{”Employe Number”}= $row[’enumber’]; 22. $value{”item”}{$i}{”Name”}= $row[’name’]; 23. $value{”item”}{$i}{”Position”}= $row[’position’]; 24. $value{”item”}{$i}{”Phone Number”}= $row[’phnumber’]; 25. $value{”item”}{$i}{”Location”}= $row[’location’]; 26. $i++; 27. } 28. 29. // использую JSON.php конвертируем данные в JSON формат и отправляем в браузер 30. 31. $json = new Services_JSON(); 32. $output = $json->encode($value); 33. print($output); 34. ?>
И это весь код. Вывод этого php скрипта должен быть похож на следующие: {”item”:[{ “Employe Number”:”110009″, “Name”:”Juan Hurtado”, “Position”:”System Analist”, “Phone Number”:”81001121″, “Location”:”Monterrey City”}] }
Теперь пора заняться интерфейсом и GWT.
3. Работа над клиентской частью. 3.1 Пример с JSON RPC На сайте http://code.google.com/webtoolkit/ есть несколько примеров использования GWT. Один из них показывает, как использовать GWT в связке с JSON для доступа к сервису Yahoo. Мы возьмем за основу нашего интерфейса пример JSON RPC.
3.2 Создание нового приложения Используя projectCreator.cmd (этот файл находится в дистрибутиве GWT) создадим новый проект:
C:>projectCreator.cmd -eclipse PHPJSON -out PHPJSON Created directory PHPJSONsrc Created file PHPJSON.project Created file PHPJSON.classpath
Теперь создадим новый проект для eclipse с помощью applicationCreator.cmd:
C:>applicationCreator.cmd -eclipse PHPJSON -out PHPJSON com.juan.client.PHPJSON
Created directory PHPJSONsrccomjuan Created directory PHPJSONsrccomjuanclient Created directory PHPJSONsrccomjuanpublic Created file PHPJSONsrccomjuanPHPJSON.gwt.xml Created file PHPJSONsrccomjuanpublicPHPJSON.html Created file PHPJSONsrccomjuanclientPHPJSON.java Created file PHPJSONPHPJSON.launch Created file PHPJSONPHPJSON-shell.cmd Created file PHPJSONPHPJSON-compile.cmd
Пример JSON RPC содержит классы, которые позволяют обрабатывать иформацию в формате JSON. (Тут говорится о старой версии примера JSON RPC; в новой версии примера JSON RPC эти файлы не идут в дистрибутиве примера, так как эти классы стали стандартными в новой версии GWT. Но никто не мешает вам следовать примеру, все это будет работать и с новой версией GWT) Скопируем из примера следующие файлы в папку PHPJSONsrccomjuanclient:
* JSONArray.java * JSONBoolean.java * JSONException.java * JSONNumber.java * JSONObject.java * JSONParser.java * JSONString.java * JSONValue.java
Во всех файлах нужно заменить строчку с данными о пути пакета. (в нашем случае нужно заменить package com.google.gwt.sample.json.client; на package com.juan.client;) Также исправьте пути в файле JSONParser.java. Затем импортируем наш проект в Eclipse как написано в документации по GWT. Запустите Eclipse и кликните в меню File -> Import. В появившемся окне выберите пункт ‘Existing Projects into Workspace’, укажите путь к файлу .project в следующем окне. После этого вы должны увидеть ваш GWT проект:
Создадим класс JSONRequester и опишем следующие метод:
1. public Widget initializeMainForm() { 2. /* 3. * Иницилизация и установка панели, которая будет содержать 4. * поисковую форму и вывод результата 5. */ 6. 7. FocusPanel fpn = new FocusPanel(); 8. Grid gd = new Grid(1,2); 9. 10. b1.setText(”Search”); 11. b1.addClickListener(new SearchButtonClickListener()); 12. 13. gd.setWidget(0, 0, txtBox); 14. gd.setWidget(0, 1, b1); 15. 16. gdOut.setWidget(0,0,gd); 17. 18. gdOut.setBorderWidth(1); 19. gdOut.setWidth(”500px”); 20. 21. childGrid.setCellPadding(0); 22. childGrid.setCellSpacing(0); 23. childGrid.setWidth(”490px”); 24. 25. fpn.add(gdOut); 26. 27. return fpn; 28. }
Как вы видете создается элемент FocusPanel, затем мы прикрепляем эелемент Grid(Сетка), на этой сетке располагаем все нужные элементы. В обработчике клика по кнопке создается класс SearchButtonClickListener, которые будет содержать следующие строки:
1. private class SearchButtonClickListener implements ClickListener { 2. 3. public void onClick(Widget sender) { 4. /* 5. * Когда пользователь нажимает кнопку мы получаем URL. 6. */ 7. itemNumber = 0; 8. doFetchURL(); 9. } 10. 11. private void doFetchURL() { 12. /* 13. * Получаем URL и вызываем обработчик 14. */ 15. b1.setText(”Searching …”); 16. if (!HTTPRequest.asyncGet(DEFAULT_SEARCH_URL + “?tosearch=” + txtBox.getText(), 17. 18. new JSONResponseTextHandler())) { 19. 20. b1.setText(”Search”); 21. } 22. } 23. }
Этот класс содержит метод doFetchURL(), с помощью которого находится URL и вызывается класс JSONResponseTextHandler() для выполнения операций над JSON документом:
1. private class JSONResponseTextHandler implements ResponseTextHandler { 2. 3. public void onCompletion(String responseText) { 4. /* 5. * После того, как полученны данные в формате JSON мы 6. * обрабатываем их и выводим результат 7. */ 8. 9. JSONObject jsonObject; 10. try { 11. jsonObject = JSONParser.parse(responseText); 12. displayJSONObject(jsonObject); 13. 14. } catch (JSONException e) { 15. 16. } 17. 18. b1.setText(”Search”); 19. 20. } 21. 22. private void displayJSONObject(JSONObject jsonObject) { 23. /* 24. * Очищаем Grid(сетку) и заполняем новыми результатами 25. */ 26. 27. childGrid.clear(); 28. requestChildrenGrid(jsonObject); 29. gdOut.setWidget(1,0,childGrid); 30. 31. } 32. 33. private void requestChildrenGrid(JSONValue jsonValue){ 34. /* 35. * Заполнение Grid(сетки) 36. */ 37. 38. JSONObject jsonObject; 39. if(jsonValue.isArray() != null){ 40. for(int i = 0; i < jsonValue.isArray().size();i++){ 41. requestChildrenGrid(jsonValue.isArray().get(i)); 42. childGrid.setWidget(itemNumber,0,new HTML(”<HR/>”)); 43. childGrid.setWidget(itemNumber,1,new HTML(”<hr />”)); 44. 45. itemNumber++; 46. int resizeNumber = itemNumber + 1; 47. childGrid.resize(resizeNumber,2); 48. } 49. } else { 50. 51. if ((jsonObject = jsonValue.isObject()) != null) { 52. String[] keys = jsonObject.getKeys(); 53. 54. for (int i = 0; i < keys.length; ++i) { 55. String key = keys[i]; 56. childGrid.setWidget(itemNumber,0,new HTML(”<B>”+ key +”:”)); 57. childGrid.setWidget(itemNumber,1,new HTML(jsonObject.get(key).toString())); 58. requestChildrenGrid(jsonObject.get(key)); 59. 60. itemNumber++; 61. int resizeNumber = itemNumber + 1; 62. childGrid.resize(resizeNumber,2); 63. } 64. } else if (jsonValue != null) { 65. // 66. 67. } else { 68. // 69. } 70. 71. } 72. } 73. 74. }
Все эти методы из файла JSON.java гугловкого примера JSON RPC. Метод requestChildrenGrid(JSONValue jsonValue) разбивает JSON документ на ключи и значения, ключи обрамляются тэгами “<B>”и прикрепляются к Grid(сетке), которая в свою очередь прикрепляется к FocusPanel. И наконец, в файле PHPJSON.java мы выводим результат на главную панель:
1. public void onModuleLoad() { 2. /* 3. * Для красоты используем TabPanel 4. */ 5. TabPanel tp = new TabPanel(); 6. JSONRequester myJson = new JSONRequester(); 7. 8. tp.add(myJson.initializeMainForm() ,”Corporate Directory”); 9. 10. tp.selectTab(0); 11. 12. RootPanel.get().add(tp); 13. }
Вот как должно выглядеть приложение в результате:
|