100% found this document useful (5 votes)
43 views55 pages

Full-Stack Web Development With Jakarta EE and Vue - JS: Your One-Stop Guide To Building Modern Full-Stack Applications With Jakarta EE and Vue - Js Daniel Andres Pelaez Lopez 2024 Scribd Download

Jakarta

Uploaded by

goneyarenzha
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
43 views55 pages

Full-Stack Web Development With Jakarta EE and Vue - JS: Your One-Stop Guide To Building Modern Full-Stack Applications With Jakarta EE and Vue - Js Daniel Andres Pelaez Lopez 2024 Scribd Download

Jakarta

Uploaded by

goneyarenzha
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 55

Download the Full Version of textbook for Fast Typing at textbookfull.

com

Full-Stack Web Development with Jakarta EE and


Vue.js: Your One-Stop Guide to Building Modern
Full-Stack Applications with Jakarta EE and Vue.js
Daniel Andres Pelaez Lopez
https://textbookfull.com/product/full-stack-web-development-
with-jakarta-ee-and-vue-js-your-one-stop-guide-to-building-
modern-full-stack-applications-with-jakarta-ee-and-vue-js-
daniel-andres-pelaez-lopez/

OR CLICK BUTTON

DOWNLOAD NOW

Download More textbook Instantly Today - Get Yours Now at textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Full Stack Web Development with Jakarta EE and Vue js Your


One Stop Guide to Building Modern Full Stack Applications
with Jakarta EE and Vue js 1st Edition Daniel Andres
Pelaez Lopez
https://textbookfull.com/product/full-stack-web-development-with-
jakarta-ee-and-vue-js-your-one-stop-guide-to-building-modern-full-
stack-applications-with-jakarta-ee-and-vue-js-1st-edition-daniel-
andres-pelaez-lopez/
textboxfull.com

Full-Stack Web Development with Go: Build your web


applications quickly using the Go programming language and
Vue.js 1st Edition Nanik Tolaram
https://textbookfull.com/product/full-stack-web-development-with-go-
build-your-web-applications-quickly-using-the-go-programming-language-
and-vue-js-1st-edition-nanik-tolaram/
textboxfull.com

Full stack development with JHipster build full stack


applications and microservices with Spring Boot and modern
JavaScript frameworks Second Edition Sendil Kumar N.
https://textbookfull.com/product/full-stack-development-with-jhipster-
build-full-stack-applications-and-microservices-with-spring-boot-and-
modern-javascript-frameworks-second-edition-sendil-kumar-n/
textboxfull.com

Pro MERN Stack: Full Stack Web App Development with Mongo,
Express, React, and Node Vasan Subramanian

https://textbookfull.com/product/pro-mern-stack-full-stack-web-app-
development-with-mongo-express-react-and-node-vasan-subramanian/

textboxfull.com
Pro MERN Stack: Full Stack Web App Development with Mongo,
Express, React, and Node 2nd Edition Vasan Subramanian

https://textbookfull.com/product/pro-mern-stack-full-stack-web-app-
development-with-mongo-express-react-and-node-2nd-edition-vasan-
subramanian/
textboxfull.com

Pro MERN Stack: Full Stack Web App Development with Mongo,
Express, React, and Node 1st Edition Vasan Subramanian
(Auth.)
https://textbookfull.com/product/pro-mern-stack-full-stack-web-app-
development-with-mongo-express-react-and-node-1st-edition-vasan-
subramanian-auth/
textboxfull.com

Mastering Full Stack React Web Development 1st Edition


Tomasz Dyl

https://textbookfull.com/product/mastering-full-stack-react-web-
development-1st-edition-tomasz-dyl/

textboxfull.com

Modern Full-Stack Development: Using TypeScript, React,


Node.js, Webpack, and Docker Zammetti

https://textbookfull.com/product/modern-full-stack-development-using-
typescript-react-node-js-webpack-and-docker-zammetti/

textboxfull.com

Building Native Web Components: Front-End Development with


Polymer and Vue.js Carlos Rojas

https://textbookfull.com/product/building-native-web-components-front-
end-development-with-polymer-and-vue-js-carlos-rojas/

textboxfull.com
Full-Stack Web
Development
with Jakarta EE
and Vue.js
Your One-Stop Guide to Building Modern
Full-Stack Applications with Jakarta EE
and Vue.js

Daniel Andres Pelaez Lopez
Full-Stack Web
Development with Jakarta
EE and Vue.js
Your One-Stop Guide to Building
Modern Full-Stack Applications
with Jakarta EE and Vue.js

Daniel Andres Pelaez Lopez


Full-Stack Web Development with Jakarta EE and Vue.js
Daniel Andres Pelaez Lopez
Medellin, Colombia

ISBN-13 (pbk): 978-1-4842-6341-9 ISBN-13 (electronic): 978-1-4842-6342-6


https://doi.org/10.1007/978-1-4842-6342-6

Copyright © 2021 by Daniel Andres Pelaez Lopez


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Louise Corrigan
Development Editor: James Markham
Coordinating Editor: Nancy Chen
Cover designed by eStudioCalamar
Cover image designed by Freepik (www.freepik.com)
Distributed to the book trade worldwide by Springer Science+Business Media New York, 1 New York Plaza,
New York, NY 10004. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail [email protected], or
visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is
Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware
corporation.
For information on translations, please e-mail [email protected]; for reprint,
paperback, or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book’s product page, located at www.apress.com/9781484263419. For more
detailed information, please visit http://www.apress.com/source-code.
Printed on acid-free paper
To my family, who gave me the push to move forward
when I needed it the most.
Table of Contents
About the Author�����������������������������������������������������������������������������������������������������xv

About the Technical Reviewer�������������������������������������������������������������������������������xvii


Acknowledgments��������������������������������������������������������������������������������������������������xix

Introduction������������������������������������������������������������������������������������������������������������xxi

Chapter 1: Full-Stack Web Development with Jakarta EE���������������������������������������� 1


Technical Requirements���������������������������������������������������������������������������������������������������������������� 1
Using Jakarta Enterprise Edition as a Back-End Layer����������������������������������������������������������������� 2
Java Enterprise Edition������������������������������������������������������������������������������������������������������������ 2
Jakarta Enterprise Edition������������������������������������������������������������������������������������������������������� 3
Using Eclipse GlassFish Application Server: An Open Source Jakarta EE Reference
Implementation����������������������������������������������������������������������������������������������������������������������� 4
Using Apache Netbeans IDE���������������������������������������������������������������������������������������������������� 4
Jakarta EE Project Structure������������������������������������������������������������������������������������������������� 11
Running the Jakarta EE Project��������������������������������������������������������������������������������������������� 21
Summary������������������������������������������������������������������������������������������������������������������������������������ 24
Extended Knowledge������������������������������������������������������������������������������������������������������������������ 24

Chapter 2: Vue.js as a Front-End Layer������������������������������������������������������������������ 25


Technical Requirements�������������������������������������������������������������������������������������������������������������� 25
Vue.js������������������������������������������������������������������������������������������������������������������������������������� 26
Understanding NodeJS and NPM������������������������������������������������������������������������������������������ 26
Hello World Project with a Vue.js CLI������������������������������������������������������������������������������������� 28
Using Visual Studio Code and Vue.js�������������������������������������������������������������������������������������� 36
Vue.js Project Structure��������������������������������������������������������������������������������������������������������� 39
Running a Vue.js Project�������������������������������������������������������������������������������������������������������� 44
Debugging a Vue.js Application��������������������������������������������������������������������������������������������� 48

v
Table of Contents

Summary������������������������������������������������������������������������������������������������������������������������������������ 62
Extended Knowledge������������������������������������������������������������������������������������������������������������������ 62

Chapter 3: Getting Started with Vue.Js������������������������������������������������������������������ 63


Technical Requirements�������������������������������������������������������������������������������������������������������������� 64
Creating Our Business Entities Using TypeScript������������������������������������������������������������������������ 64
Defining the Role.ts Enum����������������������������������������������������������������������������������������������������� 65
Defining the User.ts Entity����������������������������������������������������������������������������������������������������� 65
Defining the State.ts Entity���������������������������������������������������������������������������������������������������� 67
Creating the Storage Using Vuex������������������������������������������������������������������������������������������������� 67
Defining the Vue.js Components������������������������������������������������������������������������������������������������� 70
Defining the Navigation Structure����������������������������������������������������������������������������������������� 71
UserList.vue: Using Declarative Rendering, Methods, and Lifecycle Events�������������������������� 77
UserForm.vue: Using Props, Handling User Input, Conditional Rendering, and
Emitted Events���������������������������������������������������������������������������������������������������������������������������� 82
Defining the UserForm.ts TypeScript Class��������������������������������������������������������������������������� 84
UserNew.vue: Reusing the UserForm Component and Router Redirection��������������������������� 92
UserUpdate.vue: Reusing UserForm Component with Props and Router Redirection����������� 95
The Final User Management Application���������������������������������������������������������������������������������� 100
Summary���������������������������������������������������������������������������������������������������������������������������������� 109
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 110

Chapter 4: Requirement Analysis for Your Full-Stack Web Application��������������� 111


Daniel’s Delivery����������������������������������������������������������������������������������������������������������������������� 112
Technical Details about Daniel’s Delivery Web Page����������������������������������������������������������� 112
Analyzing the Current Team and Costs�������������������������������������������������������������������������������� 117
A Proposal for the New Daniel’s Delivery���������������������������������������������������������������������������������� 121
Possible Causes of the Current Situation���������������������������������������������������������������������������� 122
Defining a New Architecture������������������������������������������������������������������������������������������������ 123
An Agile Approach for the New Daniel’s Delivery���������������������������������������������������������������������� 127
Defining High-Level Features: Epics������������������������������������������������������������������������������������ 128
Schedule the Plan���������������������������������������������������������������������������������������������������������������� 128

vi
Table of Contents

Writing Stories in an Iterative and Incremental Way����������������������������������������������������������������� 130


Food Services Management Epic���������������������������������������������������������������������������������������� 130
Delivery Flow Epic��������������������������������������������������������������������������������������������������������������� 131
Finding Quality Attributes���������������������������������������������������������������������������������������������������������� 134
Security Epic������������������������������������������������������������������������������������������������������������������������ 135
Infrastructure Epic��������������������������������������������������������������������������������������������������������������� 137
A Traversal Quality Attribute: Maintainability����������������������������������������������������������������������� 138
Summary���������������������������������������������������������������������������������������������������������������������������������� 141
Questions���������������������������������������������������������������������������������������������������������������������������������� 142

Chapter 5: Modeling Your Entities and Data with JPA������������������������������������������ 143


Technical Requirements������������������������������������������������������������������������������������������������������������ 144
Defining Your Entity-Relationship Model����������������������������������������������������������������������������������� 144
Extracting Business Entities from User Stories������������������������������������������������������������������� 144
Choosing Entities and Properties���������������������������������������������������������������������������������������� 147
Defining the Database Entity-Relationship Model��������������������������������������������������������������� 149
Building Your JPA Entities��������������������������������������������������������������������������������������������������������� 150
Alternatives to Create JPA Entities�������������������������������������������������������������������������������������� 150
Generating JPA Entities Using Netbeans����������������������������������������������������������������������������� 152
Understanding JPA Configuration��������������������������������������������������������������������������������������������� 162
FoodServiceData Entity������������������������������������������������������������������������������������������������������� 162
DeliveryData Entity�������������������������������������������������������������������������������������������������������������� 165
ItemData Entity�������������������������������������������������������������������������������������������������������������������� 168
Understanding the persistence.xml File Basics������������������������������������������������������������������� 170
Designing the Persistence Layer���������������������������������������������������������������������������������������������� 172
Understanding the Packages����������������������������������������������������������������������������������������������� 172
Defining our Business Entities��������������������������������������������������������������������������������������������� 174
User Entity��������������������������������������������������������������������������������������������������������������������������� 175
FoodService Entity��������������������������������������������������������������������������������������������������������������� 176
FoodProduct Entity�������������������������������������������������������������������������������������������������������������� 177
Item Entity��������������������������������������������������������������������������������������������������������������������������� 179
Delivery Entity��������������������������������������������������������������������������������������������������������������������� 180

vii
Table of Contents

Defining Aggregates������������������������������������������������������������������������������������������������������������ 181


Designing Repositories�������������������������������������������������������������������������������������������������������� 182
Implementing the Persistence Layer���������������������������������������������������������������������������������������� 184
Defining the Structure and Responsibilities������������������������������������������������������������������������ 185
FoodService Persistence Layer������������������������������������������������������������������������������������������� 186
Delivery Persistence Layer�������������������������������������������������������������������������������������������������� 191
FoodProduct Persistence Layer������������������������������������������������������������������������������������������� 195
Defining the Provider for the CDI����������������������������������������������������������������������������������������� 199
Testing the Persistence Layer��������������������������������������������������������������������������������������������������� 201
Unit Tests with JUnit and Mockito��������������������������������������������������������������������������������������� 201
Integration Tests Using Arquillian and Derby����������������������������������������������������������������������� 204
Summary���������������������������������������������������������������������������������������������������������������������������������� 211
Questions���������������������������������������������������������������������������������������������������������������������������������� 212

Chapter 6: Designing Your Front-­End UI with Vue.Js Components����������������������� 213


Technical Requirements������������������������������������������������������������������������������������������������������������ 214
Defining the Basic Wireframes for New Daniel’s Delivery�������������������������������������������������������� 214
Home Page Wireframe��������������������������������������������������������������������������������������������������������� 214
Delivery Flow����������������������������������������������������������������������������������������������������������������������� 215
Food Service Settings Flow������������������������������������������������������������������������������������������������� 220
Splitting Your Wireframes into Vue.js Pages and Components�������������������������������������������������� 224
Delivery Page���������������������������������������������������������������������������������������������������������������������� 225
Food Services Settings Page����������������������������������������������������������������������������������������������� 229
Other Pages������������������������������������������������������������������������������������������������������������������������� 234
Creating Reusable Components and Compose Them in a Hierarchy���������������������������������������� 235
Delivery.vue������������������������������������������������������������������������������������������������������������������������� 235
FoodProduct.vue������������������������������������������������������������������������������������������������������������������ 236
FoodService.vue������������������������������������������������������������������������������������������������������������������ 237
Login.vue����������������������������������������������������������������������������������������������������������������������������� 238
Routing through URL to Components and Sending the Data���������������������������������������������������� 239
Defining the Navigation Structure for the Delivery Flow����������������������������������������������������� 239
Creating a Router Structure: Navigating to New Pages������������������������������������������������������� 241

viii
Table of Contents

Delivery.vue: Using Router-View for Navigation������������������������������������������������������������������ 244


CartItems Component: A Vue.js Approach��������������������������������������������������������������������������������� 245
Component Logic����������������������������������������������������������������������������������������������������������������� 246
HTML Structure������������������������������������������������������������������������������������������������������������������� 249
Summary���������������������������������������������������������������������������������������������������������������������������������� 253
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 253

Chapter 7: Creating Your Back End with Jakarta EE�������������������������������������������� 255


Technical Requirements������������������������������������������������������������������������������������������������������������ 255
Designing and Implementing the Business Layer��������������������������������������������������������������������� 256
Packages for the Business Layer���������������������������������������������������������������������������������������� 256
FoodService Business Layer����������������������������������������������������������������������������������������������� 257
FoodProduct Business Layer����������������������������������������������������������������������������������������������� 260
Delivery Business Layer������������������������������������������������������������������������������������������������������ 264
Defining Your RESTful JAX-RS Services������������������������������������������������������������������������������������ 266
Designing the RESTful API��������������������������������������������������������������������������������������������������� 266
Using JAX-RS as a RESTful Framework������������������������������������������������������������������������������ 277
Putting It All Together Using Jakarta EE������������������������������������������������������������������������������������ 284
Contexts and Dependency Injection for Jakarta EE������������������������������������������������������������� 285
Joining Our New Daniel’s Delivery Website Layers������������������������������������������������������������� 286
Testing RESTful JAX-RS Services Using Arquillian�������������������������������������������������������������������� 292
Adding New Maven Dependencies for Arquillian����������������������������������������������������������������� 293
Creating an Integration Test for DeliveryController�������������������������������������������������������������� 294
Summary���������������������������������������������������������������������������������������������������������������������������������� 297
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 298

Chapter 8: Connecting Your UI with Your Back End���������������������������������������������� 299


Technical Requirements������������������������������������������������������������������������������������������������������������ 299
Preparing the Back End for Integration������������������������������������������������������������������������������������� 300
Adding New Endpoints to Our Back End������������������������������������������������������������������������������ 300
Allowing Cross Origin Resource Sharing Calls to Our Back End������������������������������������������ 312

ix
Table of Contents

Handling Environment Properties for Jakarta EE���������������������������������������������������������������� 313


Exception Handling in JAX-RS��������������������������������������������������������������������������������������������� 316
Integrating Vue.js and the Back End����������������������������������������������������������������������������������������� 318
Handling Environment Properties in Vue.js�������������������������������������������������������������������������� 318
Creating Axios Components to Handle API Calls������������������������������������������������������������������ 319
Using Axios Components from the Vue.js Components������������������������������������������������������� 325
Handling Exceptions from Our Back-End Services�������������������������������������������������������������� 330
Summary���������������������������������������������������������������������������������������������������������������������������������� 332
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 333

Chapter 9: Securing Your Full-Stack Application������������������������������������������������� 335


Technical Requirements������������������������������������������������������������������������������������������������������������ 335
Security Basics: Authentication and Authorization�������������������������������������������������������������������� 336
Authentication: Who Are You?���������������������������������������������������������������������������������������������� 336
Authorization: What Can You Do?����������������������������������������������������������������������������������������� 339
Understanding OpenID Connect Protocol���������������������������������������������������������������������������������� 342
The Authorization Code Flow in the New Daniel’s Delivery Website������������������������������������ 342
Using the Access and Refresh Tokens��������������������������������������������������������������������������������� 347
JSON Web Tokens (JWT)������������������������������������������������������������������������������������������������������ 352
Keycloak: An Open Source Identity Provider����������������������������������������������������������������������������� 354
Installing Keycloak�������������������������������������������������������������������������������������������������������������� 355
Creating a Realm����������������������������������������������������������������������������������������������������������������� 356
Creating a New User������������������������������������������������������������������������������������������������������������ 359
Configuring OpenID Connect����������������������������������������������������������������������������������������������� 364
Summary���������������������������������������������������������������������������������������������������������������������������������� 366
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 367

Chapter 10: Authentication and Authorization����������������������������������������������������� 369


Technical Requirements������������������������������������������������������������������������������������������������������������ 369
Using Keycloak as the Source of Users������������������������������������������������������������������������������������ 370
Keycloak Client�������������������������������������������������������������������������������������������������������������������� 371
New UserRepository Implementation���������������������������������������������������������������������������������� 372

x
Table of Contents

Authorization in JAX-RS������������������������������������������������������������������������������������������������������������ 378


Validating the Token������������������������������������������������������������������������������������������������������������ 378
Requesting the Token���������������������������������������������������������������������������������������������������������� 385
Using CORS to Add Security������������������������������������������������������������������������������������������������ 389
Authentication in Vue.js������������������������������������������������������������������������������������������������������������� 390
Requesting Authentication and Tokens�������������������������������������������������������������������������������� 392
Using Vuex to Keep the Token���������������������������������������������������������������������������������������������� 394
Login: Putting the Whole Process Together������������������������������������������������������������������������� 397
Summary���������������������������������������������������������������������������������������������������������������������������������� 400
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 400

Chapter 11: Design Patterns and Best Practices�������������������������������������������������� 401


Technical Requirements������������������������������������������������������������������������������������������������������������ 402
Decoupling the View and Database from Your Business Rules������������������������������������������������� 402
Main and Abstraction����������������������������������������������������������������������������������������������������������� 402
Using the Dependency Inversion Principle to Decouple Main and Abstraction������������������� 407
Putting Together the Main and the Abstraction Using the CDI Container����������������������������� 411
Stateless Servers as a Priority�������������������������������������������������������������������������������������������������� 415
Why Stateful Servers Are Not Cool to Scale������������������������������������������������������������������������ 416
Defining What Kind of Security You Want���������������������������������������������������������������������������������� 425
Basic Form vs. OpenID Connect Protocol���������������������������������������������������������������������������� 426
External vs. Internal Security Delegation���������������������������������������������������������������������������� 429
Single Page Application vs. Back-End Pages���������������������������������������������������������������������������� 433
Some Time Ago... JSP���������������������������������������������������������������������������������������������������������� 433
Browsers Improved and SPA Was Born������������������������������������������������������������������������������� 436
Micro Front Ends: Mixing the Two Worlds���������������������������������������������������������������������������� 437
Choosing the Right Database���������������������������������������������������������������������������������������������������� 439
Relational Databases����������������������������������������������������������������������������������������������������������� 439
Non-Relational databases��������������������������������������������������������������������������������������������������� 441
Aligning Your Requirements with Your Database����������������������������������������������������������������� 442

xi
Table of Contents

Defining Your RESTful API��������������������������������������������������������������������������������������������������������� 448


Resources and Not Operations�������������������������������������������������������������������������������������������� 448
Summary���������������������������������������������������������������������������������������������������������������������������������� 458
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 459

Chapter 12: Cloud Architecture Implementation�������������������������������������������������� 461


Technical Requirements������������������������������������������������������������������������������������������������������������ 462
Defining the AWS Architecture Using CloudFormation�������������������������������������������������������������� 462
Jakarta EE Using ECS, RDS, and Load Balancer������������������������������������������������������������������ 463
VueJS Using S3 and CloudFront������������������������������������������������������������������������������������������ 493
SSO Using Cognito��������������������������������������������������������������������������������������������������������������� 500
Summary���������������������������������������������������������������������������������������������������������������������������������� 508
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 508

Chapter 13: Continuous Integration and Deployment������������������������������������������� 509


Technical Requirements������������������������������������������������������������������������������������������������������������ 509
What Are Continuous Integration and Deployment?����������������������������������������������������������������� 509
CodePipeline for Jakarta EE������������������������������������������������������������������������������������������������������ 510
Source S3���������������������������������������������������������������������������������������������������������������������������� 511
CodeBuild in Develop and Production Environment������������������������������������������������������������ 513
CodeBuild in Develop and Production Environment������������������������������������������������������������ 531
Active Approval�������������������������������������������������������������������������������������������������������������������� 533
Configure the Pipeline through the AWS Console���������������������������������������������������������������� 535
CodePipeline for VueJS������������������������������������������������������������������������������������������������������������� 541
Source S3���������������������������������������������������������������������������������������������������������������������������� 542
CodeBuild Dev and Prod������������������������������������������������������������������������������������������������������ 543
CodeDeploy Dev and Prod��������������������������������������������������������������������������������������������������� 548
Active Approval�������������������������������������������������������������������������������������������������������������������� 550
Configure the Pipeline through the AWS Console���������������������������������������������������������������� 550
AWS Daniel’s Delivery Website������������������������������������������������������������������������������������������������� 556
Summary���������������������������������������������������������������������������������������������������������������������������������� 559
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 560

xii
Table of Contents

Chapter 14: Testing and Monitoring��������������������������������������������������������������������� 561


Technical Requirements������������������������������������������������������������������������������������������������������������ 561
AWS Monitoring������������������������������������������������������������������������������������������������������������������������ 561
RDS MySQL�������������������������������������������������������������������������������������������������������������������������� 562
ECS Fargate Cluster������������������������������������������������������������������������������������������������������������� 571
GlassFish Console Logs������������������������������������������������������������������������������������������������������� 573
JMeter Load Testing������������������������������������������������������������������������������������������������������������������ 576
What Is Load Testing?���������������������������������������������������������������������������������������������������������� 576
Using JMeter����������������������������������������������������������������������������������������������������������������������� 577
Summary���������������������������������������������������������������������������������������������������������������������������������� 584
Extended Knowledge���������������������������������������������������������������������������������������������������������������� 584

Index��������������������������������������������������������������������������������������������������������������������� 585

xiii
About the Author
Daniel Andres Pelaez Lopez is a software craftsman with 12 years of experience
working in the software industry across a variety of domains including the finance,
aerospace, entertainment, and government sectors.
Passionate about IT architectures and software development at all levels, from
solution design to software implementation. He likes to solve difficult problems using
high technology applying not common solutions.
He worked as a contractor for Fortune 500 companies like Southwest Airlines and
Disney, solving hard problems using the Java ecosystem and participating on the overall
solution architecture. Currently working on Hourly, a fast growing startup, creating the
next generation of payroll systems.
He holds a Bachelor’s Degree on Computer Science from the University of Quindio,
Colombia, and a Master’s Degree on IT Architectures from the University of los Andes,
Colombia.
He has participated in all stages of development from software architecture to
implementation, from front-end to back-end, using Vue.js, React.js, Java, JavaEE, Spring,
AWS infrastructure, and more.
He blogs at Coders Tower: https://coderstower.com/ and can be found on Twitter
@danielpelaezlo.

xv
About the Technical Reviewer
Massimo Nardone has more than 23 years of experience in security, web/mobile
development, cloud, and IT architecture. His true IT passions are security and Android.
He has been programming and teaching how to program with Android, Perl, PHP, Java,
VB, Python, C/C++, and MySQL for more than 20 years.
He holds a Master of Science degree in Computing Science from the University of
Salerno, Italy. He has worked as a project manager, software engineer, research engineer,
chief security architect, information security manager, PCI/SCADA auditor, and senior
lead IT security/cloud/SCADA architect for many years.
Technical skills include security, Android, cloud, Java, MySQL, Drupal, Cobol, Perl,
web and mobile development, MongoDB, D3, Joomla, Couchbase, C/C++, WebGL,
Python, Pro Rails, Django CMS, Jekyll, Scratch, etc.
Massimo worked as a visiting lecturer and supervisor for exercises at the Networking
Laboratory of the Helsinki University of Technology (Aalto University). He holds four
international patents (PKI, SIP, SAML, and Proxy areas).
He currently works at the Chief Information Security Office (CISO) for Cargotec Oyj
and he is a member of ISACA Finland chapter board.
Massimo has reviewed more than 40 IT books for different publishing companies,
and he is the coauthor of Pro Android Games (Apress, 2015).

xvii
Acknowledgments
Thanks to the whole software community; without your efforts day to day, I wouldn’t
have enough knowledge to write this book.

xix
Introduction
Full-stack development has been a trending term the last years, but what does full-stack
development really mean? I will try to answer that question in the following paragraphs
and link it with this book.
When I started my career as a software engineer, 12 years ago, the technologies
I used were Java EE for the back end, using MVC with JSF, HTML, jQuery, over a server
like Jboss or Weblogic. Everything was server side.
In those times, as a back-end developer, I needed to code on the front-end side also.
I learned JavaScript and CSS to render a page that consumes the back-end logic.
Today, things have changed. We have a lot of back-end frameworks, like Spring,
Jakarta EE, Micronaut, Quarks, only to mention a few. And on the front-end side, we also
have Vue.js, Reac.js, Angular.js, and so on.
The distinction over front end and back end is greater today than before. The front-­
end frameworks are not server side anymore; they are client side.
This moved the industry to “create” new specialized roles: we have front-end
developers and back-end developers. As the frameworks in both sides get bigger and
more complex each year, mastering both sides at the same time is hard.
However, companies become complex also, having a lot of software components, in
different languages, using different frameworks. Companies started to have problems
finding talent and retain it, as they will need to hire a lot of developers with different
roles to pull off even one project. Companies started to search for workers with more
complex roles: engineers with abilities to master both sides of the coin, front-end and
back-end.
This conflict between software engineers’ abilities and companies’ interests opens a
new concept: Full-Stack Engineer.
A Full-Stack Engineer is someone who has “mastered” front-end and back-end
sides, or at least, that’s what people think. This new “role” allows companies to hire lees
engineers, and the engineers are able to apply their knowledge more broadly.
Full-Stack Engineer is a pretty interesting concept because it looks familiar. If the
previous definition was true, 10 years ago I was a Full-Stack Engineer, and maybe all of
my peers were also Full-Stack Engineer.

xxi
Introduction

I cannot say if the previous definition of Full-Stack Engineer is true or not, but what
I can say is this: don’t get locked in by one technology or one language or framework; be
open to learning both sides of the coin. Maybe you won’t master both, but, in the end
that’s what a software engineer does: build software to solve problems, and it doesn’t
matter which toolset you use.
I prefer to call myself a software engineer as this opens an entire world of
possibilities.
In this book, you will see the journey of a full-stack/software engineer: from learning
how to set up a development environment, to monitoring an application in production.
In Chapters 1 and Chapter 2, you will see how to set up your environment to use
Jakarta EE as a back-end framework and Vue.js as a front-end framework.
Chapter 3 shows you how to build a proof of concept, using only Vue.js, creating a
whole application for user management.
Chapter 4 shows you a fictional delivery company named Daniel’s Delivery, its
current state, and where they want to be. You will see an analysis of how to move from
Daniel’s Delivery today, to where they want to be, using high-level requirements, stories
and quality attributes, ending with a new software architecture. The next chapters will
solve Daniel’s Delivery problems, using Jakarta EE and Vue.js.
In Chapter 5, you start modeling the data for Daniel’s Delivery and create a back end
using JakartaEE to connect to a database, and finally, you will see how to create unit and
integration tests.
In Chapter 6, you will see the high-level requirements for Daniel’s Delivery, breaking
them over wireframes and mapping them to Vue.js components. Finally, you will see the
Vue.js implementation for the shopping cart.
In Chapter 7, you will see how to expose and modify your data using JAX-RS and
RESTful services in the Jakarta EE back-end, and of course, unit and integration tests.
In Chapter 8 you will connect Vue.js and JakartaEE using RESTful services through
the Axios framework and handling exceptions.
In Chapter 9, you will learn the basics of securing a full-stack application, starting
from authentication and authorization, and ending with a configuration using Keycloak
for OAuth2 and OIDC protocols.
In Chapter 10, you will use the concepts of Chapter 9 to secure Daniel’s Delivery
application, from the front-end to the back-end, using Keycloak.
In Chapter 11, you will learn some of the good practices of building full-stack
applications, from decoupling, security, and databases, to RESTful design.

xxii
Introduction

In Chapter 12, you will design and implement the cloud architecture for Daniel’s
Delivery using AWS as an infrastructure provider.
In Chapter 13, you will define a continuous integration and deployment strategy for
the front-end and back-end sides.
And finally, in Chapter 14 you will learn how to monitor your AWS infrastructure to
detect errors or improvements.

xxiii
CHAPTER 1

Full-Stack Web
Development with
Jakarta EE
In this chapter, we are going to cover the basics of full-stack development with Jakarta
EE, talking about general concepts and the environment’s installation, so that you will
understand where and how to start your full-stack project in a hands-on manner.
The following topics will be covered in this chapter:

• Understanding Java EE and Jakarta EE basics

• Using GlassFish application server as an example

• Environment installation

• Understanding Jakarta EE project structure

T echnical Requirements
• Java 1.8

• Netbeans 11

• Eclipse GlassFish

• Java Enterprise Edition

• Jakarta Enterprise Edition

We are not going to cover Java 1.8 installation in this chapter.


You can check the whole project and code at https://github.com/Apress/full-
stack-web-development-with-jakartaee-and-vue.js/tree/master/CH1/.
1
© Daniel Andres Pelaez Lopez 2021
D. A. P. Lopez, Full-Stack Web Development with Jakarta EE and Vue.js,
https://doi.org/10.1007/978-1-4842-6342-6_1
Chapter 1 Full-Stack Web Development with Jakarta EE

 sing Jakarta Enterprise Edition as a Back-End


U
Layer
The first design we will create in our heads for a software project splits the
responsibilities into at least two segments: front-end and back-end.
There are a lot of back-end technologies in different languages and with different
features. In this book, we are going to cover Jakarta Enterprise Edition as our back-end
framework.

Java Enterprise Edition


Java Enterprise Edition is an enterprise standard created by Sun Microsystems (later
bought by Oracle Inc.) that uses different specifications to enrich web applications, from
database access to RESTful services. There you will find:

• Well-known standards and specifications like JAX-RS or JPA. A


programming models based on layers.

• Highly featured application servers supporting those standards.

• A well-constituted community of developers and companies using


the specification.

Note We are not going to cover the details of how the specification is created
and validated in this book. However, I suggest you read more about this interesting
process through different people and organizations here: https://javaee.
github.io/javaee-spec/.

Java EE applications have been in the market for a long time, from J2EE 1.2
(December 12, 1999) until today, with the current version being Java EE 8 (August 31,
2017). You can have a look at the list of version releases at https://en.wikipedia.org/
wiki/Java_Platform,_Enterprise_Edition.

Note For the purposes of this book, we assume you have a basic understanding
of Java EE applications.

2
Chapter 1 Full-Stack Web Development with Jakarta EE

Today, a lot of companies have their systems over the Java EE platform due to their
robust application servers and pretty good support. However, its evolution has been slow
and other frameworks in the Java ecosystem have shown up, like Spring or Play.
For its own reasons, Oracle Inc. made the choice to open source the Java EE
specification. You will learn more details about this in the next section.

Jakarta Enterprise Edition


Java EE has been a great tool to build enterprise applications using Java. However,
its evolution has been slower in comparison to other similar frameworks like Spring
Framework.
As it was slowly evolving, the leading software vendors (including Oracle Inc.), who
supports and implements Java EE, collaborated to move Java EE as open source and
named Jakarta EE, handled by the Eclipse Foundation, to boost up its development and
evolution.

Tip Java EE is the Oracle trademark; that’s why the name was changed. You
can find more information here: https://blogs.oracle.com/theaquarium/
the-road-to-jakarta-ee

In September 2019, Jakarta EE 8 was released by the Eclipse Foundation. In


addition, Eclipse released the Eclipse GlassFish 5.1 application server fully compatible
with Jakarta EE 8. This first release was not a huge technical one but was more about
negotiations, processes, and specifications related to the open sourcing strategy. Also,
the Eclipse Foundation released the first Java API specification, changing from the
javax.* namespace (Java EE) to jakarta.* namespace (Jakarta EE).
Jakarta EE won’t stop here, as new versions are being planned for release.

Note You can find more information here: ­https://www.infoworld.com/


article/3437783/eclipse-jakarta-ee-arrives.html

From here, we are going to use Jakarta EE as a specification reference.

3
Chapter 1 Full-Stack Web Development with Jakarta EE

 sing Eclipse GlassFish Application Server: An Open


U
Source Jakarta EE Reference Implementation
An application server is a comprehensive framework that allows us to create web
applications, giving us a set of tools and APIs to facilitate our job. Jakarta EE is a set of
specifications defined for application servers. So, in the market, at the time I wrote this
book, you find Eclipse GlassFish, OpenLiberty, and WildFly as servers supporting
Jakarta EE. You can find more information here: https://jakarta.ee/compatibility.

Note For Java EE, there are more servers like JBoss, Tomcat EE, WebLogic, and
so on.

The Eclipse GlassFish application server is a fully compliant server for Jakarta EE
standards and specifications. GlassFish is usually the first server that gets updated when
a new Jakarta EE specification arrives.
We are going to install GlassFish through Netbeans IDE in the following section.

Using Apache Netbeans IDE


Netbeans is the default IDE used when developing an application using Java EE. It
has the latest Java EE integrations and plugins and is up to date with the current
specification; however, it is not upgraded yet to use Jakarta EE by default.
Until Netbeans 8.2, Oracle Inc. handled and sponsored it. After that version, Oracle
released the IDE as an open source project to Apache. We have now the 11 incubating
version, which has enough features to work with Jakarta EE
For the purposes of this book, we are going to use Netbeans as a default IDE;
however, you can choose one at your discretion or just use your favorite one.

Note For more information on Netbeans and Java EE compatibility, you can
have a look at the questions posted at https://stackoverflow.com/
questions/45852077/netbeans-how-to-add-a-javaee-version
and https://stackoverflow.com/questions/46528103/upgrade-
netbeans-to-jee-8​.

4
Chapter 1 Full-Stack Web Development with Jakarta EE

Tip At the time of writing this book, Intellj IDE supports Java EE in the Ultimate
edition.

Netbeans 11.1 was released while we were writing this book; however, it is
in an unstable state. You can see more information here: https://netbeans.
apache.org/download/nb111/index.html.

Installing Apache Netbeans


We are going to use the Netbeans 11 version. For the setup and installation, the following
steps need to be performed:

1. Download the installer for your specific SO from https://


netbeans.apache.org/download/nb110/nb110.html.

2. Unzip the file. You will find the folders shown in Figure 1-1.

Figure 1-1. Netbeans installation folder

3. Move to the bin folder and run NetBeans using the right runner
for your OS. You will see the window in Figure 1-2.

5
Chapter 1 Full-Stack Web Development with Jakarta EE

Figure 1-2. Netbeans home

Now, let’s integrate the Eclipse GlassFish server into Netbeans.

1. In the right-top box, search for Server, and click on Server Tools.
You will see the window in Figure 1-3.

Figure 1-3. Window to aggregate a server

2. Now, click on Add Server, and then select GlassFish Server as


shown in Figure 1-4.

6
Chapter 1 Full-Stack Web Development with Jakarta EE

Figure 1-4. Selecting GlassFish Server configuration

3. Click on Download and Activate ... to start downloading the


support for Java EE and Web, as shown in Figure 1-5.

Figure 1-5. Downloading and activating the Java Web and EE support

4. After your download is completed and you have activated the


features, click on Next. This will bring up the screen in Figure 1-6.

7
Chapter 1 Full-Stack Web Development with Jakarta EE

Figure 1-6. Choosing the latest GlassFish Server version

5. Choose your GlassFish installation location. You can choose


between an already created GlassFish installation or download a
new one. In this case, I choose to download the latest GlassFish
Server. As I use the server locally, I let it remain as a Local
Domain, as shown in Figure 1-7.

8
Chapter 1 Full-Stack Web Development with Jakarta EE

Figure 1-7. Setting the location of the GlassFish installation

6. Now, set up the environment as local and use root as a user and
password for now. Use the default domain as domain1 that is
given by GlassFish, as shown in Figure 1-8.

Figure 1-8. Setting the domain, host, user name, and password to access GlassFish
9
Chapter 1 Full-Stack Web Development with Jakarta EE

7. When you click on Finish, you will see the GlassFish Server
summary in Figure 1-9.

Figure 1-9. GlassFish settings summary

Note that the GlassFish application server includes Java DB (Derby) by default, and
following the above process, this database is automatically registered on Netbeans, as
shown in Figure 1-10.

Figure 1-10. Derby database by default


10
Another Random Scribd Document
with Unrelated Content
Calamintha Alpina Lmk.
Lamium longiflorum Ten.
Armeria allioides Boiss.

Les broussailles qui bordent la vallée sont composées, comme


celles de la vallée elle-même, du Retama sphærocarpa, qui plus
haut est remplacé par le Calycotome spinosa.

TRAJET DE BATNA A EL-KANTARA.

La route de Batna à Ksour nous amène bientôt au point de la


vallée qui établit le partage des eaux du Tell et du Sahara (1090
métrés d’altitude). La route se rapproche de la rivière, dont le lit ne
présente que des flaques d’eau de distance en distance, et traverse
des plaines uniformes presque entièrement incultes, où de larges
espaces sont couverts de touffes de Retama sphærocarpa,
d’Artemisia Herba-alba et de Santolina squarrosa ; dans les champs
en friche, nous retrouvons en abondance le Delphinium Orientale.
Sur les montagnes qui limitent la vallée à l’est, les bois ne sont plus
représentés que par des broussailles parsemées de quelques arbres
peu élevés (Pistacia Atlantica et Juniperus Phœnicea). — Vers
Ksour, la vallée s’élargit, et, dans le voisinage du caravansérail (961
mètres d’altitude), quelques champs de céréales, qui nous offrent le
Hohenackeria polyodon et le Valerianella stephanodon, sont
fertilisés par des irrigations dérivées de la rivière, dans laquelle des
sources versent leurs eaux douces et abondantes. Dans des terrains
en friche auprès du caravansérail se rencontrent de nombreuses
touffes de Peganum Harmala et le Silybum eburneum. — La route,
après avoir traversé la plaine de Ksour, s’engage dans l’un des
profonds ravins des montagnes qui bornent cette plaine vers le sud ;
les pentes argileuses et pierreuses de ces ravins encaissés n’offrent
que quelques rares buissons ; vers leur partie inférieure, dans les
points arrosés par des dérivations de la rivière, quelques champs de
céréales présentent le plus beau développement, et annoncent la
fertilité du sol, qui, pour produire de riches moissons, n’a besoin que
d’irrigations pratiquées du reste avec une certaine habileté par les
indigènes. A Nza-Ben-Messaï ou les Tamarins (790 mètres
d’altitude), les eaux de la rivière sont encore assez abondantes, et
sur les berges se rencontrent de nombreux buissons de Lauriers-
Roses et de Tamarix Africana, en arabe Tarfa, d’où le nom d’Oued
Tarfa donné au cours d’eau par les indigènes, et le nom français
attribué à la localité. Il n’y a encore aux Tamarins d’autre
construction que la maison bâtie par les soins de l’administration
pour servir de halte aux voyageurs. Sur les bords de l’Oued Tarfa, M.
le docteur Guyon a recueilli le Lonchophora Capiomontiana que
nous retrouverons dans la région saharienne. La vallée des
Tamarins forme un bassin assez étendu du nord au sud, borné à
l’est et à l’ouest par des montagnes entièrement déboisées.
Quelques champs de Blé dur et d’Orge, bien arrosés, sont déjà (25
mai) arrivés presque à maturité ; les plantes que nous observons
dans ces moissons sont encore pour la plupart celles de la région
des hauts-plateaux, et nous y retrouvons le Hohenackeria polyodon,
que dans notre voyage nous n’avons pas vu au sud de cette localité.

Liste des plantes observées dans les moissons aux environs des Tamarins.

Ranunculus arvensis L.
— trilobus Desf.
Ceratocephalus falcatus Pers.
Papaver hybridum L.
Rœmeria hybrida DC.
Carrichtera Vellæ DC.
Alyssum Granatense Boiss. et Reut.
*Clypeola cyclodontea Delil.
*Sisymbrium torulosum Desf.
— runcinatum Lagasc.
Moricandia arvensis DC.
Diplotaxis virgata DC. var. subsimplex.
Helianthemum glutinosum Pers.
— pilosum Pers.
— Niloticum Pers.
Reseda alba L.
Silene tridentata Desf.
Spergularia diandra Heldr.
Malva parviflora L.
— Ægyptiaca L.
Erodium Cicutarium L’Hérit.
Peganum Harmala L.
Medicago denticulata Willd.
— minima Lmk.
Astragalus hamosus L.
Hippocrepis scabra DC.
Paronychia argentea Lmk.
Herniaria annua Lagasc.
*Hohenackeria polyodon Coss. et DR.
Buplevrum semicompositum L.
Ammi majus L.
Thapsia Garganica L.
Daucus aureus Desf.
Scandix Pecten-Veneris L.
Torilis nodosa Gærtn.
Turgenia latifolia Hoffm.
Caucalis leptophylla L.
Crucianella patula L.
Callipeltis Cucullaria Stev.
Galium setaceum Lmk.
— tricorne With.
Valerianella discoidea Lois.
Scabiosa Monspeliensis Jacq.
Calendula arvensis L.
*Echinops spinosus L.
Onopordon macracanthum Schousb.
Centaurea pullata L.
*— Algeriensis Coss. et DR.
— Nicæensis All.
— Melitensis L.
*Microlonchus Duriæi Spath.
Filago Jussiæi Coss. et Germ.
Micropus bombycinus Lagasc.
Artemisia Herba-alba Asso.
Bellis annua L.
Anacyclus tomentosus DC.
*Pyrethrum fuscatum Willd.
Kœlpinia linearis Pall.
Hedypnois rhagadioloides L.
Podospermum laciniatum DC. var. calcitrapæfolium.
*Kalbfussia Salzmanni Schultz. Bip.
Asterothrix Hispanica DC.
Scorzonera undulata Vahl.
Sonchus divaricatus Desf.
— oleraceus L.
Anagallis arvensis L.
Nonnea micrantha Boiss. et Reut.
Lithospermum Apulum L.
Echinospermum Vahlianum Lehm.
— patulum Lehm.
Salvia Verbenaca L.
Plantago albicans L.
— Psyllium L.
Beta vulgaris L.
Chenopodium Vulvaria L.
Euphorbia falcata L.
— exigua L.
— sulcata De Lens.
Alopecurus pratensis L. var. ventricosus. — Lieux frais.
Echinaria capitata Desf.
Dactylis glomerata L.
Schismus calycinus Coss. et DR.
Festuca rigida Kunth.
Bromus Madritensis L.
Brachypodium distachyum Rœm. et Sch.
Elymus crinitus Schreb.
Hordeum murinum L.
Triticum Orientale M. Bieb.
Ægilops ovata var. triaristata. L.

Les lieux incultes nous présentent déjà quelques-unes des


espèces que nous retrouverons dans la région saharienne, entre
autres les : Atractylis microcephala, Anabasis articulata, Herniaria
fruticosa, Astragalus tenuifolius, Echium humile, etc. — La présence
de ces espèces sahariennes s’explique par une moindre altitude, par
la présence de terrains salés, et surtout par l’action du vent du sud
qui fait déjà sentir là sa puissante influence.

Liste des plantes observées dans les terrains incultes aux environs des Tamarins.

Peganum Harmala L.
*Genista microcephala Coss. et DR.
*Anthyllis Numidica Coss. et DR.
*Astragalus tenuifolius Desf.
Minuartia montana Lœfl.
Pteranthus echinatus Desf.
*Paronychia Cossoniana J. Gay.
Polycarpon Bivonæ J. Gay.
Herniaria fruticosa L.
Aizoon Hispanicum L.
Centaurea Parlatoris Heldr.
*Atractylis microcephala Coss. et DR.
*— cæspitosa Desf.
Artemisia Herba-alba Asso.
Sonchus spinosus DC.
Echium humile Desf.
Thymus hirtus Willd.
Globularia Alypum L.
Anabasis articulata Moq. Tand.
Atriplex Halimus L.
— parvifolia Lowe.
Salsola vermiculata L.
Passerina hirsuta L.
Stipa parviflora Desf.
— gigantea Lagasc.
— barbata Desf.
Dactylis glomerata L.
Festuca tenuiflora Schrad.
— cynosuroides Desf.
Lepturus incurvatus Trin.

Des ruines indiquent que les Tamarins furent jadis un poste


occupé par les Romains. — La route s’éloigne bientôt du cours de
l’Oued Tarfa pour se rapprocher de l’Oued Fedâla, quelle traverse et
longe ensuite pour descendre dans le ravin creusé par le lit de cette
rivière ; ce ravin est encaissé entre les pentes argileuses et
pierreuses des Djebel Tilatou et Madou, et ses pentes présentent de
nombreuses touffes de Retama sphærocarpa et de Passerina
hirsuta. A l’extrémité du Djebel Tilatou, l’étendue occupée par des
ruines romaines dans un élargissement de la vallée montre toute
l’importance qu’avaient les établissements romains dans cette partie
du pays. Quelques champs de céréales cultivés par les indigènes
promettent, grâce à l’irrigation, d’assez belles récoltes. Plus loin,
nous traversons l’Oued Fedâla et l’Oued Ksour vers leur confluent,
et nous suivons l’Oued El-Kantara, réunion de ces deux cours d’eau,
et encaissé entre des montagnes escarpées ; au nord-ouest s’élève
le Djebel Metlili constitué par d’énormes blocs de rochers, dont les
assises, souvent régulières et verticales, apparaissent de loin
comme une muraille immense ; au sud-est le Djebel El-Gaous moins
élevé, à pentes moins escarpées, est formé de blocs jetés sans
ordre, et dont un grand nombre se sont éboulés dans la vallée. Dans
tous les points où la rivière a déposé une épaisse couche de terre
végétale, les indigènes ont cultivé le sol, et arrosent leurs moissons
par des travaux d’irrigation exécutés avec intelligence, et qui n’ont
besoin que de quelques perfectionnements. Ces atterrissements
nous présentent déjà plusieurs des espèces que nous retrouverons
dans les endroits arrosés de la région saharienne :
*Lonchophora Capiomontiana DR.
Diplotaxis pendula DC.
*Hedysarum carnosum Desf.
*Paronychia Cossoniana J. Gay.
Galium setaceum L.
Callipeltis Cucullaria Stev.
Pulicaria Arabica Cass.
Asteriscus pygmæus Coss. et DR.

Là nous rencontrons également le Cordylocarpus muricatus, que,


dans la province d’Oran, nous n’avions pas vu dépasser les limites
du Tell. — Les montagnes resserrent de plus en plus l’étroite vallée
que nous venons de suivre, et bientôt nous arrivons au pied de la
muraille de rochers gigantesques qui semblent fermer l’accès de la
région saharienne ; ce n’est qu’après avoir contourné une dernière
colline que l’on voit apparaître l’étroite brèche creusée par le torrent,
et formant l’entrée du célèbre défilé d’El-Kantara : à droite et à
gauche s’élèvent perpendiculairement les rochers de l’immense
massif qui paraissaient devoir nous barrer le passage. La profondeur
du ravin, ses nombreuses sinuosités, le bruit des eaux, tout concourt
à impressionner vivement le voyageur dans ce site grandiose et
sauvage. Un magnifique pont d’une seule arche, construit par les
Romains, traverse le torrent dont la route suit tous les contours.
Quelques Dattiers qui croissent sur les bords du torrent annoncent
seuls l’approche de la première oasis, dérobée aux regards par les
détours du défilé. Encore quelques pas, et le Sahara nous
apparaîtra dans son austère majesté. — Il est impossible de
dépeindre la magnificence du vaste panorama qui se déroule à nos
regards : les cimes majestueuses des innombrables Dattiers de
l’oasis se détachent, au soleil couchant, par leur vert foncé, sur la
teinte rougeâtre qui semble embraser l’horizon ; les murs de terre
qui forment la ceinture de l’oasis, les tours carrées dont elle est
flanquée, et les maisons qui composent les villages arabes, forment
par leur teinte grisâtre un saisissant contraste. La plaine apparaît
dans toute son étendue, et des montagnes au sol rougeâtre
semblent dans le lointain se confondre avec le ciel. Tout, jusqu’au
costume sévère et primitif des indigènes, concourt à donner à ce
tableau un caractère de grandeur et d’étrangeté qu’il nous faut
renoncer à décrire.

Liste des plantes observées sur les rochers du défilé d’El-Kantara.

Diplotaxis pendula DC.


Lavatera maritima Gouan.
Genista ramosissima Poir.
Ononis angustissima Lmk.
*Anthyllis tragacanthoides Desf.
*Deverra scoparia Coss. et DR.
Galium erectum Huds.
*— petræum Coss. et DR.
Centaurea Parlatoris Heldr.
Lavandula multifida L.
*Stachys Guyoniana de Noé.
Ballota hirsuta Benth.

RÉGION SAHARIENNE.

L’oasis d’El-Kantara, à 35° 16′ de latitude boréale, à 534 mètres


d’altitude d’après M. Fournel (environ 550 d’après nos observations
barométriques), est située comme les autres oasis des Ziban au
delà de la chaîne des montagnes qui séparent le Tell du Sahara ;
cette oasis s’étend parallèlement au cours de la rivière, dont les
eaux abondantes et douces, par d’importants travaux d’irrigation,
fertilisent toutes les cultures. — Un vaste caravansérail, construit,
par les soins de l’administration, sur le bord de la rivière opposé à
l’oasis, indique seul la domination française. — L’oasis d’El-Kantara
ne compte pas moins de 76,200 Dattiers et de 8,552 arbres fruitiers,
soumis à un impôt annuel uniforme de 20 centimes. Les plantations
de Dattiers et d’arbres fruitiers qui, de loin, présentaient l’aspect
d’une forêt, sont divisées en jardins par des murs en terre peu
élevés qui les entourent. Ces jardins ne contiennent souvent que
quelques arbres habituellement plantés sans ordre ; d’étroits canaux
d’irrigation (saguia) creusés dans le sol servent à l’arrosement des
arbres et des cultures ; ces canaux mettent en communication entre
eux les bassins peu profonds qui entourent chaque pied de Dattier,
et permettent aux divers propriétaires d’arroser leurs cultures avec
facilité toutes les fois que la sécheresse du sol le nécessite. A
l’ombre des Dattiers sont plantes des Abricotiers, des Figuiers, des
Grenadiers, quelques ceps de Vigne et quelques Pêchers. Les
jardins offrent, en outre, quelques Cédratiers, et la circonférence du
tronc de l’un de ces arbres mesurait près de 80 centimètres. Le Blé,
l’Orge, les Oignons, les Fèves occupent les vides laissés par les
plantations, et croissent vigoureusement grâce à l’ombrage que leur
prêtent les arbres en les garantissant de l’influence des vents du
sud, et en maintenant dans l’atmosphère la fraîcheur nécessaire à
leur développement. — Un habitant du village le plus rapproché du
caravansérail, et qui avait reçu, sans doute, quelques leçons de
culture au jardin d’acclimatation de Beni-Mora, nous a montré avec
complaisance les plantations de Riz de ses saguia, les quelques
ares de Coton qu’il venait d’ensemencer, et surtout les arbres
fruitiers de son jardin, qui, par les soins qu’il leur avait donnés, se
distinguaient déjà de ceux du voisinage. — Les plantes spontanées
qui se rencontrent dans les cultures de l’oasis appartiennent, pour la
plupart, à la végétation européenne, et nous verrons qu’il en sera de
même pour les autres oasis[18]. — Le lit de l’Oued El-Kantara
présente de nombreuses touffes de Lauriers-Rose et de Tamarix
Gallica, entre lesquelles coulent les eaux de la rivière ; sur les
parties nues des berges argileuses croissent en grande abondance
un Deverra, le magnifique Reseda Aucheri, et d’autres plantes de la
région saharienne. — Des clôtures récentes annoncent
l’agrandissement que tend à prendre l’oasis, et dans les jardins
qu’elles entourent sont cultivés le Blé et l’Oignon au pied de Dattiers
de récente plantation.
L’immense plaine argilo-calcaire d’El-Kantara, bordée au sud de
montagnes rocailleuses et nues (Djebel Kteuf), est, en général,
d’une extrême aridité ; le Peganum Harmala, l’Anabasis articulata, et
l’Artemisia Herba-alba, si commun dans les terrains analogues des
hauts-plateaux, y couvrent de larges espaces ; on y rencontre çà et
là de rares touffes de Zizyphus Lotus. A l’extrémité de cette plaine la
route traverse plusieurs fois le lit de l’Oued El-Kantara, et s’engage
entre des collines nues et coupées par de nombreux ravins.

Liste des plantes observées aux environs d’El-Kantara.

Ranunculus arvensis L.
Nigella sativa L.
Delphinium cardiopetalum DC.
Papaver Rhœas L.
*Lonchophora Capiomontiana DR.
*Nasturtium coronopifolium DC.
Sisymbrium runcinatum Lagasc.
— erysimoides Desf.
Moricandia arvensis DC.
Diplotaxis pendula DC.
— virgata DC.
Eruca sativa Lmk.
Carrichtera Vellæ DC.
Cleome Arabica L.
Reseda Phyteuma L.
— Aucheri Boiss.
Buffonia perennis Pourr.
Spergularia diandra Heldr.
Hypericum tomentosum L.
Erodium guttatum Willd.
Fagonia glutinosa Delile.
Peganum Harmala L.
Zizyphus Lotus L.
Ononis angustissima Lmk.
— brachycarpa DC.
Anthyllis tragacanthoides Desf.
Astragalus sesameus L.
*— geniculatus Desf.
*Hedysarum carnosum Desf.
Herniaria annua Lagasc.
— fruticosa L.
*Paronychia Cossoniana J. Gay.
— argentea Lmk.
Polycarpon tetraphyllum L. f.
— Bivonæ J. Gay.
Minuartia montana Lœfl.
Pteranthus echinatus Desf.
Eryngium ilicifolium Lmk.
Ammi Visnaga Lmk.
Torilis nodosa Gærtn.
Sherardia arvensis L.
Crucianella patula L.
Galium saccharatum L.
— setaceum Lmk.
Callipeltis Cucullaria Stev.
Scabiosa Monspeliensis Jacq.
Micropus supinus L.
Pulicaria Arabica Cass.
Asteriscus aquaticus DC.
— pygmæus Coss. et DR.
Pallenis spinosa Cass.
Anacyclus tomentosus DC.
Artemisia Herba-alba Asso.
Filago Jussiæi Coss. et Germ.
Xeranthemum inapertum Willd.
*Carlina involucrata Desf.
*Atractylis microcephala Coss. et DR.
Centaurea Melitensis L.
— Nicæensis All.
— sulphurea Willd.
*Centaurea Algeriensis Coss. et DR.
— Calcitrapa L.
Kentrophyllum lanatum DC.
*Carduncellus calvus Boiss. et Reut.
*Silybum eburneum Coss. et DR.
Onopordon macracanthum Schousb.
Pycnomon Acarna Cass.
Scolymus Hispanicus L.
Hedypnois rhagadioloides L.
*Kalbfussia Salzmanni Schultz Bip.
Sonchus divaricatus Desf.
— maritimus L.
— spinosus DC.
Anagallis arvensis L.
Nerium Oleander L.
*Echium humile Desf.
Echinospermum Vahlianum Lehm.
Cynoglossum pictum Ait.
Lycium Mediterraneum Dun.
Verbascum sinuatum L.
*Linaria fruticosa Desf.
Veronica Anagallis L.
Mentha rotundifolia L.
— sylvestris L.
— Pulegium L.
Thymus hirtus Willd.
Salvia lanigera Desf.
— Ægyptiaca L.
Marrubium Alysson L.
Teucrium Polium L.
*Plantago Syrtica Viv.
— Lagopus L.
— Coronopus L.
— Psyllium L.
Beta vulgaris L. var. macrocarpa.
Blitum virgatum L. var. minus Vahl.
Salsola vermiculata L.
Anabasis articulata Moq.-Tand.
Passerina hirsuta L.
Euphorbia falcata L.
*— glebulosa Coss. et DR.
Ephedra fragilis Desf.
Juncus bufonius L.
Piptatherum miliaceum Coss.
Stipa parviflora Desf.
Agrostis verticillata Vill.
Echinaria capitata Desf.
Melica ciliata L.
Kœleria villosa Pers.
— phleoides Pers.
Dactylis glomerata L.
Lamarckia aurea Mœnch.
Festuca rigida Kunth.
Bromus Madritensis L.
Lolium perenne L. var. rigidum.
Hordeum murinum L.
Ægilops ovata L.
Imperata cylindrica P. B.
Andropogon hirtus L.
— laniger Desf.
Equisetum ramosissimum Desf.
A quelques kilomètres plus au sud, à 6 kilomètres nord-ouest
d’El-Outaïa, existe une fontaine chaude, que les indigènes
connaissent sous le nom de Hammam-Sid-el-Hadj (Bain du
Pèlerin) ; son vaste bassin est alimenté par plusieurs sources, dont
la principale atteint une température de plus de 40 degrés. Des
débris de constructions romaines se rencontrent dans le voisinage
de cette source que nous n’avons pas pu visiter. Les eaux de la
fontaine du Hammam contiennent une certaine quantité de matières
salines, où dominent le sulfate de chaux et le sel marin. M. Guyon
(Voyage aux Ziban), auquel nous avons emprunté les détails qui
précèdent, signale aux environs du Hammam le Lonchophora
Capiomontiana, et dans les lieux arides voisins le Statice pruinosa.
Un unique pied de Dattier, seul vestige d’une oasis détruite par
Salah-Bey, l’un des derniers beys de Constantine, nous annonce le
voisinage du caravansérail d’El-Outaïa (256 mètres d’altitude). Dans
les environs du caravansérail et du village arabe campent quelques
douars, dont les troupeaux paissent dans les maigres pâturages de
ce sol aride et déjà brûlé par le soleil (27 mai), en attendant le jour
peu éloigné de leur migration dans le Tell. Quelques jardins où
dominent le Figuier et le Grenadier se trouvent dans le voisinage
immédiat du village. — Une herborisation dans le lit de l’Oued El-
Kantara, et à la base de la Montagne-de-sel (Djebel Mélah), nous
présente la plupart des espèces sociales caractéristiques de la
région saharienne, entre autres les Limoniastrum Guyonianum,
Statice pruinosa, Linaria fruticosa, Sonchus quercifolius, etc.

Liste des plantes observées près d’El-Outaïa dans le lit de l’Oued El-Kantara et à
la base de la Montagne-de-sel.

*Lonchophora Capiomontiana DR.


*Nasturtium coronopifolium DC.
Sisymbrium runcinatum Lagasc.
*— cinereum Desf.
*— torulosum Desf.
Moricandia arvensis DC.
*— teretifolia DC.
Diplotaxis pendula DC.
Cleome Arabica L.
Helianthemum sessiliflorum Pers.
Reseda eremophila Boiss.
— Aucheri Boiss.
Erodium glaucophyllum Ait.
— guttatum Willd.
Fagonia glutinosa Delile.
Ononis angustissima Lmk.
— Columnæ All.
*Ebenus pinnatus Desf.
Cucumis Colocynthis L.
Ecbalium Elaterium Rich.
Herniaria fruticosa L.
*Paronychia Cossoniana J. Gay.
— nivea DC.
Polycarpæa fragilis Delile.
Polycarpon tetraphyllum L.
Pteranthus echinatus Desf.
*Reaumuria stenophylla Jaub. et Spach.
Eryngium ilicifolium Lmk.
Ammi Visnaga Lmk.
*Deverra chlorantha Coss. et DR.
Ridolfia segetum Moris.
Daucus pubescens Koch.
— aureus Desf.
Calendula arvensis L.
*Echinops spinosus L.
*Atractylis microcephala Coss. et DR.
Centaurea Parlatoris Heldr.
— Calcitrapa L.
*— omphalotricha Coss. et DR.
*Nolletia chrysocomoides Cass. (Conyza pulicarioides Coss. et DR. olim).
Asteriscus pygmæus Coss. et DR.
*Pyrethrum fuscatum Willd.
Artemisia Herba-alba Asso.
Scolymus Hispanicus L.
Hedypnois rhagadioloides L.
Zollikoferia resedifolia Coss.
*Sonchus quercifolius Desf.
Andryala Ragusina L.
Coris Monspeliensis L.
Dœmia cordata R. Br.
Convolvulus althæoides L.
*Echium humile Desf.
*Arnebia Vivianii Coss. et DR.
Echinospermum Vahlianum Lehm.
*Linaria fruticosa Desf.
Thymus hirtus Willd.
Salvia lanigera Desf.
*— Jaminiana de Noé.
Marrubium Alysson L.
Statice Thouini Viv.
— pruinosa L.
*Limoniastrum Guyonianum DR.
Plantago Coronopus L.
— Psyllium L.
Atriplex Halimus L.
Echinopsilon muricatus Moq.-Tand.
Caroxylon articulatum Moq.-Tand.
Rumex roseus Campd.
— vesicarius L.
Passerina hirsuta L.
*— microphylla Coss. et DR.
*Euphorbia glebulosa Coss. et DR.
Zannichellia macrostemon J. Gay.
Asphodelus ramosus L.
Imperata cylindrica P. B.
Andropogon laniger Desf.
Stipa tortilis Desf.
Arthratherum plumosum Nees.
Cynodon Dactylon L.
Schismus calycinus Coss. et DR.
Festuca rigida Kunth.
Brachypodium distachyum Rœm. et Sch.
Ægilops ovata L.
— — var. triaristata.

Le sol de la Montagne-de-sel (Djebel Mélah) est composé d’une


argile rougeâtre et de terrains calcaires mêlés de gypse, à la surface
desquels vient souvent s’effleurir le sel qui les imprègne et qui
apparaît dans le lointain comme de larges taches blanchâtres sur les
flancs de la montagne. Le Djebel Mélah doit son nom aux bancs
considérables de sel qu’il renferme, et que les habitants exploitent
en grand. Le sel peut être extrait par masses volumineuses
cristallines, et à un état de pureté qui permet, sans aucune
préparation, de le livrer immédiatement à la consommation. Les
eaux des sources du Djebel Mélah sont chargées de sel qui
cristallise aux bords des ruisseaux et incruste les plantes qui y
croissent.
La plaine d’El-Outaïa présente un terrain argileux généralement
salé ; ce terrain cependant devient assez fertile sous l’influence des
irrigations, et de riches moissons d’Orge et de Blé dur se rencontrent
sur tous les points qui peuvent être arrosés par des dérivations des
eaux de la rivière. Les Arabes s’occupent de toutes parts de la
moisson (27 mai), et coupent les chaumes à peu de distance des
épis, dont ils forment des bouquets, qu’ils se jettent de main en main
pour les remettre aux femmes qui, sur le bord du champ, en opèrent
le battage au moyen de gros bâtons. — Le lit de l’Oued El-Kantara
nous offre en abondance des buissons de Limoniastrum
Guyonianum, dont les innombrables fleurs, d’un rose vif, forment
d’admirables panicules, qui, par leur couleur éclatante, contrastent
avec le feuillage blanchâtre de l’arbuste. — A l’extrémité de la plaine
s’élèvent des montagnes (Djebel Bourzel) que traverse le Col-de-
Sfa. Du sommet du col, on voit se dérouler devant soi la région
saharienne dans toute son immensité, et sans autre limite que
l’horizon ; les oasis de Biskra n’y apparaissent que comme de vastes
îlots de verdure, qui se détachent par leur couleur foncée sur la
teinte terne du terrain. — Les pentes pierreuses et le ravin argileux
du col ne présentent d’autres plantes ligneuses que le Rhus dioica et
le Periploca angustifolia, qui y forment des touffes rabougries. Là se
trouvent réunies la plupart des espèces caractéristiques des
montagnes basses et arides des environs de Biskra, entre autres les
diverses espèces d’Arthratherum, les Andropogon laniger, Chloris
villosa, Farsetia linearis, Limoniastrum Guyonianum, etc. Le
Lasiopogon muscoides a été également observé par M. Hénon à
cette localité.
Une plaine argileuse, ondulée et nue, dont le sol est en général
imprégné de sel, s’étend jusqu’à Biskra, éloignée d’environ 8
kilomètres ; elle est coupée de collines arides qui disparaissent à
environ un kilomètre de l’oasis ; çà et là s’élèvent des cônes
réguliers qui peuvent atteindre 15 mètres d’élévation, et qui sont
souvent tronqués au sommet ; les plantes qui croissent sur les
collines et sur ces tumulus, et qui sont le plus souvent mutilées par
les troupeaux, appartiennent presque toutes à la végétation
saharienne, et se présentent généralement par touffes espacées,
comme la plupart des espèces de cette région.
Diplotaxis pendula DC.
Notoceras Canariense R. Br.
Helianthemum Cahiricum Delile.
Argyrolobium uniflorum Jaub. et Sp.
Gymnarrhena micrantha Desf.
Dœmia cordata R. Br.
Passerina hirsuta L.
*— microphylla Coss. et DR.
Forskalea tenacissima L.
Gagea reticulata Rœm. et Sch.
Arthratherum, diverses espèces, etc.

Dans les dépressions du sol où l’eau a séjourné l’hiver, on


observe les :
Trigonella anguina Delile.
— Ægyptiaca Poir.
Leobordea lotoides Delile.
Cladanthus Arabicus Cass., etc.

Biskra[19], à 319 kilomètres de Philippeville, à 236 sud-ouest de


Constantine, à 126 sud de Batna, à 34° 56′ latitude boréale et 3° 21′
longitude orientale, à 75 mètres d’altitude, est située, au sud des
derniers contre-forts de la chaîne de l’Aurès, sur le cours de la
rivière qui porte son nom, et qui résulte de la réunion de l’Oued El-
Kantara et de l’Oued Abdi. Cette ville est pour ainsi dire par sa
position la clef des oasis des Ziban dont elle est la capitale ; il suffit
de jeter les yeux sur une carte pour comprendre son importance, car
son occupation assure la soumission des populeuses vallées de
l’Aurès méridional et des oasis qui en dépendent, en même temps
que celle des nombreuses et importantes oasis des Ziban[20]. — Le
fort Saint-Germain est construit à l’entrée de l’oasis de Biskra, vers
la prise d’eau qui en alimente les nombreuses saguia, d’où le nom
de Ras-el-ma (Tête de l’eau) donné par les indigènes aux
constructions récentes qui sont groupées dans le voisinage du fort.
— Une population assez nombreuse, et composée exclusivement
d’indigènes, est agglomérée dans plusieurs villages situés dans
l’intérieur de l’oasis. Ces villages sont composés de maisons
construites en terre, couvertes en terrasse, généralement à un seul
étage, et placées pour la plupart le long des ruelles qui sillonnent
l’oasis, sur lesquelles elles n’ont souvent que la porte pour toute
ouverture. Leurs murs sont composés d’espèces de briques, faites
d’argile mêlée à du fumier, et séchées au soleil ; des poutres de
Dattier, recouvertes des feuilles du même arbre, soutiennent la terre
battue qui constitue la terrasse ; des planches grossières en bois de
Dattier, et réunies par des traverses de Genévrier, en forment les
portes. Un ruisseau longe habituellement l’un des côtés de la ruelle,
et ses eaux, souillées par l’incurie des habitants, servent à tous leurs
usages domestiques. Les villages sont entourés de toutes parts des
jardins de l’oasis, dont quelques-uns sont assez étendus. Dans les
clairières de l’oasis ou au bord des chemins, çà et là se trouvent
réunies la tente en poil de chameau de l’Arabe nomade et la hutte
en feuilles de Dattiers qu’habite le Nègre. A peu de distance du
premier village arabe, au sud de Biskra, avait été construit en pisé
l’ancien fort de Biskra, abandonné récemment depuis la construction
du fort de Saint-Germain. Les jardins qui dépendent de l’ancien
village européen qui était protégé par le fort, et dont il n’existe plus
que des vestiges, sont encore cultivés par les soldats de la garnison
qui, à l’ombre des Dattiers, y entretiennent des cultures potagères.
— Plusieurs moulins arabes, d’une construction toute primitive, sont
établis sur les principaux canaux dérivés de l’Oued Biskra, et seront
probablement remplacés bientôt par des usines plus perfectionnées,
dont le moulin à turbine et à deux tournants, bâti pour le caïd, ne
tardera pas à démontrer tous les avantages aux indigènes. Les
canaux de dérivation se ramifient en d’innombrables saguia qui
servent à l’arrosement de toutes les cultures, et permettent de faire
arriver l’eau avec facilité au pied de chacun des arbres de l’oasis.
Les eaux de ces saguia tiennent en dissolution une assez grande
quantité de sel marin et d’autres substances salines ; aussi partout
où elles ne sont pas ombragées, voit-on généralement leurs bords
se couvrir des plantes qui affectionnent spécialement les lieux
salés : diverses Salsolacées, Aizoon Hispanicum,
Mesembryanthemum nodiflorum, etc. Dans les endroits ombragés et
au voisinage des saguia, les plantes salines font ordinairement place
à une végétation rudérale presque entièrement européenne. Pour
éviter d’inutiles redites, nous croyons devoir grouper dans une
même liste toutes les plantes que nous avons observées dans les
terrains cultivés des diverses oasis que nous avons visitées ; car ce
sont à peu près les mêmes espèces qui se rencontrent dans toutes
les cultures de la région saharienne.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like