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

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

13.02.2010, 18:22. Показов 5492. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru