Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Обновление картинки


Автор: iLoveJava 19.3.2008, 19:29
У меня в приложениии есть поток который переодически генерить картинку а на странице надо ее
переодически обновлять собственно вопрос как на странице ее переодически обновлять?

щас я делаю так

Код

    <a4j:region>
        <center>
            <h:form id="imageForm"> 
                   <t:graphicImage id="mapImage" url="#{myBean.imgPath}"
                                usemap="#myMap"/>
                   <map name="myMap">
                           <h:outputText escape="false" value="#{myBean.myMap}"/>
                   </map>
            </h:form>    
        </center>
    </a4j:region>

    ...

    <a4j:region>
        <h:form>
            <a4j:poll id="poll" rendered="true" interval="2500"
                enabled="true" reRender="imageForm"/>
        </h:form>
    </a4j:region>



и это не работает  smile 
помогите плиз  smile 

Автор: v2v 19.3.2008, 19:50
тоесть  тебе надо по истечении некоторого времени обращаться к серверу и качать оттуда новую картинку и это без перезагрузки всей страницы?

Автор: powerOn 19.3.2008, 23:06
Что конкретно не работает? Какие ошибки выдаёт? Исключения кидает?

Автор: necromancer 20.3.2008, 20:14
хммм может быть дело в этом?
reRender="imageForm"
может нада так?
reRender="imageForm:mapImage"
+ если включено кеширование то картинка могла закешится браузером.

Автор: iLoveJava 21.3.2008, 17:48
2 powerOn 
никаких ошибок нет просто не обновляет и все, а myMap обновляет
наверное вся проблема в кешировании а как сказать браузеру что бы не кешировал картинку?

Автор: iLoveJava 23.3.2008, 22:23
пробывал делать так

Код

...
    <a4j:region>
        <center>
            <h:form id="imageForm"> 
                <a4j:mediaOutput element="img" cacheable="false" session="true"
                        createContent="#{myBean.paintPic}"
                        mimeType="image/jpeg" usemap="#myMap"/>
                <map name="myMap">
                         <h:outputText escape="false" value="#{myBean.myMap}"/>
                </map>
            </h:form>    
        </center>
    </a4j:region>
    ...

    <a4j:region>
        <h:form>
            <a4j:poll id="poll" rendered="true" interval="2500"
                enabled="true" reRender="imageForm"/>
        </h:form>
    </a4j:region>
...


Код

public class MyBean {
...
    public void paintPic(OutputStream out, Object data) throws IOException {
        try {
            BufferedImage bi = null;
            bi = ImageIO.read(new File("myFile.jpg"));
            ImageIO.write(bi, "jpeg", out);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
...
}


не помогло хотя картинка не должна в теории кешироваться  cacheable="false"

но мап обновляется...

Автор: necromancer 25.3.2008, 17:16
у тебя картинка лежит на форме, форма это namingContainer т.е. к айдишнику твоей картинки прибавляется id формы

Автор: iLoveJava 26.3.2008, 21:37
2 necromancer попробывал так как ты сказал вот что вышло
Код

...
    <a4j:region>
        <center>
            <h:form id="imageForm"> 
                <a4j:mediaOutput id="myImage" element="img" cacheable="false" session="true"
                        createContent="#{myBean.paintPic}"
                        mimeType="image/jpeg" usemap="#myMap"/>
                <map id="myMap" name="myMap">
                         <h:outputText escape="false" value="#{myBean.myMap}"/>
                </map>
            </h:form>    
        </center>
    </a4j:region>
    ...

    <a4j:region>
        <h:form>
            <a4j:poll id="poll" rendered="true" interval="2500"
                enabled="true" reRender="imageForm,imageForm:myImage,imageForm:myMap"/>
        </h:form>
    </a4j:region>
...


но оно не работает!!!!  smile 

Как и в предыдущих случаях обновляется токо мап

2 necromancer
А как в 1 и 2 варианте мог обновляться мап?

А нельзя картинку в какойнить компонент поместить?

Автор: necromancer 26.3.2008, 22:14
на самом деле из за таких вот проблем я сам и не использую a4j:mediaOutput 
а написал сервлет, который собственно рендерит изображение, обновляется все без проблем

PS session="true" попробуй session="false"

Автор: alexsmirnov 27.3.2008, 07:23
Браузеры сильно консервативны. При динамической замене картинки, на сервер за ней не лезут, даже если все заголовки кеширование запрещают.
Надо чтобы URL хоть чуть-чуть поменялась. Например, в value/data вставлять время последней генерации картинки. Оно сериализуется в URL, и все будет в порядке.
Более того, при этом картинку можно сделать кешируемой - запрос пойдет только если она реально поменялась.

Автор: iLoveJava 27.3.2008, 19:41
alexsmirnov ты оказался прав спс ктонить добавте человеку +1
а то я не могу :(
2 necromancer тебе тоже спс за участие я на всякий случал сделал session="false"
а так как все теперь работает так даже не хочу проверять зависит от этого что-нибудь или нет smile
Код

...
    <a4j:region>
        <center>
            <h:form id="imageForm"> 
                <a4j:mediaOutput id="myImage" element="img" cacheable="false" session="false"
                        createContent="#{myBean.paintPic}"
                        mimeType="image/jpeg" usemap="#myMap" value="#{myBean.date}"/>
                <map id="myMap" name="myMap">
                         <h:outputText escape="false" value="#{myBean.myMap}"/>
                </map>
            </h:form>    
        </center>
    </a4j:region>
    ...

    <a4j:region>
        <h:form>
            <a4j:poll id="poll" rendered="true" interval="2500"
                enabled="true" reRender="imageForm,imageForm:myImage,imageForm:myMap"/>
        </h:form>
    </a4j:region>
...


и

Код

public class MyBean {
...
    public long getDate() {
        return (new Date()).getTime();
    }
...

}


Обновляет...  smile  smile 

Токо вот тут проблема: оно обновляет, но при этом сначала "убивает" картинку, потом посылает запрос на сервер, получает ответ и токо потом рисует картинку. Получается, что страничка ка бы постоянно скачет. Нельзя ли сделать, чтобы картинка убивалась токо после того, как получен ответ от сервера? и нельзя ли поместить картинку в какой-нибуть контейнер так, чтобы он оставался постоянного размера и позволял бы делать прокрутки, если его размер к примеру 100х100, а картинка 1000х1000.  smile 

Автор: alexsmirnov 28.3.2008, 02:45
Надо ставить размеры для тега img ( width/height , или в стиле ). Если картинка генерируется, то ее размер должен быть известен. Если это файл, то можно считывать его свойства. Грузить в background можно, но для этого довольно много javascript написать потребуется - вначале вывести скрытый элемент img, прикрутить к нему listener, по окончании загрузки скопировать элемент по назначению.

Автор: iLoveJava 28.3.2008, 15:23
чуствую с бекграундом для меня проще будет такой аплет сделать...  smile 

а на счет контейнера ничего посоветовать не можете?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)