
Сессия - инструмент передачи переменных из одной jsp-страницы в другую. В jsp-страницах уже определена переменная session класса HttpSession. Сессии в jsp-страницах поддерживаются по умолчанию, отключить эту поддержку можно с помощью опции session="false" директивы
<%@page%>.
Тут же небольшой пример. Первая страница:
<%
String S ="The message from the first application";
session.setAttribute("S", S);
out.println(S+"<br/>");
out.println(session.getAttribute("S"));
%>
<br />
<a href="http://localhost:8080/ses1/contin.jsp">
To the second page
</a>Вторая:
<%
out.println("The session variable is:"+session.getAttribute("S"));
%>Всё очень просто. Странички можно инклудить друг в друга. include - на этапе превращения в сервлет, jsp:include - на этапе запроса. Сразу пример. Первая страничка:
<body> Including page ... <br /> <jsp:include page="req1.jsp"/> <% out.println("<br/>Finished"); %> </body>
Вторая:
<body> <% out.println("Hello, "+request.getParameter("S")); %> </body>
Теперь, учтя вышеизложенное, придумаем что-нибудь посложней. Первая страничка:
<body> Including page ... <br /> <jsp:include page="req1.jsp"/> <% out.println (request.getAttribute("Q") +"<br>"); out.println("<br/>Finished"); %> </body>
..и инициализация переменной во второй страничке:
String Q = "new string"; request.setAttribute("Q", Q);
Два слова о пересылке запроса:
<body> Forwarding request ... <br /> <jsp:forward page="req1.jsp"/> <% out.println("<br/>Finished"); %> </body>
Характерным случаем для пересылки запроса будет предварительная обработка данных сервлетом, установка бинов, и в результате пересылка их одному из документов.
Пример пересылки в зависимости от запроса:
try { String SP=""; final String FIRST = "first"; final String SECOND = "second"; SP = request.getParameter("S"); String ur = "/default.jsp"; if (SP==null) { ur="/default.jsp"; } else { if (SP.equals(FIRST)) ur = "/first.jsp"; if (SP.equals(SECOND)) ur= "/second.jsp"; } RequestDispatcher rd = getServletContext().getRequestDispatcher(ur); rd.forward(request, response); }
Фильтры. Позволяют организовать цепочки классов, которые последовательно выполняют запрос клиента. Основные элементы реализации:
- В новом классе переопределить метод
doFilter(); - Описать фильтр в дескрипторе развёртки (
web.xml).
Простой пример (блокируем контент для некоторых имён, основной код):
String S=""+request.getParameter("nm"); if (S.equals("bob")) { PrintWriter out = response.getWriter(); out.println("You are banned because of persistent spamming"); } else { chain.doFilter(request, response); }
Два слова про страницы ошибок:
<%@page contentType="text/html" errorPage="err.jsp" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <% int i=10; if (i>0) throw new Exception(); else %> Hello, world </body> </html>
И сама страница ошибки:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" isErrorPage="true" content="text/html; charset=UTF-8"> <title>Error Page</title> </head> <body> <h2>Sorry, we erred</h2> </body> </html>
И в заключение поговорим об атрибутах директивы
<%@page%>.
- import - импортируемые пакеты.
- contentType - MIME-тип содержимого, передаваемого клиенту.
- isThreadSafe(по умолчанию
true) - определяет, является ли код потокобезопасным, и, в результате, должен ли сервлет реализовывать интерфейсSingleThreadModel. - session (по умолчанию
true) - автоматическая поддержка сессий. - errorPage - установка страницы, которая выведется в случае ошибки.
- isErrorPage - может ли данная страница выводиться в качестве страницы ошибки.
JSTL(JavaServer Pages Standard Tag Library) — в переводе с английского «стандартная библиотека тегов JSP». Она расширяет спецификацию JSP, добавляя библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации. JSTL — конечный результат JSR 52, разработанного в рамках JCP(Процесса Java сообщества).
JSTL является альтернативой такому виду встроенной в JSP логики, как скриптлеты, то есть прямые вставки Java кода. Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения.
Библиотека десрипторов подключается к jsp-странице с помощью директивы
<%@ taglib uri=“…" prefix=“…" %>. Это даёт возможность добавлять свои, пользовательские теги к страничке (правда похоже на импортирование существующих онтологий в свои?), в том числе и стандартную библиотеку тегов jsp (jstl).
Основные группы тегов jstl:
- вывод текста на jsp-страницах;
- установка атрибутов объектов для веб-приложений;
- перебор элементов некоторой коллекции данных;
- форматирование чисел, дат, валют;
- обработка XML-файлов;
- взаимодействие с бд;
- специальные возможности вызова кода из страницы jsp.
Простейший пример:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <c:out value="hello"/> </body> </html>
Перебор значений:
<c:set var="SS" value="Ivanov, Petrov, Sidorov"/> <c:forEach var="v" items="${SS}"> ${v} <br /> </c:forEach>
Парсинг xml:
<body> <c:import url="books.xml" var="xb"/> <x:parse doc="${xb}" var="xx"/> <x:forEach var="v" select="$xx/catalogue/book/title"> <x:out select="$v"/><br /> </x:forEach> </body>
Соответствующий xml-файл:
<?xml version="1.0" encoding="UTF-8"?> <catalogue location="Congress Library"> <book> <author>Sidorov</author> <title>The pleasure of murders</title> </book> <book> <author>Petrov</author> <title>Innocent victims</title> </book> </catalogue>
Ещё один банальный пост о всем известных штуках. Поясню, зачем пишу эти посты. Мне бы хотелось поднять пару интересных мне тем, связанных с фреймворками: JSF, Hibernate, Spring, … Потому мне кажется правильным вначале поговорить о некоторых моментах, которые впоследствии я планирую использовать в контексте последующих постов. Заранее прошу прощения у тех, кому кажется, что ниженаписанное ежу понятно. Постараюсь стать интересней в ближайшее время.
← Пикрелейтед - материальная помощь фотошопокалекам от чудесного дизайнера.
JavaBeans — классы в языке Java, написанные по определённым правилам. Они используются для объединения нескольких объектов в один (bean) для удобной передачи данных.
Спецификация Sun Microsystems определяет JavaBeans, как “универсальные программные компоненты, которые могут управляться с помощью графического интерфейса” (“reusable software components that can be manipulated visually in a builder tool”).
Правила описания bean`ов:
- Класс компонента должен иметь
public-конструктор без параметров (либо не иметь конструкторов). - Свойства класса должны быть доступны через методы с именами, которые подчинятся стантдартному соглашению об именах (
get,set,is, …). Да, мне тоже вспоминаются страшные слова “аксессор” и “мутатор” из курса ООП в универе. - Класс должен быть сериализуем. Для сохранения состояния платформонезависимым способом.
- Не должен содержать методы обработки событий.
Bean-компоненты могут быть использованы как консольными, так и веб-приложениями.
Пример bean`a:
package beantest; public class StringBean { private String request; private String appendix; private String answer; private void treat() { answer=appendix+request; } public void setAppendix(String appendix) { this.appendix=appendix; } public String getRequest() { return request; } public String getAppendix() { return appendix; } public String getAnswer() { treat(); return answer; } public void setRequest(String request) { this.request=request; } }
Пример прокладки между ben`ом и jsp-страницой:
import beantest.*; public class testbean { public static void main (String[] args) { StringBean sb=new StringBean(); sb.setRequest("aaaa"); sb.setAppendix("hello, "); System.out.println(sb.getAnswer()); } }
И пример самой jsp-странички:
<html> <head> <title> The simple JSP page </title> </head> <body> <jsp:useBean id="info" class="beantest.StringBean"/> <jsp:setProperty name="info“ property="appendix“ value="Hello, "/> <jsp:setProperty name="info“ property="request" value='<%=request.getParameter("input")%>'/> <center> <strong> <jsp:getProperty name="info“ property="answer"/> </strong> </center> </body> </html>
Ниженаписанное будет Вам не интересно в случае, если вы знаете, что такое JSP. Тут излагаются только основные сведения о сервлетах, ничего нового либо оригинального.
Сервлет - java-программа, выполняющаяся на стороне сервера и расширяющей функциональные возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ.
via.
Сервлеты должны реализовывать интерфейс Servlet. Также имеется несколько готовіх реализаций: класс GenericServlet и дочерний для него класс HttpServlet (как правило, его наследуют при написании сервлетов для расширения веб-серверов). Соответствующие классы и интерфейся находятся в пакетах javax.servlet и javax.servlet.http.
Жизненный цикл сервлета:
- В случае отсутствия сервлета в контейнере.
- Класс сервлета загружается контейнером.
- Контейнер создает экземпляр класса сервлета.
- Контейнер вызывает метод
init(). Этот метод инициализирует сервлет и вызывается в первую очередь, до того, как сервлет сможет обслуживать запросы. За весь жизненный цикл методinit()вызывается только однажды.
- Обслуживание клиентского запроса. Каждый запрос обрабатывается в своем отдельном потоке. Контейнер вызывает метод
service()для каждого запроса. Этот метод определяет тип пришедшего запроса и распределяет его в соответствующий этому типу метод для обработки запроса (напримерdoGet(),doPost()). Разработчик сервлета должен предоставить реализацию для этих методов. Если поступил запрос, метод для которого не реализован, вызывается метод родительского класса и обычно завершается возвращением ошибки инициатору запроса. - В случае если контейнеру необходимо удалить сервлет, он вызывает метод
destroy(), который снимает сервлет из эксплуатации. Подобно методуinit(), этот метод тоже вызывается единожды за весь цикл сервлета.
Прочие важные методы:
- Получение параметра запроса - метод getParameter(”name”)
- Получение потока вывода - метод getWriter()
Простейший пример сервлета:
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class reply extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); String req=request.getParameter("name"); PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println(""); out.println("<span style="font-size: x-large; color: maroon;">"); out.println("GREETINGS, "+req+"!"); out.println("</span>"); out.println(""); out.println("This is a very simple servlet"); out.println(""); out.println(""); out.close(); } }
Подготовка сервлетов к выполнению:
- Компиляция
- Подготовка связанных файлов, в частности - дескрипторов развёртки (web.xml)
- Типичным шагом является упаковка сервлетов в war-файлы с помощью утилит jar либо ant.
- Доставка на сервер - с помощью deploytools, либо ручная развёртка.
Дескриптор развёртки:
- Тег <servlet>, который задаёт соответствие между именем сервлета (servlet-name) и его классом (servlet-class).
- Тег <servlet-mapping>, который задаёт соответствие между именем сервлета (<servlet-name>) и методом обращения к нему (<url-pattern>)
Простой пример дескриптора развёртки:
<servlet> <servlet-name> reply </servlet-name> <servlet-class> reply </servlet-class> </servlet> <servlet-mapping> <servlet-name> reply </servlet-name> <url-pattern>/servlet/reply</url-pattern> </servlet-mapping>
jsp-страницы:
Комбинация статического html и динамического контента из скриптлетов.
Например:
<html>
<head>
<title>
The simple JSP page
</title>
</head>
<body>
<%
String name=request.getParameter("name");
%>
<center>
<img src="sample.jpg" />
<br clear="all" />
<strong>
Hello, <%=name%>
</strong>
</center>
</body>
</html>Также используются:
<%! Декларации %>, <%@ Директивы (директива атрибуты) %> и <%-- Комментарии %>
Некоторые заранее определённые переменные:
- request - запрос клиента, объект класса HttpServletRequest
- response - ответ клиенту, объект класса HttpServletResponse
- out - поток класса PrintWriter, используется для передачи данных клиенту
- session - данные сессии, объект класса HttpSession
Я снова вернулся. И я счастлив. Но. Тут не о том. Не буду рассказывать о причинах моего отсутствия, расскажу лучше о том, как преобразится блог. Я поудалял все лишние посты (оставил только тематические и те, которые было жалко удалить): о личной жизни и прочей нечисти буду писать на тумблр. Когда-нибудь. Когда время будет. Тут же отныне останется две основные и две вспомогательные категории: java и semantic web; projects и misc (на случай если всё-же очень захочется нечисти тут).
Итак, пишем о жаве и семантик веб. И начнём прямо сейчас. Те, кто меня читал в начале этого года, помнят, возможно, что темой моей дипломной работы был Семантический Веб. Собственно, практической частью работы было написание API на жаве, semanticAPI. АПИ включает в себя два пакета: microformatParser и rdfParser, в каждом - класс document и единственный (кроме конструктора, конечно же) публичный метод - gerMicroformats() и parseRdf() соответственно. Не буду вдаваться в реализацию, желающим полистать сорцы могу предложить их скачать тут, желающим всё это просто напросто заюзать (если такие правда будут), предлагаю ознакомиться с UML-диаграммами и презентацией (оставил с защиты работы; если заинтересует, выложу русскую версию) ниже и скачать jar-файл.
microformatParser:
rdfParser:
Презентация:
Сначала немного о нём:
Цель:
- Обеспечить класс, который имеет только один экземпляр и предоставить глобальную точку доступа к нему.
- Инкапсулировать “JIT инициализацию” (”инициализацию при первом использовании”). Continue reading ‘Безопасный Singleton’







