J'ai déjà été en contact avec le développement Web lié à .NET, mais maintenant je suis toujours très mal à l'aise avec Javaweb.
1. Parlez de l'architecture du projet <br /> Je suis d'abord entré en contact avec le développement lié à .NET, donc je suis bien familier avec le développement lié à .NET, mais j'ai appris Java à l'école et je prévois de combiner ces deux plateformes. Levez-vous, utilisez Java comme backend, c'est-à-dire le fournisseur de services, complétez toute la logique métier sur la plate-forme Java et utilisez .NET que je connais plus pour le développement Web. De cette façon, il y aura des applications Android et des sites Web. Le client appelle le service uniformément via un cadre distribué. Après avoir cherché longtemps, j'ai finalement choisi HPROSE, une bibliothèque de moteur d'appel à distance dynamique d'objet à distance dynamique d'objet à distance dynamique à haute performance légère, non invasive, non invasive. La raison pour laquelle je l'ai choisi est à cause du faible coût d'apprentissage, et en revanche, son appel multiplateforme est très facile et efficace, car nous devons utiliser .NET pour faire le Web pour appeler les services publiés par Java! Après avoir regardé à peu près la documentation HProse, j'ai constaté que l'utilisation du service de version HproseServlet intégré est plus rapide et plus simple à développer, donc je prévois d'utiliser cette méthode pour publier le service. Mais le problème est que l'architecture SSH traditionnelle se sent un peu lourde, et je vais utiliser .NET pour développer le côté Web, donc je pense qu'il n'est pas nécessaire d'intégrer des entretoises, donc c'est une architecture Hibernate + Spring + Hprose .
2. Conception de la base de données
Il s'agit d'une petite librairie en ligne, donc la conception fait toujours défaut, et il est principalement pratique, principalement pratiquant le développement de Java ~~. J'ai donc utilisé Navicat pour le concevoir brièvement, mais il n'y avait pas de corrélation de table de conception.
En fait, vous pouvez voir la corrélation du tableau en un coup d'œil ~~, ensuite Hiberner certains mappages et utiliser également des plug-ins pour générer des modèles et des mappages de fichiers.
C'est comme ça avec une légère modification
3. Spring3 + Hibernate4 Configuration <Br /> Parce que les fichiers de modèle et de mappage sont générés automatiquement, il est préférable de les configurer un peu. modèle composite. Par exemple, le type de clé primaire composé du tableau d'examen des produits :
package com.book.model; // généré 2015-11-2 9:07:06 par Hibernate Tools 4.0.0.FinalImport Java.util.date; / ** * commentaire généré par HBM2Java * / Publi C Class commentairepk implémente Java Le livre de livre privé; Utilisateur Public (Book, User, User, « .Commentsdate = commentaires;} public Book GetBook () {return this.book;} public void setbook (book book) {this.book = book;} public user GetUser () {return this.user; Utilisateur) {this.User = User;} Public Date GetCommentsDate () {RETOUR ==)) Return True; Castother.getBook ()) || ) == castother.getUser ()) || (this.getUser ()! = null && castother.getUser ()! = null && this.getUser (). .GetCom mementsDate () == Castother.getCommentsDate ()) || (this.getCommentsDate ()! = Null && Castother.getCommentsDate ()! = Null && this.getCommentsDate (). ; == null? 0: this.getUser (). HashCode ()); Modèle de table de révision des produits :
Package com.book.model; // généré 2015-10-30 14:56:21 par Hibernate Tools 4.0.0.FinalImport Java.Sql.Date; / ** * Commentaires générés par HBM2Java * / Classe publique Les commentaires implémentent Java. IO.Serializable {Contenu de la chaîne privée; } public String getPic () {return pic;} public void setpic (String pic) {this.pic = pic;} public Integer getClient () {return Client; ; Content = Content; Le fichier de mappage Hibernate correspondant:
<? xml version = "1.0"?> <! Doctype Hibernate-Mapping public "- // Hibernate / Hibernate Mapping DTD 3.0 // en" "http://www.hibernate.org/dtd/hibernate-mapp ing-3.0 . "commentaires" catalog = "librairie"> <composite-id name = "id"> <key-many-to-one name = "book"> <colonnen name = "bookid" /> </ key-many-to- un> <key-many-to-one name = "user"> <colonnen name = "userId" /> </ key-many-to-one> <key-property name = "commentaire" type = "timestamp"> <colonnen name = "commentaire" longueur = "19" /> </ key-property> </ composite-id> <propriété name = "contenu" type = "string"> <colonnel name = "contenu" longueur = "65535 "/> </ propriété> <propriété name =" pic "type =" string "> <colonnel name =" pic "longueur =" 65535 "/> </ propriété> <propriété name =" client "type =" java. lan g .Integer "> <colonne name =" client "/> </ propriété> </ class> </ hibernate-mapping>
Étant donné qu'il y a deux clés étrangères dans le tableau d'examen des produits, la balise de Key-Many-to One est utilisée.
Étant donné que Spring3.2 + HiberNate4.1 est utilisé, le moyen d'obtenir SessionFactory est limité à SessionFactory.getCurrentession (); mais les choses doivent être activées:
<bean id = "TransactionManager"> <propriété name = "sessionfactory" ref = "sessionfactory" /> </ank> <! - Caractéristiques de propagation de transaction -> <tx: conseil id = "txadvice" transac tion-manager = "TransactionManager"> <Tx: Attributs> <Tx: Method Name = "Add *" propagation = "OBLIQUE" /> <TX: Method Name = "Delete *" Propagation = "OBLIQUE" /> <TX: Méthode Nom = " modifier * "propagation =" requise "/> <! - HiberNate4 doit être configuré pour activer les transactions, sinon getCurrentSession () ne peut pas être obtenu -> <tx: méthode name =" * "propagation =" requis "en lecture ly = "true" /> </ tx: attributs> </ tx: conseils>
Ce qui précède est les problèmes qui se sont produits lorsque je l'ai configuré. Voici le fichier de configuration de ressort:
<? xml version = "1.0" Encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org / 2001 / XMLSCHEMA-INSTANCE "XMLNS: AOP =" http://www.springframework.org/schema/aop "xmlns: context =" http://www.springframework.org/schema/ context "xmlns: tx =" http://www.springframework.org/schema/tx "xsi: schemalocation =" http://www.springframework.org/schema/beans http://www.springframework.org / schema / beans / printemps-Beans- 3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http: //www.springframeword k.org/schema/ Context http://www.springframework.org/schema/context/spring-context-3.2.20 - TX-3.2.xsd "> <! - Activer le support d'annotation de ressort -> <contexte: annotation-config /> <bean id =" dataSource "destrement-méthod =" close "> <propriété name =" driverclassnam e " value = "com.mysql.jdbc.driver" /> <propriété name = "url" value = "jdbc: mysql: //127.0.0.1/bookstore? useunicode = true & caractèrescoding = utf-8" /> <propriété name = " nom d'utilisateur "value =" root "/> <propriété name =" password "value =" yangyang "/> </-bean> <! - Vous pouvez ajouter la configuration du cache secondaire -> <bean id =" sessionfactory " > <propriété name = "dataSource" ref = "dataSource" /> <propriété name = "mappingDirectoryLocations"> <sist> <value> classpath: config </value> </sist> </ propriété> <propriété name = "HiberNateProperties "> <props> <prop key =" hibernate.dialect "> org.hibernate.dialect.mysqldialect </ prop> <prop Key =" hibernate.show_sql "> true </ prop> <prop> key =" hibernate.show_sql " > true </ prop> <prop key = "hibernat e.hbm2ddl.auto"> update </ prop> <prop key = "hibernate.tremp.use_jdbc_metadata_defaults"> false </ prop> <prop key = "current_session_context_class"> thread </prop> </ props> </ propriété> </ bean> <! - Configuration Transaction Manager -> <bean id = "TransactionManager"> <propriété name = "sessionfactory" ref = "sessionfactory" /> </ bean> <! - Caractéristiques de propagation des transactions -> <tx: conseil id = "txadvice" transaction-manager = "transactionManager"> <tx: attributs> <tx: méthode name = "add *" propagation = "requise" /> <tx: méthode name = "delet e *" propagation = "requise" /> <tx: méthode name = "modifier *" propagation = "requise" /> <! - HiberNate4 doit être configuré pour activer les transactions, sinon getCurrentSession () ne peut pas être obtenu -> <tx: méthode name = "*" propagation = "requise" readly = "true" /> </ tx: attributs> </ tx: conseils> <! - ces classes et les méthodes utilisent des transactions -> <aop: config> <! - Seules les transactions sont implémentées pour la couche logique métier -> <aop: Pointcut id = "allManagerMethod" expression = "EXECUTION (* com.book.test. * . * (..)) "/> <aop: Advisor Pointcut-Ref =" AllManagerMethod "adv ice-ref =" txadvice "/> </ aop: config> <bean name =" basaseddao "/> <bean name = "OrderDao" /> </ Beans>
Une fois que tout est prêt, nous utilisons le test de servlet:
<Serplet> <Servlet-Name> Test </ serplet-name> <servlet-class> com.book.test.test </ servlet-Class> </ serplet> <servlet-mapping> <servlet-name> test </ servlet-name> <url-sattern> / index </ url-stern> </ servlet-mapping>
Protected void doGet (HttpServLetRequest Request, HttpServletResponse Response) lève ServletException, ioException {// TODO Méthode générée automatique OrderDao.Parce que nous n'utilisons pas de structures, nous devons trouver le haricot du printemps pour obtenir le haricot Dao.
Résultats en cours:
Table de commande chargée avec succès 1 Article Quantité de commande.
Après tout, c'est la première fois que je utilise Java pour développer de tels projets.