Archive for the 'java' Category
24
Nov
java.  | 

java session
Сессия - инструмент передачи переменных из одной 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 - может ли данная страница выводиться в качестве страницы ошибки.
22
Nov
java.  | 
JSTL

JSTL(JavaServer Pages Standard Tag Library) — в переводе с английского «стандартная библиотека тегов JSP». Она расширяет спецификацию JSP, добавляя библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации. JSTL — конечный результат JSR 52, разработанного в рамках JCP(Процесса Java сообщества).
JSTL является альтернативой такому виду встроенной в JSP логики, как скриптлеты, то есть прямые вставки Java кода. Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения.

via

Библиотека десрипторов подключается к 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>
22
Nov
java.  | 
java beans & jsp

Ещё один банальный пост о всем известных штуках. Поясню, зачем пишу эти посты. Мне бы хотелось поднять пару интересных мне тем, связанных с фреймворками: JSF, Hibernate, Spring, … Потому мне кажется правильным вначале поговорить о некоторых моментах, которые впоследствии я планирую использовать в контексте последующих постов. Заранее прошу прощения у тех, кому кажется, что ниженаписанное ежу понятно. Постараюсь стать интересней в ближайшее время.

← Пикрелейтед - материальная помощь фотошопокалекам от чудесного дизайнера.

JavaBeans — классы в языке Java, написанные по определённым правилам. Они используются для объединения нескольких объектов в один (bean) для удобной передачи данных.

Спецификация Sun Microsystems определяет JavaBeans, как “универсальные программные компоненты, которые могут управляться с помощью графического интерфейса” (“reusable software components that can be manipulated visually in a builder tool”).

via

Правила описания 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>
20
Nov
java.  | 
jsp

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

Сервлет - java-программа, выполняющаяся на стороне сервера и расширяющей функциональные возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ.

via.

Сервлеты должны реализовывать интерфейс Servlet. Также имеется несколько готовіх реализаций: класс GenericServlet и дочерний для него класс HttpServlet (как правило, его наследуют при написании сервлетов для расширения веб-серверов). Соответствующие классы и интерфейся находятся в пакетах javax.servlet и javax.servlet.http.

Жизненный цикл сервлета:

  1. В случае отсутствия сервлета в контейнере.
    1. Класс сервлета загружается контейнером.
    2. Контейнер создает экземпляр класса сервлета.
    3. Контейнер вызывает метод init(). Этот метод инициализирует сервлет и вызывается в первую очередь, до того, как сервлет сможет обслуживать запросы. За весь жизненный цикл метод init() вызывается только однажды.
  2. Обслуживание клиентского запроса. Каждый запрос обрабатывается в своем отдельном потоке. Контейнер вызывает метод service() для каждого запроса. Этот метод определяет тип пришедшего запроса и распределяет его в соответствующий этому типу метод для обработки запроса (например doGet(), doPost()). Разработчик сервлета должен предоставить реализацию для этих методов. Если поступил запрос, метод для которого не реализован, вызывается метод родительского класса и обычно завершается возвращением ошибки инициатору запроса.
  3. В случае если контейнеру необходимо удалить сервлет, он вызывает метод 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
18
Nov
i`m back

Я снова вернулся. И я счастлив. Но. Тут не о том. Не буду рассказывать о причинах моего отсутствия, расскажу лучше о том, как преобразится блог. Я поудалял все лишние посты (оставил только тематические и те, которые было жалко удалить): о личной жизни и прочей нечисти буду писать на тумблр. Когда-нибудь. Когда время будет. Тут же отныне останется две основные и две вспомогательные категории: java и semantic web; projects и misc (на случай если всё-же очень захочется нечисти тут).

Итак, пишем о жаве и семантик веб. И начнём прямо сейчас. Те, кто меня читал в начале этого года, помнят, возможно, что темой моей дипломной работы был Семантический Веб. Собственно, практической частью работы было написание API на жаве, semanticAPI. АПИ включает в себя два пакета: microformatParser и rdfParser, в каждом - класс document и единственный (кроме конструктора, конечно же) публичный метод - gerMicroformats() и parseRdf() соответственно. Не буду вдаваться в реализацию, желающим полистать сорцы могу предложить их скачать тут, желающим всё это просто напросто заюзать (если такие правда будут), предлагаю ознакомиться с UML-диаграммами и презентацией (оставил с защиты работы; если заинтересует, выложу русскую версию) ниже и скачать jar-файл.

microformatParser:

microformatParser

rdfParser:

rdfParser

Презентация:

26
Mar
java.  | 

Сначала немного о нём:

Цель:

  • Обеспечить класс, который имеет только один экземпляр и предоставить глобальную точку доступа к нему.
  • Инкапсулировать “JIT инициализацию” (”инициализацию при первом использовании”). Continue reading ‘Безопасный Singleton’



Мальчикам и девочкам:


Любителям почитать:

Более того: