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

Вилучено вміст Додано вміст
Рядок 188:
 
JSP оголошення дозволяють оголошувати змінні та методи, проте це не дуже добре робити в JSP сторінках. Основна причина в тому, що такі змінні не є безпечними з точки зору багатонитковості. Використання таких змінних та методів може призвести до ряду проблем, пов’язаними з використанням їх різними нитками. Оголошені в JSP змінні і методи є глобальними і потрібно вживати спеціальних заходів, щодо безпечної роботи із ними.
 
==JSP помилки==
При роботі з JSP найчастіше в браузері можна побачити помилку 404 та 500.
 
'''Error 404''' означає, що JSP не знайдено. Необхідно перевірити чи працює Tomcat і чи коректна URL адреса.
 
'''Error 500''' означає, що JSP знайдено, проте не скомпільовано через помилку в середині. Уважно читайте інформацію відображену в браузері, за якою можна визначити, що це за помилка і де в коді вона.
 
== Привіт сервлет ==
Тож наступна наша задача написати сервлет, щоб робив те ж саме, що і hello.jsp.
Кожен сервлет повинен розширювати клас HttpServlet. Для того, щоб обробляти запити нам потрібно замістити два методи doPost та doGet. Оскільки обом методам найчастіше потрібно робити одне і те ж, то ж визначають цю роботу у одному методі, а в іншому методі просто його викликають. Також можна визначити інший, власний метод, який би викликався із методів doPost та doGet. Останнє і зроблено в нашому прикладі.
 
<source lang="java">
package ua.volodimirg;
 
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 HelloFirstServlet extends HttpServlet {
 
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
//витягуємо параметри із http запиту
String login=request.getParameter("login");
String password=request.getParameter("password");
String ipAddress=request.getRemoteAddr();
//відсилаємо html-сторінку
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet HelloFirstServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Ви розкриті</h3>");
out.println("Ваш логін: "+ login +"<br/>");
out.println("Ваш пароль: " + password +"<br/>");
out.println("Ваша IP адреса: "+ipAddress);
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
 
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
 
 
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
</source>
 
Якщо ви знаєте джаву, то нічого складного у вищенаведеному коді для вас немає. Нове тут з’явилося, хіба що наступний рядок:
 
<source lang="java">PrintWriter out = response.getWriter();</source>
 
Тут ми створюємо потік виводу, який відсилатиме назад у браузер необхідний html-код. Далі просто іде запис необхідного коду у потік виводу.
 
Щоб створити сервлет у IDE, необхідно натиснути на проекті праву кнопку миші і ввести назву сервлету, та псевдонім за яким до нього будуть звертатися. Наприклад, в даному прикладі повна назва HelloFirstServlet, а звертатися до нього будемо просто HelloServlet. Щоб це зробити, нам потрібно зробити декілька дій.
 
Перш за все зробити відповідне мапування (англ. mapping) у файлі web.xml. Скоріш за все IDE само створить вам відповідний файл і пропише усе потрібне (у NetBeans необхідно всього лиш поставити відповідну галочку при створенні сервлету). Для вищенаведених прикладів було створено наступний web.xml файл:
<source 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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>NewFilter</filter-name>
<filter-class>ua.volodimirg.NewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>HelloFirstServlet</servlet-name>
<servlet-class>ua.volodimirg.HelloFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloFirstServlet</servlet-name>
<url-pattern>/HelloFirst</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
</source>
 
Якщо ви не створювали фільтра сервлетів з метою правильного читання кирилиці, то тегів із його згадкою у вашому web.xml не буде.
Зверніть увагу як вказано як потрібно звертатися до сервлету в URL-адресі:
<source lang="xml"><url-pattern>/HelloFirst</url-pattern></source>
 
Друге, що нам потрібно, це модифікувати index.jsp. У тегу form, замість посилання на hello.jsp, поставте HelloFirst.
 
<source lang="java"><form name="hello" action="HelloFirst" method="post"></source>
Якщо усе правильно зроблено, то у браузері ви отримуватимете те ж саме, що і при використанні hello.jsp. Лишень рядок адреси у браузері при переході на нову сторінку виглядатиме так:
 
<pre>http://localhost:8080/HelloApp/HelloFirst</pre>
 
Зауважте, як іде зверненні до сервлету. Використовується не точна назва сервлету, а коротка, яку ми написали в web.xml файлі в тегові <url-pattern>.
 
Загалом, найкращий спосіб програмування веб-прикладень на java – це комбінація сервлетів та jsp.
 
І на останок, як вже було сказано будь-яка сторінка jsp компілюється і створюється відповідний сервлет, який і опрацьовує запити від користувача. Якщо ви написали jsp і щось йде не так, хоча ніби все правильно, ви завжди можете глянути на код створеного сервлету. Для цього, після того як викликали в браузері відповідну jsp, скористайтесь пошуком в каталогах tomcat і ви обов’язково знайдете скомпільовані файли з розширенням .class та вихідні файли з розширенням .java. Останні файли можна відкрити і переглянути код створеного сервлету. Так, для вищенаведеного прикладу, при запуску index.jsp, файл index_jsp.java знаходився за адресою C:\tomcat\work\Catalina\localhost\HelloApp\org\apache\jsp. І звичайно ж ви можете скористатися засобами зневадження у вашому інтегрованому середовищі розробки для пошуку вад у коді.
 
==Servlets==