440 likes | 533 Views
JavaServer Pages (JSP). Борислава Спасова. Светлин Наков. Java Web Developer Acsior Ltd. National Academy for Software Development. www.acsior.com. academy.devbg.org. Contents. Въведение в JSP технологията JSP изрази Предефинирани променливи в JSP JSP скриплети
E N D
JavaServer Pages (JSP) Борислава Спасова Светлин Наков Java Web Developer Acsior Ltd. National Academy for Software Development www.acsior.com academy.devbg.org
Contents • Въведение в JSP технологията • JSP изрази • Предефинирани променливи в JSP • JSP скриплети • JSP страниците са всъщност сървлети • JSP декларации • JSP директиви • JSP @page • Статичен и динамичен Include
Contents (2) • Повече за предефинираните променливи • Пренасочване на клиента и на сървъра • Избягване наспециалните символи в HTML
Накратко за JSP? • JavaServer Pages (JSP) е технология: • За създаване на динамични Web приложения • Позволяваща използването на Java код в HTML страници • Java кода се изпълнява на сървъра по време наинтерпретирането наJSP страницата • Чист HTML се изпраща на browser-a на клиента в резултат от интерпретирането на JSP страницата
JSP Технологията • JSP технологиятаосигурява лесен начин за разработване на динамични Web приложения • Подобно на сервлетите работи в режим request/response • Дава възможност за генериране на динамично съдържание без да се изискват задълбочени познания за Java • За запознатите с езика осигурява възможноста за лесното му използване заедно със статндартния HTML • Позволява използването на различни XML тагове
Пример - Date JSP • Примерната страница показва текущата дата и час date.jsp <html> <head><title>Date JSP example</title></head> <body> The date is: <% out.println(new java.util.Date()); %> </body> </html>
Date JSP Demo
JSP Изрази • JSP изразите се използват за директно показване на резултат от израз на Java • Имат следният вид: • Примери: <%= Javaизраз %> The time is: <%= new java.util.Date() %> The square root of 2 is: <%= Math.sqrt(2) %> The value of PI is: <%= Math.PI %>
Предефинирани променливи • JSP имат няколко предифинирани променливи • request – еквивалент на HttpServletRequest • response – HttpServletResponse • session – HttpSession(свързва се с request) • out – използва за показване на резулатата генерира от JSP страбицара (PrintWriter) • Тези променливи са инициализирани и могат да се използват директно на кое да е място в JSP станицата.
JSP Expressions –More Examples • Следващият пример използва прменливатаrequest , за да покаже името на host-a на клиентската машина : • Показва timeout-а на сесията: • Показва идентификационните параметри на клиентският web browser: Your hostname: <%= request.getRemoteHost() %> Session timeout: <%= session.getMaxInactiveInterval() %> Browser: <%= request.getHeader("User-Agent") %>
JSP Изрази Demo
JSP Сриплети • JSP скриплетитеосиуряват директното използване на Java код в JSP страниците • Чрез скриплетите се осигурява директния достъп до предефинираните променливи на JSP страниците (request, response, session, ...) <% Java code %> <% String queryData = request.getQueryString(); out.println("Attached GET data: " + queryData); %>
Пример – JSP скриплети • Пример на директно използване на Java код в JSP страница: • Пример илюстриращ използването на цикъл: <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have an <B>interesting</B> day! <% } %> <% for (int i=0; i<10; i++) { %> <%= i %> * <%= i %> = <%= i*i %> <br> <% } %>
JSP Сриплети Demo
JSP Technology Internals • JSP страниците са всъщност сървлети! • Web контейнера превръща JSP страниците в Java сървлети ( с разширение .java) • След което ги компилира до.class файлове • JSP имат същия жизнен цикъл като сървлетите Compiled Java servlet (date.class) JSP compiler javac JSP Page (date.jsp) Java servlet (date.java)
JSP Technology Internals • Tomcat запазва така компилираните JSP страници в директория CATALINA_HOME/work date_jsp.java date.jsp JSP compilation <html> <head><title>Date JSP example</title></head> <body> The date is: <% out.println(new java.util.Date()); %> </body> </html> package org.apache.jsp; public final class date_jsp extends HttpJspBase implements JspSourceDependent { ... } \webapps\JSP-Demos\ date.jsp \work\Catalina\localhost\ JSP-Demos\org\apache\jsp
JSP Декларации • JSP декларациите позволяват дефинирането на методи и полета, които стават част от основното тяло на съответния сервлет. Имат следния вид: • Пример: <%! Java code (fields and methods) %> <%! long counter = 0; public void getCounter() { return counter; } %>
JSP Декларации • Декларациите не генерират резултат • Обикновено се използва заедно с JSP изрази и скриплети. • Пример: • Извежда на екрана колко пъте и била достъпвана страницата, от момента на качването й на сървъра: <%! private static int accessCount = 0; %> This page has been accessed <%= ++accessCount %> times.
JSP Декларации Demo
JSP Директиви JSP directive засяга цялостната структура на сървлета, до който е компилирана JSP страницата • Има следната форма: • Може да има повече от един атрибути: <%@ directive attribute="value" %> <%@ directive attribute1="value1" attribute2="value2" ... attributeN="valueN" %>
Директивата @page • page директивата позволява дефинирането на един или повече,видими в рамките на една страница,атрибути: • Оказва кои пакети се import-ват • Пример: • Атрибута import е единственият, който може да се повтаря многократно import="package.class" or import="package.class1,...,package.classN" <%@ page import="java.util.*" %>
Директивата@page (2) • Оказва използвания MIME тип за показване на извода (по подразиране това е "text/html") • Например директивата: има същият резултат като скриплета: contentType="MIME-Type" or contentType="MIME-Type; charset=Character-Set" <%@ page contentType="text/plain" %> <% response.setContentType("text/plain"); %>
Директивата @page (3) • Дефинира дали страница ще работи съсsessionобекта (по подразбиране е true) • Дефинира URL на страницата, към която ще се пренасочват всички непрехванати изключения • Декларира текущатата страцица като error page (позволява достъп до обектаexception) session="true|false" errorPage="url" isErrorPage="true|false"
JSP Page директива Demo
Директивата @include • Позволява вючването на файлове повреме на превършането на страницата в сървлет (static include) • Директивата има следния вид: • Зададеното URL се разглежда като относителен път до JPS-то към което сочи • Пример: <%@ include file="relative url" %> <%@ include file="/include/menu.jsp" %>
Използване на JSP@include • Например може да използваме JSP @include, за да добавим navigation bar към всяка страница <html> <body> <%@ include file="/navbar.html" %> <!-- Part specific to this page ... --> </body> </html>
Динамичен Include • Динамично включване на страница (dynamic include): • Резултът от включената страница се добавя към главната, като се изчислява всеки път <jsp:include page="header.jsp"/> <% String headerPage = "header.jsp"; %> <jsp:include page="<%= headerPage %>" />
Предефинирани променливи (2) • request • HttpServletRequestсе свързва с променливатазаявката на клиента • Осигурява достъп до параметрите на request-а, HTTP headers, cookies и др. • response • HttpServletResponseсе свързва с отговора,мкойто се връща на клиенат • Могат да се задават HTTP status кодове и response header-и
More About The JSP Predefined Variables (2) • out • PrintWriter, който се използва за да се изпрати отговвора на клиентаsession • session • HttpSessionобекта се сързва със заявката на клиента т.е. с request обекта • Сесиите се създават автоматично • Пази статична информация за текущият потребител, свързан с тази сесия
Предефинирани променливи (3) • application • ServletContext, който се достъпва чрезgetServletConfig().getContext() • Пази информаци, достъпна за цяото приложение. • Всички сервлети и JSP страници могат да си обменят информация чрез този обект • pageContext • Обвива всички останали предефинирани обеткти в JSP страниците (request, response, session, ...) и ги пази в инстанция наPageContext
Предефинирани променливи (4) • page • Синоним на обекта this object (не особено полезен) • exception • Дефинира обекта от типThrowable • Достъпен е само за дефинираните error pages • Съдържа последното хвърлено изключение • config • СъдържаServletConfigза текущата JSP страница • Използва се за достъп до init параметрите
applicationОбекта • Използването на applicationпбакта трябва да става вsynchronizedчаст от кода • Обекта е общ за всички нишки • Web container-итестартират самостоятелна нишка за всеки клиент synchronized (application) { Vectoritems = (Vector) application.getAttribute("items"); if (sharedItems == null) { sharedItems = new Vector (); application.setAttribute("items", items); } }
Пренасочване на клиентакъм друго URL • Client redirection • Ппенасочва Web browser-а на клиента към предварително посоченио URL • В действителност изпраща HTTP response код 302 (Resource moved temporarily) • Browser-а изпраща заявка към новия адрес • Пример: response.sendRedirect(<url>); response.sendRedirect("date.jsp");
Пренасочва не на сървъра към друг ресурс • Server redirection • Връща съдържанието на някакъв ресурс на сървъра • За клиента това пренасочване става неявно • Пример: request.getRequestDispatcher(<url>). forward(request, response) request.getRequestDispatcher("date.jsp"). forward(request, response);
Проблеми със специалнитe символи в HTML • Проблемите със специалнитe символи в HTML са широко разпространени в Web програмирането • Показването на тези символи може да бъде опасно • Прави приложението нестабилно • Разкрива пропуски в сигурността • Когато се показва текст на ектана на потребителя, той не трябва да съдържа специални символи • Избягването на тези символи е задължително!
Проблеми със специалнитe символи в HTML - Пример • Разгледайте този пример: • Какво става ако въведем това? <html> You entered: <%= request.getParameter("something") %> <form> Enter something:<br> <input type="text" name="something"> <input type="submit"> </form> </html> <script language="JavaScript">alert('Bug!');</script>
Проблеми със специалнитe символи в HTML Demo
Какво трябва да прескачаме? • Кой и сиволи се прескачат се определя от тяхното местоположенив в страницата: • В HTML body тези символи са: • <, >, &, space (евентуалноtab, нов ред) • В атрибут на HTML таг те са: • "и& • В<textarea> : • <, >и&
Character Name HTML Entity Character По-малко < < По-голямо > > и & & Въпросителен знак " " Character Name Escaping Space Нов ред <br> Tab Избягване наспециалните символи • По принцип се препоръчва избягването на следните символи: • Освен тях, в тялото на HTML страницата трябжа да се избегнат:
Избягване наспециалните символи • Няма стандартен метод в Servlet/JSP API за рещаването на този проблем • Ето примерен метод: public static String htmlEscape(String text) { if (text == null) { return ""; } StringBuilder escapedText = new StringBuilder(); for (int i=0; i<text.length(); i++) { char ch = text.charAt(i);
Избягване наспециалните символи if (ch == '<') escapedText.append("<"); else if (ch == '>') escapedText.append(">"); else if (ch == '&') escapedText.append("&"); else if (ch == '\"') escapedText.append("""); else escapedText.append(ch); } String result = escapedText.toString(); return result; }