1. Parlez de votre compréhension de Struts
(Recommandations pour des questions d'entretien plus connexes :questions et réponses d'entretien Java)
1. Struts est un framework de couche Web conçu selon le modèle MVC. En fait, il s'agit d'un Servlet appelé ActionServlet, ou une sous-classe d'ActionServlet. Nous pouvons transmettre toutes les requêtes répondant à certaines caractéristiques du fichier web.xml à ce servlet pour traitement. Ce servlet fait ensuite référence à un fichier de configuration pour attribuer chaque requête à différentes actions de traitement.
(Struts peut avoir plusieurs fichiers de configuration, et chaque fichier de configuration peut être configuré en fonction du module, ce qui peut empêcher une expansion excessive du fichier de configuration)
2. action pour le traitement Auparavant, les paramètres de la requête étaient encapsulés dans un objet formbean (c'est-à-dire une classe Java, chaque attribut de cette classe correspond à un paramètre de la requête),
3. objet formbean à l'action Avant la méthode d'exécution, la méthode de validation du formbean peut être appelée pour vérification. Ce n'est qu'une fois la vérification réussie que l'objet formbean sera transmis à la méthode d'exécution de l'action, sinon il renverra une page d'erreur. est spécifié par l'attribut d'entrée.
4. Une fois l'action exécutée, la vue des résultats affichée doit être renvoyée. Cette vue des résultats est représentée par un objet ActionForward. L'objet actionForward est associé à une page jsp via la configuration dans struts-config. xml. , car le programme utilise le nom logique défini pour la page jsp dans le fichier de configuration struts-config.xml, afin que le code du programme d'action et le nom de la page jsp renvoyé puissent être découplés.
(Ci-dessus, vous pouvez également parler de vos propres opinions en fonction de votre propre expérience de son utilisation)
2. Parlez de votre compréhension d'Hibernate.
1. Le processus de fonctionnement interne d'un logiciel orienté objet peut être compris comme le processus de création constante de divers nouveaux objets, d'établissement de relations entre les objets et d'appel de méthodes objet pour modifier le statut de chaque objet et sa disparition. . , Quels que soient le processus et le fonctionnement du programme, il s'agit essentiellement d'obtenir un résultat. La différence entre les résultats d'exécution du programme au moment précédent et au moment suivant se reflète dans le changement d'état de l'objet. dans la mémoire.
2. Afin de maintenir l'état d'exécution du programme en cas d'arrêt ou d'espace mémoire insuffisant, il est nécessaire de sauvegarder l'état de l'objet dans la mémoire sur le périphérique de persistance et de restaurer l'état de l'objet à partir du périphérique de persistance. . Habituellement, ils sont tous enregistrés dans une base de données relationnelle pour enregistrer une grande quantité d'informations sur les objets. Du point de vue de la fonction d'exécution d'un programme Java, la fonction de sauvegarde de l'état de l'objet devrait être une fonction subsidiaire très discrète par rapport aux autres fonctions de fonctionnement du système. Java utilise jdbc pour implémenter cette fonction, mais cette fonction discrète nécessite une écriture. beaucoup de code, et la seule chose qu'il fait est de sauvegarder et de restaurer des objets, et ces grandes quantités de code jdbc n'ont aucun contenu technique. Ils sont essentiellement écrits à l'aide d'un ensemble de modèles de code standard de routine, ce qui est une sorte de travail acharné et. Travail répétitif.
3. L'enregistrement des objets et des objets de récupération générés lorsque le programme Java est exécuté dans la base de données réalise en fait la relation de mappage entre les objets Java et les enregistrements de la base de données relationnelle, appelée ORM (c'est-à-dire que les gens peuvent encapsuler). Le code JDBC est utilisé pour implémenter cette fonction, et le produit encapsulé est appelé framework ORM. Hibernate est l'un des frameworks ORM les plus populaires. En utilisant le framework Hibernate, vous n'avez pas besoin d'écrire du code JDBC. Vous pouvez enregistrer un objet dans une base de données relationnelle en appelant simplement une méthode save. Vous pouvez charger un objet depuis la base de données en appelant simplement une méthode get.
4. Le processus de base d'utilisation d'Hibernate est le suivant : configurer l'objet de configuration, générer SessionFactory, créer un objet de session, démarrer la transaction, terminer l'opération CRUD, soumettre la transaction, fermer la session.
5. Lorsque vous utilisez Hibernate, vous devez d'abord configurer le fichier hibernate.cfg.xml, qui configure les informations de connexion à la base de données et les dialectes, etc., et configure également le fichier hbm.xml correspondant pour chaque entité, hibernate. .cfg.xml Chaque fichier hbm.xml doit être enregistré dans le fichier.
6. Lors de l'application d'Hibernate, il est important de comprendre le principe de mise en cache de la session, de la cascade, du chargement paresseux et de la requête hql.
(Ci-dessus, vous pouvez également parler de votre expérience d'hibernation en fonction de votre propre expérience fastidieuse dans l'utilisation de JDBC)
Troisièmement, parlez de votre compréhension de Spring.
1. Spring est une classe d'usine qui implémente le modèle d'usine (il est nécessaire d'expliquer clairement ce qu'est le modèle d'usine ici. Cette classe s'appelle BeanFactory (en fait une interface). , il s'agit généralement de la sous-classe ApplicationContext de BeanFactory. Spring est équivalent à une grande classe d'usine. Dans son fichier de configuration, le nom de classe utilisé pour créer des objets d'instance et les propriétés de l'objet d'instance sont configurés via l'élément
2. Spring fournit un bon support pour IOC. IOC est une idée de programmation et un art architectural. Cette idée peut être utilisée pour réaliser un bon découplage entre les modules.
3. Spring fournit une bonne encapsulation de la technologie AOP. AOP est appelé programmation orientée aspect, ce qui signifie qu'il existe de nombreuses méthodes de classes non liées dans le système. Le code de certaines fonctions du système doit être ajouté à ces nombreuses méthodes. as, ajoutez la journalisation, ajoutez le jugement des autorisations et ajoutez la gestion des exceptions. Cette application est appelée AOP.
La technologie proxy est utilisée pour implémenter la fonction AOP. Le programme client n'appelle plus la cible, mais appelle la classe proxy et la classe cible ont la même instruction de méthode en externe. implémentez la même instruction de méthode, l'une consiste à implémenter la même interface et l'autre est une sous-classe de la cible.
Dans le JDK, la classe Proxy est utilisée pour générer un proxy dynamique afin de générer une classe d'implémentation pour une interface. Si vous souhaitez générer une sous-classe pour une certaine classe, vous pouvez utiliser CGLI B. Ajoutez la fonction système et la méthode correspondante d'appel de la classe cible à la méthode de la classe proxy générée. Le proxy de la fonction système est fourni sous forme d'objet Advice Évidemment, pour créer un objet proxy, au moins la classe cible et la. Des cours de conseils sont obligatoires. Spring fournit cette prise en charge et il vous suffit de configurer ces deux éléments dans le fichier de configuration Spring pour implémenter les fonctions proxy et aop.
(Vous pouvez également parler de vos propres opinions en fonction de votre propre expérience d'utilisation)
4. Parlez des avantages et des inconvénients de Struts
Avantages :
1. Implémentez le modèle MVC avec une structure claire, permettant aux développeurs de se concentrer uniquement sur la mise en œuvre de la logique métier 2. Il existe une multitude de balises disponibles. peut grandement améliorer le développement s'il peut être utilisé de manière flexible. Efficacité 3. La navigation dans les pages rend le contexte du système plus clair. Grâce à un fichier de configuration, vous pouvez saisir la connexion entre les différentes parties de l'ensemble du système, ce qui est très utile pour une maintenance ultérieure. Cet avantage devient encore plus évident lorsqu'un autre groupe de développeurs reprend le projet. 4. Fournir un mécanisme de gestion des exceptions 5. Gestion du pool de connexions à la base de données 6. Prise en charge de I18N Inconvénients : 1. . Lors du passage à la couche de présentation, vous devez configurer le transfert. S'il y a dix jsps de couche de présentation, vous devez configurer les struts dix fois, et cela n'inclut pas parfois les modifications de répertoire et de fichier. Notez que. après chaque modification de la configuration, l'ensemble du projet doit être redéployé et un serveur comme tomcate doit être redémarré 2. L'action Struts doit être thread-safe, ce qui ne permet qu'à une seule instance de gérer toutes les requêtes. Par conséquent, toutes les ressources utilisées par les actions doivent être uniformément synchronisées, ce qui entraîne des problèmes de sécurité des threads. 3. Les tests ne sont pas pratiques. Chaque action de Struts est couplée à la couche Web, donc ses tests dépendent du conteneur Web et les tests unitaires sont également difficiles à mettre en œuvre. Cependant, il existe un outil d'extension Junit, Struts TestCase, qui peut implémenter ses tests unitaires. 4. Conversion de type. FormBean de Struts traite toutes les données comme du type String et peut utiliser l'outil Commons-Beanutils pour la conversion de type. Mais sa conversion se fait entièrement au niveau de la classe et le type de conversion n'est pas configurable. Il est également très difficile de renvoyer à l'utilisateur des messages d'erreur lors de la conversion de type. 5. Trop de dépendance à l'égard de Servlet. Struts doit s'appuyer sur ServletRequest et ServletResponse lors du traitement de l'action, il ne peut donc pas se débarrasser du conteneur Servlet. 6. En termes de langage d'expression front-end, Struts intègre JSTL, il utilise donc principalement le langage d'expression JSTL pour obtenir des données. Cependant, le langage d'expression de JSTL est très faible dans la gestion des propriétés de collection et d'index. 7. Il est difficile de contrôler l'exécution d'une action. Lorsque Struts crée une action, il sera très difficile de contrôler son ordre d'exécution. Vous devrez peut-être même réécrire le servlet pour répondre à vos exigences fonctionnelles. 8. Traitement avant et après l'exécution de l'action. Lorsque Struts traite une action, il est basé sur des hiérarchies de classes. Il est difficile d'opérer avant et après le traitement de l'action. 9. Prise en charge insuffisante des événements. Dans Struts, un formulaire correspond en réalité à une classe Action (ou DispatchAction). En d'autres termes : Dans Struts, un formulaire correspond en réalité à un seul événement. appelé événement d'application. Comparé à l'événement de composant, l'événement d'application est un événement à gros grain (Tutoriel vidéo recommandé :cours Java)
5. Quelle est la différence entre iBatis et Hibernate ? Mêmes points : protéger les détails d'accès sous-jacents de l'API jdbc, afin que nous puissions accéder aux données sans avoir à gérer l'API jdbc. Le processus de programmation de l'API jdbc est corrigé et il mélange également des instructions SQL avec du code Java. Il est souvent nécessaire de reconstituer des instructions SQL, et les détails sont très fastidieux. Avantages d'ibatis : protège les détails d'accès sous-jacents de l'API jdbc ; sépare les instructions SQL du code Java ; fournit la fonction d'encapsuler automatiquement les ensembles de résultats appelés objets d'entité et les collections d'objets renvoient une collection d'objets. queryForObject pour renvoyer un seul objet ; fournit des paramètres qui transmettent automatiquement les propriétés de l'objet entité à l'instruction SQL.Hibernate est un outil de mappage ORM entièrement automatique. Il peut générer automatiquement des instructions SQL. Ibatis nous oblige à écrire nous-mêmes des instructions SQL dans le fichier de configuration XML. Hibernate est beaucoup plus responsable et puissant qu'ibatis. Étant donné qu'Hibernate génère automatiquement des instructions SQL, nous ne pouvons pas contrôler les instructions et nous ne pouvons pas écrire du SQL spécifique et efficace. Pour certaines requêtes SQL moins complexes, hibernate peut très bien nous aider à les compléter. Cependant, pour les requêtes particulièrement complexes, hibernate est difficile à adapter. Pour le moment, utiliser ibatis est un bon choix, car ibatis nous oblige toujours à écrire le SQL. déclarations nous-mêmes.
6. Effectuez une requête multi-tables en veille prolongée et sélectionnez plusieurs champs de chaque table, c'est-à-dire que l'ensemble de résultats de la requête n'a pas de classe d'entité correspondante.
Solution 1 : Récupérez les données en fonction des données Object[], puis formez vous-même le bean
Solution 2 : Écrivez un constructeur pour le bean de chaque table, par exemple, la table 1 doit trouver field1, field2 a deux champs, puis il y a un constructeur appelé Bean(type1filed1,type2 field2), et ensuite ce bean peut être généré directement dans hql.
7. Présentez le cache de deuxième niveau d'Hibernate
Répondez selon les idées suivantes :
(1) Tout d'abord, expliquez clairement ce qu'est le cache
(2) De plus, la session d'hibernate est le cache de premier niveau. Autrement dit, avec le cache de premier niveau, pourquoi avons-nous besoin du cache de deuxième niveau
(3) Enfin, parlons-en ? comment configurer le cache de deuxième niveau d'Hibernate.
1. La mise en cache consiste à stocker en mémoire les objets précédemment interrogés et utilisés à partir de la base de données (dans une structure de données) ou similaire à HashMap, lorsqu'un objet doit être utilisé dans le futur. , demandez d'abord s'il y a cet objet dans le cache, si c'est le cas, utilisez l'objet dans le cache, sinon, interrogez la base de données et enregistrez l'objet interrogé dans le cache pour une prochaine utilisation.
2. La session d'Hibernate est une sorte de cache. Nous l'appelons généralement le cache de premier niveau d'Hibernate. Lorsque vous souhaitez utiliser la session pour interroger un objet de la base de données, Session vérifie également d'abord s'il existe en interne. cet objet existe, il sera renvoyé directement s'il n'existe pas, il accédera à la base de données et enregistrera les résultats de la requête en interne.
Étant donné que la session représente un processus de session et qu'une session est associée à une connexion à une base de données, il est préférable de ne pas garder la session ouverte pendant une longue période. Elle n'est généralement utilisée que dans une seule transaction et doit être fermée à. la fin de la transaction. Et Session n'est pas sécurisée pour les threads et est sujette à des problèmes lorsqu'elle est partagée par plusieurs threads. Habituellement, seul le cache au sens global est la véritable application de cache et a une plus grande valeur de cache. Par conséquent, la fonction de cache du cache au niveau de la session d'Hibernate n'est pas évidente et la valeur de l'application n'est pas grande. Le cache de deuxième niveau d'Hibernate consiste à configurer un cache global pour Hibernate afin que plusieurs threads et plusieurs transactions puissent partager ce cache. Ce que nous espérons, c'est qu'une fois qu'une personne l'a utilisé, d'autres pourront également l'utiliser. Session n'a pas cet effet.
3. Le cache de deuxième niveau est un composant logiciel indépendant d'Hibernate et est un produit tiers. Plusieurs fabricants et organisations proposent des produits de mise en cache, tels que EHCache et OSCache, etc. Pour utiliser le cache de deuxième niveau dans Hibernate, vous devez d'abord configurer le produit de cache du fabricant à utiliser dans le fichier de configuration hibernate.cfg.xml. Vous devez ensuite configurer le propre fichier de configuration du produit de cache. Enfin, vous devez configurer quelle entité. les objets dans Hibernate doivent être inclus dans la gestion du cache de deuxième niveau. Après avoir compris le principe du cache de deuxième niveau et avoir eu cette idée, il est facile de configurer le cache de deuxième niveau d'Hibernate.
Connaissances étendues : Une SessionFactory peut être associée à un cache de deuxième niveau, c'est-à-dire qu'un cache de deuxième niveau ne peut être responsable de la mise en cache des données que dans une seule base de données. Lorsque vous utilisez le cache de deuxième niveau d'Hibernate, soyez prudent. ne pas avoir d'autres applications ou SessionFactory pour modifier les données de la base de données actuelle afin que les données mises en cache soient incohérentes avec les données réelles de la base de données.
8. Qu'est-ce que JDO ?
JDO est une nouvelle spécification pour la persistance des objets Java. C'est l'abréviation d'objet de données Java et est également un outil permettant d'accéder à certains types de données. entrepôt. API standardisée pour les objets. JDO fournit un stockage d'objets transparent, donc pour les développeurs, aucun code supplémentaire (tel que l'utilisation de l'API JDBC) n'est requis pour stocker les objets de données. Ces tâches de routine fastidieuses ont été transférées aux fournisseurs de produits JDO, permettant ainsi aux développeurs de concentrer leur temps et leur énergie sur la logique métier. De plus, JDO est flexible car il peut s’exécuter sur n’importe quelle donnée sous-jacente.
Comparaison : JDBC est uniquement destiné aux bases de données relationnelles (JDO est plus général et fournit des fonctions de stockage sous-jacentes pour toutes les données, telles que les bases de données relationnelles, les fichiers, les bases de données XML et objets (ODBMS), etc. ., rendant les applications plus portables.
9. Quelle est la différence entre les associations bidirectionnelles un-à-plusieurs et plusieurs-à-plusieurs d'Hibernate ? ?
Les principes de base de la mise en œuvre du mappage d'associations un-à-plusieurs et du mappage d'associations plusieurs-à-un sont les mêmes, c'est-à-dire qu'il faut ajouter une clé étrangère à l'extrémité multiple pour pointer vers la clé étrangère à l'extrémité plusieurs. une extrémité, et la principale différence est que l'extrémité maintenance est différente.
La différence entre eux réside dans la relation qu'ils entretiennent :
Le mappage d'association un-à-plusieurs signifie charger les données à une extrémité tout en chargeant les données à plusieurs extrémités. un mappage d'association signifie charger les données à une extrémité en même temps. Charger les données des multiples extrémités et charger les données d'une extrémité en même temps.
10. Comment Hibernate se charge-t-il paresseusement ?
1. Implémentation du chargement paresseux d'Hibernate2 : a) Objet d'entité b) Collection (Collection)
2. Lorsque Hibernate interroge les données, les données n'existent pas dans la mémoire. Lorsque le programme opère réellement sur les données, l'objet existe dans la mémoire, ce qui permet d'économiser la surcharge de mémoire du serveur, améliorant ainsi les performances du serveur. . performance.
Tutoriels associés recommandés :Tutoriel d'introduction à Java
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!