Avatar billede pnr Nybegynder
27. marts 2003 - 14:11 Der er 31 kommentarer og
1 løsning

Hente flere html sider på en gang

Jeg har lavet et lille program som kan hente nogle html sider på nettet. Mit problem er bare at i det første opslag laver jeg en søgning på en html side, når jeg så vil have de efterfølgende sider må jeg ikke afbryde forbindelsen, for så kan jeg ikke hente de efterfølgende sider. Jeg gør følgende:


String orgUrl = "DenFørsteHtmlSide";
String urlString = "DenEfterfølgedeSide"
URL PageURL;
try {
    PageURL = new URL(orgUrl);
}
catch (MalformedURLException e) {
String msg = "Invalid url: " + orgUrl;
    throw new GetStringException(msg);
}

// Get the InputStream from the URL connection
InputStream webPageInputStream;

try {
    webPageInputStream = PageURL.openStream();
}
catch (IOException e){
// Could be any server error, but the most likely is 404
    String msg = "404 File Not Found: " + urlString;
        throw new GetStringException(msg);
}

try {
    PageURL = new URL(urlString);
}
catch (MalformedURLException e) {
    String msg = "Invalid url: " + urlString;
    throw new GetStringException(msg);
}

try {
    webPageInputStream = PageURL.openStream();
}
catch (IOException e){
    // Could be any server error, but the most likely is 404
String msg = "404 File Not Found: " + urlString;
            throw new GetStringException(msg);
}
Avatar billede arne_v Ekspert
27. marts 2003 - 14:26 #1
Jeg forstår ikke dit problem.

HTTP er grundliggende en open/get/close per fil protokol (der er
lidt keep-alive for at forbedre performance), men grundliggende
er det open/get/close.

Så det man gør er faktisk at oprette en ny connection for hver fil
man vil hente.

Hvis der er noget login halløjsa, så skal du nok til at håndtere
cookies.
Avatar billede arne_v Ekspert
27. marts 2003 - 14:27 #2
PS: Jeg tror din kode vill blive kortere og mere læselig hvis du
    kun havde en enkelt try block og kun en catch per exception.
Avatar billede pnr Nybegynder
27. marts 2003 - 14:35 #3
dvs at man ikke kan lave en browser i java?

Jeg skal bruge en måde at lave 2 kald til serveren uden at lukke forbindelsen. dvs. Den første side laver en søgning, den næste side går til en bestemt side i søgningen.
Avatar billede arne_v Ekspert
27. marts 2003 - 14:42 #4
En gammel browser vil også lukek forbindelsen.

En ny browser vil muligvis holde forbindelsen åben
med keep-alive funktionaliteten muligvis ikke.

Det skal virke uden brug af keep-alive.
Avatar billede pnr Nybegynder
27. marts 2003 - 14:46 #5
Den måde jeg gør det på ovenfor virker det ikke, kan jeg gøre noget for at få det til at virke?
Avatar billede disky Nybegynder
27. marts 2003 - 14:55 #6
en browser, bruger flere forbindelser samtidigt, og lukker og genåbner dem per fil der skal hentes.

hvorfor må du ikke lukke forbindelsen til din server ?
Avatar billede pnr Nybegynder
27. marts 2003 - 15:00 #7
Det kan også være det er mig der er galt på den, Kna der så være et problem med sessions?
Avatar billede disky Nybegynder
27. marts 2003 - 15:08 #8
måske, men hvad er det lige dit problem er helt specifikt ?

Du søger på en side med en forbindelse og bagefter laver du noget andet på en anden side med en ny forbindelse.
Avatar billede pnr Nybegynder
27. marts 2003 - 15:15 #9
Jeg laver en søgning på en side, og skal så have adgang til alle resultaterne som godt kan sprede sig ud og flere sider. men disse efterfølgende sider er bestemt af den første side (med et resultset som ligger i en session, eller noget ligende)
Avatar billede arne_v Ekspert
27. marts 2003 - 15:21 #10
Den state bør ligge i de URL'er som bliver returneret af den
første side.
Avatar billede pnr Nybegynder
27. marts 2003 - 15:26 #11
og hvad mener du med det?
Avatar billede disky Nybegynder
27. marts 2003 - 15:38 #12
Du parser bare dine resultater og henter de nye sider med nye forbindelser.
Avatar billede arne_v Ekspert
27. marts 2003 - 16:11 #13
Du sender en søg og den returnerer en side med nogle links f.eks.
10 hits og frem og tilbage.

Alle 12 links bør indeholde alt det nødvendige.

Desværre er det et mareridt at parse HTML.

:-(
Avatar billede disky Nybegynder
27. marts 2003 - 16:12 #14
ikke hvis man parser sider der overholder HTML standarden.
Avatar billede arne_v Ekspert
27. marts 2003 - 16:16 #15
Det gør det ikke bedre hvis de ikke overholder standarden, men
selv standard ting kan godt være tricky at få parset korrekt.
Avatar billede disky Nybegynder
27. marts 2003 - 16:30 #16
Smag og behag.
Avatar billede pnr Nybegynder
27. marts 2003 - 20:23 #17
Problemet er at det link jeg får for at få den næste side, er baseret på den første side, dvs at den næste side er afhænig af at den første side har oprettet en session, hvor der ligger oplysninger til at vise de efterfølgende sider.
Avatar billede disky Nybegynder
27. marts 2003 - 20:42 #18
det gør jo ingen forskel når du har hentet siden kan du lukke forbindelsen, og oprette nye til de efterfølgende sider.
din computer glemmer jo ikke data fordi du lukker forbindelsen.
Avatar billede pnr Nybegynder
27. marts 2003 - 20:51 #19
Jo for så forsvinder den session som tilhører den første forespørsel
Avatar billede disky Nybegynder
27. marts 2003 - 20:59 #20
en session er noget der er på serveren hvor du henter siderne fra. Og en session er bundet til ip adresse der henter.

Hvis jer kommer ind på experten oprettes der en session på serveren, som vedbliver med at være der sålænge jeg bevæger mig rund på experten.
Denne session timer så ud efter f.eks. 30 min, efter sidste bevægelse på sitet.

Er du ved at lave serverside software eller en form for browser ?
Hvis det er server side, bibeholdes din session indtil den timer ud.

Hvis det er en browser har du en session på serveren, henter du fra en anden server får du en ny session der.
Avatar billede pnr Nybegynder
27. marts 2003 - 21:02 #21
Jeg vil da mene at en session er bundet til en browser.
Avatar billede disky Nybegynder
27. marts 2003 - 21:07 #22
Det skriver jeg også. Men den findes på webserveren ikke i browseren.

HTTP er en protokol type hvor browseren beder om noget, får det retur, og er så ligeglad med om serveren springes i luften bagefter.
Avatar billede arne_v Ekspert
27. marts 2003 - 21:08 #23
Der er en session på serveren som bliver koblet til requests fra
browseren enten via noget i URL (kaldet URL rewriting) eller via cookies.
Avatar billede arne_v Ekspert
27. marts 2003 - 21:09 #24
Hvis det sker via cookies skal din app håndtere dette.
Avatar billede arne_v Ekspert
27. marts 2003 - 21:11 #25
En session der kobles via client IP vil ikke fungere p.g.a. firewalls/routers
med NAT.
Avatar billede miknil Nybegynder
27. marts 2003 - 21:59 #26
En session i fx Tomcat håndteres  v.h.a enten en cookie eller en get parameter. (URL rewriting som arne korrekt nævner)
Hvis du slår cookies fra i din browser vil du opleve at der for hvert request (efter sessionen er oprettet) medsendes en parameter JSessionID.
Andre Webservere bruger tilsvarende mekanismer.
Sessionen er ikke koblet til IP-addressen, og kan i princippet også afkobles fra browseren, ved ikke SSL forbindelser kan en session overtages ved et såkaldt "man in the middle" attack.
Avatar billede arne_v Ekspert
27. marts 2003 - 22:57 #27
pnr>

Har du overvejet at genbruge noget eksisterende kode som f.eks.:
  http://jakarta.apache.org/commons/httpclient/index.html

Jeg tror at du kunne spare en masse kode.
Avatar billede pnr Nybegynder
03. april 2003 - 08:16 #28
Jeg har ikke helt fået det op og spille endnu.

Jeg beskriver lige mit problem igen.

Jeg laver en søgning (med den ovenstående kode) på en hjemmeside, den søgning opretter åbenbart en session på hvor alle mine søgekriterier står i. Nå jeg så skal have den næste side af min søgning har jeg et link til en servlet, som finder mine søgkriterier i den oprettede session, og udfra denne laver den den næste side.

Hvis jeg går dette i den ovenstående kode bliver den session nedlagt efter den første søgning, og det vil sige at servletten ikke kan finde de næste sider.

Så den ovenfor viste kode må altså virke lige som hvis man tager en browser laver en søgning og derefter lukker browseren, åbner en ny browser og søger igen. dvs at det session der bliver oprettet til den enkelte søgning bliver nedlagt for hver forspørgesel.
Avatar billede arne_v Ekspert
03. april 2003 - 08:22 #29
Jakarta Http-Client kan netop holde state mellem forskellige requests
(d.v.s. at den gemmer cookies).

Jeg lavede følgende eksempel til et andet spørgsmål:

package test;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class Login {
    private HttpClient client;
   
    public Login() {
        client = new HttpClient();
    } 
   
    public void login(String url,
                      String userField, String userValue,
                      String passField, String passValue) {
        NameValuePair[] nvp = new NameValuePair[2];
        nvp[0] = new NameValuePair(userField, userValue);
        nvp[1] = new NameValuePair(passField, passValue);
        post(url, nvp);
    }

    public String get(String url) {
        GetMethod met = new GetMethod(url);
        try {
            client.executeMethod(met);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return met.getResponseBodyAsString();
    }

    public String post(String url, NameValuePair[] nvp) {
        PostMethod met = new PostMethod(url);
        if(nvp != null) {
            met.setRequestBody(nvp);
        }
        try {
            client.executeMethod(met);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return met.getResponseBodyAsString();
    }

    public static void main(String[] args) {
        Login lgi = new Login();
        lgi.login("http://arne:8080/useradmin/Login",
                  "username", args[0],
                  "password", args[1]);
        System.out.println(lgi.get("http://arne:8080/useradmin/UserAdmin.jsp"));
    }
}

[du skal nok ikke bruge login men snarere en kombination af post og get]
Avatar billede pnr Nybegynder
03. april 2003 - 08:33 #30
Hvordan installere jeg denne komponent?
Avatar billede arne_v Ekspert
03. april 2003 - 08:48 #31
Du downloader ZIP-file, unzipper og putter commons-httpclient.jar og
commons-logging.jar i din classpath, skriver din kode (genbrug evt.
lidt fra min kode ovenfor).
Avatar billede pnr Nybegynder
03. april 2003 - 12:42 #32
Du er sq en haj arne_v!!
Også en stor tak til disky
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester