In una applicazione Java “desktop” di tipo grafico (o al limite una applicazione “console”) potrebbe essere necessario, in qualche caso, lanciare un browser esterno per aprire la pagina con i risultati della ricerca su internet fatta tramite uno specifico “motore di ricerca” (es. Google o Bing, giusto per citarne due noti).
La possibilità per farlo esiste. Per arrivare alla soluzione descritta in questo articolo, bisogna però prima stabilire alcuni “vincoli”:
- è sufficiente/accettabile aprire il browser “predefinito”, qualunque esso sia in base alla impostazione fatta dall’utente sulla sua macchina
- è accettabile dover conoscere a priori e impostare all’interno del codice (o al limite renderlo “configurabile”) l’indirizzo completo di un motore di ricerca (es. Google o Bing) per eseguire una ricerca e arrivare subito alla pagina dei primi risultati
- è possibile usare almeno Java 6 (scenario abbastanza facile e ragionevole al giorno d’oggi)
Se tutte queste premesse sono soddisfatte, allora possiamo procedere in maniera abbastanza semplice e lineare. Il punto 1 (grazie anche al punto 3) infatti ci dà la libertà di sfruttare il metodo browse(URI)
della classe java.awt.Desktop
.
Desktop
è una classe del framework AWT che è stata introdotta molto tempo fa in Java 6 per poter facilitare l’avvio di quelle applicazioni che vengono registrate nel sistema per essere “associate” a determinati tipi di file o di url. Se ad esempio su Windows l’estensione di file .txt
è stata associata al ben noto editor di testo Notepad++, allora se al metodo open(File)
di Desktop
si passa un java.io.File
che rappresenta un file .txt
esistente, esso verrà aperto proprio con Notepad++.
Il metodo browse
di Desktop
si occupa di lanciare il browser “predefinito” per far aprire la pagina il cui url è rappresentato da un oggetto java.net.URI
(per il concetto di URI in generale vedere Uniform Resource Identifier su Wikipedia).
Riguardo il punto 2 bisogna quindi scegliere innanzitutto un determinato motore di ricerca. In questo articolo descriverò cosa fare per i due motori di ricerca Google e Bing che tra l’altro, al momento attuale, hanno una struttura dell’url di ricerca che è praticamente similare.
Per Google l’url di ricerca basilare è: https://www.google.com/search?q=
testo+di+ricerca
Per Bing l’url di ricerca basilare è: https://www.bing.com/search?q=
testo+di+ricerca
Da notare che gli url indicati sono quelli “globali” ma si possono, ovviamente, anche usare le varianti nazionali, se/dove presenti (es. www.google.it
). Inoltre ciascun motore di ricerca ha sicuramente una serie di possibili ulteriori parametri per gestire delle sue funzionalità aggiuntive.
Generalmente in questi casi il testo da ricercare si passa sempre in query string che è quella parte del url dopo il “?
” che contiene le coppie nome=valore. Per via degli standard del web, la parte di query string va codificata appropriatamente (vedere Query string su Wikipedia per maggiori dettagli). Per far questo in Java è appropriato (e tipico) usare il metodo statico encode
della classe java.net.URLEncoder
.
Il seguente è un esempio basilare della ricerca con Google e Bing.
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
public class ProvaRicercaInternet {
public static void main(String[] args) {
try {
apriRicercaGoogle("foto di gatti"); // provare anche con apriRicercaBing
} catch (Exception e) {
System.err.println(e);
}
}
public static void apriRicercaGoogle(String testoRicerca) throws IOException, URISyntaxException {
String valoreQ = URLEncoder.encode(testoRicerca, "UTF-8");
URI uriRicerca = new URI("https://www.google.com/search?q=" + valoreQ);
Desktop.getDesktop().browse(uriRicerca);
}
public static void apriRicercaBing(String testoRicerca) throws IOException, URISyntaxException {
String valoreQ = URLEncoder.encode(testoRicerca, "UTF-8");
URI uriRicerca = new URI("https://www.bing.com/search?q=" + valoreQ);
Desktop.getDesktop().browse(uriRicerca);
}
}
Il costruttore URI(String)
si aspetta che la stringa ricevuta rappresenti un URI corretto secondo le specifiche (vedere la documentazione di java.net.URI
per i dettagli). Se così non fosse, ad esempio se il testo di ricerca non fosse codificato in maniera appropriata, il costruttore di URI
lancerebbe subito immediatamente un URISyntaxException
.
Il codice riportato sopra è chiaramente basilare, scritto volutamente per essere breve e abbastanza comprensibile. In una applicazione più reale e concreta bisognerebbe sicuramente considerare meglio le eccezioni. I due metodi di ricerca possono infatti lanciare diverse eccezioni, tra cui in modo particolare le seguenti tre:
-
URISyntaxException
se la stringa del URI non fosse composta correttamente secondo le specifiche. Ragionevolmente questo “non dovrebbe” avvenire nell’esempio sopra, perché è stato codificato il valore del parametroq
e perché il resto del url è fisso ed è scritto perlomeno correttamente -
UnsupportedOperationException
se l’operazione di “browse” conDesktop
non fosse supportata su un certo sistema (nota: questo si può anche testare a priori usando il metodoisSupported
diDesktop
passando come argomentoDesktop.Action.BROWSE
) -
IOException
se non esiste o non è stato possibile determinare il browser “predefinito” oppure se il lancio del browser è fallito per qualche motivo
Prima di concludere, è bene precisare che Google o Bing in futuro potrebbero cambiare la forma del loro url di ricerca. In tal caso il codice andrebbe ovviamente modificato di conseguenza.