Usando um servlet em uma aplicação JSF (Resolvido)

22 respostas
Naruto

Bom dia, galera estou utilizando um sevlet em minha aplicação JSF que contem um trecho com o seguinte código

private static void processStream(InputStream is, ServletRequest request, 
       HttpServletResponse response) throws ServletException, IOException { 
  
     BufferedImage image; 
     try { 
       image = ImageIO.read(is); 
     } catch (IOException ioe) { 
       log.fine(ioe.toString()); 
       // Includes javax.imageio.IIOException 
       response.sendRedirect("badimage.jspx"); 
       return; 
     } catch (CMMException cmme) { 
       log.fine(cmme.toString()); 
       // Have seen this in logs 
       response.sendRedirect("badimage.jspx"); 
       return; 
     } catch (IllegalArgumentException iae) { 
       log.fine(iae.toString()); 
       // Have seen this in logs for some JPEGs 
       response.sendRedirect("badimage.jspx"); 
       return; 
     } 
     if (image == null) { 
       response.sendRedirect("badimage.jspx"); 
       return;       
     } 
     if (image.getHeight() <= 1 || image.getWidth() <= 1 || 
         image.getHeight() * image.getWidth() > MAX_PIXELS) { 
       log.fine("Dimensions too large: " + image.getWidth() + 'x' + image.getHeight());         
       response.sendRedirect("badimage.jspx"); 
       return; 
     } 
  
     Reader reader = new MultiFormatReader(); 
     LuminanceSource source = new BufferedImageLuminanceSource(image); 
     BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source)); 
     Collection<Result> results = new ArrayList<Result>(1); 
     ReaderException savedException = null; 
  
     try { 
       // Look for multiple barcodes 
       MultipleBarcodeReader multiReader = new GenericMultipleBarcodeReader(reader); 
       Result[] theResults = multiReader.decodeMultiple(bitmap, HINTS); 
       if (theResults != null) { 
         results.addAll(Arrays.asList(theResults)); 
       } 
     } catch (ReaderException re) { 
       savedException = re; 
     } 
  
     if (results.isEmpty()) { 
       try { 
         // Look for pure barcode 
         Result theResult = reader.decode(bitmap, HINTS_PURE); 
         if (theResult != null) { 
           results.add(theResult); 
         } 
       } catch (ReaderException re) { 
         savedException = re; 
       } 
     } 
  
     if (results.isEmpty()) { 
       try { 
         // Look for normal barcode in photo 
         Result theResult = reader.decode(bitmap, HINTS); 
         if (theResult != null) { 
           results.add(theResult); 
         } 
       } catch (ReaderException re) { 
         savedException = re; 
       } 
     } 
  
     if (results.isEmpty()) { 
       try { 
         // Try again with other binarizer 
         BinaryBitmap hybridBitmap = new BinaryBitmap(new HybridBinarizer(source)); 
         Result theResult = reader.decode(hybridBitmap, HINTS); 
         if (theResult != null) { 
           results.add(theResult); 
         } 
       } catch (ReaderException re) { 
         savedException = re; 
       } 
     } 
  
     if (results.isEmpty()) { 
       handleException(savedException, response); 
       return; 
     } 
  
     if (request.getParameter("full") == null) { 
       response.setContentType("text/plain"); 
       response.setCharacterEncoding("UTF8"); 
       Writer out = new OutputStreamWriter(response.getOutputStream(), "UTF8"); 
       try { 
         for (Result result : results) { 
           out.write(result.getText()); 
           out.write('\n'); 
         } 
       } finally { 
         out.close(); 
       } 
     } else { 
       request.setAttribute("results", results); 
       request.getRequestDispatcher("decoderesult.jspx").forward(request, response); 
     } 
   }
O que acontece é que nessa parte do código
if (request.getParameter("full") == null) { 
       response.setContentType("text/plain"); 
       response.setCharacterEncoding("UTF8"); 
       Writer out = new OutputStreamWriter(response.getOutputStream(), "UTF8"); 
       try { 
         for (Result result : results) { 
           out.write(result.getText()); 
           out.write('\n'); 
         } 
       } finally { 
         out.close(); 
       }

ele faz uma verificação que caso atenda retorna uns dados... porem esse dados é mostrado pelo out.write(result.getText);
e abre uma pagina em branco em minha aplicação para mostrar isso ... gostaria de saber se é possivel eu mostrar esses dados na mesma pagina onde pedi a verificação...

Obrigado pessoal

22 Respostas

dev.rafael

Claro! Faça uma requisição assícrona via javascript p/ sua servlet, pegue o conteudo retornado e
atualize a sua página p/ apresentar o conteudo!!!

Naruto

como seria isso? tem algum exemplo?
vlww

dev.rafael

Procura p/ AJAX no google, o q ñ faltam são exemplos disso por ai.

Naruto

rapaz não consegui que me ajudasse não…

vlw

dev.rafael
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","servlet_url",true);
xmlhttp.send();
}
</script>
</head>
<body>

<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>

</body>
</html>

Esse código ñ é meu, eu o tirei do site http://www.w3schools.com. Esse código
vai receber no atributo xmlhttp.responseText td q vc ecoar no out.write() na sua
Servlet e vc poderá modificar a página com o conteúdo.

É só importante lembrar que os redirects ñ ṽ funcionar aqui. O cliente deve saber
se as requisições são síncronas ou assíncronas.

Naruto

mais como aplico isso em minha aplicação?

chamo essa pagina dentro do meu servlet? ou quando clico no botão que dispara o servlet???

vlwwww

Naruto

este é o código no qual chama a servlet

<form action="decode" method="post" enctype="multipart/form-data">    
<input type="file" size="50" name="f"/>
<input type="submit"/>        
</form>

quando clico no botão se o campo input file nãoe stiver vazio ou não estiver com um arquivo invalido ele dispara a servlet retornando o texto da servlet
o.O

dev.rafael

Cara, pq vc simplesmente ñ encaminha o usuário de volta p/ mesma página, coloca uma mensagem
de erro na HttpServletRequest e usa o JSP p/ renderizar essa mensagem?

Naruto

rapaz to quase conseguindo… fiz o seguinte a hora que ele clica no botão ele redireciona o usuario para outra pagina xhtml … beleza ai ao inves de dar um out.Write eu fiz um
System.out.println para mostrar no console para não abrir uma outra pagina contendo as informações… agora o negocio é so fazer assim na pagina que o usuario é redirecionado se tudo ocorrer bem mostrar as informações nessa pagina xhtml … porem tentei com request.setAtributte porem não consegui nada :frowning:

vc tem alguma dica de como posso pegar?

vlww fera

Naruto

ninguem?? não tenho ideia de como pegar esse valor do servlet e mostrar em minha pagina JSF

dev.rafael

É JSP ou JSF afinal?

Naruto

é JSF… tenho apenas um servlet que é disparado e preciso que quando eu do um response.sendRedirect(pagina.jsf);

eu mostre o resultado nessa pagina
:confused:

Naruto

você deve ter achado que era JSP por causa desse ~código

porem é assim porque foi a unica forma que consegui fazerr o servlet ser disparo

foi utilizando esse código
<form action="decode" method="post" enctype="multipart/form-data">       
<input type="file" size="50" name="f"/>   
<input type="submit"/>           
</form>

vlw fera

dev.rafael

Sua Servlet:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
  ...
  req.getSession().setAttribute("my_info", myInfo);
  resp.sendRedirect("pagina.jsf");
  ...
}

Seu managed bean:

public Object getInformacaoQueVeioDaServlet() {
  return ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().getAttribute("my_info");
}
Naruto

sabe tinha tentado algo parecido… porem o problema é que se eu coloco o
resp.sendRedirect(“pagina.jsf”);

depois da execução da servlet parece que ele não pega o valor via getAtributte

e se eu coloco antes da execução o resp.sendRedirect(“pagina.jsf”);

ele não me redireciona e abre a pagina em branco

vlwwwwww

dev.rafael

Não imagino qual possa ser o problema, esse código abaixo faz exatamente o q disse e funcionou muito bem p/ mim.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>TODO supply a title</title>
    </head>
    <body>
        <form action="first" method="POST">
            <label for="data">Data:</label>
            <input id="data" type="text" name="data" />
            <button type="submit">Send</button>
        </form>
    </body>
</html>
package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(urlPatterns = "/first")
public class FirstServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws IOException, ServletException {
        String data = req.getParameter("data");
        HttpSession session = req.getSession();
        session.setAttribute("data", data);
        resp.sendRedirect("faces.xhtml");
    }

}
package test;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@ManagedBean
@RequestScoped
public class MBean {

    public String getData() {
        FacesContext facesCtx = FacesContext.getCurrentInstance();
        ExternalContext externalCtx = facesCtx.getExternalContext();
        HttpSession session = (HttpSession) externalCtx.getSession(true);
        return (String) session.getAttribute("data");
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>TODO supply a title</title>
    </head>
    <body>
        <h:outputText value="#{mBean.data}" />
    </body>
</html>
Naruto

Tu usa a tag no faces config para chamar essa pagina ou não utiliza ela?

bom vou ver aqui o que pode ser tentarei mais uma vez e te falo
vlw fera

dev.rafael

Cara isso é JSF 2. A unica coisa que eu configurei foi a FacesServlet. Todo o comportamento do
programa está ai mesmo, no código.

Naruto

opa parceiro belez???

então consegui em partes… na pagina que é chamada pelo sendRedirect(); eu coloco um botão para chamar outra página pois esse send Redirect so funciona se eu coloco antes do metodo e antes de enviar a variavel via request … pois se eu coloco ela depois ela abre uma pagina em branco que é a do servlet … e tambem tive que criar um metodo para atribuir o valor a variavel no ManagedBean pois da forma que vc me passou não dava certo dava um erro… mais tamos quase la

se tiver mais alguma sugestão

vlw obrigado

dev.rafael

Kra, manda o seu projeto ai, pq esse código funciona certinho. Eu realmente ñ vejo como as situações
q vc citou possam impedir esse código de funcionar.

Naruto

opa vou mandar sim porem o código esta funcionando certim o problema so ta no sendRedirect … e na hora de pegar mais vou mandar para vc Vlw

Naruto

Obrigado fera… problema resolvido :smiley:

Criado 27 de maio de 2010
Ultima resposta 2 de jun. de 2010
Respostas 22
Participantes 2