Динамическая привязка значения компонента JSF

Как я связываю значение определенного компонента динамично во времени выполнения? Например, у меня есть следующий тег компонента,

<h:inputText value="#{bean.someProp}" />

В моем случае, "# {bean.someProp}" только известен во времени выполнения.

Что лучшая стратегия состоит в том, чтобы реализовать это?

Я должен пересечь дерево компонента и установить значение, связывающее программно? Если да, в которой фазе жизненного цикла JSF я должен сделать пересечение?

5
задан bungrudi 9 February 2010 в 01:21
поделиться

2 ответа

Вы можете привязать его к свойству bean Map , где ключ String меньше или более имя динамического свойства. Вы можете получить доступ к значениям карты в EL следующим образом:

<h:inputText value="#{bean.map.someProp}" />

или

<h:inputText value="#{bean.map['someProp']}" />

, что можно сделать даже немного более динамично, где someVar фактически преобразуется в значение String ] "someProp" :

<h:inputText value="#{bean.map[someVar]}" />

Вам нужно только убедиться, что Map создается во время инициализации bean-компонента, иначе JSF не сможет получить доступ к значениям карты. EL не будет предварительно создавать для вас "вложенные свойства". Таким образом, например, прямое создание:

public class Bean {
    private Map<String, Object> map = new HashMap<String, Object>();
}

.. или внутри конструктора или @PostConstruct , если хотите.

15
ответ дан 18 December 2019 в 11:56
поделиться

Оба примера нуждаются в некоторой работе. Попробуйте перенести поведение в абстрактный (или защищенный) метод на транспортном средстве. Если это код, который нельзя изменить, используйте композицию, чтобы поместить его в интерфейс базы кода, чтобы не загрязнять остальную часть кода плохим дизайном используемой библиотеки. Это определенно кодовый запах. См. раздел «Замена условного полиморфизмом» в Рефакторинг книге Фаулера.

-121--2964732-

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

HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=myboundary

--myboundary
Content-Type: image/jpeg
Content-length: 12345

[image 1 encoded jpeg data]


--myboundary
Content-Type: image/jpeg
Content-length: 45678

[image 2 encoded jpeg data]

...

ПРИМЕЧАНИЕ: Как сказал Эргуша в ответе, после поля Content-length должна быть пустая строка.

Почему бы не перенаправить клиента непосредственно в поток mjpeg?

Можно использовать, например, http ://ipcam/mjpg/video.mjpg AXIS IP-камеры.

Если образ нужен только через HTTP, необходимо установить правильный заголовок и тип содержимого MIME image/jpeg. Для декодирования изображения необходимо получить байтовые данные и кодирование jpeg. Тогда вам придется декодировать jpeg, чтобы получить изображение в конкретном формате (что-то вроде yuv420p я думаю). Я проверил свою ip-камеру, и ее поток не имеет кодировки base64, я думаю.

Точно ваши потребности, я постараюсь помочь больше.

my2c

EDIT:

Ну, я полагаю, вы делаете что-то вроде:

client    : connect to proxy, 
            get example.com/camera1.mjpg,
            while not the end
                recv


yourproxy : wait connection
            connect to camera,
            get 10.0.0.123/camera1.mjpg
            while not the end
                recv buffer
                copy buffer
                send buffer to client

Это сказать, что вы должны отправить правильный заголовок своему клиенту. Чтобы быть уверенным использовать инструмент, как wireshark для шпионажа за пакетом и быть уверенным, что после того, как ваш клиент выпустил HTTP GET вы посылаете ему правильный поток MJPEG (как тот, который я описываю в начале моего поста...)

m2c

-121--3866385-

Другой вариант - можно добавить слой абстракции к бобу.

public String getDynamicProp() {
   ...Code to determine and return the correct property based on the meta-data...
}

public void setDynamicProp(String input) {
   ...Code to determine and return the correct property based on the meta-data...
}

Тогда вы свяжете ваш JSF непосредственно с динамической реквизитом:

#{bean.dynamicProp}

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

0
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

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