Веб-програмування на Java: відмінності між версіями

Вилучено вміст Додано вміст
→‎Вступ: Слово "прикладення" калька. Є слова "веб-додаток", або "веб-застосунок".
DannyS712 (обговорення | внесок)
м <source> -> <syntaxhighlight> (phab:T237267)
Рядок 76:
 
Ось перша сторінка:
<sourcesyntaxhighlight lang="html4strict">
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
Рядок 107:
</body>
</html>
</syntaxhighlight>
</source>
Якщо ви знаєте html, то практично усе вам повинно бути зрозумілим. На сторінці присутня форма для створення запиту і в таблиці розміщуються елементи форми: два текстових поля та кнопка.
 
Рядок 118:
Друга сторінка name.jsp буде більш цікавішою. Її створити можна у тому ж каталозі що і попередня сторінка.
 
<sourcesyntaxhighlight lang="java">
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
Рядок 137:
</body>
</html>
</syntaxhighlight>
</source>
[[Файл:HelloJSP.png|350px|thumb|right|Вигляд index.jsp та hello.jsp у браузері]]
Як бачимо у нас є JSP скриптлет оточений обмежувачами <% та %>. Тут по суті іде звичайний java код.
Рядок 144:
 
Слід зазначити, що при використанні кирилиці можуть виникнути проблеми з правильним відображенням символів із запиту. Коли замість потрібних букв будуть зображені незрозумілі закарлючки та символи. Вся проблема у різних кодуваннях запиту і того, що використовує віртуальна машина java, tomcat, база даних і т.п. Якщо у вас в наведеному прикладі вивело саме так, то у випадку з POST запитом допоможе створення спеціального сервлета-фільтра, який викликається перед запитом певних сторінок та сервлетів. Приклад фільтру та вирішення інших проблем з кодуванням дивіться на [http://stackoverflow.com/questions/138948/how-to-get-utf-8-working-in-java-webapps| stackoverflow.com]. Даний фільтр повинен бути відповідним чином прописаний у файлі конфігурації web.xml.
<sourcesyntaxhighlight lang="xml">
<filter>
<filter-name>NewFilter</filter-name>
Рядок 153:
<url-pattern>/*</url-pattern>
</filter-mapping>
</sourcesyntaxhighlight>
Знову ж таки, щоб не заплутатись у файлах конфігурації, популярні IDE надають графічні форми для редагування файлів конфігурації, зокрема і для web.xml.
 
Рядок 162:
Отже існують JSP скриптлети та JSP вирази, що оточені відповідними JSP тегами. З скриптлетами зрозуміло — у них всередині знаходяться інструкції Java. Що ж та таке вирази? Коли ви пишете вираз ви по суті говорите, що результат його обчислення повинен виводитися на екран (тобто вставлятися в html сторінку як текст). При цьому можна обійтися і без змінної:
 
<sourcesyntaxhighlight lang="java"><%= request.getParameter("password") %></sourcesyntaxhighlight>
 
Зверніть увагу, що на відміну від інструкцій скриптлету, вираз не закінчується крапкою з комою. Виводити можна як примітивні типи так і об’єкти. Якщо результатом виразу є об’єкт, то ви повинні бути впевнені, що в ньому присутній метод toString. В іншому разі буде викликаний метод toString класу Object, що є предком усіх класів Java. Результатом цього буде виведено лише ім’я класу та хеш-код.
Рядок 185:
Якщо нам потрібно імпортувати певні класи, необхідно вставити наступну JSP директиву (директива сторінки, page directive):
 
<sourcesyntaxhighlight lang="java"><%@ page import="java.util.Date, ua.mylibrary.*" %></sourcesyntaxhighlight>
 
Різниця між html-коментарем <!-- --> та JSP коментарем <%-- --%> в тому, що html коментар є частиною html сторінки і пересилається користувачу, лишень не виводиться при перегляді її браузером, а JSP коментар суто для розробника. Він не опрацьовується при компіляції JSP сторінки і відповідно не включається в html-код сторінки, яку користувач переглядає у браузері. Зауважте, що якщо у html коментарі присутні JSP теги, то вони будуть скомпільовані і опрацьовані. Тобто якщо там передбачається створення певного об’єкту, то об’єкт на сервері буде створений. Якщо там є JSP вираз, то він буде опрацьований і у html коментар буде вставлено відповідний текст. JSP ж коментарі не компілюються, не опрацьовуються і відповідно нічого не створюється, нікуди не вставляється і не відсилається.
Рядок 206:
Кожен сервлет повинен розширювати клас HttpServlet. Для того, щоб обробляти запити нам потрібно замістити два методи doPost та doGet. Оскільки обом методам найчастіше потрібно робити одне і те ж, то ж визначають цю роботу у одному методі, а в іншому методі просто його викликають. Також можна визначити інший, власний метод, який би викликався із методів doPost та doGet. Останнє і зроблено в нашому прикладі.
 
<sourcesyntaxhighlight lang="java">
package ua.volodimirg;
 
Рядок 260:
}
}
</syntaxhighlight>
</source>
 
Якщо ви знаєте джаву, то нічого складного у вищенаведеному коді для вас немає. Нове тут з’явилося, хіба що наступний рядок:
 
<sourcesyntaxhighlight lang="java">PrintWriter out = response.getWriter();</sourcesyntaxhighlight>
 
Тут ми створюємо потік виводу, який відсилатиме назад у браузер необхідний html-код. Далі просто іде запис необхідного коду у потік виводу.
Рядок 271:
 
Перш за все зробити відповідне мапування (англ. mapping) у файлі web.xml. Скоріш за все IDE само створить вам відповідний файл і пропише усе потрібне (у NetBeans необхідно всього лиш поставити відповідну галочку при створенні сервлету). Для вищенаведених прикладів було створено наступний web.xml файл:
<sourcesyntaxhighlight lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Рядок 298:
</session-config>
</web-app>
</syntaxhighlight>
</source>
 
Якщо ви не створювали фільтра сервлетів з метою правильного читання кирилиці, то тегів із його згадкою у вашому web.xml не буде.
Зверніть увагу як вказано як потрібно звертатися до сервлету в URL-адресі:
<sourcesyntaxhighlight lang="xml"><url-pattern>/HelloFirst</url-pattern></sourcesyntaxhighlight>
 
Друге, що нам потрібно, це модифікувати index.jsp. У тегу form, замість посилання на hello.jsp, поставте HelloFirst.
 
<sourcesyntaxhighlight lang="java"><form name="hello" action="HelloFirst" method="post"></sourcesyntaxhighlight>
Якщо усе правильно зроблено, то у браузері ви отримуватимете те ж саме, що і при використанні hello.jsp. Лишень рядок адреси у браузері при переході на нову сторінку виглядатиме так:
Рядок 322:
Коли ви відкриваєте JSP сторінку у браузері на сервері відбувається відкриття сесії. Ви можете подивитися на відкриті сесії Томкету відвідавши відповідну сторінку: на основній сторінці Tomcat 7 необхідно натиснути кнопку Manager App. Вам буде запропоновано ввести логін та пароль. У файлі C:\tomcat\conf\tomcat-users.xml повинен бути описаний відповідний користувач. У Tomcat 7 на відміну від Tomcat 6 використовується декілька користувачів для доступу до різних сторінок і можливостей Tomcat. Так в даному випадку необхідний користувач manager-gui. Для нашого випадку, для доступу до менеджера прикладень, необхідно, щоб були присутні такі рядки у tomcat-users.xml:
 
<sourcesyntaxhighlight lang="xml">
<tomcat-users>
<role rolename="manager-gui" />
<user password="55" roles="manager-gui" username="tomcat1" />
</tomcat-users>
</syntaxhighlight>
</source>
 
Тож при такому описі користувача, на запит пароля необхідно ввести tomcat1 та пароль 55. Ви можете задати у файлі tomcat-users.xml власну назву користувача і пароль. Загалом Tomcat інформуватиме вас, які користувачі потрібні для доступу до його службових сторінок.
Рядок 339:
Також кукі можна створювати самому, вони використовуються для збереження і передачі часто вводимих даних на стороні користувача, проте у браузері користувач може відключати можливість використання кукі, тому потрібно або попереджати користувача, щоб увімкнув їх, або ж писати код сторінок так, щоб можна було обходитися без кукі.
Переглянути ID сесії можна так:
<sourcesyntaxhighlight lang="java">
<%
HttpSession session1=request.getSession();
Рядок 345:
out.println(s);
%>
</sourcesyntaxhighlight>
В результаті в браузері буде виведено ряд чисел, на зразок: E873633EC113311CA0306882A0143936
 
Що дає нам сесія? Основна мета сесії – це передача певних даних між різними JSP сторінками та сервлетами, що пов’язані з певним користувачем. З програмної точки зору, сесія – це спеціальний об’єкт в якому ми можемо зберігати ім’я змінної та її значення, або ж навіть цілий об’єкт. Наступний рядок демонструє як зберегти певне значення:
 
<sourcesyntaxhighlight lang="java">session.setAttribute("MyAppOperator", "");</sourcesyntaxhighlight>
 
І коли потрібно отримати значення можна скористатися відповідним методом getAttribute:
<sourcesyntaxhighlight lang="java">
boolean isOperator = (session.getAttribute("MyAppOperator") != null);
if (isOperator) { ...
</syntaxhighlight>
</source>
Наступний приклад демонструє використання сесійної змінної для підрахування звернень до сторінки під час сесії:
<sourcesyntaxhighlight lang="java">
<%
Рядок 372:
out.println("<br/> k="+k);
 
%></sourcesyntaxhighlight>
 
Просто вставте даний код у JSP сторінку.
Рядок 380:
Якщо вкінці добавити рядок:
 
<sourcesyntaxhighlight lang="java">session.invalidate();</sourcesyntaxhighlight>
 
то кожного разу буде відкриватися нова сесія. Метод invalidate так би мовити «вбиває» сесію. Також можна встановити максимальний інтервал неактивності. Як вже було сказано по замовчування через пів години бездіяльності користувача, сесію буде закрито. Проте це можна змінити:
 
<sourcesyntaxhighlight lang="java">
session.setMaxInactiveInterval(60*60*24); // один день
session.setMaxInactiveInterval (-1); // допоки не буде закритий браузер
</syntaxhighlight>
</source>
 
При необхідності можна перебрати усі атрибути, що зберігає сесія таким чином:
<sourcesyntaxhighlight lang="java">
Enumeration names=session.getAttributeNames();
while (names.hasMoreElements())
Рядок 396:
out.println((String) names.nextElement());
}
</syntaxhighlight>
</source>
 
==Рекомендована література==