Como carregar um site externo dentro de um div

Tutorial de como inserir uma página externa em um div.
Vou utilizar o método HttpURLConnection do Java. Pro Javascript JQuery.
Vou abrir uma conexão à uma página externa de dentro de um Servlet Java e exibir o resultado em um HttpServletResponse que por fim será exibido em um Div.

Primeiro o arquivo html.
Vou criar um botão que ao ser clicado vai enviar um url pra um método javascript que por sua vez vai chamar o servlet e abrir a página externa no div.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <link rel="stylesheet" type="text/css" href="/pages/style/style.css" />
  <script type="text/javascript" src="/pages/script/jquery-1.6.2.min.js"></script>
  <script type="text/javascript" src="/pages/script/script.js"></script>
  <title>Generate</title>
</head>

  <body>
    <input type="button" id="btnSend" value="clique aqui" onclick="show('http://www.google.com.br');">
    
    <div id="result" style="border: 1px solid black; width: 450px; height: 500px; text-align: center;"></div>
    <div id="error"></div>
  </body>

</html>

O arquivo script.js, que contém o método show(url)
A função vai desabilitar o botão submit, e em seguida chamar o servlet com o url (método GET). Caso haja algum erro na requisição, eu exibo o tipo do erro no html.

function show(url) {
  $('#btnSend').attr('disabled', 'disabled');
  $("#result").load(
      '/Generate/ServletRedirect?host='.concat(url),
      function(response, status, xhr) {
        if (status == "error") {
          var msg = "Ocorreu um erro: ";
          $("#error").html(msg + xhr.status + " " + xhr.statusText);
        }
      });

}

Por fim o Servlet que vai utilizar o método HttpURLConnection pra conectar a página externa
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletRedirect extends HttpServlet {
  private static final long serialVersionUID = 1L;

  protected void doGet(HttpServletRequest request,
      HttpServletResponse responsethrows ServletException, IOException {
    StringBuilder stringBuilder = new StringBuilder();
    HttpURLConnection connection = null;

    try {
      URL url = new URL(request.getParameter("host"));
      connection = (HttpURLConnectionurl.openConnection();
      connection.setRequestProperty("Accept-Charset""ISO-8859-1");
      connection.setRequestMethod("GET");
      connection.setRequestProperty("Content-Type","text/plain");
      connection.connect();

      BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

      String line = null;
      while ((line = reader.readLine()) != null) {
        stringBuilder.append(line + "\n");
      }
      reader.close();
    catch (Exception e) {
      InputStream error = ((HttpURLConnectionconnection).getErrorStream();
      BufferedReader reader = new BufferedReader(new InputStreamReader(error));
      String line = null;
      while ((line = reader.readLine()) != null) {
        stringBuilder.append(line + "\n");
      }
      reader.close();
      e.printStackTrace();
    
    response.setContentType("text/html"));
    response.getWriter().write(stringBuilder.toString());
  }

}

Iniciei a conexão com HttpURLConnection. Como o método utilizado foi GET, peguei o parâmetro da url.
A linha connection.setRequestProperty("Accept-Charset""ISO-8859-1"); codifica a página, caso haja acentuação. No meu caso ISO-8859.
Em seguida leio toda a página em um StringBuilder e marco a saída (response) como html (response.setContentType("text/html");) e mando o resultado.

Se eu utilizasse o método POST, mudaria o seguinte:
connection.setDoOutput(true)// Triggers POST.
connection.setRequestProperty("Content-Type""application/x-www-form-urlencoded;charset=" "ISO-8859-1");

OutputStream output = null;
try {
     output = connection.getOutputStream();
     output.write(query.getBytes(charset));
finally {
     if (output != nulltry output.close()catch (IOException logOrIgnore) {}
}

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));


É isso. 

Comentários

Postagens mais visitadas deste blog

Utilizando um pool de conexões com hibernate

Gravando dados de um arquivo CSV no Oracle utlizando Python e a biblioteca cx_Oracle

Popup em JSF sem Javascript