La classe abstraite URLStreamHandler permet la gestion d'un protocole spécifique. Nous appelerons cependant rarement directement ses méthodes, car elles sont appelées par d'autres méthodes des classes URL et URLConnection. C'est en surchargeant (“overriding”) les méthodes d'URLStreamHandler que nous pouvons permettre à la classe URL d'utiliser de nouveaux protocoles.
La classe URLStreamHandler définit 4 méthodes d'accès qui peuvent être surchargées par les sous-classes, mais seule la méthode openConnection doit obligatoirement être surchargée car elle est abstraite et ne fournit donc pas d'implémentation par défaut.
protected abstract URLConnection openConnection(URL u) throws IOException
La plus importante responsabilité de URLStreamHandler est de créer un objet URLConnection approprié à l'URL par une surcharge de la méthode abstraite openConnection.
La méthode openConnection prend en paramètre une URL. De cette URL, elle peut extraire le protocole, et retourner un objet URLConnection. L'objet URLConnection peut être utilisé pour créer les flux d'entrée et de sortie pour accéder à la ressource pointée par l'URL.
import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; private static final int DEFAULT_PORT = 8241; if("prout".equals(u.getProtocol())){ return new ProutURLConnection(u); } return null; } public int getDefaultPort() { return DEFAULT_PORT; } }
Nous pouvons aussi utiliser une classe qui implémente l'interface URLStreamHandlerFactory
/** * This BrolURLStreamHandlerFactory allows us to create URL * objects that will use the sun.net.www protocol handlers * for known schemes. If the scheme is not one of those * within the JDK, we create an instance of our BrolHandler * and return that. If this factory returned null instead, * a MalformedURLException would be thrown for unknown * schemes. */ import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; if (protocol.equalsIgnoreCase("ftp")) { } if (protocol.equalsIgnoreCase("gopher")) { } if (protocol.equalsIgnoreCase("file")) { } if (protocol.equalsIgnoreCase("mailto")) { } if (protocol.equalsIgnoreCase("prout")) { } } }
package sun.net.www.protocol.brol; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; /** * This is a null protocol handler. This handler will allow * us to create a URL object for this protocol, but we won't * be able to retrieve any data through it. */ /** * This method will only return null. Data cannot be * obtained from this handler. * @param u The URL to obtain data from. * @return A null URLConnection. */ return null; } }
protected void parseURL(URL u, String spec, int start, int limit)
Une autre responsabilité importante de la classe URLStreamHandler est de diviser la chaîne de caractères représentant l'URL en différentes parties et d'utiliser ces parties pour affecter les valeurs aux différents champs de l'objet URL. La méthode parseURL analyse et divise l'URL puis appelle enfin la méthode setURL pour assigner les valeurs aux différents champs de l'URL.
La méthode parseURL que Java fournit présume que l'URL ressemble plus ou moins à une URL HTTP :
protocole://www.domaine.com:port/chemin/ressource.ext
Ce comportement fonctionne pour des URL de type FTP ou Gopher, mais pas pour mailto ou news, et encore moins dans le cas d'un protocole que nous créons nous-même, et qui définit sa propre structure d'URL.
Si nous notre « gestionnaire de protocole » (en anglais, “protocol handler”) utilise des URL de type HTTP, nous ne sommes pas obligés de surcharger la methode parseURL. Cependant, si nous devons surcharger la méthode parseURL, nous devons aussi absolument surcharger la méthode toExternalForm qui place les parties de l'URL dans une chaîne de caractères.
int port = u.getPort(); String host, file, userInfo, query, ref, authority; host = ""; file = ""; authority = ""; if(start<limit){ int atSign = address.indexOf('@'); int questionMark = address.indexOf('?'); int hostEnd = questionMark <=0 ? questionMark : address.length(); if(atSign >= 0){ host = address.substring(atSign+1, hostEnd); userInfo = address.substring(0, atSign); } if(questionMark >= 0 && questionMark < atSign){ query = address.substring(questionMark+1); } if(userInfo != null){ authority = userInfo + '@'; } authority += host; if(port < 0){ authority += ':' + port; } setURL(u, protocol, host, port, authority, userInfo, file, query, ref); } }
La requête est extraite de l'URL, mais nous devons ensuite veiller à la décoder.N'oublions pas non plus qu'au moment de coder l'URL, nous devons veiller à préserver les caractères spéciaux (par exemple, le point d'interrogation qui marque le début des paramètres, le signe & qui permet de séparer les paramètres, etc.).
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
6 mots clés dont 0 définis manuellement (plus d'information...).
Avertissement
Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)