Você esta no caminho certo, usando a4j:support
Não olhei o código com calma, vi só o xhtml porque não estou com muito tempo... Mas um bom exemplo de utilização do a4j:support para esse tipo de coisa, tem aqui:
http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/a4j_support.html
O pouco que eu vi está correto, mas faz um teste primeiro, troque os valores da imagem utilizando um h:commandButton
Eu tive problemas com o mediaOutput, porque ele sempre carregava a primeira imagem e não mudava mais usando a4j:commandButton/support.. mas quando eu mudava a imagem com uso de h:commandButton, funcionava normal
A solução pra mim foi colocar o mediaOutput dentro de um a4j:outputPanel e associar o "value" direto com a URL da imagem, mais ou menos assim:
<a4j:outputPanel>
<a4j:mediaOutput element="img" cacheable="false" session="true" value="#{controller.usuario.foto}" createContent="#{controller.paint}"
mimeType="image/jpg" style="width: 105px; height: 120px;"/>
</a4j:outputPanel>
Onde controller.usuario.foto = algo como \\192.168.0.1\...\Fotos\xxx.jpg
E esse é meu método paint(). Nesse método tem 3 maneiras (ou 2, não li pra lembrar) de fazer aparecer a imagem...
public void paint(OutputStream out, Object data) throws IOException {
try {
File file = null;
//Pega a foto associada ao usuário
if (usuario.getFoto() != null && !usuario.getFoto().equals(""))
file = new File(usuario.getFoto());
//Caso a foto não exista, é exibida a imagem de "FOTO NÃO ECONTRADA"
else if (!file.exists())
file = new File("/images/PhotoNotFound.jpg");
//Caso não possua, é exibia a imagem de "SEM FOTO DEFINIDA"
else
file = new File("/images/NoPhoto.jpg");
//Responsáveis por "escrever" a foto no a4j:mediaOutput.
BufferedImage image = ImageIO.read(file);
ImageIO.write(image, "jpg", out);
//Isso tambem funciona, mas pelo jeito virará deprecated logo...
// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
// encoder.encode(ImageIO.read(file));
//Outra maneira que tambem funciona...
// byte[] buffer = null;
// InputStream is = new FileInputStream(file);
// buffer = new byte[is.available()];
// is.read(buffer);
// is.close();
// out.write(buffer);
} catch(Exception e) {
Recursos.getStackTraceToFile(e, "controller.paint()");
Recursos.setMessage("error", "Não foi possível carregar a foto.");
}
}
Lembre-se que o reRender é no a4j:outputPanel
Espero que essa lenda toda te ajude em algo... Boa sorte