Les servlets sont des programmes Java qui s'exécutent côté serveur d'une application Web. Tout comme les applets étendent dynamiquement les fonctionnalités d'un navigateur Web, les servlets étendent dynamiquement les fonctionnalités d'un serveur Web. Bien que les servlets puissent servir n'importe quelle requête, ils sont couramment utilisés pour étendre les serveurs Web. Pour de telles applications, la technologie Java Servlet définit des classes de servlet spécifiques à HTTP. Les packages javax.servlet et javax.servlet.http fournissent des interfaces et des classes pour la création de servlets.
- Quelle est la structure d'un projet web ?
- Qu'est-ce qu'un conteneur de servlet ? Cycle de vie des servlets.
Un conteneur de servlets est un programme qui gère le cycle de vie des servlets.
Cycle de vie du servlet : il est géré par le conteneur du servlet, lors du premier accès au servlet, il est chargé en mémoire et la méthode init() est appelée. Au fur et à mesure que l'application s'exécute, les méthodes service() sont appelées pour traiter les demandes des clients. Lorsque l'application se termine, la méthode destroy() est appelée et la servlet est déchargée de la mémoire.
- Quelles sont les tâches, les fonctionnalités d'un conteneur de servlet ?
Un conteneur de servlet peut agir comme un serveur Web entièrement autonome, fournir des pages à un autre serveur Web tel qu'Apache ou s'intégrer à un serveur d'applications Java EE. Assure l'échange de données entre le servlet et les clients, exécute des fonctions telles que la création d'un environnement logiciel pour un servlet fonctionnel, l'identification et l'autorisation des clients, l'organisation d'une session pour chacun d'eux.
- En quoi sendRedirect() est-il différent de forward() ?
Pour appeler une JSP à l'aide d'un chemin relatif, utilisez la méthode forward() ; pour accéder à une JSP à l'aide d'un chemin absolu, utilisez la méthode sendRedirect(). La différence entre ces méthodes est qu'un objet de requête déjà existant est passé avec la méthode forward() et qu'une nouvelle requête est formée lorsque la méthode sendRedirect() est appelée. Dans ce dernier cas, les informations doivent être transmises avec d'autres objets. De plus, la méthode forward() est plus rapide.
- Que savez-vous des filtres de servlet ?
L'implémentation de l'interface Filter permet de créer un objet qui intercepte la requête, peut transformer l'en-tête et le contenu de la requête client. Les filtres ne créent pas de demande ou de réponse, mais les modifient uniquement. Le filtre prétraite la demande avant qu'elle n'atteigne le servlet, puis (si nécessaire) traite la réponse du servlet. Le filtre peut interagir avec différents types de ressources, en particulier avec les servlets et les pages JSP. Les filtres de servlet peuvent :
- intercepter le lancement du servlet avant que le servlet ne soit lancé.
- déterminer le contenu de la requête avant que la servlet ne soit invoquée.
- modifier les en-têtes et les données de requête dans lesquelles la requête entrante est conditionnée.
- modifier les en-têtes et les données de réponse dans lesquels la réponse reçue est compressée.
- intercepter l'initiation du servlet après un appel au servlet.
Un filtre de servlet peut être configuré pour fonctionner sur un seul servlet ou un groupe de servlets. La base de la formation des filtres est l'interface javax.servlet.Filter, qui implémente trois méthodes :
- void init(FilterConfig config) lève ServletException ;
- vide détruire();
- void doFilter (demande ServletRequest, réponse ServletResponse, chaîne FilterChain) lance IOException, ServletException ;
La méthode init() est appelée avant que le filtre ne commence à s'exécuter et configure l'objet de configuration du filtre. La méthode doFilter fait le travail réel du filtre. Ainsi, le serveur appelle init() une fois pour exécuter le filtre, puis appelle doFilter() autant de fois qu'il y a de requêtes faites directement à ce filtre. Une fois que le filtre a terminé son travail, la méthode destroy() est appelée.
- Pourquoi avons-nous besoin d'écouteurs dans les servlets ?
Les écouteurs de contexte et de session sont des classes qui peuvent garder une trace du moment où un contexte ou une session a été initialisé, ou garder une trace du moment où ils doivent être détruits et du moment où des attributs ont été ajoutés ou supprimés du contexte ou de la session. Le servlet 2.4 étend le modèle d'écouteur de requête pour suivre la manière dont une requête est créée et détruite, et la manière dont les attributs sont ajoutés et supprimés d'un servlet. Servlet 2.4 a ajouté les classes suivantes :
- ServletRequestListenerServletRequestListener
- ServletRequestEventServletRequestEvent
- ServletRequestAttributeListenerServletRequestAttributeListener
- ServletRequestAttributeEventServletRequestAttributeEvent
- Comment gérer les exceptions levées par une autre servlet dans l'application ?
Étant donné que le navigateur ne comprend que le HTML, lorsqu'une application lève une exception, le conteneur de servlet gère l'exception et génère une réponse HTML. Ceci est similaire à ce qui se passe avec des codes d'erreur comme 404, 403, etc. L'API Servlet prend en charge les servlets natifs pour gérer les exceptions et les erreurs que nous pouvons définir dans le descripteur de déploiement. La tâche principale de ces servlets est de gérer l'erreur ou l'exception et d'envoyer une réponse HTML lisible par l'utilisateur à l'utilisateur. Par exemple, vous pouvez fournir un lien vers la page principale, ainsi qu'une description de certains détails sur l'erreur.
- Qu'est-ce qu'un descripteur de déploiement ?
Le descripteur de déploiement est le fichier de configuration d'artefact qui sera déployé dans le conteneur de servlet. Dans la spécification Java Platform, Enterprise Edition, un descripteur de déploiement décrit comment un composant, un module ou une application (telle qu'une application Web ou d'entreprise) doit être déployé.
Ce fichier de configuration spécifie les options de déploiement d'un module ou d'une application avec des paramètres spécifiques, des options de sécurité et décrit les exigences de configuration spécifiques. La syntaxe des fichiers descripteurs de déploiement est XML.
- Comment implémenter le lancement de servlet avec le lancement d'application ?
Le conteneur de servlet charge généralement le servlet à la première demande du client, mais il est parfois nécessaire de charger le servlet dès le démarrage de l'application (par exemple, si le servlet est volumineux et prendra beaucoup de temps à charger). Pour ce faire, vous devez utiliser l'élément load-on-startup dans le descripteur (ou l'annotation loadOnStartup), qui indiquera que la servlet doit être chargée au démarrage.
La valeur doit être un entier. Si la valeur est négative, alors la servlet sera chargée à la demande du client, et si 0 et plus, alors elle sera chargée au démarrage de l'application. Plus le nombre est bas, plus tôt le servlet sera dans la file d'attente de téléchargement.
- Qu'est-ce qu'un objet ServletConfig ?
L'interface javax.servlet.ServletConfig est utilisée pour transmettre des informations de configuration à un servlet. Chaque servlet a son propre objet ServletConfig, dont le conteneur de servlet est responsable de l'instanciation. Les paramètres d'initialisation dans web.xml (ou les annotations WebInitParam) sont utilisés pour définir les paramètres de configuration. La méthode getServletConfig() est utilisée pour obtenir l'objet ServletConfig de cette servlet.
- Qu'est-ce qu'un objet ServletContext ?
L'interface javax.servlet.ServletContext définit un ensemble de méthodes qu'une servlet utilise pour communiquer avec son conteneur de servlet, telles que l'obtention du type MIME d'un fichier, la distribution de requêtes ou l'écriture dans un fichier journal. L'objet ServletContext est unique et disponible pour tous les servlets d'une application Web. Nous pouvons utiliser l'objet ServletContext lorsque nous devons accorder l'accès à un ou plusieurs servlets aux paramètres initialisés d'une application Web. Pour ce faire, utilisez l'élément
Les conteneurs de servlet peuvent également fournir des objets de contexte qui sont uniques à un groupe de servlets. Chacun des groupes sera associé à un ensemble différent d'URL de chemin d'hôte.
ServletContext a été étendu dans la spécification Servlet 3 pour fournir un ajout programmatique d'écouteurs et de filtres à une application. Cette interface possède également de nombreuses méthodes utiles comme getMimeType(), getResourceAsStream() etc.
- Quelle est la différence entre ServletContext et ServletConfig ?
Voici quelques-unes des différences :
- ServletConfig est unique par servlet, tandis que ServletContext est unique dans toute l'application.
- ServletConfig est utilisé pour fournir des paramètres d'initialisation à un servlet, et ServletContext est utilisé pour fournir des paramètres d'initialisation d'application pour tous les servlets.
- Nous n'avons pas la possibilité de définir des attributs sur l'objet ServletConfig, alors que nous pouvons définir des attributs sur l'objet ServletContext qui seront disponibles pour les autres servlets.
- Interface ServletResponse.
L'interface ServletResponse est un outil pour envoyer des données à un client. Toutes les méthodes de cet outil servent cet objectif.
- Interface ServletRequest.
L'interface ServletRequest est un outil permettant d'obtenir les paramètres de requête HTTP. Cette interface possède certaines méthodes dont le nom et l'objectif sont identiques à ServletContext.
- Qu'est-ce qu'un répartiteur de demandes ?
L'interface RequestDispatcher est utilisée pour transmettre une demande à une autre ressource (il peut s'agir de HTML, de JSP ou d'un autre servlet dans la même application). Nous pouvons l'utiliser pour ajouter le contenu d'une autre ressource à la réponse. Cette interface est utilisée pour la communication interne entre les servlets dans le même contexte. L'interface a deux méthodes :
- void forward(ServletRequest var1, ServletResponse var2) - transmet une requête d'un servlet à une autre ressource (servlet, JSP ou fichier HTML) sur le serveur.
- void include(ServletRequest var1, ServletResponse var2) - inclut le contenu de la ressource (servlet, JSP ou page HTML) dans la réponse.
L'interface est accessible à l'aide de la méthode ServletContext getRequestDispatcher(String s). Le chemin doit commencer par / , qui sera interprété par rapport au chemin racine actuel du contexte.
- Comment créer un deadlock dans une servlet ?
Le blocage (deadlock) peut être obtenu en implémentant un appel de méthode en boucle, par exemple en appelant la méthode doPost() dans la méthode doGet() et en appelant doGet() dans la méthode doPost().
- Comment obtenir l'adresse de la servlet sur le serveur ?
Pour obtenir le chemin réel du servlet sur le serveur, vous pouvez utiliser cette construction : getServletContext().getRealPath(request.getServletPath()).
- Comment obtenir des informations sur le serveur à partir du servlet ?
Les informations sur le serveur peuvent être récupérées à l'aide de l'objet ServletContext à l'aide de la méthode getServerInfo(). Ceux. getServletContext().getServerInfo().
- Comment obtenir l'adresse IP du client sur le serveur ?
Utilisez request.getRemoteAddr() pour obtenir l'adresse IP du client dans le servlet.
- Que savez-vous des classes wrapper de servlet ?
L'API HTTP Servlet fournit deux classes wrapper, HttpServletRequestWrapper et HttpServletResponseWrapper. Ils aident les développeurs à implémenter leurs propres implémentations des types de requête et de réponse du servlet. Nous pouvons étendre ces classes et remplacer uniquement les méthodes nécessaires pour implémenter nos propres types d'objets de réponse et de requête. Ces classes ne sont pas utilisées dans la programmation standard des servlets.
L'une des caractéristiques les plus agréables de Java est sa nature multiforme. Bien sûr, la création d'applications de bureau traditionnelles et même d'applications mobiles est excellente. Mais que se passe-t-il si vous voulez sortir des sentiers battus et entrer dans le territoire du développement Web Java ? La bonne nouvelle pour vous est que le langage est livré avec une API Servlet complète qui vous permet de créer des applications Web robustes sans trop de tracas.
Créer des applications Java avec des servlets
Nous avons donc déjà créé les fichiers de configuration de l'application. Cependant, dans son état actuel, il ne fait littéralement rien. Nous voulons que les clients puissent s'inscrire à l'aide d'un formulaire HTML, donc la prochaine chose que nous devons faire est de créer des fichiers JSP qui afficheront le formulaire ci-dessus et les détails du client une fois l'inscription réussie. C'est ce que nous allons faire maintenant.
Travail sur le look
L'apparence de l'application sera définie par deux fichiers JSP - dans le contexte de MVC, ils sont appelés vues. Le premier sera responsable de l'affichage du formulaire d'inscription et des éventuelles erreurs causées après validation des données saisies. La seconde sera une page d'accueil normale qui affichera les données saisies par le client une fois le processus d'inscription terminé avec succès.
Voici le premier fichier JSP :
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Inscription
$(violation).
Le fichier contient du code HTML simple avec quelques ajouts. C'est la beauté de JSP combiné avec JSTL et JEL. Remarquez à quel point il est facile de vérifier les erreurs de validation à l'aide de balises standard telles que<с:if>et
L'attribut d'action du formulaire d'inscription pointe vers l'URL suivante : $(pageContext.request.contextPath)/processcustomer . Cela signifie qu'à chaque fois qu'un client essaie de s'enregistrer, les données seront envoyées à processcustomer, quelle que soit l'URL où le formulaire est disponible. Ceci est réalisé grâce à la fonctionnalité des objets disponibles à partir du fichier JSP, tels que request .
Nous verrons bientôt comment la servlet se lie à l'URL processcustomer et comment elle interagit avec l'entrée. Pour l'instant, regardons le fichier JSP responsable de la page d'accueil :
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Merci de votre inscription!
Vos données saisies :
Nom:$(prénom)
Nom de famille:$(nom de famille)
E-mail:$(courriel)
Maintenant que nous avons traité du rendu des pages, l'étape suivante consiste à créer un servlet chargé de collecter les données client à partir des requêtes POST et de valider les données de manière simple.
Nous écrivons le contrôleur
Écrire un servlet qui peut recevoir des données à partir d'un formulaire d'inscription est aussi simple que de décortiquer des poires. Tout ce que nous avons à faire est d'écrire une sous-classe de la classe HttpServlet et d'implémenter ses méthodes doGet() ou doPost() (ou les deux si nécessaire). Dans ce cas, la servlet va interagir avec les données provenant des requêtes POST.
Voici à quoi ça ressemble :
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") la classe publique CustomerController étend HttpServlet ( @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) lance ServletException, IOException ( RequestCustomer client = RequestCustomer.fromRequestParameters(request); client .setAsRequestAttributes(request); List violations = customer.validate(); if (!violations.isEmpty()) ( request.setAttribute("violations", violations); ) String url = determineUrl(violations); request.getRequestDispatcher(url ).forward(request, response); ) private String determineUrl(List violations) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) classe statique privée RequestCustomer ( string final privé firstName ; string final privé lastName ; email final privé String ; RequestCustomer privé (String firstName, String lastName, String email) ( this.firstName = firstName; th is.lastName = lastName; this.email = e-mail ; ) public static RequestCustomer fromRequestParameters (demande HttpServletRequest) ( renvoie un nouveau RequestCustomer (request.getParameter("firstname"), request.getParameter("lastname"), request.getParameter("email")); ) public void setAsRequestAttributes(demande HttpServletRequest) ( request.setAttribute("firstname", firstName); request.setAttribute("lastname", lastName); request.setAttribute("email", email); ) public List validate() ( List violations = new ArrayList<>(); if (!StringValidator.validate(firstName)) ( violations.add("Le prénom est un champ obligatoire"); ) if (!StringValidator.validate(lastName)) ( violations.add("Le nom est un champ obligatoire") ; ) if ( !EmailValidator.validate(email)) ( violations.add("Email must be well-formed"); ) return violations; ) ) )
La première chose à remarquer ici est l'utilisation de l'annotation @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer"). Il indique au conteneur de servlet d'utiliser la classe CustomerController pour gérer les requêtes HTTP vers /processcustomer . Le même effet peut être obtenu en ajoutant des directives de mappage de servlet à web.xml comme , mais puisque nous utilisons la spécification de servlet 3.1, nous n'avons pas besoin de recourir à cette méthode.
Ici, nous avons nommé le servlet CustomerController car il est considéré comme une bonne pratique d'utiliser le nom de la classe de servlet comme valeur de l'attribut name de l'annotation @WebServlet. Sinon, certains conteneurs ne correspondront pas, ce qui entraînera une erreur 404.
La classe CustomerController elle-même effectue quelques tâches simples. Tout d'abord, il collecte les entrées de formulaire à l'aide d'une implémentation de l'interface HttpServletRequest, qui contient des valeurs correspondant aux champs firstname , lastname et email du formulaire. Il définit ensuite ces valeurs en tant qu'attributs de requête afin qu'elles puissent être restituées soit sur le formulaire, soit sur la page de résultats. Enfin, les validateurs vérifient l'exactitude des données saisies.
Les validateurs sont des classes simples qui vérifient certaines propriétés, comme si une chaîne est vide ou si un e-mail ressemble à un e-mail. Sur le GitLab de l'auteur, vous pouvez voir leur implémentation.
Le résultat de la validation affecte la suite des événements : si les données ne sont pas valides, le client est redirigé via l'objet RequestDispatcher vers la page d'enregistrement, où les erreurs correspondantes sont affichées. Si tout est en ordre, la page d'accueil s'affiche.
Nous avons donc créé une application Web Java complète qui vous permet d'enregistrer des clients à l'aide d'un formulaire HTML, d'un servlet de base et de quelques fichiers JSP. Il est temps de le lancer.
Lancement de l'application
Pour lancer l'application, vous devez suivre les étapes suivantes :
IDÉE IntelliJ). Lorsque vous déployez le projet et que vous l'exécutez, le navigateur par défaut doit se lancer avec une fenêtre de connexion.
Conclusion
Ainsi, vous avez acquis toutes les compétences nécessaires pour créer votre propre application web Java sans avoir recours à des frameworks complexes. Tout ce dont vous avez besoin est une API Servlet, une technologie telle que JSP pour le rendu et des fonctionnalités Java intégrées. C'est génial, non ?
Il est à noter que l'implémentation de la classe CustomerController met en évidence les avantages et les inconvénients des servlets : d'une part, elle montre brièvement à quel point il est facile de traiter les paramètres de requête et d'envoyer des réponses au client dans différents formats. Mais cette fonctionnalité a un prix : les deux implémentations des interfaces HttpServletResponse et HttpServletResponse sont des localisateurs de service réguliers. Cela ne veut pas dire que c'est mauvais, puisque les localisateurs contiennent simplement des données. Cependant, gardez à l'esprit que ces implémentations seront toujours liées au servlet.
L'exemple de servlet inclut le servlet HelloWorld.java lui-même et le descripteur d'application web.xml. Le servlet vous permet de générer une page de réponse en cyrillique. La structure de l'exemple de servlet dans l'IDE Eclipse est illustrée dans la capture d'écran suivante.
Liste de l'exemple de servlet HelloWorld.java
Le code ci-dessous implémente une simple servlet HelloWorld.java, qui renvoie une page HTML statique au navigateur. Dans l'exemple, la servlet hérite des propriétés de la HttpServlet qui implémente l'interface Servlet.
Importer java.io.IOException ; import java.io.OutputStream ; import javax.servlet.ServletConfig ; import javax.servlet.http.HttpServlet ; import javax.servlet.ServletException ; import javax.servlet.http.HttpServletRequest ; import javax.servlet.http.HttpServletResponse ; la classe publique HelloWorld étend HttpServlet ( configuration privée de ServletConfig ; @Override public void init (configuration de ServletConfig) lance ServletException ( this.config = config ; ) @Override public void destroy() () @Override public ServletConfig getServletConfig() ( return config ; ) @Override public String getServletInfo() ( return "A Simple Servlet"; ) public void service (demande HttpServletRequest, réponse HttpServletResponse) lance ServletException, IOException ( response.setContentType("text/html"); String text = " " + "
" + " " + "Bonjour %s %s !
" + "" ; text = String.format(text, config.getInitParameter("name"), config.getInitParameter("mname")); OutputStream outStream = response.getOutputStream(); outStream.write(text.getBytes(" UTF-8")); outStream.flush(); outStream.close(); ) )Lors de l'accès à une servlet, une méthode est appelée un service, qui affiche la page de réponse et l'envoie au navigateur via HttpServletResponse. L'en-tête est défini dans les premières lignes de la réponse du serveur type de contenu avec encodage UTF-8. De plus, le prénom et le patronyme, obtenus à partir du descripteur d'application web.xml, sont remplacés dans le modèle de réponse. Autrement dit, les paramètres de configuration du servlet sont lus.
Pour pouvoir retourner une page avec du cyrillique, utilisez OutputStream. Toute information peut être sortie dans le flux de sortie (dans notre exemple, un simple code HTML).
Liste des descripteurs d'application web.xml
Dans le descriptif de l'application web.xml Les paramètres de servlet (nom nom-servlet et classe classe-servlet) et les paramètres d'initialisation (prénom nom, deuxième prénom mname) sont définis. La servlet lit ces paramètres en utilisant ServletConfig.
Pour exécuter l'exemple de servlet à partir de l'IDE Eclipse, vous devez démarrer le serveur d'application et saisir la ligne suivante dans la barre d'adresse de votre navigateur :
http://localhost:8080/ServletHello/hello
Le navigateur nous affichera un message d'accueil indiquant le personnage principal des œuvres d'Ilf et de Petrov.
![](https://i2.wp.com/java-online.ru/images/web/servlet-example2.png)
Pour la compilation séparée d'un servlet, vous pouvez utiliser un fichier de commandes, dont le texte pour Windows peut ressembler à ceci.
SET TOMCAT_LIB="C:\Program Files\Apache Software Foundation\Tomcat\common\lib" SET JAVA_SDK=C:\Java\Sun\SDK\jdk\bin\ %JAVA_SDK%javac -classpath %TOMCAT_LIB%\servlet-api. pot*.java
Après compilation de la servlet Classe HelloWorld doit être placé dans le répertoire WEB-INF/classes/ Applications WEB sur serveur Tomcat et inscription dans le descripteur de distribution web.xml.
Télécharger l'exemple
Le code source de l'exemple de servlet discuté dans le texte de la page est disponible (191 Ko).
Un exemple de servlet utilisant la bibliothèque graphique Chart.js pour générer dynamiquement une page avec des graphiques peut être visualisé.
Près de vingt ans se sont écoulés depuis l'avènement du langage de programmation Java. Pendant ce temps, Java était prophétisé par la mort et l'oubli, les programmeurs ici se moquaient de sa lenteur et de sa soif de ressources. Mais il y avait aussi ceux qui croyaient en Java, ils ont développé toutes sortes de bibliothèques, développé la communauté, prouvé obstinément qu'il n'y a pas de limites à Java : temps réel, embarqué, IA - tout est possible. Nous avons décidé de ne pas rester à l'écart et de faire une petite série d'articles sur Java dans cette rubrique. Aller!
Votre bouilloire choisit Java
Selon Oracle lui-même, la machine virtuelle Java est actuellement installée sur plus de trois milliards d'appareils. Et ce ne sont pas seulement des ordinateurs et des smartphones, mais aussi des appareils photo, des téléviseurs, des lecteurs Blue-ray, des imprimantes, des cartes SIM, des distributeurs automatiques de billets et même des voitures. Cette liste s'allongera régulièrement, et avec elle, les offres d'emploi pour les programmeurs Java. Même maintenant, le nombre de postes vacants pour les programmeurs Java dépasse le reste. Et les entreprises sont prêtes à payer de plus en plus, débauchent des salariés et organisent des conditions de travail plus favorables.
Et pourquoi est-elle bonne ?
Les programmeurs Java sont attirés par le minimalisme de la syntaxe. Pas de modificateurs supplémentaires et de mots de service. Même l'absence d'héritage multiple, qui a d'abord un peu dérouté les programmeurs C++, s'avère finalement raisonnable et justifiée. Logique simple, travail automatique avec mémoire, documentation détaillée, forums avec des réponses à toutes sortes de questions, open source - tout cela vous permet de comprendre rapidement le processus de développement et réduit considérablement le nombre d'erreurs potentielles. Même les paysans indiens apprennent Java en quelques mois, du moins c'est ce que disent leurs diplômes :). De plus, Java est un langage interprété. Le compilateur traduit le code source en ce que l'on appelle un bytecode, qui est facile à reconvertir, ce qui rend Java particulièrement attrayant pour la rétro-ingénierie.
Eh bien, commençons
Java est un langage orienté objet, ce qui signifie que toutes les variables, méthodes, constantes sont déclarées au sein d'une classe. En plus des classes, il existe également des interfaces - une construction abstraite spéciale qui vous permet de décrire le comportement d'un objet sans spécifier d'implémentation spécifique. Et s'il n'y a pas d'héritage multiple de classes en Java, alors une classe peut implémenter n'importe quel nombre d'interfaces, ce qui permet à un objet d'avoir de nombreuses fonctions, mais de n'en fournir qu'une partie.
Les types de données peuvent être divisés en deux groupes : les types simples (int, long, char, etc.) et les types d'objet : classes, interfaces, tableaux. Les types simples sont toujours et partout de dimension fixe. Par exemple, sur n'importe quelle architecture et n'importe quel périphérique, un int occupe quatre octets de mémoire. C'est assez pratique pour les calculs. Le tableau de données contient un attribut de longueur spécial qui stocke la taille du tableau, pour lequel un merci spécial aux développeurs. Les données de différents types sont transmises aux méthodes de différentes manières. Les types simples sont toujours passés par valeur. Objet - toujours par référence pour économiser de la mémoire. Cela signifie que si nous passons int a = 10 et changeons sa valeur à 5 dans la méthode appelée, alors a sera toujours 10 dans la méthode d'origine. Mais si nous changeons la propriété de l'objet, il changera dans la méthode d'origine comme Bien.
Rappelez-vous la mémoire
Bien qu'un programmeur Java soit soulagé du besoin d'allouer et de désallouer de la mémoire, le fait de ne pas connaître certaines des fonctionnalités de la machine virtuelle et du ramasse-miettes peut facilement transformer votre programme en un monstre vorace qui dévore le temps CPU et toute la mémoire disponible.
Lors de la création d'un nouveau tableau, rappelez-vous toujours qu'il est beaucoup plus facile de créer plusieurs petits morceaux de mémoire qu'un seul énorme. Sinon, vous courez le risque de rencontrer une erreur de mémoire insuffisante, ce qui signifie en gros que vous aviez de la mémoire, mais tout est sorti.
De nombreux programmeurs, lorsqu'ils passent à Java et découvrent le nettoyage automatique de la mémoire, commencent à créer des objets en grandes quantités, en espérant que tout se nettoiera tout seul. Pendant ce temps, le ramasseur d'ordures est comme une machine qui ne peut ramasser que les ordures jetées dans une poubelle près de la maison. Si vous n'avez plus besoin de certaines données, vous ne devez pas les stocker au cas où, comme une pile de vieilles cartes postales - attribuez null au pointeur de données, aidez le nettoyeur à nettoyer :). Il est également recommandé d'effacer la liste si vous n'en avez plus besoin. N'oubliez pas qu'un objet sera conservé en mémoire tant qu'il y aura des références à celui-ci dans le code. Même si votre programme s'exécute sur 16 gigaoctets de mémoire et ne risque pas de planter avec Mémoire insuffisante, il deviendra de plus en plus maladroit et lent à cause d'une surabondance de mémoire utilisée. 99% des plaintes des utilisateurs concernant les programmes Java lents sont dues à un code source écrit de manière inefficace. Si vous devez constamment créer des objets qui sont utilisés rapidement et dont vous n'avez plus besoin, comme de nombreux petits messages, envisagez de créer un pool qui stockera un certain nombre d'instances pour une utilisation répétée. N'oubliez pas que la création et la suppression d'un objet est une opération coûteuse.
Mettez-vous au travail, messieurs.
Un exemple vaut mieux que mille mots. Vous pouvez faire défiler le manuel et consulter les hellowords standard sans nous, nous supposerons donc que vous l'avez déjà fait et que vous êtes prêt à mettre en œuvre un exemple plus intéressant.
Vous et moi allons nous occuper de l'application serveur de Java et écrire un petit programme pour "espionner" les utilisateurs des réseaux sociaux. Pour ce faire, vous n'avez même pas besoin d'obtenir un emploi à la NSA - les utilisateurs diffusent tout sur eux-mêmes, et nous n'aurons qu'à recevoir, systématiser et afficher ces informations d'une belle manière. Prenons l'un des services sociaux populaires, par exemple foursquare, et dessinons les mouvements de nos amis sur la carte.
Voyons d'abord ce que nous pouvons tirer de foursquare. Après avoir parcouru les pages destinées aux développeurs, nous tournons notre attention vers deux méthodes :
- https://developer.foursquare.com/docs/users/checkins - lieux visités par l'utilisateur. Malheureusement, il n'est actuellement pris en charge que pour l'utilisateur enregistré dans le programme, et il y a des rumeurs selon lesquelles en raison de limitations dans la mise en œuvre, il le restera ;
- https://developer.foursquare.com/docs/checkins/recent - lieux visités par les amis de l'utilisateur enregistré. Si vous jouez un peu avec cette fonction, il s'avère un triste fait: pour chaque ami, exactement un endroit est renvoyé - le dernier endroit où il s'est vérifié.
Pour utiliser l'API foursquare, vous devez enregistrer notre future application, rendez-vous à cette adresse : https://ru.foursquare.com/developers/register et remplissez les champs (oui, vous devrez également vous enregistrer dans foursquare lui-même, mais vous pouvez le faire parfaitement sans moi).
Parmi les champs importants, seuls "Nom de l'application", "URL de la page de téléchargement / d'accueil" (entrez ici une adresse Web arbitraire) et "URI (s) de redirection" peuvent être notés ici - c'est l'adresse à laquelle le serveur nous enverra après inscription. Nous entrerons la valeur souhaitée ici plus tard, mais pour l'instant, vous pouvez simplement entrer n'importe quelle adresse Web. Cliquez sur "Enregistrer" et notre application de suivi a été enregistrée avec succès.
Nous nous élevons vers les nuages
Captain Obvious indique que toute application serveur a besoin d'un serveur pour fonctionner. Élever un serveur par soi-même, c'est des hémorroïdes, nous allons donc utiliser des solutions cloud qui sont désormais populaires. Le cloud sera parrainé par Google Corporation car leur Google App Engine est gratuit, assez facile à configurer et à utiliser. Pour commencer, rendez-vous ici et téléchargez le SDK Google App Engine pour Java.
Vous pouvez maintenant commencer à créer le projet. Pour le développement Java, j'utilise IntelliJ IDEA, mais vous pouvez utiliser l'environnement Eclipse gratuit et tout aussi connu.
Sélectionnons un nouveau projet Java. Appelons-le nsa_tracker.
![](https://i0.wp.com/xakep.ru/wp-content/uploads/2014/07/image1.png)
Dans l'onglet suivant, marquez Application Web et Google App Engine sur la gauche et indiquez le chemin d'accès au SDK App Engine précédemment téléchargé et décompressé.
![](https://i1.wp.com/xakep.ru/wp-content/uploads/2014/07/image2.png)
Maintenant, asseyez-vous et laissez l'IDE faire son travail. Si vous avez choisi IDEA et que vous avez tout fait correctement, vous verrez alors un projet terminé qui, une fois lancé, ouvrira une fenêtre de navigateur avec un contenu vide. Vous pouvez commencer à coder.
Nous commençons à chercher
Nous avons donc un dossier de projet, qui contient le dossier src. C'est là que nous mettrons le code source. Les sources en Java sont regroupées par packages. Un package est un dossier sur le disque. Les packages sont nécessaires pour ne pas jeter toutes les sources dans un tas, mais pour les séparer, guidés par les principes de la logique. Par exemple, le code lié à l'interface utilisateur serait logiquement placé dans le package ui, les interactions réseau dans le package réseau. Cela facilite grandement le développement et l'accompagnement du projet par la suite. Il a toujours été d'usage de commencer la structure du package par le nom de la société suivi du nom du programme. Cela aidera à identifier facilement nos sources parmi un tas de sources identiques à l'avenir. Pour notre programme, nous allons créer le package org.nsa.tracker. Nous y créerons des classes.
Les servlets sont utilisés pour traiter les requêtes des utilisateurs sur le serveur. Un servlet est une classe qui hérite généralement de HttpServlet et fonctionne sur une base requête-réponse. Tout ce qui est nécessaire est de remplacer la méthode doGet. À la demande de l'utilisateur, nous devons nous connecter à foursquare, charger la liste des enregistrements d'amis et rediriger la demande vers la page de la carte.
Pour travailler avec l'API foursquare, nous utiliserons la bibliothèque gratuite foursquare-api-java, qui peut être extraite d'ici. Une bibliothèque Java est une archive ZIP avec une extension jar qui contient des classes Java compilées qui implémentent certaines fonctionnalités. Pour l'autorisation, nous avons besoin du ClientId et du ClientSecret obtenus au stade de l'enregistrement de l'application dans foursquare. Comme ces paramètres ne changent pas pendant l'exécution du programme, nous les déclarons comme des constantes.
Chaîne finale statique privée CLIENT_ID = "FAKE_CLIENT_ID" ; Chaîne finale statique privée CLIENT_SECRET = "FAKE_CLIENT_SECRET" ;
Final signifie que cette variable a reçu une valeur finale qui ne peut pas être modifiée. Static rend la variable disponible pour toutes les instances de la classe donnée. En utilisant l'exemple d'autorisation de la bibliothèque foursquare-api-java, nous obtenons quelque chose comme le code suivant :
Protected void doGet(HttpServletRequest req, HttpServletResponse resp) lance ServletException, IOException ( FoursquareApi foursquareApi = new FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req.getParameter("code"); if (code == null) ( // Accédez à la page d'inscription resp.sendRedirect(foursquareApi.getAuthenticationUrl()); ) else ( essayez ( foursquareApi.authenticateCode(code); // Inscription réussie, téléchargez les données Résultat
Notez le "lève ServletException, IOException" dans la déclaration de méthode. Cette ligne signifie que la méthode peut potentiellement lever l'une de ces exceptions. Une exception en Java est un objet qui signale qu'une exception s'est produite. Ils sont vérifiables et invérifiables. Les exceptions vérifiées doivent être gérées en entourant une partie du code avec un bloc try-catch, ou passées au-dessus. Les exceptions non contrôlées ne sont généralement pas gérées car elles se produisent lorsque le programme est incapable de récupérer son état. Dans cette méthode, nous gérons uniquement l'exception FoursquareApiException.
Lorsque le serveur Web reçoit une demande pour une application, il utilise le descripteur de déploiement pour faire correspondre l'URL de la demande avec le code qui doit traiter la demande. Le descripteur de déploiement est un fichier XML appelé web.xml. Ajoutons une description du servlet de suivi.
Désormais, les requêtes vers /track seront traitées par notre servlet nommé TrackerServlet. Vous pouvez définir le paramètre Callback Url sur la valeur correcte http://localhost:8080/track.
Pour afficher les résultats, vous pouvez utiliser l'API Static Maps, aimablement fournie par la même société Google (https://developers.google.com/maps/documentation/staticmaps/). Notre servlet générera une simple page HTML et la renverra en réponse à une demande de l'utilisateur.
StringBuilder sb = new StringBuilder("
- "); index = 1; for (Checkin checkin: result.getResult()) ( sb.append("
Pour générer la page, la classe StringBuilder est utilisée, cela est dû au fait que les chaînes en Java sont des objets immuables. Lors de la concaténation de chaînes à l'aide de l'opérateur +. une nouvelle chaîne est créée en mémoire. StringBuilder économise de la mémoire car il utilise un tableau de caractères pour stocker les chaînes à concaténer. Envoi d'une réponse à l'utilisateur :
Octet resultBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(resultBytes.length); resp.getOutputStream().write(resultBytes);
…Et tout est prêt. Nous lançons et voyons quelque chose de similaire à une image avec un dicton "Résultat du programme".
![](https://i0.wp.com/xakep.ru/wp-content/uploads/2014/07/image3.png)
Et après?
L'application peut être améliorée, par exemple en séparant la collecte et l'affichage des données. Transférez la collecte de données vers un service distinct qui fonctionnera en permanence et se souviendra de tous les mouvements des utilisateurs dans la base de données. Ensuite, il sera possible d'afficher non pas des points individuels, mais un itinéraire connecté. En fouillant un peu dans l'API foursquare, vous pouvez extraire encore plus d'informations sur l'activité des utilisateurs.
Mais j'espère avoir réussi l'essentiel : vous convaincre que Java est simple et cool. Rendez-vous dans un mois !
Livres pour programmeur Java
Nous vous conseillons de commencer à apprendre la langue avec le livre « Java. Java : Guide du débutant par Herbert Schildt. Le niveau suivant est "Java. Le guide complet est de lui, et vous pouvez en apprendre davantage sur les servlets dans Java Servlet et JSP Cookbook par Bruce W. Perry.