среда, 30 мая 2012 г.

Как остановить веб приложение java на Apache Tomcat непосредственно из програмного кода

Остановку веб приложения java на Tomcat из программного кода можно выполнить путем посылки команды выключения на специальный порт, который может быть настроен в корневом элементе файла server.xml Томката.

Итак, алгоритм действий по шагам:

1. Добавить в корневой элемент файла CATALINA_HOME/conf/server.xml код, приведенный ниже:

<server port="8005" shutdown="myShutDownCommand">

Аттрибут port не обязателен. Если он пропущен - то будет использован порт по умолчанию - 8005. Значением аттрибута shutdown может быть все что угодно. Это значение не должно быть известно никому кроме вас.

Может возникнуть сложность в нахождении файла server.xml. Он может оказаться в различных местах. У меня при использовании Netbeans 7.1.2 он оказался в директории вида C:\Documents and Settings\<UserName>\.netbeans\7.1.2\apache-tomcat-7.0.22.0_base\conf. Файл server.xml есть также по пути вида C:\Program Files\Apache Software Foundation\Apache Tomcat 7.0.22\conf - путь к нужному файлу будет зависеть от того, с какими параметрами был запущен томкат.

2. Создать код в java программе, который будет посылать команду остановки используя java.net.Socket на порт остановки tomcat.

try { 
    Socket socket = new Socket("localhost", 8005); 
    if (socket.isConnected()) { 
        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); 
        pw.println("myShutDownCommand");//send shut down command 
        pw.close(); 
        socket.close(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
}

пятница, 18 мая 2012 г.

Как единоразово выполнить некоторый код в java при запуске web приложения на Apache Tomcat

Чтобы выполнить некоторый код единоразово при запуске веб приложения на Apache Tomcat (например создать иконку в трее и т.д.) следует сконфигурировать listener в файле web.xml

Итак, по шагам:

1. Добавляем в раздел <web-app> код листенера со ссылкой на наш класс.

<listener>
    <listener-class>mypackage.StartListener</listener-class>
</listener>


2. Создаем класс своего листенера наследуясь от javax.servlet.ServletContextListener.

package mypackage;

import javax.servlet.ServletContextEvent;

/**
 *
 * @author Cloud
 */
public class StartListener implements javax.servlet.ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
         // код выполняющийся при уничтожении контейнера
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // код выполняющийся при инициализации контейнера
    }
}

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

Как в java определить свой внешний IP адрес

Программно определить внешний IP не так уж и просто как может показаться на первый взгляд. В java нет да и не может быть стандартной функции для получения IP адреса своего компьютера в интернете. При этом ip адрес компьютера в локальной сети получить достаточно просто, для этого можно воспользоваться классом InetAddress.
InetAddress addr = InetAddress.getLocalHost();         
String myLANIP = addr.getHostAddress();
Для получения внешнего IP необходимо подключиться к какому-нибудь серверу в интернете, который вернет IP под которым он видит данный компьютер. В общем случае необходимо подключится к серверу (сайту) предоставляющему услугу определения IP, получить ответ в виде html кода и выделить из этого кода IP адрес. Ниже приведен пример с использованием сервиса http://myip.by/ - он удобен тем, что возвращает минимум лишней информации.

private static String getCurrentIP() {
        String result = null;
        try {
            BufferedReader reader = null;
            try {
                URL url = new URL("http://myip.by/");
                InputStream inputStream = null;
                inputStream = url.openStream();
                reader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder allText = new StringBuilder();
                char[] buff = new char[1024];

                int count = 0;
                while ((count = reader.read(buff)) != -1) {
                    allText.append(buff, 0, count);
                }
// Строка содержащая IP имеет следующий вид 
// <a href="whois.php?127.0.0.1">whois 127.0.0.1</a> 
                Integer indStart = allText.indexOf("\">whois ");
                Integer indEnd = allText.indexOf("</a>", indStart);

                String ipAddress = new String(allText.substring(indStart + 8, indEnd));
                if (ipAddress.split("\\.").length == 4) { // минимальная (неполная) 
                //проверка что выбранный текст является ip адресом.
                    result = ipAddress;
                }
            } catch (MalformedURLException ex) {
                 ex.printStackTrace();
            } catch (IOException ex) {
                 ex.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        return result;
    }

воскресенье, 13 мая 2012 г.

Как в java поместить фрейм (JFrame) в центре экрана

Основной сложностью при помещении фрейма в центр экрана является получение значения текущего разрешения экрана. Получить разрешение экрана в java можно используя класс java.awt.Toolkit вызвав метод java.awt.Toolkit.getDefaultToolkit().getScreenSize().
Он возвратит значение разрешения экрана в виде объекта класса Dimension.
Дальше необходимо просто вычислить координаты, куда следует поместить фрейм.
Пример:

    /**
    * Puts any Window or Frame to the centre of the screen.
    * 
    * @author Cloud
    */
    public static void centerFrame(Window frame) {
        Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        int x = (int) ((screenSize.getWidth() - frame.getWidth()) / 2);
        if (x < 0) {
            x = 0;
        }
        int y = (int) ((screenSize.getHeight() - frame.getHeight()) / 2);
        if (y < 0) {
            y = 0;
        }
        frame.setBounds(x, y, frame.getWidth(), frame.getHeight());
    }

UPD (из комментария Tom-Trix): Есть более простой способ помещения фрейма в центр экрана - использование метода frame.setLocationRelativeTo(null). Однако следует учитывать, что данный метод будет работать только при использовании java версии выше 1.4 (первый способ работает и на более ранних версиях java). Пример :
    /**
    * Puts any Window or Frame to the centre of the screen.
    * 
    */
    public static void centerFrame(Window frame) {
        frame.setLocationRelativeTo(null);
    }

Важно: вышеописанные методы следует вызывать после установки размера фрейма (вызова методов setSize(), setPrefferedSize() и т.д.), а также желательно после добавления всех необходимых компонентов на фрейм, иначе эти методы просто не сработают или сработают не так, как ожидалось. Также скорее всего они могут не совсем корректно работать для среды с несколькими мониторами (не проверял).

суббота, 12 мая 2012 г.

Часто используемые регулярные выражения в java

Регулярные выражения могут являться крайне удобным средством для решения самых различных задач. Обычно, главная сложность состоит в составлении выражения для конкретной задачи. В данной статье приведены примеры регулярных выражений в java для решения наиболее часто встречающихся случаев.

1. Выделение IP-адреса из произвольной строки.
Например, для строки "Ваш IP: 178.124.248.231" регулярное выражение имеет вид
Pattern ipPattern =
            Pattern.compile("Ваш IP: ([[\\d]+[\\.]+]+[\\d])[\\.]+", 
 Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 

2. Выделение времени в минутах и секундах.
Для строки "Время : 02:00"
Pattern remainedTimePattern =
            Pattern.compile("Время : ([[\\d]+[:]]+[\\d])",
 Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

3. Проверка строки времени в 12-ти часовом формате.

Pattern timeAMPMPattern =
            Pattern.compile("(1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm)", 
Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

4. Проверка строки времени в 24-x часовом формате.

Pattern time24Pattern =
            Pattern.compile("([01]?[0-9]|2[0-3]):[0-5][0-9]", 
Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

5. Проверка даты в формате dd/mm/yyyy.

Pattern datePattern =
            Pattern.compile(
"(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)", 
Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

6. Проверка правильности email адреса

Pattern emailPattern =
            Pattern.compile(
"^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$", 
Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);


7. Проверка IP

Pattern checkIPattern = Pattern.compile(
        "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

8. Проверка имени пользователя

Pattern userNamePattern = Pattern.compile("^[a-z0-9_-]{3,15}$");

9. Паттерн HTML тэга

Pattern htmlTagPattern = Pattern.compile("<("[^"]*"|'[^']*'|[^'">])*>");

Ярлыки

java (31) оптимизация (7) CPanel (5) svn (5) windows xp (5) ошибка (5) свой сервер (5) файлы и папки (5) gui (4) регулярные выражения (4) jacoco (3) redmine (3) windows (3) автоматизация (3) защита данных (3) резервное копирование (3) сервер (3) JavaScript (2) Oracle SQL (2) adsl модем (2) apache maven (2) apache tomcat (2) coverage (2) dropbox (2) excel (2) firewall (2) netbeans (2) office 2007 (2) samsung (2) system tray (системный трей) (2) xerox (2) вирусы (2) принтер (2) сериализация (2) удаленный рабочий стол (2) HTML (1) JFileChooser (1) MySQL (1) Nokia (1) Ovi (1) P660R-T1 (1) WakeOnLan (1) blogger.com (1) ctfmon.exe (1) email (1) flash память (1) ftp (1) integration testing (1) ip (1) jQuery (1) jvisualWm (1) log4j (1) look and feel (1) myBatis (1) php (1) serialVersionUID (1) skype (1) smtp (1) ssh (1) swing (1) torrents (1) unit-testing (1) unix (1) vpn (1) windows 7 (1) xStarter (1) zip (1) безопасность (1) вход в систему (1) дизайн (1) документация (1) заправка (1) интернет (1) логирование (1) мышь (1) патч (1) перенос (1) печать (1) плагины (1) почтовые сообщения (1) программирование (1) процессы (1) прошивка (1) сеть (1) сеть. ошибка (1) скрытые файлы (1) списки (1) фильтрация (1) фокус (1) часовые пояса (1) шифрование (1) экран (1)