Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 13

"Идеология правильности"

13.02.2010, 18:22. Показов 5512. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько правилен идеологически такой код (он рабочий):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<jsp:useBean id='gal' class='jyana.GalleryData'/>
<%@ page import='jyana.*' %>
<%!
 GalleryData gal = new GalleryData();
 int i = 0;
%>
<html>
<head>
<title>index</title>
</head>
<body bgcolor='#ffffff'>
 
<% for (i = 0; i < gal.getCmax(); i++) { gal.setCid(i); %>
  <h1><jsp:getProperty name='gal' property='cdata'/></h1>
 
<% } %>
</body>
</html>
То есть это Bean имеющий методы, которые используются отдельно. Или правильней завязать это bean к основному JSP через еще какой-нибудь дополнительный класс?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2010, 18:22
Ответы с готовыми решениями:

DAO проверка правильности работы
есть такой вопрос : проверить, что дао отработало правильно?

Проверка правильности ввода в консоли
Добрый день. Как сделать проверку ввода , чтобы при вводе с клавиатуры других символов (не Double) выводилась ошибка. Искал, гуглил,...

Проверка правильности MAC адреса
Написать регулярное выражение, определяющее является ли заданная строка правильным MAC-адресом. – пример правильных выражений:...

40
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
14.02.2010, 21:33
С моей точки зрения код корректен. Вполне разумно использовать бин внутри скриплетов и парарельно брать его свойства через акссессор. В итоге всё полюбому в сервлет скопируется. Что бы я сказал мне не нравится
1. Слишком много бизнес логики для JSP. Все циклы должны быть в кастом тагах. Хотя это конечно если время есть. Вебдизайнеру уже этот код не понять
2. Если бин создаётся конструктором без параметров то инициализацию можно пропустить, так как одно из требований к бину что он может быть создан конструктором по умолчанию. Если бин не создан в момент когда страница вызывается он создаётся автоматически. Если вы затем поместите бин в сессию (не ваш случай я понимаю) то он будет там жить и следующее обращение к этой странице не вызовет повторное создание бина.
0
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
15.02.2010, 21:21
И кстати мне кажется что этот код не thread safe. Так как i общая для всех тредов а в скриплете который выполняется в service нет синхронизируюшего блока. Хотя это ерунда конечно.
0
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 80
16.02.2010, 16:02
Если можно про это поподробнее:
что такое thread safe, для чего это надо?
И насколько это важно?
0
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
16.02.2010, 22:11
Каждый сервлет имеет только один экземпляр. То есть глобально задекларированые переменные существуют в единственном экземпляре... метод service в свою очередь выполняется для каждого запроса (doGet,doPost,doDelete etc) в отдельном потоке(треде). Если тред использует глобальные переменные он должен использовать их в синхронизированом блоке. Или как вариант указать что сервлет не есть thread safe. И сервер должен подовать ему все запросы последовательно(что резко замедляет работу); JSP в свою очередь компилируются в сервлет следующим образом
<%! означает декларирование глобальной переменной
<% означает код внутри service метода

Non-thread safe code
Code
1
2
3
4
5
<%! private int idNum=0;%>
<% String userID='UserID'+idNum;
out.println('ID='+userID);
idNum=idNum+1;
%>
thread safe code
Code
1
2
3
4
5
6
7
<%! private int idNum=0;%>
<% 
synchronize(this){
String userID='UserID'+idNum;
out.println('ID='+userID);
idNum=idNum+1;}
%>
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
17.02.2010, 00:31
2simplepilot
А вы уверены, что контейнер создает только один экземпляр сервлета? Я где-то читал, что это зависит от контейнера. Если нагрузка большая, то запросы или копятся в очереди, или создаются новые экземпляры сервлетов. Я, используя Томкат, не наблюдал создания новых экземпляров. У меня было ощущение, что Томкат лучше помрет, чем создаст новый экземпляр сервлета. Но может это определяется настройками?
0
0 / 0 / 2
Регистрация: 29.09.2009
Сообщений: 48
17.02.2010, 16:24
Tread safe code - это когда гарантируется, что ВЕСЬ этот код за раз будет выполнет только в одном потоке.

По умолчанию сервлет не thread safe, это означает что метод service() ОДНОГО экземпляра сервлета выполняется паралельно в разных потоках. Количество потоков соответствует количеству обрабатываемых в данный момент реквестов.


Если сервлет обладает состоянием, то все зависит от того что мы хотим делать с ним. Если состояние общее для приложения, то синхронизуем операции над ним.

Если же состояние уникально для каждого реквеста, то тогда нужно чтобы сервлет имплементировал javax.servlet.SingleThreadModel. Это маркер-интерфейс который указывает севлет контейнеру, что для каждого реквеста должен быть предоставлен новый экземпляр сервлета. Т.е чтобы метод service() был выполнен в одном потоке.

Вопрос о том как он может быть предоставлен зависит от реализации сервет контейнера. Наиболее разумен подход с реализаций пула объектов для каждого из таких сервлетов.

0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
17.02.2010, 17:28
Спасибо за разьяснение, я как-то совсем забыл, что SingleThreadModel как раз и служит для того, чтобы контейнер стал создавать новые обьекты сервлетов при необходимости.
0
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
17.02.2010, 21:01
Контейнер никогда(!) не будет создовать несколько экземпляров сервлета. Если у вас сервлет не thread safe то все запросы будут стоять в очереди к единственному экземпляру сервлета, в противном случае (сервлет считается thread safe по умолчанию) все запросы будут идти к одному экземпляру в котором метод service будет выполняться в своём потоке. Если вы встретите другое поведение то это уже (имхо) будет не J2EE совместимый контейнер - спецификация требует что бы сервлет существовал всегда в одном экземпляре
0
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
17.02.2010, 21:47
Tread safe code - это когда гарантируется, что ВЕСЬ этот код за раз будет выполнет только в одном потоке.

>>Что то не понял вашей мысли ? что значит весь код ? метода service ? так он всегда будет выполнен в одном потоке (если сам других потоков не создаст) другой вопрос сколько методов service будет выполнятся одновременно - по умолчанию сколько угодно контейрнеру; То есть по умолчанию сервлет считается thread safe переключение на SingleThreadModel крайне не рекомендуется так как снижает быстродействие. В версии Servlets 2.4 это модель объявлена depricated.

По умолчанию сервлет не thread safe,

>>Откуда эта информация ? Мне кажется наоборот.

это означает что метод service() ОДНОГО экземпляра сервлета выполняется паралельно в разных потоках.

>>Это то да но только потому что сервлет есть thread safe
по крайней мере считается таковым. Если вы его таким не сделаете то это будут ваши проблемы
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
17.02.2010, 23:02
Это, на мой взгляд, просто небольшая путаница в применении термина thread safe.
А почему SingleThreadModel замедляет? Например, пришло два запроса - берем два сервлета из пула и обрабатываем запросы в двух потоках. Иначе, если используем один сервлет, его метод service должен быть синхронизирован. Значит эти два запроса будут обрабатываться последовательно в одном потоке. Если обработка запроса включает в себя медленные операции ввода-вывода, то многопоточная обработка должна быть предпочтительнее?
0
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
17.02.2010, 23:45
Это, на мой взгляд, просто небольшая путаница в применении термина thread safe.
Дело в том что в JSP есть специальный атрибут isThreadSafe. Вот что пишут об этом в книге
<%page isThreadSafe='true' %> <%!-- Default -->
A value of true means that you have to (то есть должны) made your code thread safe and then the system can send multiply concurent requests.

А почему SingleThreadModel замедляет? Например, пришло два запроса - берем два сервлета из пула и обрабатываем запросы в двух потоках.
Не может она взять два сервлета, система возьмёт один сервлет и выполнит сначала первый запрос а потом второй. При SingleThreadModel обработка двух запросов паралельно исключена в любом виде.

Иначе, если используем один сервлет, его метод service должен быть синхронизирован.
Один сервлет используется всегда !

Значит эти два запроса будут обрабатываться последовательно в одном потоке.
Да нет потоки будут может и разные но второй начнёт работать после завершения работы первого и относится это к ситуации isThreadSafe=false

Если обработка запроса включает в себя медленные операции ввода-вывода, то многопоточная обработка должна
быть предпочтительнее?
Многопоточная обработка по любому предпочтительней. Но если например у вас есть один доступ к ресурсу в один момент времени то лучше делать isThreadSafe=false. Возможная ситуация у вас есть асинхронный канал передачи сообщений например IBM MQSeries. Первый сервлет выполнил посылку сообщения и ждёт ответа в этот момент второй сервлет начинает работу и тоже посылает сообщение. Приходит ответ на первое сообщение но его первым успевает прочитать второй сервлет - что есть очень плохо. Следовательно в этом случае нам надо объявить isThreadSafe=false (для JSP) или SingleThreadModel для сервлета и запретить обработку двух запросов одновременно.
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
17.02.2010, 23:56
Я использую голые сервлеты,Томкат и больше ничего. Думаю, что если обьявить сервлет SingleThreadModel, то Томкат обязан будет создавать новые инстансы. Проверю. Потому что у меня как раз эта ситуация: чтобы ответить клиенту сервлет посылает запрос куда-то еще и может долго ждать ответа.
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
18.02.2010, 19:27
Проверил. Если сервлет имплементирует SingleThreadModel, то при увеличении потока запросов Томкат создает новые обьекты сервлета.
0
0 / 0 / 2
Регистрация: 29.09.2009
Сообщений: 48
23.02.2010, 10:16
>2 simplepilot

Не может она взять два сервлета, система возьмёт один сервлет и выполнит сначала первый запрос а потом второй. При SingleThreadModel обработка двух запросов паралельно исключена в любом виде.

Читаем спецификацию

public interface SingleThreadModel
Ensures that servlets handle only one request at a time. This interface has no
methods.
If a servlet implements this interface, you are guaranteed that no two threads will
execute concurrently in the servlet’s service method. The servlet container can
make this guarantee by synchronizing access to a single instance of the servlet, or
by maintaining a pool of servlet instances and dispatching each new request to a
free servlet.

То бишь стратегия предоставления инстанса сервлета зависить от реализации сервлет контейнера.

ЗЫ. и чего обсуждаем ? -- не пойму ....
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
23.02.2010, 19:37
Вы сначала пишете, что .. 'При SingleThreadModel обработка двух запросов паралельно исключена в любом виде.' , а потом приводите спецификацию, в которой сказано, что контейнер может организовать пул сервлетов и брать для каждого запроса инстансы оттуда. Так это и есть параллельная обработка. Пришло 2 запроса одновременно, контейнер извлек 2 инстанса сервлета из пула (или создал их) и сунул в них эти запросы.

Понятно, что 'параллельная обработка' имеется в виду обработка в разных потоках, так как процессор обычно все равно один.

Пусть на сервлет приходит запрос. Пока сервлет не ответил на этот запрос, он должен быть недоступен для других запросов. Если мы это реализуем через обьявление его методов synchronized , то контейнер будет использовать одну инстанс сервлета и все запросы будут обрабатываться последовательно. Если же мы это реализуем путем навешивания на сервлет SingleThreadModel интерфейса, то контейнер имеет право(а по моей логике - обязан, иначе нафига этот интерфейс вообще нужен) создать для каждого запроса свой инстанс сервлета. Томкат именно так и поступает и это очень хорошо.

0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
23.02.2010, 19:49
2vl romanov
Виноват, не понял, что вы цитируете simplepilot.
0
1 / 1 / 5
Регистрация: 22.07.2007
Сообщений: 366
23.02.2010, 20:47
Хмм. Не знал. Думал что если поставить в сервлете какую то общую переменную и инициализировать её в init() методе , а потом закрывать в destroy() то каждый из методов будет выполнен только однажды независимо от модели. Хотя склонен верить спецификации. Получается что физически могут существовать несколько сервлетов в пуле с разными значениями общих переменных. Это как то мне совсем не нравится :-(
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
23.02.2010, 21:27
Если 'общая переменная' - статическая переменная, то она будет одна для всех инстансев сервлета. А их может быть много, если сервлет имплементирует SingleThreadModel.
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
23.02.2010, 21:29
И это не противоречит спецификации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.02.2010, 21:29
Помогаю со студенческими работами здесь

Проверка правильности введеного пароля
Нужно написать код для проверки правильности введеного пароля. Я вообще не шарю в Java, но очень нужно :(

Проверка правильности postfix expression
Добрый день, подскажите пожалуйста, как можно реализовать проверку правильности postfix expreession используя стак? Спасибо!

Задача на определение правильности даты
import java.util.Scanner; public class Main { public static void main(String args) { Scanner scanner = new...

Оценка правильности написания кода
Вечер добрый. В учебных целях написал программу которая переводит значение угла из вида 11.0° 49.0′ 12.6″ в вид 11,82017, а...

Идеология схемы БД
Приветки, всезнающий All! Такой вопрос возник: имеем объекты 'человек', 'место работы', 'что-то еще...'. Связи 'человек' - 'место...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru