Java programming выпуск 26-й
Здравствуйте дорогие читатели!
С наступающим Новым Годом!!!
После долгого перерыва наконец-то увидел свет очередной выпуск рассылки.
В прошлом номере я провел опрос о том, как продолжать рассылку, спасибо всем ответившим и приславшим комментарии к своему голосу.
Многих огорчает малый объем информации и редкий выход. Но я стараюсь и прошу вас помочь мне наладить выпуск более объемных номеров, присылайте свои статьи и разные примеры, да и просто советы с идеями.
В общем, результат опроса вы можете посмотреть тут.
Да и после вот такого комментария я думаю оставить все пока как есть, но постараюсь выпускать рассылку регулярно раз в месяц.
Мне так больше нравится , потому что всё равно читаешь рассылку по настрению , а уж настроение - оно как повезёт. Но вот ваша рассылка почти всегда удачно приходит ;)
Так и вот еще одно:
Дизайн сайта и рассылки неплохо бы сменить. Мало обзоров об новейших технологиях, связанных с Java, например, переводы статей IBM developerWorks и IBM alphaWorks, хотя если сайт только для начинающих, то все это не к чему.
Если кому не трудно помогите с переводами, и я их опубликую.
И сайт я рассчитывал не только для начинающих, но одному столько не сделать, не в моих силах. Новостной раздел сделать я тоже хотел, вот только кто новости писать будет? Есть желающие? И обзоры новых технологий и т.д. и т.п.
Жду вашей помощи.
Предлагаю принять участи в тестировании обновленного форума.
Пишите найденные багги в этот топик.
Также предлагаю обсудить открытие новых разделов на форуме в топике: Названия разделов форума
Начинающим
Классы (продолжение)
final
Все методы и переменные объектов могут быть замещены по умолчанию. Если же вы хотите объявить, что подклассы не имеют права замещать какие-либо переменные и методы вашего класса, вам нужно объявить их как final (в Delphi / C++ не писать слово virtual).
final int FILE_NEW = 1;
По общепринятому соглашению при выборе имен переменных типа final — используются только символы верхнего регистра (т.е. используются как аналог препроцерных констант C++). Использование final-методов порой приводит к выигрышу в скорости выполнения кода — поскольку они не могут быть замещены, транслятору ничто не мешает заменять их вызовы встроенным (in-line) кодом (байт-код копируется непосредственно в код вызывающего метода).
finalize
В Java существует возможность объявлять методы с именем finalize. Методы finalize аналогичны деструкторам в C++ (ключевой знак ~) и Delphi (ключевое слово destructor). Исполняющая среда Java будет вызывать его каждый раз, когда сборщик мусора соберется уничтожить объект этого класса.
static
Иногда требуется создать метод, который можно было бы использовать вне контекста какого-либо объекта его класса. Так же, как в случае main, все, что требуется для создания такого метода — указать при его объявлении модификатор типа static. Статические методы могут непосредственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок this и super. Переменные также могут иметь тип static, они подобны глобальным переменным, то есть доступны из любого места кода. Внутри статических методов недопустимы ссылки на переменные представителей. Ниже приведен пример класса, у которого есть статические переменные, статический метод и статический блок инициализации.
class Static
{
static int a = 3;
static int b;
static void method(int x)
{
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static
{
System.out.println("static block initialized");
b = a * 4;
}
public static void main(String args[])
{
method(42);
}
}
Ниже приведен результат запуска этой программы.
Х = 42
А = 3
B = 12
В следующем примере мы создали класс со статическим методом и несколькими статическими переменными. Второй класс может вызывать статический метод по имени и ссылаться на статические переменные непосредственно через имя класса.
class StaticClass
{
static int a = 42;
static int b = 99;
static void callme()
{
System.out.println("a = " + a);
}
}
class StaticByName
{
public static void main(String args[])
{
StaticClass.callme();
System.out.println("b = " + StaticClass.b);
}
}
А вот и результат запуска этой программы:
а = 42 b = 99
abstract
Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов отсутствует. В таких случаях вы можете с помощью модификатора типа abstract объявить, что некоторые из методов обязательно должны быть замещены в подклассах. Любой класс, содержащий методы abstract, также должен быть объявлен, как abstract. Поскольку у таких классов отсутствует полная реализация, их представителей нельзя создавать с помощью оператора new. Кроме того, нельзя объявлять абстрактными конструкторы и статические методы. Любой подкласс абстрактного класса либо обязан предоставить реализацию всех абстрактных методов своего суперкласса, либо сам должен быть объявлен абстрактным.
abstract class A
{
abstract void callme();
void metoo()
{
System.out.println("Inside A's metoo method");
}
}
class B extends A
{
void callme()
{
System.out.println("Inside B's callme method");
}
}
class Abstract
{
public static void main(String args[])
{
A a = new B():
a.callme():
a.metoo():
}
}
В нашем примере для вызова реализованного в подклассе класса А метода callme и реализованного в классе А метода metoo используется динамическое назначение методов, которое мы обсуждали раньше.
Inside B's callrne method Inside A's metoo method
Тема "на заказ"
Первый сервлет
Что такое сервлет ? Это класс порожденный от класса HttpServlet с переопреденными методами doGet и doPost (управление приходит в один из этих методов в зависимости от того какого типа был запрос. Надеюсь у Вас есть некоторый опыт в cgi-программировании для того чтобы понять разницу между ними).
Входиные-выходные параметры передаются в этих методах через:
HttpServletRequest req
HttpServletResponse res
Дальше все совсем просто - приведу исходный текст, на мой взгляд там все очевидно.
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class myServlet extends HttpServlet { public final void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException { doRequest(req, res); } public final void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException { doRequest(req, res); } private void doRequest(HttpServletRequest req, HttpServletResponse res) { try{ res.setContentType("text/html; charset=windows-1251"); PrintWriter out = res.getWriter(); out.println("<html><body>"); out.println("<h1>Hello, world !</h1>"); out.println("</body></html>"); } catch(Exception e) { message("Exception in error():"+e);} } }
Дальше я думаю что Вам захочется обрабатывать html-формы? Так это очень просто!
Это делает код:
String res=req.getParameter("имя параметра");
А как получить список всех параметров и "пройтись" по этому списку? Пожалуста:
Enumeration e=req.getParameterNames(); while(e.hasMoreElements()) { String paramName=(String)e.nextElement(); // имя параметра String paramVal=req.getParameter(paramName); // значение параметра ... }
Вопрос - ответ
Вопрос:
Подскажите, как можно одновременно загрузить несколько картинок, чтобы они отображались одновременно, а то у меня получается, что они отображаются с небольшим интервалом по мере загрузки?
|
Ответ: Для этих целей можно использовать класс MediaTracker: MediaTracker tracker = new MediaTracker(this); Image img1 = getToolkit().createImage(getClass().getResource("URL")); Image img2 = getToolkit().createImage(getClass().getResource("URL ")); tracker.addImage(img1,0); tracker.addImage(img2,0); try { tracker.waitForAll(); }catch(InterruptedException ie){} |
Вопрос: Можно ли каким либо образом приостановит выполнение цикла при определенном условии и затем продолжить его выполнение без потери данных.
|
Ответ: В необходимом месте в цикле можно сделать следующим образом:try { Thread.sleep(millis); } catch (InterruptedException e) { }Где millis время приостановки цикла в миллисекундах. |
Вопрос:
Мне необходимо чтобы Label отображалась не строка а несколько строк, можно ли это сделать?
|
Ответ: Да можно, но используя класс JLabel, из библиотеки javax.swing.* используя встроенную возможность применять HTML для форматирования текста: JLabel jlabel = new JLabel("<html;><body; color=#00b400><p;>Привет! <br;>Всем!</p></body></html>"); |
Вопрос: Как хранить настройки java программ?
|
Ответ: Прочитайте статью на эту тему Как хранить настройки java программ?. |
Программный код…
Посылка почты с приложением через javamail
/// /// Посылка Сообщения /// String to = args[0]; String from = args[1]; String host = args[2]; boolean debug = Boolean.valueOf(args[3]).booleanValue(); // Устанавливаем свойиства и получаем Сессию по умолчанию Properties props = new Properties(); props.put("mail.smtp.host", host); Session session = Session.getDefaultInstance(props, null); session.setDebug(debug); try { // Создаем сообщение MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = {new InternetAddress(to)}; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject("JavaMail APIs Multipart Test"); msg.setSentDate(new Date()); // создаем и заполняем первую часть сообщения MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText("Your mail"); // создаем и заполняем вторую часть сообщения MimeBodyPart mbp2 = new MimeBodyPart(); // Можно использовать setText(text, charset), для предоставления в нужной кодировке! mbp2.setContent(msgText2, "image/jpg"); // Создаем Multipart и добавляем в него ранее созданные части Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); // Добавляем Multipart в сообщение msg.setContent(mp); // Посылаем сообщение Transport.send(msg); } catch (MessagingException mex) { mex.printStackTrace(); Exception ex = null; if ((ex = mex.getNextException()) != null) { ex.printStackTrace(); } }
JavaScript
Вопрос: Как в JavaScript определить нажат ли SHIFT?
|
Ответ:
|
Вопрос: Как проверить емайл введенный в форму??
|
Ответ:
|
Вопрос:
Попал я на Ваш сайт с целью найти скрипт для отправки почты.
И нашел:
/java/examples/sendmail0.html
Но я не понял,каким боком и куда его прописывать. |
Ответ: Это не скрипт это Java-приложение. Не путайте Java и JavaScript. С помощью JavaScript вы не отправите почту. |
Вопрос: Как отключить кэширование страниц в браузере с помощью JavaScript.? |
Ответ: Вам не позволит этого сделать политика безопасности. |
Вопрос: Как проверить с какова адреса(WWW) пришел посетитель?
|
Ответ:
|
Вопросы присылайте на E-mail
[email protected] с пометкой "Вопрос по Java".
Или задавайте их на форуме
Жду вопросов и предложений.