Я нахожусь в антишаблоне, и я хочу выйти

Я разрабатываю веб-приложение Java, с помощью jsp/jquery/ejb/jboss.

У меня есть веб-форма, которая позволяет пользователю выбрать любую комбинацию 100 полей (все от различных несвязанных таблиц/объектов) от базы данных. Эти поля затем производятся, через сервлет Java, к электронной таблице Excel. Хранимая процедура выполняется, который всегда возвращает все 100 полей.

Веб-форма устанавливает 100 булевых значений в объекте передачи (TO), чтобы определить, должны ли данные быть затем быть отображенными. На это К затем ссылаются для создания строки заголовка электронной таблицы и также для каждой строки от базы данных, которая выполнена с помощью итераций.

Все это хорошо работает, однако это чувствует себя неправильным. Я не могу думать о жизнеспособном пути, который не ссылается на 100 булевских переменных (времена N+1), чтобы определить, должно ли поле быть включено в произведенную электронную таблицу. Когда я говорю жизнеспособный, я подразумеваю, например, что не хочу переписывать хранимую процедуру или создавать 100 различных хранимых процедур.

15
задан NimChimpsky 11 August 2010 в 14:51
поделиться

4 ответа

Наше решение было в аналогичных ситуациях для создания динамического объекта передачи. По сути, это была карта вместо POJO, имеющая несколько геттеров и сеттеров.

Коды, которые заполняют и читают этот объект передачи, были простыми итерациями.

3
ответ дан 1 December 2019 в 05:22
поделиться

Вам придется оценить, действительно ли это лучше, но вы могли бы использовать подход, при котором вы используете битовый массив для хранения того, должны ли использоваться поля или нет. Каждое поле будет иметь значение, соответствующее одному биту:

static final FIELD1 = 1;
static final FIELD2 = 2;
static final FIELD3 = 4;
static final FIELD4 = 8;
static final FIELD5 = 16;
etc

Каждое поле формы будет иметь значение своего бита, если оно выбрано, или 0, если не выбрано. При отправке формы, суммируйте поля и отправляйте значение. Таким образом, если FIELD1 и FIELD3 были отмечены, вы отправите значение 5 (00101 в двоичном формате).

Затем вы применяете простую битовую маску для каждого поля, чтобы определить, какие из них были выбраны (есть ли лучший способ, чем поле за полем?):

boolean field1Selected = sum & FIELD1;
boolean field2Selected = sum & FIELD2;
etc

Недостатки: при 100 полях вы говорите о действительно большом числе! Возможно, вам придется использовать 2-битные массивы. Я также не уверен, что это действительно упрощает вашу проблему, но, возможно, это действительно так.

0
ответ дан 1 December 2019 в 05:22
поделиться

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

1
ответ дан 1 December 2019 в 05:22
поделиться

Вы можете исключить перечисление полей вручную, выполнив следующие действия:

  • при загрузке формы, для каждого из доступных полей электронной таблицы вы выводите логический элемент управления. Вероятно, лучше всего добавить какой-то префикс, чтобы у вас не было конфликтов с другими полями, которые существуют в форме.

  • при отправке формы вы показываете все включенные поля с префиксом.

0
ответ дан 1 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: