Request URI: /FirstProject/RequestServlet

Protocol: HTTP/1.1

PathInfo: null

Remote Address: 127.0.0.1

Header INFO:

accept = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
referer = http://localhost:8080/FirstProject/index.jsp
accept-language = ru
content-type = application/x-www-form-urlencoded
accept-encoding = gzip, deflate
user-agent Request URI: /FirstProject/RequestServlet = Мозилла/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
host = localhost:8080
content-length = 0
connection = Keep-Alive
cache-control = no-cache
cookie = JSESSIONID=91014EB2B2208BCA18AE898424B71CEF

Сервлет RequestServletследует испытать вызывать с разных компов локальной сети либо вызвать пару раз сервлет из нескольких браузеров, запущенных на одном компьютере.

Когда клиент перебегает по адресу URL Request URI: /FirstProject/RequestServlet, который обрабатывается сервлетом, контейнер сервлета перехватывает запрос и вызывает способ doGet() либо doPost(). Эти способы вызываются после конфигурации объектов, наследующих интерфейсы HttpServletRequest, HttpServletResponse. Задачка способов doGet() и doPost() – взаимодействие с HTTP-запросом клиента и создание HTTP-ответа, основанного на данных запроса. Способ getWriter() объекта-ответа возвращает поток PrintWriter, который употребляется для записи Request URI: /FirstProject/RequestServlet символьных данных ответа.

Интерфейсы ServletResponse и HttpServletResponse

Генерируемые сервлетами данные пересылаются серверу-контейнеру при помощи объектов, реализующих интерфейс ServletResponse, а сервер, в свою очередь, пересылает ответ клиенту, инициировавшему запрос.

Можно получить ссылки на потоки вывода одним из 2-ух способов:

ServletOutputStream getOutputStream() – извлечение ссылки на поток ServletOutputStream для передачи Request URI: /FirstProject/RequestServlet бинарной инфы;

PrintWriter getWriter() – извлечение ссылки на поток типа PrintWriter для передачи символьной инфы;

Если способ getOutputStream() уже был вызван для этого ответа, то генерируется IllegalStateException. Оборотное также правильно.

В интерфейсе HttpServletResponse, наследующем интерфейс ServletResponse, еще есть несколько нужных способов:

void setContentType(String type) – установка MIME-типа генерируемых документов;

void addCookie(Cookie Request URI: /FirstProject/RequestServlet c) – добавление cookie к объекту ответа для следующей пересылки на клиентский компьютер;

void sendError(int sc, String msg) – сообщение о появившихся ошибках, где sc – код ошибки, msg – текстовое сообщение;

void setDateHeader(String name, long date) – добавление даты в заголовок ответа;

void setHeader(String name, String value) – добавление характеристик Request URI: /FirstProject/RequestServlet в заголовок ответа. Если параметр с таким именованием уже существует, то он будет заменен.

Обработка запроса

Распределенное приложение может быть действенным исключительно в случае, если оно способно принимать информацию от на физическом уровне удаленных клиентов. В последующем примере сервлет извлекает данные пользовательской формы, переданные вкупе с запросом по способу GET.

Приведенная на Request URI: /FirstProject/RequestServlet рисунке 18.1 форма является результатом отображения JSP-страницы index.jsp, находящейся в папке /webapps/FirstProject3.

В форме имеется текстовое поле с именованием name и значением по дефлоту «Название проекта». Значение поля можно поменять конкретно на страничке.

Рис. 18.1. JSP-форма

В форме заданы две группы по два элемента ввода типа Request URI: /FirstProject/RequestServlet radio, любая из которых имеет свое имя. При наличии на страничке нескольких полей, имеющих одно имя, можно избрать только какой-то из них. Им задаются надлежащие значения, и при выборе одной из кнопок значение, данное соответственной кнопке, заносится в значение собственного элемента. По дефлоту для радиогрупп принято задавать одно из Request URI: /FirstProject/RequestServlet значений с помощью характеристики checked.

В конечном итоге юзер может поменять значения текстового поля и радиогрупп. При нажатии кнопки типа происходит доказательство формы и вызывается сервлет.

В форме задан способ POST, с помощью которого происходит передача данных формы в виде отдельных заголовков. Если не задавать этот способ, то по Request URI: /FirstProject/RequestServlet дефлоту будет употребляться способ GET, и данные формы будут передаваться через универсальный запрос (URL), в который к адресу будут добавлены значения соответственных частей.

<%@ page language="java" contentType=

"text/html; charset=utf-8" pageEncoding="utf-8"%>

Заглавие проекта:

Технологии:

JSPX

name="Разработка"

value="JSP в формате XML">

JSTL

name Request URI: /FirstProject/RequestServlet="Разработка"

value="Библиотека тегов JSTL">

Язык программирования:

Java 6

name="Язык"

value="Java SE 6">

Java 5

name="Язык"

value="Java 1.5.0" checked>


При доказательстве из формы вызывается сервлет FormRequest. Сервлет получает и извлекает значения всех переменных формы и показывает их совместно
с именами переменных. Для обработки Request URI: /FirstProject/RequestServlet данных, приобретенных из полей формы, употребляется приведенный ниже сервлет.

/* пример # 4 : обработка запроса клиента : FormRequest.java :

ParameterOutput.java */

package chapt18;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class FormRequest extends HttpServlet {

protected void doPost(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

private void performTask(HttpServletRequest Request URI: /FirstProject/RequestServlet req,

HttpServletResponse resp) {

RequestOutput.generate(resp, req);

}

}

В способе performTask() происходит воззвание к другому классу-обработчику запроса юзера с передачей ему объектов HttpServletRequest req иHttpServletResponse resp.

/* пример # 5 : извлечение инфы из запроса клиента : RequestOutput.java */

package chapt18;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import javax Request URI: /FirstProject/RequestServlet.servlet.http.HttpServletResponse;

public class RequestOutput {

public static void generate(HttpServletResponse resp,

HttpServletRequest req) {

try {

String name, value;

resp.setContentType("text/html; charset=utf-8");

PrintWriter out = resp.getWriter();

out.print("");

out.print("Итог");

out.print("");

out.print("

");

Enumeration names = req.getParameterNames();

while (names.hasMoreElements()) {

name = (String) names.nextElement();

value = req.getParameterValues(name)[0]; /*

name = new String(name Request URI: /FirstProject/RequestServlet.getBytes("ISO-8859-1"), "utf-8");

value = new String(value.getBytes("ISO-8859-1"), "utf-8");

*/

out.print("

");

out.print("

");

out.print("

");

out.print("

");

}

out.print("

" + name + " " + value + "
");

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

В классе в объекте resp задается тип содержимого text/html и шифровка UTF-8, если необходимо показать кириллицу. После чего объект out устанавливается Request URI: /FirstProject/RequestServlet в выходной поток resp.getWriter(), в который будут помещаться данные. Из запроса HttpServletRequest req извлекается объект типа Enumeration с текстовыми значениями имен переменных формы. Дальше, итерируя по элементам этого объекта, поочередно извлекаются все характеристики. Для каждого имени переменной можно по мере надобности (если не указана кодовая Request URI: /FirstProject/RequestServlet страничка) произвести перекодировку: сначала извлекается объект итерации
в шифровке, в какой он передается, а конкретно ISO-8859-1, после создается новенькая строчка с нужной шифровкой, в этом случае UTF-8. Для каждой из переменных извлекаются из запроса надлежащие им значения с помощью способа getParameterValues(name). Этим же методом их шифровка может быть изменена Request URI: /FirstProject/RequestServlet и добавлена в выходной поток.

Класс сервлета относится к пакету chapt18, потому файл
FormRequest.class должен быть расположен в папке

/webapps/FirstProject3/WEB-INF/classes/chapt18

и воззвание к этому классу, к примеру из документа HTML, должно выполняться как chapt18.FormRequest. В файле web.xml должны находиться строчки:

MyForm

chapt18.FormRequest

MyForm

/testform

Воззвание к сервлету делается Request URI: /FirstProject/RequestServlet по его URL-имени testform. Итог выполнения:

Рис. 18.2. Итог выполнения запроса

Способ getParameterValues() возвращает значения хоть какой переменной формы по имени этой переменной. Массив ворачивается поэтому, что некие переменные формы могут иметь несколько значений, к примеру группа флагов либо радиокнопок. Другой способ доступа не подразумевает подготовительного познания их имен. Способ getParameterNames Request URI: /FirstProject/RequestServlet() возвращает объект Enumeration, в каком содержатся все имена переменных, извлеченных из формы.

Многопоточность

Контейнер сервлетов будет иметь несколько потоков выполнения, распределяемых согласно запросам клиентов. Возможна ситуация, когда два клиента сразу вызовут способы doGet() либо doPost(). Способ service() должен быть написан с учетом вопросов многопоточности. Хоть какой доступ к разделяемым ресурсам, которыми могут Request URI: /FirstProject/RequestServlet быть файлы, объекты, нужно защитить главным словом synchronized. Ниже приведен пример посимвольного вывода строчки сервлетом с паузой меж выводом знаков в 500 миллисекунд, что позволяет другим клиентам, вызвавшим сервлет, успеть вклиниться в процесс вывода при отсутствии синхронизации.

/* пример # 6 : доступ к синхронизированным ресурсам :

ServletSynchronization.java */

package chapt18;

import java.io Request URI: /FirstProject/RequestServlet.*;

import javax.servlet.ServletException;

import javax.servlet.http.*;

public class ServletSynchronization extends HttpServlet {

// синхронизируемый объект

private StringBuffer locked = new StringBuffer();

protected void doGet(HttpServletRequest req,

HttpServletResponse res)

throws ServletException, IOException {

performTask(req, res);

}

private void performTask(HttpServletRequest req,

HttpServletResponse res)

throws ServletException, IOException {

try {

Writer out = res.getWriter();

out.write(

""

+ "SynchronizationDemo"

+ "");

out.write(createString());

out.write("");

out.flush();

out.close();

} catch (IOException e) {

throw Request URI: /FirstProject/RequestServlet new RuntimeException(

"Failed to handle request: " + e);

}

}

protected String createString() {

// оригинал строчки

final String SYNCHRO = "SYNCHRONIZATION";

synchronized (locked) {

try {

for (int i = 0; i < SYNCHRO.length(); i++) {

locked.append(SYNCHRO.charAt(i));

Thread.sleep(500);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

String result = locked.toString();

locked.delete(0, SYNCHRO.length() - 1);

return result;

}

}

}

Результаты работы сервлета при наличии и отсутствии синхронизации представлены на рисунках Request URI: /FirstProject/RequestServlet.

Рис. 18.3. Итог работы сервлета Synchronization
с блоком синхронизации

Рис. 18.4. Итог работы сервлета Synchronization
без синхронизации

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

Электрическая почта

Рассылка электрической почты, в том числе и автоматическая, является стандартным родом деятельности при использовании Web Request URI: /FirstProject/RequestServlet-приложений. Свой почтовый сервер сделать довольно просто, только нужно указать адресок почтового севера, который будет применен в качестве транспорта.

Последующий пример употребляет интерфейсы API JavaMail для работы с электрической почтой в сервлетах и JSP. API JavaMail содержит классы, при помощи которых моделируется система электрической почты. Класс javax.mail Request URI: /FirstProject/RequestServlet.Session представляет сеанс почтовой связи, класс javax.mail.Message – почтовое сообщение, класс javax.mail.internet.InternetAddress – адреса электрической почты.

Рис. 18.5. Формирование запроса на отправку письма

Для работы с данной частью платформы J2EE нужно скачать zip-файлы, расположенные по адресу http://java.sun.com/products/javamail/, содержащие архивы mail.jar и activation.jar. И Request URI: /FirstProject/RequestServlet добавить эти файлы в каталог jar-файлов серверам приложений (common/lib для Tomcat). Также нужно запустить почтовую программку James, являющуюся также одним из проектов apache.org.

Ниже приведена страничка JSP, содержащая форму для наполнения главных полей: «Кому» – «to», «От кого» – «from», «Тема сообщения» – «subj»

<%@ page language="java" contentType=

"text/html; charset=UTF-8" pageEncoding="UTF-8"%>

SendMail Application

Мой почтовый сервер

<form Request URI: /FirstProject/RequestServlet method="post" action="sendmail">

To(email):

From(email):

Subject:

Хороший денек!


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

/* пример # 8 : доступ к синхронизированным ресурсам :

SendMailServlet.java */

packagechapt18;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail Request URI: /FirstProject/RequestServlet.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.activation.*;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.PrintWriter;

public class SendMailServlet

extendsjavax.servlet.http.HttpServlet

implements javax.servlet.Servlet {

//объект почтовой сессии

private Session mailSession = null;

public Request URI: /FirstProject/RequestServlet void init(ServletConfig config)

throws ServletException {

//mailSession = Session.getDefaultInstance(System.getProperties());

final String host = "mail.smtphost";

final String port = "mail.smtpport";

//запрос характеристик почтового сервера из web.xml

String hostvalue = config.getInitParameter(host);

String portvalue = config.getInitParameter(port);

java.util.Properties props = new java.util.Properties();

//загрузка характеристик почтового сервера в объект параметров

props.put Request URI: /FirstProject/RequestServlet(host, hostvalue);

props.put(port, portvalue);

//загрузка характеристик почтового сервера в объект почтовой сессии

mailSession = Session.getDefaultInstance(props, null);

}

protected void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

//извлечение характеристик письма из запроса

String from = request.getParameter("from");

String to = request.getParameter("to");

String subject = request.getParameter("subj");

String content = request.getParameter("body");

if((from Request URI: /FirstProject/RequestServlet == null) || (to == null)

|| (subject == null) || (content == null)) {

/*при отсутствии 1-го из характеристик предлагается повторить

ввод*/

response.sendRedirect("index.jsp");

return;

}

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

(new MailSender(to, from, subject, content)).start();

//формирование странички с предложение о разработке нового письма

response.setContentType("text/html; charset=CP1251");

PrintWriter out = response.getWriter();

out.println("");

out.println Request URI: /FirstProject/RequestServlet("SendMail Application");

out.println("Message to " + to

+ " sending in progress");

out.println("New message");

out.println("");

}

private class MailSender extends Thread {

private String mailTo;

private String mailFrom;

private String mailSubject;

private String mailContent;

MailSender(String mailTo, String mailFrom,

String mailSubject, String mailContent) {

setDaemon(true);

this.mailTo = mailTo;

this.mailFrom = mailFrom;

this.mailSubject = mailSubject;

this.mailContent = mailContent;

}

public void run() {

try {

//создание объекта почтового сообщения

Message Request URI: /FirstProject/RequestServlet message = new MimeMessage(mailSession);

//загрузка характеристик в объект почтового сообщения

message.setFrom(new InternetAddress(mailFrom));

message.setRecipient(Message.RecipientType.TO,

new InternetAddress(mailTo));

message.setSubject(mailSubject);

message.setContent(mailContent, "text/plain");

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

Transport.send(message);

} catch(AddressException e) {

e.printStackTrace();

System.err.print("Ошибка адреса");

} catch(MessagingException e) {

e.printStackTrace();

System.out.print("Ошибка сообщения");

}

}

}

}

В Request URI: /FirstProject/RequestServlet итоге в браузер будет выведено:

Message to blinov@gmail.com sending in progress New message

где New message представляет собой активную ссылку, перенаправляющую при запуске на index.jsp для сотворения еще 1-го письма. Процесс же отправки письма будет работать независимо от предстоящей работы приложения.

Файл web.xml для данного приложения имеет вид:

FirstMail

SendMailServlet

SendMailServlet

SendMailServlet

mail Request URI: /FirstProject/RequestServlet.smtphost

mail.bsu.bsu

mail.smtpport

25

chapt18.SendMailServlet

/sendmail

index.jsp

В качестве значения параметра mail.smtphost можно испытать использовать адресок почтового сервера mail.attbi.com.

Задания к главе 18

Вариант А

Сделать сервлет и взаимодействующие с ним пакеты Java-классов и JSP-страницы, выполняющие последующие деяния:

1. Генерация таблиц по переданным характеристикам: заголовок, количество строк и столбцов, цвет Request URI: /FirstProject/RequestServlet фона.

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

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

4. Вычисление объемов тел (параллелепипед, куб, сфера, тетраэдр, тор, шар, эллипсоид и т.д.) с Request URI: /FirstProject/RequestServlet точностью и параметрами, указываемыми юзером.

5. Поиск и (либо) подмена инфы в коллекции по ключу (значению).

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

7. Выбор изображения по теме (природа, авто, малыши и т.д.)
и его отображение.

8. Информация о среднесуточной температуре воздуха Request URI: /FirstProject/RequestServlet в месяц задана
в виде перечня, лежащего в файле. Найти:

а) среднемесячную температуру воздуха; б) количество дней, когда температура была выше среднемесячной; в) количество дней, когда температура опускалась ниже 0ºC; г) три самых теплых денька.

9. Игра с сервером в “21”.

10. Реализация адаптивного теста из цепочки в 3–4 вопроса Request URI: /FirstProject/RequestServlet.

11. Определение значения полинома в данной точке. Степень полинома
и его коэффициенты вводятся юзером.

12. Вывод фрагментов текстов шрифтами различного размера. Размер шрифта и количество строк задаются на стороне клиента.

13. Информация о точках на плоскости хранится в файле. Избрать все точки, более приближенные к данной прямой. Характеристики прямой
и наибольшее расстояние от Request URI: /FirstProject/RequestServlet точки до прямой вводятся на стороне клиента.

14. Выполнить сортировку введенного юзером массива целых чисел. Числа вводятся через запятую.

15. Воплотить игру с сервером в крестики-нолики.

16. Выполнить форматирование избранного юзером текстового файла, так чтоб все абзацы имели отступ ровно 3 пробела, а длина каждой строчки была ровно 80 знаков и не имела исходными Request URI: /FirstProject/RequestServlet и конечными знаками пробел.

Вариант B

Для заданий варианта В главы 4 на базе сервлетов создать механизм аутентификации и авторизации юзера. Сервлет должен сгенерировать приветствие с указанием имени, роли юзера, также указать текущую дату и Айпишник компьютера юзера.

Тестовые задания к главе 18

Вопрос 18.1.

Каким образом в способе init() сервлета получить параметр Request URI: /FirstProject/RequestServlet инициализации сервлета с именованием “URL”? (изберите два)

1) ServletConfig.getInitParameter("URL");

2) getServletConfig().getInitParameter("URL");

3) this.getInitParameter("URL");

4) HttpSerlet.getInitParameter("URL");

5) ServletContext.getInitParameter("URL").

Вопрос 18.2.

Какой способ сервлета FirstServlet будет вызван при активизации ссылки последующего HTML-документа?

OK!

Соответственный сервлету тег в файле web.xml имеет вид:

/FirstServlettest

1) doGet();

2) doGET();

3) performTask();

4) doPost();

5) doPOST().

Вопрос 18.3.

Контейнер Request URI: /FirstProject/RequestServlet вызывает способ init() экземпляра сервлета…

1) при каждом запросе к сервлету;

2) при каждом запросе к сервлету, при котором создается новенькая сессия;

3) при каждом запросе к сервлету, при котором создается новый поток;

4) только один раз за актуальный цикл экземпляра;

5) когда сервлет создается в первый раз;

6) если время жизни Request URI: /FirstProject/RequestServlet сессии юзера, от которого пришел запрос, истекло.

Вопрос 18.4.

Каковы типы возвращаемых значений способов getResource()
и getResourceAsStream()интерфейса ServletContext?

1) ServletContext не имеет таких способов;

2) String и InputStream;

3) URL и InputStream;

4) URL и StreamReader.

Вопрос 18.5.

Какие интерфейсы находятся в пакете javax.servlet?

1) ServletRequest;

2) ServletOutputStream;

3) PageContext;

4) Servlet;

5) ServletContextEvent;

6) ни один из перечисленных.

Вопрос 18.6.

Как можно Request URI: /FirstProject/RequestServlet получить всю информацию из запроса, посланного последующей формой? (изберите два варианта ответа)

1) request.getParameterValues("filename");

2) request.getAttribute("filename");

3) request.getInputStream();

4) request.getReader();

5) request.getFileInputStream().

Глава 19

Java Server Pages

Разработка Java Server Pages (JSP) была разработана компанией Sun Microsystems, чтоб облегчить создание страничек с динамическим содержанием.

В то время как сервлеты лучшим образом Request URI: /FirstProject/RequestServlet подходят для выполнения контролирующей функции приложения в виде обработки запросов и определения вида ответа, странички JSP делают функцию формирования текстовых документов типа HTML, XML, WML и неких других.

под определениями “динамическое/статическое содержание” обычно понимаются не части JSP, а содержание Web-приложения:

1) динамические ресурсы, изменяемые в процессе работы Request URI: /FirstProject/RequestServlet: сервлеты, JSP, также java-код;

2) статические ресурсы, не изменяемые в процессе работы – HTML, JavaScript, изображения и т.д.

Смысл разделения динамического и статического содержания в том, что статические ресурсы могут находиться под управлением HTTP-сервера, в то время как динамические нуждаются в движке (Servlet Engine) и почти Request URI: /FirstProject/RequestServlet всегда в доступе к уровню данных.

Рекомендуется поделить и разрабатывать параллельно две части приложения: Web-приложение, состоящее только из динамических ресурсов, и Web-приложение, состоящее только из статических ресурсов.

Некие достоинства использования JSP-технологии над другими способами сотворения динамического содержания страничек:

d) Разделение динамического и статического содержания.

Возможность поделить логику приложения Request URI: /FirstProject/RequestServlet и дизайн Web-страницы понижает сложность разработки Web-приложений и упрощает их поддержку.

d) Независимость от платформы.

Потому что JSP-технология, основанная на языке программирования Java, не находится в зависимости от платформы, то JSP могут производиться фактически на любом Web-сервере. Разрабатывать JSP можно на хоть какой Request URI: /FirstProject/RequestServlet платформе.

e) Неоднократное внедрение компонент.

Внедрение JavaBeans и Enterprise JavaBeans (EJB) позволяет мно­гократно использовать составляющие, что ускоряет создание Web-сайтов.

f) Скрипты и теги.

Спецификация JSP заявляет собственные теги, не считая того, JSP поддерживают как JavaScript, так и HTML-теги. JavaScript обычно употребляется, чтоб добавить многофункциональные способности на уровне Request URI: /FirstProject/RequestServlet HTML-страницы. Теги обеспечивают возможность использования JavaBean и выполнение обыденных функций.

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

Содержимое Java Server Pages (теги HTML, теги JSP и скрипты) переводится в сервлет код-сервером Request URI: /FirstProject/RequestServlet. Этот процесс ответствен за трансляцию как динами­ческих, так и статических частей, объявленных снутри файла JSP. Об архитектуре веб-сайтов, использующих JSP/Servlet-технологии, нередко молвят как о thin-client (внедрение ресурсов клиента некординально), так как большая часть логики производится на сервере.

JSP составляется из стандартных HTML-тегов, JSP Request URI: /FirstProject/RequestServlet-тегов, action-тегов, JSTL и пользовательских тегов. В спецификации JSP 2.0 существует 5 главных тегов:

<%@директива%>–употребляются для установки характеристик серверной странички JSP.

<%!объявление%>–содержит переменные Java и способы, которые вызываются в expression-блоке и являются полями генерируемого сервлета. Объявление не должно создавать запись в выходной поток out странички, но может быть применено в Request URI: /FirstProject/RequestServlet скриптлетах и выражениях.

<%скриптлет%>–вживление Java-кода в JSP-страницу. Скриптлеты обыч­но употребляют мелкие блоки кода и производятся во время обработки запроса клиента. Когда все скриптлеты собираются воедино в том порядке, в каком они записаны на страничке, они должны представлять собой верный код языка программирования. Контейнер помещает код Java в способ Request URI: /FirstProject/RequestServlet _jspService() на шаге трансляции.

<%=вычисляемое выражение%>–операторы языка Java, которые рассчитываются, после этого итог вычисления преобразуется в строчку String и посылается в поток out.

<%-- JSP-комментарий --%>–комментарий, который не отображается в начальных кодах JSP-страницы после шага выполнения.

Стандартные элементы action

Большая часть тегов, объявленных выше, используются не так нередко. Более применяемыми являются стандартные деяния Request URI: /FirstProject/RequestServlet версии JSP 2.0. Они позволяют создавать правильные JSP –документы при помощи последующих тегов:

1) jsp:declaration– объявление, аналогичен тегу ;

2) jsp:scriptlet – скриптлет, аналогичен тегу ;

3) jsp:expression– скриптлет, аналогичен тегу;

4) jsp:text– вывод текста;

2 jsp:useBean – позволяет использовать экземпляр компонента Java Bean. Если экземпляр с обозначенным идентификатором не существует, то он будет сотворен с областью видимости page (страничка), request (запрос Request URI: /FirstProject/RequestServlet), session (сессия) либо application(приложение). Объявляется, обычно, с атрибутами id(имя объекта), scope (область видимости), class(полное имя класса), type (по дефлоту class).

scope=”session”

class=”test.MyBean” />

Сотворен объект ob класса MyBean, и в предстоящем через этот объект можно вызывать доступные способы класса. Специфичность компонент JavaBean в том, что если компонент имеет поле field, экземпляр Request URI: /FirstProject/RequestServlet компонента имеет параметр field, а способ, устанавливающий значение, должен называться setField(type value), ворачивающий значение – getField().

package test;

public class MyBean {

private String field = "нет инфы";

public String getField() {

return info;

}

public void setField(String f) {

field = f;

}

}

5) jsp:setProperty– позволяет устанавливать значения полей обозначенного в атрибуте name объекта. Если установить значение property в «*», то значения параметров компонента JavaBean Request URI: /FirstProject/RequestServlet будут установлены таким макаром, что будет определено соответствие меж именами характеристик и именами методов-установщиков (setter-ов) компонента:

property=”field”

value=”привет” />

e) jsp:getProperty– получает значения поля обозначенного объекта, конвертирует его в строчку и посылает в неявный объект out:

f) jsp:include– позволяет включать файлы в Request URI: /FirstProject/RequestServlet генерируемую страничку при запросе странички:

относительный URL

flush=”true”/>

g) jsp:forward– позволяет передать запрос другой страничке:

относительный URL”/>

h) jsp:plugin– замещается тегом либо , зависимо от типа браузера, в каком будет производиться подключаемый апплет либо Java Bean.

i) jsp:params– группирует характеристики снутри тега jsp:plugin.

6) jsp:param– добавляет характеристики Request URI: /FirstProject/RequestServlet в объект запроса, к примеру в элементах forward, include, plugin.

7) jsp:fallback– показывает содержимое, которое будет употребляться браузером клиента, если подключаемый модуль не сумеет запуститься. Употребляется снутри элемента plugin.

В качестве примера можно привести последующий кусок:

code=”test.com.ReadParam”

width=”250”

height=”250”>

unable to start plugin

Код апплета Request URI: /FirstProject/RequestServlet находится в примере 5 главы 11, и пакет, в каком он объявлен, должен быть размещен в корне папки /WEB-INF, а не в папке /classes.

Элементы ,,,,,употребляются в главном при включении в страничку пользовательских тегов.

JSP-документ

Желательно создавать JSP-страницу в виде JSP-документа – кор­рект­ного XML-документа, который ссылается Request URI: /FirstProject/RequestServlet на определенное место имен, содержит стандартные деяния JSP, пользовательские теги и теги ядра JSTL, XML-эквиваленты директив JSP. В JSP-документе перечисленные выше 5 тегов неприменимы, потому их необходимо подменять стандартными действиями и кор­ректными тегами. JSP-документы нужно сохранять с расширением .jspx.

Директива taglib для обыкновенной JSP:

<%@ taglib uri="http://java.sun.com Request URI: /FirstProject/RequestServlet/jsp/jstl/core"

prefix="c"%>

для JSP-документа:

Директива page для обыкновенной JSP:

для JSP-документа:

Директива include для обыкновенной JSP:

для JSP-документа:

Ниже приведены два примера, демонстрирующие различие внедрения стандартных действий и тегов при разработке JSP-страниц и JSP-документов.

JSP-страница

<%! private int count = 0;

String version = new String("J Request URI: /FirstProject/RequestServlet2EE 1.5");

private String getName(){return "J2EE 1.6";} %>




<% version=getName();

out.println("Новое значение version: " + version); %>

Версия в виде JSP-документа несколько более громоздка, но читать и находить ошибки в таком документе проще, ежели в прошлом.

version="2.0">

"text/html; charset Request URI: /FirstProject/RequestServlet=UTF-8" />

private int count = 0;

String version = new String("J2EE 1.5");

private String getName(){return "J2EE 1.6";}

out.println("Значение count: ");

count++


out.println("Значение count после инкремента:"

+ count);


out.println("Старенькое значение version: ");

version


version=getName();

out.println("Новое значение version: " + version);

Дальше в главе примеры будут приведены в виде JSP-документов.

JSTL

JSP Request URI: /FirstProject/RequestServlet-страницы, включающие скриптлеты, элементы action (стандартные деяния) и пользовательские теги, не могут быть технологичными без использования JSTL (JSP Standard Tag Library). Создание страничек с применением JSTL позволяет упростить разработку и отрешиться от вживления Java-кода в JSP. Как было показано ранее, странички со скриптлетами тяжело читаемы, что вызывает Request URI: /FirstProject/RequestServlet препядствия как у программера, так и у веб-дизайнера, не владеющего глубокими заниями в Java.

Библиотеку JSTL версии 1.1.2 (jstl-1.1.2.jarиstandard-1.1.2.jar) либо более позднюю версию можно загрузить c веб-сайта apache.org. Библиотеки следует расположить в каталоге /lib проекта. При указании значения параметра xmlns элемента root (для JSP-страницы значение параметра taglib uri="") нужно Request URI: /FirstProject/RequestServlet быть внимательным, потому что если адресок будет указан некорректно, JSP-страница не сумеет иметь доступ к тегам JSTL. Проверить корректность значение параметра uri (оно же справедливо и для параметра xmlns) можно в файле подключаемой библиотеки (к примеру c.tld). Простая JSP с применением тега JSTL, выводящим в браузер приветствие будет смотреться Request URI: /FirstProject/RequestServlet последующим образом:

xmlns:c=http://java.sun.com/jsp/jstl/core

version="2.0">

"text/html; charset=Utf-8"/>

Тег посылает значение параметра value в поток JspWriter.

JSTL предоставляет последующие способности:

- поддержку Expression Language, что позволяет разработчику писать обыкновенные выражения Request URI: /FirstProject/RequestServlet снутри атрибутов тега и предоставляет “прозрачный” доступ к переменным в разных областях видимости странички;

- компанию условных переходов и циклов, основанную на тегах, а не на скриптовом языке;

- обычное формирование доступа (URL) к разным ресурсам;

- ординарную интернационализацию JSP;

- взаимодействие с базами данных;

- обработку XML, также форматирование и разбор строк.

Expression Request URI: /FirstProject/RequestServlet Language

В JSTL вводится понятие Expression Language (EL). EL употребляется для упрощения доступа к данным, хранящимся в разных областях видимости (page, request, application) и вычисления обычных выражений.

EL вызывается с помощью конструкции “${имя}”.


researching-resistance-l-simmons.html
reshaem-po-chelovecheski-cherez-matricu-gesse.html
reshaemie-zadachi-lekciya-vvedenie-logicheskaya-programma-osnovnie.html