Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java -texnologiya.doc
Скачиваний:
2
Добавлен:
27.02.2020
Размер:
2.62 Mб
Скачать

1.2. Выполнение Java-программы

Cначала Java-программа должна быть скомпилирована, а потом выполнена интерпретатором.

Компилятор Java требует, чтобы исходный файл использовал расширение .java.

Для компиляции программы необходимо запустить компилятор javac, указав в параметре командной строки имя исходного файла, например:

c:\java\bin\javac abc1.java

Компилятор javac создает файл с именем abc1.class, который содержит программу в виде байт-кода.

Байт-коды записываются в одном или нескольких файлах, могут храниться во внешней памяти или передаваться по сети. Затем полученные в результате компиляции байт-коды можно выполнять на любом компьютера, имеющем систему, реализующую JVM (Java Virtual Maсhine). При этом не важен ни тип процессора, ни архитектура компьютера.

Все стандартные функции, вызываемые в программе, подключаются к ней только; на этапе выполнения из библиотеки классов JDK (Java Development Kit), а не включаются в байт-коды, то есть осуществляется динамическая компоновка.

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

 При создании апплетов или приложений на языке Java приходится сталкиваться с исключениями. Исключение - это специальный тип ошибки, создаваемый в случае неправильной работы программы. После того как Java  создаст объект-исключение, этот объект посылается прикладной программе; такая операция называется возбуждением исключения. Прикладная программа должна перехватить исключение [2].

Код, который может вызвать исключение, помещается в программный блок try, а код обработки этого исключения располагается в блоке catch.

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

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

c:\java\bin\java abc1 1 -5 6

На экране будет выдана следующая информация:

NumOfargs=3

args[0]=1

args[1]=-5

args[2]=6

That number is a double!

x1=3.0, x2=2.0

 

1.3. Апплеты. Основные принципы создания

Основной нишей языка Java  является создание апплетов, работающих на рабочих местах клиентов сети Internet. Апплет можно запускать только в среде броузера. Современные броузеры обладают собственной встроенной виртуальной машиной Java, что позволяет выполнять Java-программы в среде самого броузера. Для отображения апплета необходимо писать небольшой фрагмент кода HTML.

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

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

Рассмотрим процесс загрузки из сети Internet и запуска в среде броузера Java-апплета. Обычно апплет представляет собой отдельный файл, расположенный вне Web-страницы, на который создается ссылка на языке HTML внутри этой Web-страницы. Для вставки Java-апплета в Web-страницу существует специальный тег в языке HTML - <applet>, с помощью которого устанавливаются координаты и размеры области апплета, а также могут передаваться определенные параметры из Web-страницы в апплет.

Структурная схема загрузки и запуска апплета выглядит следующим образом:

С Web-сервера в сети Internet передается в Web-броузер другого компьютера HTML-страница. После ее загрузки броузер определяет использование встроенного апплета по наличию тега <applet> в HTML-коде этой страницы. Затем броузер формирует область в Web-странице, отведенную для апплета, после чего осуществляет его загрузку из Web-сервера. По завершении загрузки байт-код апплета передается на выполнение виртуальной машине Java (JVM) броузера.  При этом могут быть использованы параметры запуска, если таковые были установлены в теге <applet>. Виртуальная машина Java выполняет полученный байт-код в отведенной тегом <applet> области. В процессе запуска каждый апплет переживает четыре основных состояния, или жизненных цикла, которым соответствуют определенные методы [1]:

 init() - данный метод вызывается автоматически при загрузке апплета в Web-страницу. С помощью него удобно выполнять первоначальную установку параметров и инициализацию переменных апплета.

start() - данный метод выполняется по завершении  процесса инициализации. Управление ему передается каждый раз при  загрузке и перегрузке Web-страницы.

stop() - данный метод вызывается каждый раз, когда  пользователь переходит к другой странице. При возвращении к  текущей странице управление будет передано методу start().

destroy() - данный метод вызывается перед выходом из апплета. В этом методе обычно выполняют остановку работы потока, закрытие сетевых соединений и соединений с базами данных.

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

Приведем вариант решения уравнения ax2+bx+c=0 с применением апплета. Эскизный проект содержит четыре метки с надписями "Введите а:", "Введите в:", "Введите с:" и "Ответ" соответственно, три текстовых окна и кнопку с надписью "Решить". Результат выводится на экран.

Помещаем вначале программы рис. 1, в котором представлены результаты расчета для уравнения x2 –5x+6=0.

 

 

 

 

 

Рис. 1. Результат программы  abc2

 

Лабораторная работа № 2.

 

Листинг 2. abc2.java - апплетный вариант решения  уравнения ax2+bx+c=0.

 ----------------------------------------------------------------

// Подключение пакетов, содержащих классы

 import java.awt.*;//для создания граф. интерфейса

 import java.applet.*;//для создания java-апплетов

 import java.awt.event.*;//для обработки событий

// Определим класс abc2, расширяющий класс Applet

public class abc2 extends Applet{

//Объявление переменных

   TextField t1, t2, t3;

   Button b1;

   String Sa;

// При инициализации апплета создаем элементы управления

   public void init(){

// Устанавливаем абсолютное позиционирование

// компонентов внутри апплета

    setLayout(null);

// Установка оранжевого фона для апплета

    setBackground(Color.orange);

// Создание метки и текстового поля для коэф. a

//Создание метки

    Label l1 = new Label("Введите a: ");

//Установка границ метки

    l1.setBounds(20, 20, 180, 20);

// Добавление метки на рабочее поле аплета

    add(l1);

// Создание текстового поля для а

    t1 = new TextField(10);

//Установка границ текстового поля

    t1.setBounds(20, 40, 100, 20);

// Добавление текстового поля на рабочее поле аплета

    add(t1);

// Создание метки и текстового поля для коэф. b

    Label l2 = new Label("Введите b: ");

    l2.setBounds(20, 60, 180, 20);

    add(l2);

    t2 = new TextField(10);

    t2.setBounds(20, 80, 100, 20);

    add(t2);

// Создание метки и текстового поля для коэф. с

    Label l3 = new Label("Введите c: ");

    l3.setBounds(20, 100, 180, 20);

    add(l3);

    t3 = new TextField(10);

    t3.setBounds(20, 120, 100, 20);

    add(t3);

// Создание кнопки

    b1 = new Button("Решить");

    b1.setBounds(20, 170, 160, 20);

    add(b1);

                     }//конец init()

// Метод вывода графики в апплете

    public void paint(Graphics g){

// Вывод строк

    g.drawString("Ответ: ", 10, 220);

    g.drawString(Sa, 90, 220);   }

// Обработка реакции на нажатие кнопки Решить

   public boolean action(Event evt, Object arg){

if(arg == "Решить"){

// Объявление и инициализация переменных

  double a,b,c,d,m,eps = 1e-8; int i;

  String s1a="";

  String s1=t1.getText();

  String s2=t2.getText();

  String s3=t3.getText();

  a = Double.valueOf(s1).doubleValue();

  b = Double.valueOf(s2).doubleValue();

  c = Double.valueOf(s3).doubleValue();

  // Решение уравнения

    if(Math.abs(a)<eps)

            if(Math.abs(b)<eps)

               if(Math.abs(c)<eps)

                  s1a="any solution";

            else

                s1a="no solution";

        else

            s1a="x1 = x2 = " + (-c/b);

    else {

         if((d = b*b - 4*a*c)<0){

            d=0.5*Math.sqrt(-d)/a; a=-0.5*b/a;

    s1a="x1 ="+a+" + i" +d+ ",x2= "+a+" - i"+d;

                                }

                                else {

               d=0.5*Math.sqrt(d)/a; a=-0.5*b/a;

    s1a="x1 = "+(a+d)+", x2 = "+(a-d);

                                     }

         }

    Sa=s1a;

   // Перерисовка окна апплета

    repaint();

    return true;

     }

  else

    return false;

   }

}

Апплет начинается с операторов import. Первый импортирует AWT классы, так как апплеты взаимодействует с пользователем через абстрактный оконный интерфейс, а не через классы консольного ввода/вывода. Второй оператор import импортирует пакет java.applet, который содержит класс Applet. Создаваемый пользователь апплет должен быть подклассом этого класса. Третий оператор подключает библиотеку обработки событий.

С помощью строки объявления abcextends Applet сообщается, что класс abc2 наследует все переменные и методы более общего класса Applet. Нужно добавить к нему только нужный код.

С помощью апплета в графическую область Web-браузера можно выводить любую информацию. При перекрытии окна браузера другими окнами или его свертывании в пиктограмму это становится невозможным. Когда окно браузера вновь появляется на экране, апплет должен перерисовать свое содержимое. Это  осуществляется с помощью метода repaint().

Доступ к графическому пространству осуществляется с помощью объекта Graphics, который нужно передать в качестве параметра методу paint(). Обычно для вывода строки в графическом режиме используется метод drawString(). Этому методу нужно передать три параметра - строку, которую нужно вывести, и координаты х и у, определяющие позицию начала этой строки.

Большинство пользовательских событий, возникающих в апплете, можно обрабатывать, переопределяя метод action(). Этот метод имеет следующий вид:

 public boolean action}(Event evt, Object arg)

 Когда пользователь щелкает по одной из кнопок апплета, вызывается  метод action(). Так как arg  - это тестовая метка нажатой кнопки,  то можно определить, какую кнопку выбрал пользователь.

Метод action() возвращает значение false, указывающее системе Java, что событие еще не обработано. Пользователь должен доопределить этот метод в своей прикладной программе.

Апплеты Java выполняются в среде Java-совместимого браузера. Для выполнения апплета в Web-броузере можно записать короткий текстовый файл в формате языка HTML, который содержит тег <applet>.

Вид HTML-файла:

<HTML> <body>

 <applet code="abc2.class" width=200 height=60>

  </applet>

</body> </HTML>

Для тега <applet> обязательны атрибуты code, width и height. Параметры width и height определяют размеры окна апплета (200 и 60). После создания файла с расширением .html, можно запустить этот файл, что приведет к выполнению апплета.

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

1. Загружается HTML-файл.

2. Обнаруживается тег <applet>.

3. Файл класса, указанного в <applet>, загружается с сервера.

4. Распознаются и загружаются классы, на которые ссылается класс applet.

5. Класс applet  вызывает методы init()  и start().

6. Если все происходит нормально, апплет отображается в окне броузера (или вне его, если он использует собственный кадр - frame).

Процедура быстрой разработки апплета включает три шага:

1. Редактирование исходного файла Java.

2. Компиляция программы.

3. Запуск программы просмотра апплетов со спецификацией имени исходного файла апплета в ее аргументе. Встретив в комментарии тег <applet> утилита просмотра выполнит его.

Итак, ключевые моменты создания апплета:

 Апплеты не нуждаются в методе main().

 Апплеты должны выполняться броузером, поддержающим Java.

 

Лабораторная работа № 3.

 

Листинг 3. abc3.java - решение уравнения ax2+bx+c=0 с вводом коэффициентов с консоли

---------------------------------------------------------------

 import java.io.*;// подключение библиотеки ввода/вывода

 // определим имя класса

 class abc3{

 // Основной метод для вызова приложения

  public static void main(String[] args)  {

// Объявление и инициализация переменных

  double a=1.0,b=-5.0,c=6.0,d,eps=1e-8;

 PrintStream pr=System.out;

 InputStream is=System.in;

 // Объявление буферизованного потока ввода данных

 InputStreamReader dis = new InputStreamReader (is);

 String str =new String ();

 BufferedReader rred = new BufferedReader(dis);

 try {

 // Чтение символьного представления коэф. а из потока

 str = rred.readLine ();

     }

/* Определение ошибки обработки потока в процессе ввода-вывода */

     catch (IOException e) {;};

     Double A = new Double (str);

//     a = A.doubleValue ();

// Чтение символьного представления коэф. В и обработка исключения IOException

//в случае возбуждения ошибки ввода

 try {str = rred.readLine ();}

      catch (IOException e) {;};

 Double B = new Double (str);

 // Чтение символьного представления коэф. С и обработка исключения IOException

//в случае возбуждения ошибки ввода

 try {str =rred.readLine ();}

      catch (IOException e) {;};

 Double C = new Double(str);

// Преобразование объектов А, В и С в простой тип double

 a = A.doubleValue ();

 b = B.doubleValue ();

 c = C.doubleValue ();

// Решение уравнения

if (Math.abs(a)<eps)

    if (Math.abs(b)<eps)

      if (Math.abs(c)<eps)

          pr.println("any solution");

        else

          pr.println("no solution");

        else

          pr.println("x1 =x2 "+(-c/b));

        else{

    if((d=b*b-4*a*c)<0.01){

    d=0.5*Math.sqrt(-d)/a;a=-0.5*b/a;

          pr.println("x1= "+a+" +i "+d+

          ", x2= "+a+" -i "+d);

          }else{

    d=0.5*Math.sqrt(d)/a; a=-0.5*b/a;

          pr.println("x1= "+(a+d)+", x2= "+(a-d));

               }

             }

  }

}

После трансляции и получения файла abc3.class, его нужно запустить и ввести три числа, например, 1 –5 6, вводя каждое число с новой строки (т.е. нажимая после ввода числа на клавишу Enter). Тогда на экране будет получен следующий результат:

 X1= 3.0, x2= 2.0

 

Лабораторная работа № 4.

 

 Листинг 4 Abcfile.java - решение уравнения ax2+bx+c=0 с вводом данных из файла

 ----------------------------------------------------------------

import java.io.*;  // подключаем библиотеку ввода/вывода

import java.math.*;  // математическая библиотека

 

public class Abcfile {

    // Метод, читающий вещественные числа.

    // Создает исключение, если не удалось прочитать число.

    private static double readDouble(StreamTokenizer st) throws Exception

    {

        // читаем следующую лексему из файла

        st.nextToken();

        // если не удалось прочитать число - создаем исключение

        if (st.ttype != st.TT_NUMBER)

            throw new Exception();

        // возвращаем прочитанное число

        return st.nval;

    }

  

  

    public static void main(String[] args) {

        try

        {         

            // Открываем поток для чтения из файла

            DataInputStream dis = new DataInputStream(new FileInputStream(args[0]));

            // инициализируем символьный поток

            Reader r = new BufferedReader(new InputStreamReader(dis));

            // создаем объект, разбирающий числа в открытом потоке

            StreamTokenizer strt = new StreamTokenizer(r);

                // указываем, что будем читать числа

            strt.parseNumbers();

          

            // считываем первое число из файла

            double a = readDouble(strt);

            // считываем второе число из файла

            double b = readDouble(strt);

                // считываем третье число из файла

            double c = readDouble(strt);

           

            double d, m, eps = 1e-8;

            String Sa;

            // рассматриваем различные случаи при решении уравнения

            if (Math.abs(a) < eps)          

               if (Math.abs(b) < eps)

                  if (Math.abs(c) < eps)

                     Sa = "any solution";

                  else

                     Sa = "no solution";

               else

                  Sa = "x1 = x2 = " + (-c / b);

            else

               {

                  if((d = b * b - 4 * a * c) < 0)

                     {

                        d = 0.5 * Math.sqrt(-d) / a;

                        a = -0.5 * b / a;

                        Sa = "x1 =" + a + " + i" + d + ",    x2= " + a + " - i" + d;

                     }

                  else

                     {

                        d = 0.5 * Math.sqrt(d) / a;

                        a = -0.5 * b / a;

                        Sa = "x1 = " + (a + d) + ",    x2 = " + (a - d);

                     }

               }

                System.out.println(Sa);

        }

        catch (Exception e)

        {

            System.out.println(e.toString());

            return;

        }

    }

}

 

Лабораторная работа № 5.

 

Листинг 5. ab5.java - решение квадратного уравнения с чтением данных из файла ab5.text, c использованием меню и записью результата в файл Score.txt

-----------------------------------------------------------

//подключение пакетов, содержащих классы

 import java.io.*; //для ввода-вывода данных

 import java.awt.*; // для работы с графикой

import java.awt.event.*;//для обработки событий

// Объявляем класс ab5, являющий собой окошко Frame...

public class ab5 extends Frame

 implements Serializable,WindowListener,ActionListener{

      String Sa;

//count - количество считанных чисел из файла.

      int count,i;

      double a,b,c;

//Объявляем файловый диалог для открытия файла...

      FileDialog opener;

//Массив символов, считанных из файла...

 

    // Метод, читающий вещественные числа.

    // Создает исключение, если не удалось прочитать число.

    private static double readDouble(StreamTokenizer st) throws Exception

    {

        // читаем следующую лексему из файла

        st.nextToken();

        // если не удалось прочитать число - создаем исключение

        if (st.ttype != st.TT_NUMBER)

            throw new Exception();

        // возвращаем прочитанное число

        return st.nval;

    }

 

      public ab5(){

// Создаем окно с размещенными на нем элементами меню...

            super("Quadratic.  (c) 2006. Ivan Khramkov.");

// Устанавливает цвет фона для апплета

            super.setBackground(new Color(120,181,202));

// Устанавливаем абсолютное позицирование  компонентов внутри апплета

            super.setLayout(null);

            MenuBar mbar;

            MenuItem exit,open,help;

            mbar = new MenuBar();

            super.setMenuBar(mbar);

// Устанавливаем размер и расположение окна

            super.setSize(599,153);

            super.setLocation(233,233);

// Создаем меню File с пунктами Open, Help, Quit

            Menu file = new Menu("File");

            open=new MenuItem("Open");

            help=new MenuItem("Help");

            exit=new MenuItem("Quit...");

// Открываем прослушиватель

            open.addActionListener(this);

// Добавляем прослушиватель

            exit.addActionListener(this);

//        событий для

            help.addActionListener(this);

// каждого пункта меню...

            file.add(open);

            file.add(help);

            file.add("-");

            file.add(exit);

            mbar.add(file);

// Добавляем прослушиватель событий окна для нашего окна...

            addWindowListener(this);

            setVisible(true);

         }

      public static void main(String[] args)

         {ab5  f=new ab5(); //Создаем объект-окно...

         }

// Событие при попытке закрыть окно...

      public void windowClosing(WindowEvent we){

                  dispose();  System.exit(0);  }

// Метод для вывода графики в окне

      public void paint(Graphics g){

// Установка цвета

            g.setColor(new Color(120,181,202));

// Заполнение прямоугольника

            g.fillRect(0,0,533,333);

// Установка черного цвета

            g.setColor(Color.black);

// Вывод строки

            g.drawString(Sa,9,53); }

//

      public void actionPerformed(ActionEvent ae){

            Graphics g=getGraphics();;

            String str=(String)ae.getActionCommand();

            if (str.equals("Open")){

//Если выбрали пункт меню "Open"...

                  i=0;   opener=new FileDialog(this);

//   Вызываем окно

                  opener.setVisible(true);

//   для открытия файла...

                  String what;

                  if(opener.getFile()!=null)

                     {

                        what=opener.getDirectory()+

                                     opener.getFile();

// Фиксируем путь и имя выбранного файла.../

           try {data(what,0);}

              catch (Exception re){

                Sa="Your output Error is: "+re.getMessage();

                System.out.println("Your input Error is: "+

                                           re.getMessage());

                                  }

                what=opener.getDirectory()+"Score.txt";

                try{data(what,1);}

                 catch (Exception re){

                 Sa="Your output Error is: "+re.getMessage();

                 System.out.println("Your output Error is: "+

                                            re.getMessage());

                                     }

                     }

               }

     else

       if(str.equals("Help")){

//Если выбрали пункт меню "Help"...

         g.setColor(new Color(120,181,202));

         g.fillRect(0,0,533,333);

         g.setColor(Color.black);

         g.drawString("Click on OPEN menu item and choose file, where constants a,b,c should be.",33,53);

         g.drawString("After that, you will see the solution of quadratic, you needed to solve.",33,73);

         g.drawString("If you want to save results, you can open text file,",33,93);

         g.drawString("         named Score.txt, situated in such directory as this program.",33,113);

                              }

          else {dispose(); System.exit(0);}

         }

// Функция data(String path,int mode) - служит для записи

// и чтения информации из определенных файлов...

// Здесь: path - путь и имя файла, mode - сущность работы.

//Принимает 2 значения:

//  0 - если нужно считать информацию...

//  1 - если записать информацию...

   public void data(String path,int mode) throws Exception   {

        if (mode==0) {

                try

                {

                // Открываем поток для чтения из файла

                DataInputStream dis = new DataInputStream(new FileInputStream(path));

                // инициализируем символьный поток

                Reader r = new BufferedReader(new InputStreamReader(dis));

                // создаем объект, разбирающий числа в открытом потоке

                StreamTokenizer strt = new StreamTokenizer(r);

                // указываем, что будем читать числа

                strt.parseNumbers();

                        // считываем коэффициент A

                        a = readDouble(strt);

                        // считываем коэффициент B

                        b = readDouble(strt);

                        // считываем коэффициент C

                        c = readDouble(strt);

                }

            catch (Exception e)

            {

              // выдаем сообщение об ошибке

               Sa="Your output Error is: "+e.getMessage();

               System.out.println("Your output Error is: "+

                                           e.getMessage());

                }

               }

            else

               {

// Объявление файловой переменной для записи в файл...

                  Writer outp=new FileWriter(path);

                  int j;

                  getVal(a,b,c);

                  try{

                        for(j=0;j<Sa.length();j++)

                        outp.write(Sa.charAt(j));

                        outp.write("\n");

                        outp.close();

                     }

                 catch(Exception e){

              // выдаем сообщение об ошибке

               Sa="Your output Error is: "+e.getMessage();

               System.out.println("Your output Error is: "+

                                           e.getMessage());

                                   }

               }

         }

// Решение уравнения ax2+bx+c=0

// Ответ присваивается строковой переменной Sa, которая потом

// пишется в файл и выводится на отображение в окне...

      public void getVal (double a,double b,double c){

            double d, m, eps = 1e-8;

            int i;

            if(Math.abs(a) < eps)

               if(Math.abs(b) < eps)

                  if(Math.abs(c) < eps)

                     Sa="any solution";

                  else

                     Sa="no solution";

               else

                  Sa="x1 = x2 = " + (-c/b);

            else

               {if((d = b*b - 4*a*c) < 0)

                     {d=0.5*Math.sqrt(-d)/a;

                      a=-0.5*b/a;

                      Sa="x1 ="+a+" + i" +d+ ",x2="+a+"-i"+d;

                     }

                  else

                     {  d=0.5*Math.sqrt(d)/a;

                        a=-0.5*b/a;

                        Sa="x1 = "+(a+d)+",    x2 = "+(a-d);

                     }

               }

         }

// Функции обработки событий окна...

      public void windowOpened(WindowEvent we){}

      public void windowClosed(WindowEvent we){}

      public void windowActivated(WindowEvent we){}

      public void windowIconified(WindowEvent we){}

      public void windowDeactivated(WindowEvent we){}

      public void windowDeiconified(WindowEvent we){}

   }

 

 

При запуске программы ab5 появляется окошко с опцией File, в которой выбрав Open и выбрав имя заранее подготовленного файла с данными (например, ab5.data cо строкой 1 –5 6) получаем указанный выше результат.

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]