Parlez de votre compréhension de Struts.
Struts est un framework de couche Web conçu selon le modèle MVC. En fait, il s'agit d'un Servlet. Ce Servlet s'appelle ActionServlet, ou une sous-classe d'ActionServlet. (Étude recommandée : questions d'entretien Java)
Nous pouvons transmettre toutes les demandes qui répondent à certaines caractéristiques du fichier web.xml à cette servlet pour traitement, et cette servlet fera référence à une configuration Chaque demande est affectée à une action différente pour le 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. ActionServlet transmet la demande à l'action. pour le traitement Auparavant, les paramètres de 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 requête)
3. Il est à noter qu'ActionServlet transmet l'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. par l'attribut d'entrée.
4. Une fois l'action exécutée, la vue des résultats affichée sera 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. fichier de configuration XML.
Étant donné que le programme utilise le nom logique défini pour la page jsp dans le fichier de configuration struts-config.xml, cela peut réaliser le découplage du code du programme d'action et du nom de la page jsp renvoyé.
(Pour ce qui précède, vous pouvez également parler de vos propres opinions en fonction de votre propre expérience)
Parlez de votre compréhension d'Hibernate.
1. Le processus de fonctionnement interne d'un logiciel orienté objet peut être compris comme la création constante de divers nouveaux objets, l'établissement de relations entre les objets et l'appel de méthodes d'objets pour modifier le statut et le statut de chaque objet. Le processus de mort, quels que soient le processus et le fonctionnement du programme, consiste essentiellement à 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 de l'état de l'objet dans le moment. 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 des programmes 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. Une fonction accrocheuse nécessite d'écrire beaucoup de code, et la seule chose qu'elle fait est de sauvegarder et de restaurer des objets, et ces grandes quantités de code jdbc n'ont aucun contenu technique. Elles sont essentiellement écrites à l'aide d'un ensemble de modèles de code standard de routine. C'est un travail dur et 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 utilisateurs 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 de sauvegarde. Vous pouvez charger un objet depuis la base de données en appelant simplement un get. méthode.
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 vos sentiments concernant la mise en veille prolongée en fonction de votre propre expérience fastidieuse dans l'utilisation de JDBC)
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 classe Advice sont requises. 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)
Parlez des avantages et des inconvénients de Struts
Avantages :
1. Implémentez un 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 qui peuvent être utilisées, et la bibliothèque de balises Struts (Taglib), si elle est utilisée de manière flexible, peut grandement améliorer l'efficacité du développement
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. Lorsque vous accédez à la couche d'affichage, vous devez configurer le transfert. S'il y a dix jsps de couche d'affichage, vous devez configurer les struts dix fois, et cela n'inclut parfois pas les modifications de répertoire et de fichier. modifiez à nouveau le transfert. Remarque : chaque fois que la configuration est modifiée, l'ensemble du projet doit être redéployé et un serveur comme Tomcate doit être redémarré
Deuxièmement, l'action de Struts doit être thread-safe, ce qui ne permet qu'à une seule instance de gérer toutes les demandes. 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.
Troisièmement, 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.
Quatre. 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.
Cinquièmement, la dépendance à l'égard de Servlet est trop forte. 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.
Sixièmement, le langage d'expression frontal. 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.
Seven, 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, ce qui rend difficile le traitement avant et après l'action.
Neuf, le support des événements ne suffit pas. Dans struts, un formulaire correspond en réalité à une classe Action (ou DispatchAction). Autrement dit : dans Struts, un formulaire ne correspond en réalité qu'à un seul événement. Cette méthode d'événement est appelée événement d'application. Par rapport à l'événement de composant, l'événement d'application est un événement à gros grain
Quelle est la différence entre iBatis et Hibernate ?
Le mêmes points : protégez les détails d'accès sous-jacents de l'API jdbc afin que nous puissions accéder aux données sans avoir à traiter avec 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 nous aider à très bien le 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 est toujours contrôlé par. nous. Écrivez des instructions SQL.
Lors de l'exécution d'une requête multi-tables en veille prolongée, prenez 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 : Retirez 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, pour Par exemple, le tableau 1 nécessite de trouver les deux champs field1 et field2, puis il y a un constructeur appelé Bean(type1 field1, type2 field2), et vous pouvez ensuite générer directement ce bean en hql.
Présentez le cache de deuxième niveau d'Hibernate
Répondez selon les idées suivantes :
(1) Tout d'abord, expliquez ce que C'est le cache
(2) De plus, la session avec mise en veille prolongée est le cache de premier niveau, c'est-à-dire qu'avec le cache de premier niveau, pourquoi avons-nous besoin du cache de deuxième niveau ? (3) Enfin, parlons de la façon de configurer le cache Hibernate Level 2.
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.
S'il y en a, 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. La 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 fournisseurs 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.
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 c'est également un entrepôt de données utilisé pour accéder à certains. type de données. API standardisée pour les objets dans . 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.). applications plus portables.
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 l'ajout d'une clé étrangère à l'extrémité multiple pour pointer vers l'étranger clé à une extrémité, et la principale différence est que le côté maintenance est différent.
La différence réside dans les relations qu'ils entretiennent :Le mappage d'association un-à-plusieurs fait référence au chargement des données de plusieurs extrémités tout en chargeant les données de plusieurs end Un mappage associatif signifie charger les données d’une extrémité tout en chargeant les données d’une extrémité.
Comment Hibernate se charge-t-il paresseusement1. Implémentation du chargement paresseux d'Hibernate2 : a) Objet d'entité b) Collection (Collection)
.2. Hibernate3 fournit la fonction de chargement paresseux des attributs. 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, réalisant ainsi un chargement paresseux. , il économise la surcharge de mémoire du serveur, améliorant ainsi les performances du serveur.
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!