Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

РассылкиАрхив Java programmingВыпуск 11-й

Здравствуйте дорогие читатели!

Содержание

1. Начинающим
2. Тема "на заказ"
3. Вопрос - ответ
4. Программный код…
5. JavaScript

Начинающим

Массивы

Для объявления типа массива используются квадратные скобки. В приведенной ниже строке объявляется переменная monthDays, тип которой - "массив целых чисел типа int".


int monthDays [];

Для того, чтобы зарезервировать память под массив, используется специальный оператор new. В приведенной ниже строке кода с помощью оператора new массиву monthDdays выделяется память для хранения двенадцати целых чисел.


month_days = new int [12];

Итак, теперь monthDays - это ссылка на двенадцать целых чисел. Ниже приведен пример, в котором создается массив, элементы которого содержат число дней в месяцах года (не високосного).


class MonthDays
{
 public static void main (String args [])
 {
  int monthDays[];
  monthDays = new int[12];
  monthDays[0] = 31; 
  monthDays[1] = 28;
  monthDays[2] = 31; 
  monthDays[3] = 30; 
  monthDays[4] = 31; 
  monthDays[5] = 30; 
  monthDays[6] = 31; 
  monthDays[7] = 31; 
  monthDays[8] = 30; 
  monthDays[9] = 31; 
  monthDays[10] = 30;
  monthDays[11] = 31;
  System.out.println("April has " + monthDays[3] + " days.");
 }
}

Нумерация элементов массива в Java начинается с нуля, так что число дней в апреле - это monthDays[3].

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


class AutoMonthDays
{
 public static void main(String args[])
 {
  int monthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  System.out.println("April has " + monthDays[3] + " days.");
 }
}

В результате работы этой программы, вы получите точно такой же результат, как и от ее более длинной предшественницы.

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

Многомерные массивы

На самом деле, настоящих многомерных массивов в Java не существует. Зато имеются массивы массивов, которые ведут себя подобно многомерным массивам, за исключением нескольких незначительных отличий. Приведенный ниже код создает традиционную матрицу из шестнадцати элементов типа double, каждый из которых инициализируется нулем. Внутренняя реализация этой матрицы - массив массивов double.


double matrix [][] = new double [4][4];

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


double matrix [][] = new double [4][];
matrix [0] = new double[4];
matrix[1] = new double[4];
matrix[2] = new double[4], 
matrix[3] = { 0, 1, 2, 3 };

В следующем примере создается матрица размером 4 на 4 с элементами типа double, причем ее диагональные элементы (те, для которых х==у) заполняются единицами, а все остальные элементы остаются равными нулю.


class Matrix
{
 public static void main(String args[]) 
 { 
  double m[][];
  m = new double[4][4];
  m[0][0] = 1;
  m[1][1] = 1;
  m[2][2] = 1;
  m[3][3] = 1;
  System.out.println(m[0][0] +" "+ m[0][1] +" "+ m[0][2] +" "+ m[0][3]);
  System.out.println(m[1][0] +" "+ m[1][1] +" "+ m[1][2] +" "+ m[1][3]);
  System.out.println(m[2][0] +" "+ m[2][1] +" "+ m[2][2] +" "+ m[2][3]);
  System.out.println(m[3][0] +" "+ m[3][1] +" "+ m[3][2] +" "+ m[3][3]);
 }
}

Запустив эту программу, вы получите следующий результат:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

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

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


class AutoMatrix 
{
 public static void main(String args[]) 
 { 
  double m[][] ={{0*0,1*0,2*0,3*0},{0*1,1*1,2*1,3*1}, 
                           {0*2,1*2,2*2,3*2},{0*3,1*3,2*3,3*3}};
  System.out.println(m[0][0] +" "+ m[0][1] +" "+ m[0][2] +" "+ m[0][3]);
  System.out.println(m[1][0] +" "+m[1][1] +" "+ m[1][2] +" "+ m[1][3]);
  System.out.println(m[2][0] +" "+m[2][1] +" "+ m[2][2] +" "+ m[2][3]);
  System.out.println(m[3][0] +" "+m[3][1] +" "+ m[3][2] +" "+ m[3][3]);
 }
}

Запустив эту программу, вы получите следующий результат:
0 0 0 0
0 1 2 3
0 2 4 6
0 3 6 9

В следующем номере мы рассмотрим арифметические операторы.

Тема "на заказ"

Завершен опрос!

Закончился опрос открытый в 9-м номере.

Проголосовало 178 человек.

Какая тема вам более интересна?

Java 2D API (39 голосов - 21.91%)
JSP (22 голосов - 12.36%)
Исключительные ситуации (36 голосов - 20.22%)
Многопоточные приложения (24 голосов - 13.48%)
Пакет AWT (2 голоса - 1.12%)
Пакет JFC Swing (12 голосов - 6.74%)
Сетевые соединения (27 голосов - 15.17%)
Не знаю (16 голосов - 8.99%)

Как давно вы программируете на Java?

Больше двух лет (28 голосов - 15.73%)
Два года (9 голосов - 5.05%)
Год (49 голосов - 27.52%)
Меньше года (30 голосов - 16.85%)
Только начал(а) (62 голоса - 34.83%)

В ближайшее время будут рассмотрены темы перевалившие 15% барьер, остальные же темы будут рассмотрены по мере возможности.

Помещение в JAR-архив цифровой подписи

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

Для внесения цифровой подписи в JAR-архив необходимо иметь два инструмента.

  • Утилита keytool. Используется для генерации пары открытого и закрытого ключа и сертификата.
  • Утилита jarsigner. Используется для непосредственного помещения цифровой подписи в JAR-архивы с применением имеющегося сертификата.

Что нам понадобится:

  1. Выполнить генерацию пары ключей.
  2. Получить сертификат на эту пару.
  3. Использовать сертификат для помещения цифровой подписи в JAR-архив.

Генерация пары ключей

Для генерации новой пары ключей можно использовать следующею команду:
keytool -genkey -alias testkey

В результате выполнения этой команды будет создана новая пара ключей сохранённая в базе данных под именем testkey. Вот что у нас получится:

Программа keytool позволяет указывать следующие параметры:

-v
- запрос вывода сообщений о действии программы.
-alias псевдоним
- псевдоним (имя) который присваивается этой паре.
-keyalg алгоритм_ключа
- алгоритм шифрования вашей подписи - обычно по умолчанию это алгоритм SHA1 with DSA и его можно не указывать если не собираетесь изменять его, размер ключа при генерации DSA ключевой пары может быть от 512 до 1024 бит, но если вы хотите применить MD5 with RSA то укажите опцию -keyalg "RSA" Следует заметить что опция -keyalg обуславливает и опцию -sigalg - алгоритм подписи который будет использован по умолчанию для подписания jar-файла (при создании дайджестов сообщений).
-keysize длина_ключа
- размер генерируемых ключей в битах.
-keypass пароль
- пароль для данного ключа. Если пароль не будет указан в командной строке, программа предложит ввести его значение в режиме диалога. Длина пароля должна быть не менее шести символов.
-keystore хранилище
- расположение хранилища ключей.
-storepass пароль
- пароль доступа к хранилищу ключей.
-validity valDays
- срок годности вашего сертификата. По умолчанию это 180 дней, можно указать больше или меньше.

По умолчанию утилита keytool помещает открытый ключ в подписанный вами же сертификат X.509.v1.

Командой keytool -list мы можем посмотреть содержимое keystore:

Получение сертификата

После генерации новой пары ключей необходимо выполнить генерацию запроса CSR(Certificate Signing Request). Этот запрос отсылается в любую выбранную службу сертификации.

Для генерации CSR запроса введите следующею команду:
keytool -certreq

Для нашей пары ключей testkey команда будет выглядеть следующим образом:
keytool -certreq -alias testkey

При генерации CSR запроса допускаются следующие параметры:

-v
- сопровождение работы программы выдачей сообщений.
-alias псевдоним
- определение псевдонима пары ключей, для которых необходимо получить сертификат. По умолчанию применяется значение mekey.
-sigalg алгоритм_сигнатуры
- задание используемого алгоритма внесения подписи.
-file csr_файл
- имя и расположение файла, в котором помещается генерируемый запрос.
-keypass пароль
- пароль для доступа к данному ключу.
-storepass пароль
- пароль доступа к хранилищу ключей.
-keystore хранилище
- имя и расположения файла с парой ключей.

Сгенерированный CSR-запрос отсылается в выбранную службу сертификации. После проведения всех необходимых проверок и удостоверения вашей личности вам будет выдан требуемый сертификат.

В любом случае самостоятельно занесите полученный сертификат в файл и введите следующею команду:
keytool -import

Следующие параметры могут быть указаны в режиме import:

-v
- сопровождение работы программы выдачей сообщений.
-alias псевдоним
- псевдоним полного имени, которое будет использоваться с данным сертификатом.
-file файл-сертификата
- имя и расположение файла, в котором сохранён полученный сертификат.

Команда:
keytool -export -alias testkey -file имя_файла
даст указание утилите скопировать ваш сертификат в указанный файл. Отправьте свой сертификат всем получателям, которые будут использовать подписанные вами JAR-архива.

Помещение в JAR-архив цифровой подписи с помощью утилиты jarsigner

Помимо помещения цифровой подписи в JAR-архивы утилита jarsigner способна также проверять целостность подписанных JAR-архивов. Для этого достаточно запустить её с параметром -verify/

При вводе команды:
jarsigner myJarFile.jar
тилита воспользуется хранилищем ключей по умолчанию и результат будет помещён в файл myJarFile.jar, который заместит исходный файл архива.

Для создания JAR-архива подписанного нашими ключами testkey введите следующею команду:
jarsigner myJarFile.jar testkey

Для того чтобы файл myJarFile.jar остался неизменённым а результат записался, например, в файл mySignedJarFile.jar введите команду:
jarsigner -signedjar mySignedJarFile.jar myJarFile.jar testkey.

Вопрос - ответ

Было прислано два подобных вопроса:

У меня возникла следующая проблема. После установки Оперы (6 версия) и Java-приложения Интернет Explorer 6.0 (у меня операционная система Windows XP Rus) не воспроизводит Java-апплеты. У меня на сайте апплет в виде часов так Opera и Netscape воспроизводят, Internet Explorer -нет. Посоветуйте что делать.
Alexander

Вот скажите! В Windows XP, стоит IE 6.0, а в нем тег APPLET игнорируется, что делать?
Nick

Ответ:
Насколько я знаю в Windows XP виртуальная машина Microsoft не установлена и доступна только в Интернете, откуда ее можно загрузить на компьютер. Последнюю 32-разрядную версию Microsoft VM можно найти на веб-узле Майкрософт. (http://go.microsoft.com/fwlink/?LinkId=284)

Вопрос:
Как поставить JDK на XP?
Nick

Ответ:
Реализации JDK под XP пока ещё нет, но в работает стандартная реализация по win2k b winNT.

Вопрос:
Подскажите, как в JTable установить фиксированную и уникальную для каждого столбца ширину?

Ответ:
Привожу небольшой пример в разделе "программный код"

Программный код…


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class Frame1 extends JFrame
{
 JPanel contentPane;
 public Frame1()
 {
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  try
  {
   init();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 private void init() throws Exception
 {
  this.setSize(new Dimension(640, 300));
  this.setTitle("Пример JTable");
  //Массив названий столбцов
  String[] columnNames = {"Первый столбец", "Второй столбец", "Третий столбец"};
  //Массив ячеек таблицы
  Object[] [] dataTable = { 
  {"Первый столбец строка 1", "Второй столбец строка 1", "Третий столбец строка 1"},
  {"Первый столбец строка 2", "Второй столбец строка 2", "Третий столбец строка 2"},
  {"Первый столбец строка 3", "Второй столбец строка 3", "Третий столбец строка 3"},
  {"Первый столбец строка 4", "Второй столбец строка 4", "Третий столбец строка 4"},
  {"Первый столбец строка 5", "Второй столбец строка 5", "Третий столбец строка 5"},
  {"Первый столбец строка 6", "Второй столбец строка 6", "Третий столбец строка 6"},
  {"Первый столбец строка 7", "Второй столбец строка 7", "Третий столбец строка 7"},
  {"Первый столбец строка 8", "Второй столбец строка 8", "Третий столбец строка 8"},
                          };
  //Создаём таблицу
  JTable jTable1 = new JTable(dataTable, columnNames);
  //Изменяем ширину столбцов таблицы
  jTable1.getColumnModel().getColumn(0).setPreferredWidth(200);
  jTable1.getColumnModel().getColumn(1).setPreferredWidth(140);
  jTable1.getColumnModel().getColumn(2).setPreferredWidth(280);
  //Изменяем высоту строк таблицы
  jTable1.setRowHeight(0,10);
  jTable1.setRowHeight(1,15);
  jTable1.setRowHeight(2,20);
  jTable1.setRowHeight(3,25);
  jTable1.setRowHeight(4,30);
  jTable1.setRowHeight(5,35);
  jTable1.setRowHeight(6,40);
  jTable1.setRowHeight(7,45);
  //Создаём панель
  JPanel p=new JPanel();
  //Добавляем на панель таблицу
  p.add(jTable1);
  //Панель в свою очередь помещаем на форму
  this.getContentPane().add(p);
 }
 protected void processWindowEvent(WindowEvent e)
 {
  super.processWindowEvent(e);
  if (e.getID() == WindowEvent.WINDOW_CLOSING)
  {
   System.exit(0);
  }
 }
}

JavaScript

Вопрос:
Как я могу использовать select box как навигационное меню?

Ответ:
Рассмотрите этот пример:


<form; name="navForm">
<select; name="menu" onChange = "self.location = document.navForm.menu[document.navForm.menu.selectedIndex].value;">
<option; value="home.html">Домой
<option; value="links.html">Ссылки
<option; value="contact.html">Контактная информация
</select>
</form>

Вопросы присылайте на E-mail [email protected] с пометкой "вопрос по Java".

Жду вопросов и предложений.
Юрий Ладик.

Подписаться на эту рассылку можно тут /subs/subs.html


Эд Барнет
"Eclipse IDE. Карманный справочник"
Подробнее>>
Заказать>>

Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Apache Struts 2.0.11
Apache MyFaces Trinidad Core 1.2.3.
Sun переводит мобильные устройства с Java ME на Java SE
Хакерская атака!



Выпуск 29-й
Выпуск 28-й
Выпуск 27-й
Выпуск 26-й
Выпуск 25-й
Выпуск 24-й
Выпуск 23-й
Выпуск 22-й
Выпуск 21-й
Выпуск 20-й
Выпуск 19-й
Выпуск 18-й
Выпуск 17-й
Выпуск 16-й
Выпуск 15-й
Выпуск 14-й
Выпуск 13-й
Выпуск 12-й
Выпуск 11-й
Выпуск 10-й
Выпуск 9-й
Выпуск 8-й
Выпуск 7-й
Выпуск 6-й
Выпуск 5-й
Выпуск 4-й
Выпуск 3-й
Выпуск 2-й
Выпуск 1-й