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

22 respostas
N

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

D

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!!!

N

como seria isso? tem algum exemplo?
vlww

D

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

N

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

vlw

D
<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.

N

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

N

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

D

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?

N

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

N

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

D

É JSP ou JSF afinal?

N

é 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:

N

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

D

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");
}
N

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

D

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>
N

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

D

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

N

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

D

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.

N

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

N

Obrigado fera… problema resolvido :smiley:

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