Показаны сообщения с ярлыком Java. Показать все сообщения
Показаны сообщения с ярлыком Java. Показать все сообщения

вторник, 10 января 2012 г.

JDBC > ResultSet > getDate - форматирование даты в Java

Задача: используя чистый JDBC, выбрать из базы данных поле с типом DATE и форматировать дату к нужному формату.

Решение: для получения даты из набора данных ResultSet необходимо воспользоваться методом getDate(), результат работы которого отформатировать при помощи родного java класса java.text.SimpleDateFormat. Как это всё выглядит в сборке показано ниже - код отлично документирован.

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class getDateFormat {
  public static void main(String[] args){
    // создаем подключение, в данном примере к Oracle
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    Connection conn = DriverManager
             .getConnection("jdbc:oracle:thin:@192.168.0.1:1521:db11g",
                            "user_name", "user_pass"
                      );
    // выполняем запрос, возвращающий в составе полей
    // d_point типа DATE
    ResultSet rs = conn.createStatement()
           .executeQuery("select id, action, d_point from users_log");
    // перебираем результаты в цикле
    while (rs.next()){
      // выводим id записи и текстовое поле action
      System.out.println("Id: ".concat( rs.getInt("id").toString() )
                         .concat("\n")
                         .concat("Action: ").concat(
                           rs.getString("action")
                         )
      );
      // получаем поле с датой
      Date d_point = rs.getDate("d_point");
      // форматируем дату и выводим
      String dateFormatted = new SimpleDateFormat("dd.MM.yyyy")
                                      .format( d_point ).toString();
      System.out.println("Date: ".concat(dateFormatted));
    }
  }
}

Параметры форматирования для SimpleDateFormat приведены в официальной документации.

понедельник, 15 августа 2011 г.

ExtJS: разработка интерфейса независимо от источников данных. Кросс-доменный AJAX для загрузки хранилищ

Удаленные источники для хранилищ ExtJS - это источники, расположенные в другом домене или, как их еще называют, кросс-доменные источники. Вероятно, вы знаете о том, что традиционные XMLHttpRequest запросы (известные в народе как AJAX запросы) имеют ряд ограничений, связанных в первую очередь с безопасностью - в частности, XMLHttpRequest запросы могут быть посланы только к адресу с одноименным протоколом, доменом и портом по отношению к запрашивающей странице. Таким образом, нельзя сделать традиционный AJAX запрос с сайта site1.com к сайту site2.com.

Тем не менее, такая необходимость часто возникает, в таких случаях используется так называемый cross-domain  (кросс-доменный) AJAX. Стоит отметить, что непосредственно к AJAX эти технологии уже не относятся, название в данном случае - не более, чем дань традиции. О методах, используемых в кросс-доменных запросах, можно почитать, например, в статье на javascript.ru.

Одной из проблем разработки интерфейсов на ExtJS является зависимость от динамически загружаемых данных: фактически, большинство компонентов фреймворка используют те или иные данные, получаемые при помощи AJAX запросов. Например, так выглядит традиционное описание хранилища:

myStore = new Ext.data.JsonStore({
    url:    'getUsers',
    method: 'POST',
    root: 'items',
    fields: [{name:"id"},{name:"name"}]
});

URL, указанный первым параметром, ссылается на страницу того же домена, в котором должна находиться разрабатываемая страница, иначе AJAX запрос на загрузку данных не сможет быть произведен. Таким образом, разрабатываемая html страница и javascript код в ее составе должны быть частью домена-источника данных. Это не всегда удобно и не всегда возможно.

Использование кросс-доменных запросов в таких случаях - отличное решение. Посмотрите, как просто можно заставить работать ExtJS приложение с данными любого домена:

myStore = new Ext.data.JsonStore({
    proxy: new Ext.data.ScriptTagProxy({
            url:    'http://vasilij.com/getUsers',
    }),
    method: 'POST',
    root: 'items',
    fields: [{name:"id"},{name:"name"}]
});

В код сервлета необходимо добавить отслеживание GET параметра callback. Дело в том, что при использовании ScriptTagProxy, ExtJS добавляет в строку запроса параметр callback, таким образом, что в нашем случае запрос будет иметь вид:

http://vasilij.com/getUsers&callback=stcCallback10

Возвращаемый JSON должен быть обернут в функцию, название которой соответствует переданному параметру callback. В случае сервлета:

String callback = request.getParameter("callback");
if (callback == null){
  response.setContentType("text/javascript");
  out.println(jsonString);
}
else{
  response.setContentType("application/x-json");
  out.println(callback.concat("(").concat(jsonString).concat(")"));
}

Таким образом, при отсутствии callback параметра в строке запроса возвращается обычный JSON, в противном случае JSON оборачивается в функцию.

После внесения в код приложения описанных изменений можно разрабатывать интерфейс абсолютно независимо от всей остальной части приложения; сервлеты-поставщики данных могут находиться в любом домене, и даже простая html страница на рабочем столе с подключенным ExtJS сможет получать данные и корректно их обрабатывать и отображать. После окончания процесса разработки и тестирования можно заменить Ext.data.ScriptTagProxy на Ext.data.HttpProxy для использования AJAX запросов.

Приятного кодинга вам!

пятница, 10 июня 2011 г.

Deploying servlets on Weblogic server with weblogic.Deployer


Good day!

I want to tell you about servlets deployment on Oracle Weblogic server. Its my first post in English, so sorry for my language - its not my native:)

So, we developed some Java servlets and want to deploy them on server for testing it. If you read this article, i can suggest, that you are interesting in Weblogic server. There are several ways to deploy servlets, for example using Weblogic Administration console or using weblogic.Deployer tool. I like command-line tools, because its really simple, fast and give me many ways to automate my work. Weblogic.Deployer - command-line utilite for fast deploying applications on weblogic server.

First, we need create war file (Web Application Archive, see wikipedia) with our servlets. In windows (unix's way is not so different) we need write this code in terminal:

chdir C:\dir\with\servlets\
jar -cvf  myServlets.war *

First line changes current directory to directory with our servlets. Second line creates one war file with all files of our servlets - html, css, js, WEB-INF directory with web.xml and so on. So we have myServlets.war file.

Now we can deploy it -  with weblogic.Deployer utilite it is really simple:

java -cp C:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jar weblogic.Deployer -adminurl t3://localhost:7001 -user myusername -password mycoolpass -deploy myServlets.war

Yeah! Is it not cool? Some notes. Weblogic must be started for work with weblogic.Deployer - deploying can be done only on the running server, of course. Also console application must be deployed (you can load url http://localhost:7001/console for it, its very simple). C:\Oracle\Middleware\wlserver_10.3\ is directory with installed Weblogic server. localhost:7001 is URL of my Weblogic Administrtion console (note that I use t3 instead of http protocol), myusername is username for administration console and mycoolpass is password for this account. So, we need just 2 commands for create war file and deploy it on server! 2 commands is too much? Ok, we can merge it:

jar -cvf  myServlets.war * && java -cp C:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jar weblogic.Deployer -adminurl t3://localhost:7001 -user myusername -password mycoolpass -deploy myServlets.war

This way of deploying java servlets is more fast than using web interface of administration console.

четверг, 31 марта 2011 г.

Работа с JSON в Java

JSON (JavaScript Object Notation) - текстовый формат обмена данными, легко читаемый людьми и основанный на синтаксисе Javascript. JSON, как правило, используется с Javascript, если быть более точным - при обмене данными между Javascript и сервером. Стоит отметить, что JSON обладает существенным преимуществом перед XML - он менее избыточен.

Пример JSON объекта:

{
  userId: 32,
  firstName: "Алексей",
  lastName: "Голобурдин",
  address: {
    country: "Россия",
    city: "Москва"
  },
  phone: "8 (905) 777 77 77"
}

Как видно, все предельно просто. Фактически, JSON объект является валидным Javascript кодом, то есть может быть исполнен интерпретатором Javascript. Но как сгенерировать JSON на сервере, и как распарсить пришедший от клиента JSON?

PHP программисты сейчас довольно ухмыльнутся, ведь у них есть стандартные функции json_encode и json_decode, позволяющие легко и просто гонять PHP сущности в JSON и обратно.

Java программистам приходится сложнее - надо поддерживать свою крутость (где PHP - Personal HomePage language, и где крутая Enterprise Java), поэтому с JSON приходится работать путем сторонних библиотек, коих на офсайте json.org приводится немало. Программисты Python здесь тоже ухмыльнутся - их дзен "Должен быть только один, и лучше всего очевидный, способ сделать это".

Итак, в данной статье рассматривается использование отличной java библиотеки для генерирования и парсинга JSON - json-simple, официальный сайт на google code. Кстати, там можно найти немало отличных примеров!

Вот таблица сопоставления типов JSON и Java:

JSONJava
stringjava.lang.String
numberjava.lang.Number
true | falsejava.lang.Number
nullnull
arrayjava.util.List
objectjava.util.Map

Тааак, и как нам всем этим добром пользоваться?

Примеры давай, примеры!


Cоздадим JSON строку!

//import org.json.simple.JSONObject;
  
JSONObject resultJson = new JSONObject();

resultJson.put("name","foo");
resultJson.put("num",new Integer(100));
resultJson.put("is_vip",new Boolean(true));
resultJson.put("nickname",null);
System.out.print(obj.toString());
// {"name": "foo", "num": 100, "is_vip": true, "nickname: null}

Ну ладно, круто. А что-то посложнее?

JSONArray ar = new JSONArray();
JSONObject obj = new JSONObject();
JSONObject resultJson = new JSONObject();

ar.add("first");
ar.add(new Integer(100));

obj.put("one", "two");
obj.put("three", "four");

resultJson.put("paramsArray", ar);
resultJson.put("paramsObj", obj);
resultJson.put("paramsStr", "some string");
System.out.print(obj.toString());
// {"paramsArray": ["first", 100],
//  "paramsObj": {"one": "two", "three": "four"},
//  "paramsStr": "some string"}

Думаю, комментарии здесь излишни, все действительно чрезвычайно интуитивно и просто. Другие примеры генерирования JSON можно посмотреть на офсайте.

Парсинг JSON


А вот с парсингом дела обстоят намного хуже. Шутка:)



String json = "{paramsArray: [\"first\", 100],"
            + "paramsObj: {one: \"two\", three: \"four\"},"
            + "paramsStr: \"some string\"}";

JSONParser parser = new JSONParser();

Object obj = parser.parse(json);
JSONObject jsonObj = (JSONObject) obj;
System.out.println(jsonObj.get("paramsStr"));
// some string

JsonObject jo = jsonObj.get("paramsObj");
System.out.println(jo.get("three"));
// four

JsonArray ja = jsonObj.get("paramsArray");
System.out.println(ja.get(1));
// 100

Вот такая отличная библиотека. Приятной работы!