audação para todos,
sou novo como programador Java, e tenho feito meu projetos em JSF pois é através deles que tenho ganhado dinheiro, iniciei um projeto comercial aonde terei que mostrar as imagens dos produtos, graças a Deus conseguir implementar a gravação de imagens, e a abordagem que fiz foi gravar a imagem na pasta local no meu pc e o caminho no banco de dados MySQL.
A minha maior dificuldade foi tentar encontrar uma maneira de exigir essas imagens em tela, e a única forma que encontrei de fazer isso foi através de Servlet.
O meu código á um tempo atras funcionava tranquilamente, eu não sei se é porque estou deixando algum detalhe para traz, mas ele não funciona mais, preciso de ajuda porque eu não sei mexer direito com Servlet, e esse código eu encontrei na internet e antigamente ele funcionava perfeitamente.
essa é minha pagina XHTML feito em um projeto JSF;
<ui:composition template="/WEB-INF/template/LayoutPadrao.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<ui:define name="titulo">Pesquisa Produto</ui:define>
<ui:define name="corpo">
<h:form id="frmPesquisaProduto">
<h1>Novo Produto</h1>
<p:messages autoUpdate="true" closable="true" />
<p:toolbar style="margin-top: 20px">
<p:toolbarGroup>
<p:commandButton value="Pesquisa"
action="#{pesquisaProdutoBean.pesquisa}" update="@form" />
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:button value="Novo" outcome="/produto/cadastro/CadastroProduto" />
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="2" id="painel"
style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">
<p:outputLabel value="Nome do Produto" for="nomep" />
<p:inputText id="nomep" size="60" maxlength="90"
value="#{pesquisaProdutoBean.filtro.nome}" />
</p:panelGrid>
<p:dataTable id="produtosTable"
value="#{pesquisaProdutoBean.produtosFiltrados}" var="produto"
style="margin-top: 20px" emptyMessage="Nenhum produto encontrado."
rows="20" paginator="true" paginatorAlwaysVisible="false"
paginatorPosition="bottom">
<p:column headerText="Nome do Produto"
style="text-align: center; width: 100px">
<h:outputText value="#{produto.nomeproduto}" />
</p:column>
<p:column headerText="Foto" style="text-align: center; width: 200px">
<h:graphicImage value="../ShowImg?nomeFoto=#{produto.imagemproduto}" />
</p:column>
<p:column headerText="Valor do produto"
style="text-align: right; width: 120px">
<h:outputText value="#{produto.valorproduto}">
<f:convertNumber type="currency" />
</h:outputText>
</p:column>
<p:column headerText="Descrição do Produto"
style="text-align: center; width: 100px">
<h:outputText value="#{produto.descproduto}" />
</p:column>
<p:column style="width: 100px; text-align: center">
<p:button outcome="/produto/cadastro/CadastroProduto"
icon="ui-icon-pencil" title="Editar">
<f:param name="produto" value="#{produto.idproduto}" />
</p:button>
<p:commandButton icon="ui-icon-closethick" title="Excluir"
process="@this" update=":frmPesquisaProduto:produtosTable"
action="#{pesquisaProdutoBean.excluir}">
<f:setPropertyActionListener
target="#{pesquisaProdutoBean.produtoSelecionado}"
value="#{produto}" />
<p:confirm header="Confirmation"
message="Tem certeza que deseja excluir o produto #{pesquisaProdutoBean.produtoSelecionado.nomeproduto} ?"
icon="ui-icon-alert" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
<p:commandButton value="SIM" type="button"
styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
<p:commandButton value="NÃO" type="button"
styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>
Essa é a parte do código que não está funcionando na pagina;
<p:column headerText="Foto" style="text-align: center; width: 200px">
<h:graphicImage value="../ShowImg?nomeFoto=#{produto.imagemproduto}" />
</p:column>
E essa é a classe que fica responsavel em mostra as imagens na tela;
package br.com.comercial.controller;
import java.io.IOException;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
public class ShowImgServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ShowImgServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
ServletOutputStream outimg = response.getOutputStream();
String nomeFoto = request.getParameter("nomeFoto");
String caminho = "C:/workspace Web/Projetos Profissionais/Fotos para teste/";// Aqui você coloca o caminho do diretório onde
// as imagens estão sendo armazenadas no
// servidor
String foto = caminho + nomeFoto;
RenderedOp src = JAI.create("fileload", foto);
ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", outimg, null);
encoder.encode(src);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
Essa classe precisa dessa configuração para funciona;
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<servlet>
<servlet-name>ShowImg</servlet-name>
<servlet-class>br.com.comercial.controller.ShowImgServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ShowImg</servlet-name>
<url-pattern>/ShowImg</url-pattern>
</servlet-mapping>
Não se engane, eu fiz muitas tentativas para chegar a posta essa dúvida no fórum, estou desesperado para resolver isso, o cliente está me cobrando e eu com um código que funcionava não está funcionando;
Estou utilizando maven para baixar os artefatos.