Элементы управления
Элементы управления из пакета AWT являются наследниками класса Component. При использовании пакета Swing компоненты наследуются от класса JComponent, производного от класса Container.
Текстовые метки Label, JLabel создаются с помощью конструкторов Label(), Label(String str), Label(String str,int alignment).
Списки – Listи JList.
Полосы прокрутки – ScrollBar и JScrollBar.
Однострочная область ввода – TextField и JTextField.
Многострочная область ввода – TextArea и JTextArea.
Кнопки – Button и JButton.
Кнопки – CheckBox и JCheckBox, RadioButton и JRadioButton.
От AbstractButton наследуются два основных кнопочных класса: JButton и JToggleButton. Первый служит для создания обычных кнопок с разнообразными возможностями, а второй - для создания радиокнопок (класс JRadioButton) и отмечаемых кнопок (класс JCheckBox). Помимо названных от AbstractButton наследуется пара классов JCheckBoxMenuItem и JRadioButtonMenuItem, используемых для организации тех меню, пункты которых должны быть оснащены отмечаемыми радиокнопками.
Процесс создания кнопок достаточно прост: вызывается конструктор JButton с меткой, которую нужно поместить на кнопке. Класс JButton библиотеки Swing для создания обычных кнопок предлагает несколько различных конструкторов: JButton(),JButton(String s),
JButton(Icon i),JButton(String s, Icon i).
Если используется конструктор без параметров, то получится абсолютно пустая кнопка. Задав текстовую строку, получим кнопку с надписью. Для создания кнопки с рисунком конструктору передается ссылка на класс пиктограммы. Класс JButton содержит несколько десятков методов. JButton - это компонент, который автоматически перерисовывается как часть обновления. Это означает, что не нужно явно вызывать перерисовку кнопки, как и любого управляющего элемента; он просто помещается на форму и сам автоматически заботится о своей перерисовке. Чтобы поместить кнопку на форму, необходимо выполнить это в методе init(). Каждый раз, когда кнопка нажимается, генерируется action-событие. Оно посылается блокам прослушивания, зарегистрированным для приема события от этого компонента.
// пример # 7 : кнопка и ее методы : MyButtons.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MyButtons extends JApplet
implements ActionListener {
String msg;
JButton yes, maybe;
JLabel lbl;
JTextField txt;
public void init() {
yes = new JButton("yes");
yes.setActionCommand("yes"); //определение команды
maybe = new JButton("may be");
lbl = newJLabel("");
txt = new JTextField(10);
Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(yes);
c.add(maybe);
c.add(lbl);
c.add(txt);
yes.addActionListener(this);
maybe.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String str =
((JButton) e.getSource()).getText();
if (str.equals("yes"))
msg = "Button <yes> is pressed”;
Else
msg = " Button <may be> is pressed ";
lbl.setText(msg);
String name =
e.getActionCommand(); // извлечение команды
txt.setText(name);
}
}
Рис. 13.7. Апплет с кнопками, меткой и текстовым полем
МетодgetSource() возвращает ссылку на объект, явившийся источником события, который преобразуется в объект JButton. Метод getText()в виде строки извлекает текст, который изображен на кнопке, и помещает его с помощью метода setText() объекта JLabel в объект lbl. При этом определяется, какая из кнопок была нажата.
Команда, ассоциированная с кнопкой, возвращается вызовом метода getActionCommand() класса ActionEvent, экземпляр которого содержит всю информацию о событии. Для отображения результата нажатия кнопки использован компонент JTextField, представляющий собой поле, где может быть размещен и изменен текст. Хотя есть несколько способов создания JTextField, самым простым является сообщение конструктору нужной ширины текстового поля. Как только JTextField помещается на форму, можно изменять содержимое, используя метод s
2. Библиотека стандарта JAVA_EE
Согласно заявлению Sun Microsystems, на настоящий момент более 90% корпоративных систем поддерживают Java 2 Enterprise Edition. Эта платформа позволяет быстро и без особых издержек объединить возможности сети Интернет и корпоративных информационных систем.
Сервлеты – это компоненты приложений Java 2 Platform Enterprise Edition (J2EE), выполняющиеся на стороне сервера, способные обрабатывать клиентские запросы и динамически генерировать ответы на них. Наибольшее распространение получили сервлеты, обрабатывающие клиентские запросы по протоколу HTTP.
Сервлет может применяться, например, для создания серверного приложения, получающего от клиента запрос, анализирующего его и делающего выборку данных из базы, а также пересылающего клиенту страницу HTML, сгенерированную с помощью JSP на основе полученных данных.
Преимуществом сервлетов перед CGI или ASP можно считать быстродействие и то, что сервлеты, являющиеся переносимыми на различные платформы, пишутся на объектно-ориентированном языке высокого уровня Java, который расширяется большим числом классов и программных интерфейсов.
В настоящее время сервлеты поддерживаются большинством Web-серверов и являются частью платформы J2EE.
Все сервлеты реализуют общий интерфейс Servlet. Для обработки HTTP-запросов можно воспользоваться в качестве базового класса абстрактным классом HttpServlet. Базовая часть классов JSDK помещена в пакет javax.servlet. Однако класс HttpServletи все, что с ним связано, располагаются на один уровень ниже в пакете javax.servlet.http.
Жизненный цикл сервлета начинается с его загрузки в память контейнером сервлетов при старте либо в ответ на первый запрос. Далее происходят инициализация, обслуживание запросов и завершение существования.
Первым вызывается метод init(). Он дает сервлету возможность инициализировать данные и подготовиться для обработки запросов. Чаще всего в этом методе программисты помещают код, кэширующий данные фазы инициализации.
После этого сервлет можно считать запущенным, он находится в ожидании запросов от клиентов. Появившийся запрос обслуживается методом service() сервлета, а все параметры запроса упаковываются в объект ServletRequest, который передается в качестве первого параметра методу service(). Второй параметр метода – объект ServletResponse. В этот объект упаковываются выходные данные в процессе формирования ответа клиенту. Каждый новый запрос приводит к новому вызову метода service(). В соответствии со спецификацией JSDK, метод service() должен уметь обрабатывать сразу несколько запросов, т.е. быть синхронизирован для выполнения в многопоточных средах. Если же нужно избежать множественных запросов, сервлет должен реализовать интерфейс SingleThreadModel, который не содержит ни одного метода и только указывает серверу об однопоточной природе сервлета. При обращении к такому сервлету каждый новый запрос будет ожидать в очереди, пока не завершится обработка предыдущего запроса.
После завершения выполнения сервлета контейнер сервлетов вызывает метод destroy(), в теле которого следует помещать код освобождения занятых сервлетом ресурсов.
Интерфейсом Servlet предусмотрена реализация еще двух методов: getServletConfig() и getServletInfo(). Первый возвращает объект типа ServletConfig, содержащий параметры конфигурации сервлета, а второй – строку, описывающую назначение сервлета.
При разработке сервлетов в качестве базового класса в большинстве случаев используют не интерфейс Servlet, а классHttpServlet, отвечающий за обработку запросов HTTP.
Класс HttpServlet имеет реализованный метод service(), служащий диспетчером для других методов, каждый из которых обрабатывает методы доступа к ресурсам. В спецификации HTTP определены следующие методы: GET, HEAD, POST, PUT, DELETE, OPTIONS и TRACE. Наиболее часто употребляются методы GET и POST, с помощью которых на сервер передаются запросы, а также параметры для их выполнения.
При использовании метода GET (по умолчанию) параметры передаются как часть URL, значения могут выбираться из полей формы или передаваться непосредственно через URL. При этом запросы кэшируются и имеют ограничения на размер. При использовании метода POST (method=POST) параметры (поля формы) передаются в содержимом HTTP-запроса и упакованы согласно полю заголовка Content-Type. По умолчанию в формате: <имя>=<значение>&<имя>=<значение>&...
Однако форматы упаковки параметров могут быть самые разные, например: в случае передачи файлов с использованием формы
enctype="multipart/form-data".
В задачу метода service() класса HttpServlet входит анализ полученного через запрос метода доступа к ресурсам и вызов метода, имя которого сходно с названием метода доступа к ресурсам, но перед именем добавляется префикс do: doGet()илиdoPost().Кроме этих методов могут использоваться методы: doHead(), doPut(), doDelete(), doOptions() и doTrace(). Разработчик должен переопределить нужный метод, разместив в нем функциональную логику.
В следующем примере приведен готовый к выполнению “шаблон” сервлета:
// пример # 1 : шаблон сервлета : MyServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
/** Constructor of the object. */
public MyServlet() {
super();
}
/** Destruction of the servlet. */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/** The doDelete method of the servlet.
* This method is called when a HTTP delete request is received.
* @param request the request send by the client to the erver
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred */
public void doDelete(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Put your code here
}
/** The doGet method of the servlet.
* This method is called when a form has its tag value method equals to get.
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException or @throws IOException if an error occurred */
public void doGet(HttpServletRequest request, HttpServletRe-sponse response)
throws ServletException, IOException {
response.setContentType("text/html");
this.preventCaching(request, response);
PrintWriter out = response.getWriter();
out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML><HEAD>");
out.println("<TITLE>A Servlet in GET</TITLE>");
out.println("</HEAD><BODY>");
out.print(" This is <B>");
out.print(this.getClass().getName());
out.println("</B>, using the <B>GET</B> method<BR>");
out.println("</BODY></HTML>");
out.flush();
out.close();
}
/** The doPost method of the servlet.
* This method is called when a form has its tag value method equals to post.
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException or @throws IOException if an error occurred */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
this.preventCaching(request, response);
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML><HEAD>");
out.println("<TITLE>A Servlet in POST</TITLE>");
out.println("</HEAD><BODY>");
out.print("This is <B>");
out.print(this.getClass().getName());
out.println("</B>, using the <B>POST</B> method");
out.println("</BODY></HTML>");
out.flush();
out.close();
}
/** The doPut method of the servlet.
* This method is called when a HTTP put request is received.
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException or @throws IOException if an error occurred */
public void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Put your code here
}
/** Returns information about the servlet, such as
* author, version, and copyright.
* @return String information about this servlet */
public String getServletInfo() {
return "This is my default servlet created by Eclipse";
}
/* Initilaisation of the servlet.
* @throws ServletException if an error occure */
public void init() throws ServletException {
// Put your code here
}
/** Prevents navigator from caching data.
* @param request the request send by the client to the server
* @param response the response send by the server to the client
*/
protected void preventCaching(HttpServletRequest request,HttpServletResponse response) {
/* see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html */
String protocol = request.getProtocol();
if ("HTTP/1.0".equalsIgnoreCase(protocol)) {
response.setHeader("Pragma", "no-cache");
} else if ("HTTP/1.1".equalsIgnoreCase(protocol)) {
response.setHeader("Cache-Control", "no-cache");
}
response.setDateHeader("Expires", 0);
}
}
Практика включения HTML-кода в код сервлета не считается хорошей, так как эти действия “уводят” сервлет от его основной роли – контроллера приложения. Это приводит к разрастанию размеров сервлета, которое на определенном этапе становится неконтролируемым и реализует вследствие этого анти-шаблон “Волшебный сервлет”. Даже приведенный выше маленький сервлет имеет признаки анти-шаблона, так как содержит метод print(), используемый для формирования кода HTML. Сервлет должен использоваться только для реализации бизнес-логики приложения и обязан быть отделен как от непосредственного формирования ответа на запрос, так и от данных, необходимых для этого. Обычно для формирования ответа на запрос применяются страницы JSP. Признаки наличия анти-шаблонов все же будут встречаться ниже, но это отступление сделано только с точки зрения компактности примеров.
Веб-сервер Tomcat и запуск web-приложений
Сервер Apache Tomcat применяется в качестве обработчика страниц JSP и сервлетов. Последняя версия может быть загружена с сайта
jakarta.apache.org.
Ниже приведены необходимые действия по выполнению сервлета из предыдущего примера с помощью контейнера сервлетов Web-сервера Tomcat 4.1. Пусть Web-сервер установлен в каталоге /Apache Group/Tomcat4.1.
В этом же каталоге разместятся следующие подкаталоги:
/bin – содержит startup, shutdown и другие исполняемые файлы;
/conf – содержит конфигурационные файлы, в частности конфигурационный файл контейнера сервлетов server.xml;
/server – помещаются классы;
/logs – помещаются log-файлы;
/webapps – в этот каталог помещаются папки, содержащие сервлеты и другие компоненты приложения.
Пусть необходимо поместить в каталог /webapps папку /FirstProjectс вложенным в нее сервлетом FirstServlet и определить, что требуется поместить в эту папку. Папка /FirstProject должна содержать каталог /WEB-INF, в котором помещаются подкаталоги:
/classes – содержит класс сервлета FirstServlet.class;
/lib – содержит библиотеки классов (если они есть), упакованные в JAR-файлы (архивы java);
/src – содержит исходный файл сервлета FirstServlet.java;
а также web.xml – конфигурационный файл приложения.
В файле web.xml необходимо прописать имя и путь к сервлету. Этот файл можно сконфигурировать так, что имя сервлета в браузере не будет совпадать с истинным именем сервлета. Например:
<web-app>
<servlet>
<servlet-name>FirstServletname</servlet-name>
<display-name>FirstServletdisplay</display-name>
<servlet-class>test.com.FirstServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServletname</servlet-name>
<url-pattern>/Servtest</url-pattern>
</servlet-mapping>
</web-app>
Здесь указано имя сервлета FirstServletname, имя класса сервлета FirstServlet.class, URL-имя сервлета, по которому происходит его вызов Servtest.
Таким образом, требуется выполнить следующие действия:
1. Компиляцию сервлета: javac FirstServlet.java;
2. Полученный файл класса FirstServlet.class поместить в папку /FirstProject/WEB-INF/classes/test/com;
3. В эту же папку /FirstProject/WEB-INF поместить файл конфигурации web.xml;
4. Переместить папку /FirstProject в каталог /webapps сервера Tomcat;
5. Стартовать Tomcat;
6. Вызвать браузер и набрать строку:
Дата добавления: 2015-04-05; просмотров: 1016;