Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 418

Ильдар Шаукатович Хабибуллин

"image/jpeg" : "image/gif";

resp.setContentType(ctype);

try{

BufferedInputStream bis = new BufferedInputStream( new FileInputStream(curFile));

Outputstream os = resp.getOutputStream();

int cur = 0;

while ((cur = bis.read()) != -1) os.write(cur);

os.close(); bis.close();

}catch(FileNotFoundException e){

resp.sendError(HttpServletResponse.SC NOT FOUND);

}catch(Exception e){

resp.sendError(HttpServletResponse.SC SERVICE UNAVAILABLE);

}

curIndex= (curIndex + 1) % len;

}else resp.sendError(HttpServletResponse.SC SERVICE UNAVAILABLE); } public long getLastModified(){

return System.currentTimeMillis();

}

}

Сеанс связи с сервлетом

Сервер HTTP не сохраняет информацию о клиенте, связавшемся с ним. Хотя TCP-соединение может сохраняться вплоть до его явного закрытия (persistent HTTP connection) и за это время можно передать несколько запросов и ответов, протокол HTTP не предполагает средств сохранения информации о клиенте.

Многие задачи, решаемые Web-приложениями, требуют знания сведений о клиенте. Например, клиент электронного магазина может сделать несколько заказов в течение дня или даже нескольких дней. Сервер должен знать, в чью "корзину" складывать заказанные покупки. Еще пример. В программе листинга 26.5 завязывается диалог. Клиент регистри-

руется и посылает сведения о себе на сервер СДО. Сервер предлагает клиенту подобрать себе учебный курс. Клиент выбирает курс и посылает его название серверу. Сервер должен занести имя курса в учетную карточку клиента, а для этого ему надо знать регистрационный номер клиента.

Для получения сведений о клиенте, приславшем запрос, приходится применять искусственные средства, не входящие в протокол HTTP. Наиболее часто используются три средства: cookie, параметр в строке URL и скрытое поле в HTML-форме.

Первое средство — cookie — действует так. Получив первый запрос, сервер составляет заголовок ответа Set-Cookie, в который заносит пару "имя = значение", обычно это идентификатор клиента, а также диапазон URL, для которого действует cookie, срок хранения этих сведений и другую информацию. Браузер, получив ответ с таким заголовком, создает небольшой, размером не более 4 Кбайт, cookie-файл с этими сведениями и сохраняет его у себя в каталоге. Посылая следующие запросы, браузер отыскивает у себя соответствующий cookie-файл и заносит в заголовок Cookie запроса пару "имя = значение". Сервер по этому заголовку "узнает" клиента.

В пакете javax.servlet.http есть класс Cookie, методы которого обеспечивают работу с cookie. Объект этого класса создается конструктором

public Cookie(String name, String value);

Методы setXxx () позволяют добавить в объект остальные сведения, а методы getXxx () прочитать их.

После создания и формирования объекта cookie этот объект устанавливается в заголовок ответа методом

public void addCookie(Cookie cookie); интерфейса HttpServletResponse.

Вот обычная последовательность действий по созданию cookie и отправке его клиенту:

String value = "" + id;

Cookie ck = new Cookie("studentid", value);