English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans cette section, nous allons créer une application Web de champ de recherche. Cette application comprend des données sous forme de tableau avec des champs de recherche. Dans cette intégration, nous utilisons Spring pour la partie backend, et Angular pour la partie frontend.
Une fois l'application déployée sur le serveur, un formulaire est généré contenant des données sous forme de tableau ainsi que quelques champs de recherche. Maintenant, nous pouvons rechercher des données existantes dans la table à partir de ces champs. Ici, nous utilisons deux champs de recherche-Nom et ID e-mail. Pour rechercher des données, vous devez fournir le mot-clé complet dans n'importe quel champ de recherche.
Utilisez n'importe quel IDE pour développer des projets Spring et Hibernate. Il peut s'agir de MyEclipse/Eclipse/Netbeans. Ici, nous utilisons Eclipse. Pour la base de données MySQL. Utilisez n'importe quel IDE pour développer un projet Angular. Il peut s'agir de Visual Studio Code/Sublime. Ici, nous utilisons Visual Studio Code. Serveur: Apache Tomcat/JBoss/Glassfish/Weblogic/Websphere.
Ici, nous utilisons les technologies suivantes:
Spring5 Hibernate5 Angle6 MYSQL
Créons une base de données searchfieldexample 。Du fait que Hibernate crée automatiquement les tables, il n'est pas nécessaire de les créer. Ici, nous devons fournir explicitement des données dans la table afin qu'elles puissent apparaître sur l'écran pour effectuer des opérations de recherche. Cependant, nous pouvons également importer des données à partir de fichiers existants dans les liens de téléchargement.
Voyons la structure de répertoire Spring que nous devons suivre:
Pour développer une application de champ de recherche, suivez les étapes suivantes: -
Ajouter les dépendances au fichier pom.xml.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.w3codebox</groupId> <artifactId>SearchFieldExample</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>SearchFieldExample Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <springframework.version>5.0.6.RELEASE</<springframework.version> <hibernate.version>5.2.16.Final</<hibernate.version> <mysql.connector.version>5.1.45</<mysql.connector.version> <c3po.version>0.9.5.2</c3po.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring<-webmvc</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring<-tx</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring<-orm</artifactId> <version>${springframework.version}</version> </dependency> <!-- Ajouter Jackson pour les convertisseurs JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson<-databind</artifactId> <version>2.9.5</version> </dependency> <!-- Hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate<-core</artifactId> <version>${hibernate.version}</version> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql<-connector-java</artifactId> <version>${mysql.connector.version}</version> </dependency> <!-- C3PO --> <dependency> <groupId>com.mchange/groupId> <artifactId>c3p0</artifactId> <version>${c3po.version</version> </dependency> <!-- Servlet+JSP+JSTL --> <dependency> <groupId>javax.servlet/groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet.jsp/groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>javax.servlet/groupId> <artifactId>jstl/artifactId> <version>1.2</version> </dependency> <!-- pour compenser java 9 ne pas inclure jaxb --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <!-- Dépendance JUnit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>SearchFieldExample</finalName> </build> </project>
Création de la classe de configuration
Nous exécutons une configuration basée sur les annotations,而非XML. Par conséquent, nous créons deux classes et y spécifions la configuration nécessaire.
DemoAppConfig.java
package com.w3codebox.searchfieldexample.config; import java.beans.PropertyVetoException; import java.util.Properties; import javax.sql.DataSource; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.orm.hibernate5.HibernateTransactionManager; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.mchange.v2.c3p0.ComboPooledDataSource; @Configuration @EnableWebMvc @EnableTransactionManagement @ComponentScan("com.w3codebox.searchfieldexample") @PropertySource(value = { "classpath:persistence-mysql.properties") @PropertySource(value = { "classpath:persistence-mysql.properties") @PropertySource(value = { "classpath:application.properties" }) public class DemoAppConfig implements WebMvcConfigurer { @Autowired private Environment env; @Bean public DataSource myDataSource() { // créer un pool de connexions ComboPooledDataSource myDataSource = new ComboPooledDataSource(); // définir le pilote jdbc try { myDataSource.setDriverClass("com.mysql.jdbc.Driver"); } catch (PropertyVetoException exc) { throw new RuntimeException(exc); } // set database connection props myDataSource.setJdbcUrl(env.getProperty("jdbc.url")); myDataSource.setUser(env.getProperty("jdbc.user")); myDataSource.setPassword(env.getProperty("jdbc.password")); // set connection pool props myDataSource.setInitialPoolSize(getIntProperty("connection.pool.initialPoolSize")); myDataSource.setMinPoolSize(getIntProperty("connection.pool.minPoolSize")); myDataSource.setMaxPoolSize(getIntProperty("connection.pool.maxPoolSize")); myDataSource.setMaxIdleTime(getIntProperty("connection.pool.maxIdleTime")); return myDataSource; } private Properties getHibernateProperties() { // set hibernate properties Properties props = new Properties(); props.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); props.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); props.setProperty("hibernate.format_sql", env.getProperty("hibernate.format_sql")); props.setProperty("hibernate.hbm}}2ddl.auto", env.getProperty("hibernate.hbm2ddl")); retourner props; } // Besoin d'une méthode d'aide // Lire la propriété d'environnement et la convertir en int private int getIntProperty(String propName) { String propVal = env.getProperty(propName); // Actuellement, convertissez en int int intPropVal = Integer.parseInt(propVal); retourner intPropVal; } @Bean public LocalSessionFactoryBean sessionFactory(){ // Créer des factorys de session LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); // Définir les propriétés sessionFactory.setDataSource(myDataSource()); sessionFactory.setPackagesToScan(env.getProperty("hibernate.packagesToScan")); sessionFactory.setHibernateProperties(getHibernateProperties()); retourner sessionFactory; } @Bean @Autowired public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { // Configurer la gestionnaire de transactions basée sur la factory de session HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(sessionFactory); return txManager; } }
MySpringMvcDispatcherServletInitializer.java
package com.w3codebox.searchfieldexample.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { // TOdo Auto-généré par stub de méthode return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { DemoAppConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/}; } }
Créer la classe d'entité
Ici, nous allons créer une Entity/Classe POJO (ancien objet Java ordinaire).
User.java
package com.w3codebox.searchfieldexample.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="user") public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="userId") private int userId; @Column(name="name") private String name; @Column(name="email_id" ) public String emailId; @Column(name="qualification") public String qualification; public User() {} public User(int userId, String name, String emailId, String qualification) { super(); this.userId = userId; this.name = name; this.emailId = emailId; this.qualification = qualification; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmailId() { return emailId; } public void setEmailId(String emailId) { this.emailId = emailId; } public String getQualification() { return qualification; } public void setQualification(String qualification) { this.qualification = qualification; } @Override public String toString() { return "User [userId=" + userId + ", name=" + name + ", emailId=" + emailId + ", qualification=" + qualification + "]"; } }
Création de l'interface DAO
Ici, nous créons une interface DAO pour exécuter des opérations liées à la base de données.
UserDAO.java
package com.w3codebox.searchfieldexample.DAO.interfaces; import java.util.List; import com.w3codebox.searchfieldexample.entity.User; public interface UserDAO {}} public int SaveUser(User user); public List<User> getFilteredData(User user); }
Créer la classe d'implémentation de l'interface DAO
UserDAOImpl.java
package com.w3codebox.searchfieldexample.DAO.implementation; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.query.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.w3codebox.searchfieldexample.DAO.interfaces.UserDAO; import com.w3codebox.searchfieldexample.entity.User; @Repository("userDAO") public class UserDAOImpl implements UserDAO { @Autowired SessionFactory sessionFactory; public int SaveUser(User user) { Session session = null; try { session = sessionFactory.getCurrentSession(); int userId = (Integer) session.save(user); return userId; } catch(Exception exception) { System.out.println("Exception while saving data into DB "); + exception); return 0; } finally { session.flush(); } } public List<User> getFilteredData(User user) { Session session = null; try { session = sessionFactory.getCurrentSession(); ArrayList<Object> list_field = new ArrayList<Object>(); ArrayList<Object> list_value = new ArrayList<Object>(); if (user.getName() == null || user.getName() == "") {} else { list_field.add("name"); list_value.add(user.getName()); } if (user.getEmailId() == null || user.getEmailId() == "") {} else { list_field.add("emailId"); list_value.add(user.getEmailId()); } switch (list_field.size()) { case 0: Query<User> query0 = session.createQuery("from User"); return query0.list(); case 1: Query query1 = session.createQuery("from User where ") + list_field.get(0) +" = :value0 "); query1.setParameter("value0", list_value.get(0)); return query1.list(); case 2: Query query2 = session.createQuery("from User where ") + list_field.get(0) +" = :value0 et " + list_field.get(1) + " = :value1); query2.setParameter("value0", list_value.get(0)); query2.setParameter("value",1", list_value.get(1)); return query2.list(); } return null; } catch(Exception exception) { System.out.println("Erreur lors de l'obtention des données filtrées :: "); + exception.getMessage()); return null; } finally { session.flush(); } } }
Créer l'interface de couche de service
Ici, nous allons créer une interface de couche de service qui agit comme un pont entre les classes DAO et Entity.
UserService.java
package com.w3codebox.searchfieldexample.service.interfaces; import java.util.List; import com.w3codebox.searchfieldexample.entity.User; public interface UserService { public int SaveUser(User user); public List<User> getFilteredData(User user); }
Créer la classe d'implémentation de couche de service
UserServiceImpl.java
package com.w3codebox.searchfieldexample.service.implementation; import java.util.List; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.w3codebox.searchfieldexample.DAO.interfaces.UserDAO; import com.w3codebox.searchfieldexample.entity.User; import com.w3codebox.searchfieldexample.service.interfaces.UserService; @Service("userService") public class UserServiceImpl implements UserService { @Autowired UserDAO userDAO; @Transactional public int SaveUser(User user) { return userDAO.SaveUser(user) ; } @Transactional public List<User> getFilteredData(User user) { return userDAO.getFilteredData(user); } }
Créer la classe contrôleur
UserController.java
package com.w3codebox.searchfieldexample.restcontroller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.w3codebox.searchfieldexample.entity.User; import com.w3codebox.searchfieldexample.service.interfaces.UserService; @RestController @RequestMapping("/api") @CrossOrigin(origins = "http://localhost:4200", allowedHeaders = "*"exposedHeaders = "Authorization" public class UserController {}} @Autowired private UserService userService; @PostMapping("/saveUser") public int saveAdminDetail(@RequestBody User user) { return userService.SaveUser(user); } @PostMapping("/filterData") public List<User> getFilteredData(@RequestBody User user) { return userService.getFilteredData(user); } }
Création de fichiers de propriétés
Ici, nous sommes en train de projet src/main/resources Création interne de fichiers de propriétés.
persistence-mysql.properties
## Propriétés de connexion JDBC # jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/searchfieldexample?useSSL=false jdbc.user=root jdbc.password= ## Propriétés du pool de connexions # connection.pool.initialPoolSize=5 connection.pool.minPoolSize=5 connection.pool.maxPoolSize=20 connection.pool.maxIdleTime=3000 ## Propriétés Hibernate # <!-- hibernate.dialect=org.hibernate.dialect.MySQLDialect --> hibernate.dialect=org.hibernate.dialect.MySQL5Dialect hibernate.show_sql=true hibernate.format_sql=true hibernate.hbm2ddl=update hibernate.packagesToScan=com.w3codebox.searchfieldexample.entity
让我们看看Angular的目录结构:
创建一个Angular项目
使用以下命令创建一个Angular项目:
ng new SearchFieldExample
此处, SearchFieldExample 是项目的名称。
使用以下命令在项目中安装引导程序。
npm install [email protected] --save
现在,包括以下内容样式文件中的代码。
@import "~bootstrap/dist/css/bootstrap.css";
生成组件
在Visual Studio中打开项目,然后使用以下命令生成Angular组件:
ng g c ShowData
我们还通过使用以下命令: -
ng gs services/User
编辑app.module.ts文件 导入HttpModule -在这里,我们为服务器请求导入 HttpModule ,并在imports数组中指定它。 注册服务类-在这里,我们在提供者数组中提到了服务类。 导入ReactiveFormsModule -在这里,我们将导入 ReactiveFormsModule 用于反应形式,并在imports数组中指定它。
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; // import ReactiveFormsModule for reactive form import { ReactiveFormsModule } from '@angular/forms'; // import Http module import { HttpModule } from '@angular/http'; import { AppComponent } from './app.component'; import { ShowDataComponent } from './afficher-data/afficher-data.component'; import { UserService } from './services/user.service'; @NgModule({ declarations: [ AppComponent, ShowDataComponent ], imports: [ BrowserModule, ReactiveFormsModule, HttpModule ], providers: [UserService], bootstrap: [AppComponent] }) export class AppModule { }
éditer app.component.html Fichier
<app-afficher-data></app-afficher-data>
Créer User.ts Classe
Utilisons la commande suivante pour créer une classe: -
ng g classe class/User
Maintenant, dans User Spécifiez les champs obligatoires dans la classe.
export class User { name: string; emailId: string; qualification: string; }
L'objectif de cette classe est de mapper les champs spécifiés avec les champs des classes d'entités Spring.
éditer user.service.ts Fichier
import { Injectable } from ''@angular/core'; import { User } from ''../classes/user'; import { Http } from ''@angular/http'; @Injectable({ providedIn: 'root' }) export class UserService { private baseUrl = "http://localhost:8080/SearchFieldExample/api/"; constructor(private http: Http) { } getData(user: User) { let url = this.baseUrl + "filterData"; return this.http.post(url, user); } }
éditer afficher-data.component.ts Fichier
import { Component, OnInit } from ''@angular/core'; import { User } from ''../classes/user'; import { UserService } from ''../services/user.service'; import { FormGroup, FormControl } from ''@angular/forms'; @Component({ selector: ''app-afficher-data', templateUrl: ''./afficher-data.component.html',}} styleUrls: ['./afficher-data.component.css] }) export class ShowDataComponent implements OnInit { private user = new User(); private data; constructor(private userService : UserService) { } ngOnInit() { this.getData(this.user); } form = new FormGroup({ name : new FormControl(), email : new FormControl() }); getData(user) { this.userService.getData(user).subscribe( response => { this.data = response.json(); }, error => { console.log("erreur en obtenant les détails de l'utilisateur"); } ); } searchForm(searchInfo) { this.user.name = this.Name.value; this.user.emailId = this.Email.value; this.getData(this.user); } get Name() { return this.form.get('name'); } get Email() { return this.form.get('email'); } }
éditer afficher-data.component.html Fichier
<br><br> <div class="row"> <div class="col-md-offset-4 col-md-4"> <form [formGroup]="form" #searchInfo (ngSubmit)="searchForm(searchInfo)"><table> <tr> <td> <input type="text" formControlName="name" placeholder="Entrez le nom" class="form-control"> </td> <td> <input type="text" formControlName="email" placeholder="Entrez EmailId" class="form-control"> </td> <td><button class="btn btn-primary hidden-xs">Recherche</button></td> </tr> </table> </form> </div> </div> <br><br> <div class="row"> <div class="col-md-offset-4 col-md-4"> <table class="table table-tableau boudé-tableau stripé-responsive"> <tr> <th>Nom</th> <th>Email</th> <th>Qualification</th> </tr> <ng-container *ngFor="let item of data"> <tr> <td>{{item.name}}</td> <td>{{item.emailId}}</td> <td>{{item.qualification}}</td> </tr> </ng-container> </table> </div> </div>
Après la fin, entrez l'URL http: sur le Web //localhost: 4200/Navigateur. Une page suivante apparaît:
Maintenant, nous pouvons rechercher des données en fournissant un mot-clé spécifique dans le champ de recherche.
Recherche par nom:
Recherche par ID d'e-mail: