Download ebooks file (Ebook) Java EE Web Application Primer: Building Bullhorn: A Messaging App with JSP, Servlets, JavaScript, Bootstrap and Oracle by Dave Wolf,A.J. Henley (auth.) ISBN 9781484231944, 9781484231951, 1484231945, 1484231953 all chapters
Download ebooks file (Ebook) Java EE Web Application Primer: Building Bullhorn: A Messaging App with JSP, Servlets, JavaScript, Bootstrap and Oracle by Dave Wolf,A.J. Henley (auth.) ISBN 9781484231944, 9781484231951, 1484231945, 1484231953 all chapters
com
DOWLOAD EBOOK
ebooknice.com
ebooknice.com
https://ebooknice.com/product/sat-ii-success-
math-1c-and-2c-2002-peterson-s-sat-ii-success-1722018
ebooknice.com
ebooknice.com
(Ebook) Cambridge IGCSE and O Level History Workbook 2C -
Depth Study: the United States, 1919-41 2nd Edition by
Benjamin Harrison ISBN 9781398375147, 9781398375048,
1398375144, 1398375047
https://ebooknice.com/product/cambridge-igcse-and-o-level-history-
workbook-2c-depth-study-the-united-states-1919-41-2nd-edition-53538044
ebooknice.com
(Ebook) Java for the Web with Servlets, JSP, and EJB: A
Developer's Guide to J2EE Solutions by Budi Kurniawan ISBN
9780735711952, 073571195X
https://ebooknice.com/product/java-for-the-web-with-servlets-jsp-and-
ejb-a-developer-s-guide-to-j2ee-solutions-978614
ebooknice.com
ebooknice.com
https://ebooknice.com/product/murachs-java-servlets-and-jsp-5903424
ebooknice.com
Java EE Web
Application
Primer
Building Bullhorn: A Messaging
App with JSP, Servlets, JavaScript,
Bootstrap and Oracle
—
Dave Wolf
A.J. Henley
Java EE Web
Application Primer
Building Bullhorn: A Messaging
App with JSP, Servlets,
JavaScript, Bootstrap and
Oracle
Dave Wolf
A.J. Henley
Java EE Web Application Primer: Building Bullhorn: A Messaging App
with JSP, Servlets, JavaScript, Bootstrap and Oracle
v
Table of Contents
vi
Table of Contents
vii
Table of Contents
Index�������������������������������������������������������������������������������������������������141
viii
About the Authors
Dave Wolf is a certified Project Management
Professional (PMP) with over 20 years of
experience as a software developer, analyst,
and trainer. His latest projects include
collaboratively developing training materials
and programming bootcamps for Java and
Python.
ix
About the Technical Reviewer
Manuel Jordan Elera is an autodidactic
developer and researcher who enjoys learning
new technologies for his own experiments and
for creating new integrations.
Manuel won the 2010 Springy Award—
Community Champion and Spring Champion
2013. In his little free time, he reads the Bible
and composes music on his guitar. Manuel
is known online as dr_pompeii. He has
tech reviewed numerous books for Apress,
including Pro Spring Messaging (2017), Pro Spring, 4th Edition (2014),
Practical Spring LDAP (2013), Pro JPA 2, Second Edition (2013), and
Pro Spring Security (2013).
Read his 13 detailed tutorials about many Spring technologies or
contact him through his blog at http://www.manueljordanelera.
blogspot.com. You can also follow him on his Twitter account,
@dr_pompeii.
xi
Introduction
Are you a Java developer wondering how to create an Enterprise
application? Do you find the different components overwhelming or
confusing, not knowing how they go together? We’re here to help. What if
you could just get an example application working and use that knowledge
to continue your Java journey?
This book and the accompanying code will show you one way to
create a website. It’s not the only way. It may not be the best way for
every application. But it’s a way that will introduce you to the different
components of Java Enterprise application development. And it’s a good
way to get started.
In Java EE Web Application Primer, you’ll learn the basics of Java EE
application development. You’ll see how the parts connect. You will have
the Java code for a complete, working application.
The Software
Our students take our courses to learn how to program for large
companies. We have found these are the skills most requested by the
companies hiring our students. We choose to use Java 8, Oracle 12c, and
Eclipse for developing the application. Similarly, we choose to use JPA
(Java Persistence API) instead of Hibernate. We choose JSTL (Java Standard
Tag Library) over other available options. Again, these technologies teach
core skills without hiding all the implementation details from the student.
Our application is designed to teach. We provide the complete source code.
xiii
Introduction
You will learn much simply by reviewing and modifying the source code.
This book answers the questions you may have after working with the
source code, and the source code helps explain how the concepts in this
book have been implemented.
xiv
Introduction
If you’re ready to get started and develop your first Java Enterprise web
application, we thank you for choosing our book to begin your journey.
Know that you will face challenges and frustrations. You aren’t alone. We
have found that as our students worked through those, they learned more
about software development than we could ever teach in a book. You’re in
the right place. Wait no longer. It’s time to move on to Chapter 1!
xv
CHAPTER 1
Getting Started
VirtualBox allows you to create virtual computers within your physical
computer, enabling you to run multiple computers on one system. Setting
up VirtualBox requires very few steps. Once installed, you can then import
an existing virtual computer and begin work using that system.
Click and run the file to install VirtualBox just like with any other
software you’ve ever downloaded. If you are using Windows, double-click
the setup file and follow the prompts to install. If you are using a Mac, open
the DMG file that you downloaded and drag the VirtualBox file to your
Applications folder. During the installation, keep all of the options set to
their default.
Start the VirtualBox program. VirtualBox allows you to manage
your various virtual machines and easily create new ones. You can run
VirtualBox directly from the installation program, or you can start it from
the desktop icon.
Once you have the Oracle virtual machine file ready, select File ➤
Import Appliance in the menu bar. Click the Open Appliance button to
select the Oracle virtual machine file. Navigate to the file with the .ova
file extension. Selecting this file will open a dialog box in VirtualBox that
displays the settings. You can select the Import button from here. The next
window will show you the configuration of the current virtual appliance.
Once you click on Import, VirtualBox will copy the disk images and
create a virtual machine with the settings described in the dialog. You will
see the Oracle virtual machine in the VirtualBox Manager’s list of virtual
machines. The VirtualBox Manager is the first screen that opens when you
open VirtualBox. Select your machine, click Start, and give it time to load,
then you can work with that machine as if it were a separate computer.
2
Chapter 1 Getting Started
Note If you’re not using the Oracle virtual machine, you can
complete everything in this book using Windows.
You can download and install Oracle database version 12c for
Windows at http://www.oracle.com/technetwork/database/
enterprise-edition/downloads/database12c-win64-
download-2297732.html.
You will also need to install SQL Developer, which you can find at
http://www.oracle.com/technetwork/developer-tools/
sql-developer/downloads/index.html.
Finally, you will need to install Eclipse Oxygen from http://www.
eclipse.org/downloads.
3
CHAPTER 2
What Is a Database?
A database is a place to permanently store data for retrieval in a safe,
efficient way. A database allows us to create data and save it permanently.
It allows us to retrieve previously created data, update existing data, or
delete existing data.
A transaction groups SQL statements so that they are all applied to
the database. If one statement fails for some reason, all the statements
are undone from the database. Transactions ensure data integrity.
Transactions distinguish a database management system such as Oracle
from a file system.
The properties of a database transaction that ensure data validity are
atomicity, consistency, isolation, and durability.
The database stores data in sets, which are most commonly viewed as
tables. One row of a database table represents a record containing related
attributes, called fields. Fields are represented by the columns in a table.
Referential Integrity
Your database management system (DBMS) supports referential integrity.
The goal of referential integrity is to avoid having “orphaned” data.
Orphaned data can happen when you are deleting or updating the data
in your tables; for example, if you have a post in your database that does
not have a matching user. This shouldn’t happen and is often the result
of importing poorly formatted data or inadvertently deleting a user. A
database management system such as Oracle can enforce referential
integrity to prevent this by denying changes that will result in orphaned
data.
Null Values
Sometimes there is no value in a column of a row. In this case, the column
stores a NULL value. You can think of this as a flag to indicate the absence
of data. NULL is different from the numeric value zero or a string with a
length of zero characters. It is neither. It is nothing, because no value has
been stored in the column for this record. NULL, it turns out, is very useful.
You can search for a field in records that contain NULL and know that they
are the ones with no value in the field.
6
Chapter 2 What Is a Database?
Joining Tables
Relationships are a means to join data to different tables. This helps you
avoid redundancy in the tables. You can divide your data into different
tables—entering it only once—and then reference it from other tables by
establishing relationships.
7
Chapter 2 What Is a Database?
Normalization
In a normalized data structure, each table contains information about a
single entity and each piece of information is stored in exactly one place.
Normalization is the process of efficiently organizing data in a
database. This is done by organizing the columns (fields or attributes) and
tables of a relational database to minimize data redundancy.
The goals of the normalization process are to eliminate redundant data
and ensure data dependencies make sense.
8
Chapter 2 What Is a Database?
9
Chapter 2 What Is a Database?
10
CHAPTER 3
Installing and
Running Eclipse
Your virtual machine contains all the software you need to create
Bullhorn—the Oracle Database 12c, SQL Developer, and Java 1.8—but it
doesn’t contain the Eclipse IDE. You will need to download and install that
yourself. Fortunately, the installation process is very easy.
To install Eclipse on the virtual machine, you will need to open Firefox and
download the Eclipse archive. Then, you will need to extract the files from the
archive. Next, you will need to run the setup program that is included in the
archive files. Finally, open Eclipse.
1. From the virtual machine, open the Firefox web browser. You
can get to Firefox by clicking on the Applications menu and
selecting the icon for Firefox Web Browser.
5. Select the option to open with the Archive Manager when this
window is displayed. The Archive Manager is the program that
will extract your files.
11. Accept the default workspace. This is where your project files
will be kept.
12
Chapter 3 Installing and Running Eclipse
3. Notice that the port numbers are shown in the table on the
right. Click to edit; for example:
4. Once you change the port number for HTTP from 8080 to 9000,
you should press Ctrl + S to save the change and restart the
server.
Your application should now run without conflict. If you do get a conflict, then
you’ve chosen another used port. Repeat the process with a different port
number. It’s best to select a port within the range of 1025 to 65535. You can
research “Well-known port numbers” to find many articles explaining the
reasoning here.
13
CHAPTER 4
JPA (data
access)
Classes
Bullhorn Overview Diagram
Session - visible to all servlets and JSPs
Session times out 20 minutes after last accessed
Database
User object in session is available to all servlets and JSPs Posts Table
Users Table
Newsfeed
Login Servlet Home Servlet
Servlet
Tip To keep your HTML from getting too complicated, use CSS
(Cascading Style Sheets) and JavaScript to control the presentation of
your content and let HTML control the layout.
The Bullhorn application contains web pages for login, home, news
feed, and user profile. The user starts at the login page. Once the user
clicks the Login button, the request (data from the login form) will be sent
to the login servlet.
16
Chapter 4 Bullhorn Site Overview
The login servlet will validate the user against the database. A
valid user will be stored in the session, which is the website’s way of
remembering data between page views. Invalid users will not get past the
login page until they enter a correct username and password combination.
We will create other objects (classes) to validate data or support the
classes and pages shown in the diagram.
Figure 4-2. The login page contains text boxes for email and
password and a button to sign in to the application
17
Chapter 4 Bullhorn Site Overview
The home page will allow each user to create a new post. Each post is
limited to 141 characters, so the home page enforces this restriction (see
Figure 4-3). Once the user is logged in, all pages contain a navigation bar at
the top that allows the user to navigate to different pages, view or edit their
profile, and search for posts containing a specific word.
Figure 4-3. The home page contains a form to submit a post to the
database. The form contains a text box and buttons to either submit
the post or clear the form.
Each page contains the same navigation bar, which allows the user
to move around the application. The navigation bar contains the logo,
links for the home page and the news feed page, and a search box. It also
displays the name of the logged-in user. The user can also select from
various user options, which is implemented as a drop-down list. These
include logging out, viewing or editing profile, and submitting feedback.
See Figure 4-4.
18
Exploring the Variety of Random
Documents with Different Content
ágyukon, forognak és nyögnek, mint akik egy végtelen, álmatlan
éjszaka végét várják. Álomport vettek be és mégse tudnak aludni.
Akik pedig idejönnek, ezekhez az ágyakhoz, önkéntelenül valami
szemrehányásnak akarják elejét venni, tompítják a taglejtésüket,
szerények és szemérmesek, apró gombolyaggá szeretnének
összezsugorodni, sün módjára. Érzik, hogy tolakodók. Azzal, hogy
jönnek és azzal, hogy élnek. Beszélni nem igen tudnak. Csak nézik a
drága, kedves embert, aki meg akart előlük szökni – egy mellékajtón
– és az is néz rájuk kissé dacosan és kissé a rajtakapott gyermek
pironkodásával, aki valami tilosat és értékeset tört össze, ami nekünk
kedves. Bámulják a kalapunkat, mely ittmaradt volna nélkülük és
nem tudnak elfojtani valami halvány, alig látható mosolyt, mikor
elmenet nyakunk köré csavarjuk vastag gyapjukendőnket, nehogy
megfázzunk a nyirkos levegőn. Ha ismertük őket, akkor – akár
bevalljuk, akár nem – felelősséget érezünk, a tettükért. Talán mi is
okai voltunk, mindnyájan, akik élünk. Hiszen mi alkottuk az életüket,
melyről lemondtak. Az ő életük a mi életünkből rakódott össze.
Egykor talán egy taglejtést tettünk, mely csüggesztette és
elszomoritotta őket, vagy csak felsóhajtottunk, csunyán és
magunkból kikelve. A tele pohárban oly sok egy utolsó csöpp, annyi,
mint egy óceán. Ezért vezeklünk mindnyájan. Nem vagyunk jók,
vagy irgalmasak, szükségünk van, hogy itt legyünk. Dadogva
meghívjuk őket az élet vendégségére, melyről távozni készültek,
maradjanak még közöttünk, legalább virradtig, aztán menjenek el,
velünk együtt. Hiszen mi is elmegyünk. Nem sokat igérhetünk. Csak
szerény asztalunk van, nekünk is, édes és keserü szerepel
életsorunkon, de tudjuk, hogy jó a lépesméz és kedves a hegedüszó
meg az áprilisi eső. Lesütött fejjel állunk s várjuk, elfogadják-e
szerény ajánlatunkat, bűnbánó meghívásunkat?
Nem tudom, megértenek-e bennünket, mert mi az agyunk és
szívünk megpattanó erőfeszitésével – minden lélektani tudásával és
minden szeretetével – sem tudjuk megérteni őket. Csak azt az
embert érteném meg, aki elkészül erre a tettre. Ez szabadságot
jelent. Ha a zsebében állandóan egy forgópisztolyt, vagy egy gramm
morfiumot tart, akkor megszerezte magának a jóérzést, hogy
bármely pillanatban elhagyhatja tömlöcét, melybe be van zárva, a
kivezető ut az övé, a börtönkulcs nála van.
Vissza-visszafutok ehhez a gondolathoz és megállapodom egy
versnél. Sophokles-nek, a sötét költőnek két sorát mondogatom
magamban, amit még diákkoromban tanultam. A kórházi folyosón
ődöngve – gyötrődő szívvel – megpróbálom magyar szóra tenni a
görög igéket:
TEMETŐK.
ult délután a villamos egy hosszu, alacsony fal
mellett szaladt el, mely mögül – alattomosan –
ciprusok és márványtömbök kandikáltak. Hevesen
verni kezdett a szívem. A halottak az élők vis-á-
visjai? Itt vannak közöttünk, szemben ezzel a
kerttel? Beépitkeznek a város szívébe?
Kétségbeejtően világitott a gondolat. Alapjában pedig nem is volt
jogom csodálkozásra.
*
A csecsemő, mielőtt elszenderül, sír, mert fél az álmosság okozta
agyvérszegénységtől. Mi tapasztalt felnőttek mosolygunk ezen. Azt
hiszem, hogy a halottak is igy szánakoznak rajtunk, hogy jajgatunk,
mielőtt elaludnánk örökre. Számukra nevetséges ez az idioszinkrázia.
Ők tudják, hogy jó aludni, s mikor éjjel látják kigyulladt szemeinket,
sopánkodva mondják: „Még mindig ébren vannak, virrasztanak
szegények. Látom, világos az ablakuk.“
*
Szeretem a temetőket. Egyszerüen és közönségesen szeretem a
színeit, az őszi okkersárgáját, a haragoszöld árnyalatait, a csendjét,
mely ugy veszi körül, mint néma zivatar. A festők szeretik igy a
tengert. Csak a ragyogását látják, a hullámzó vonalait, melyek
mögött mélységek lappanganak. Ezt a táncoló és csillogó felszínt
szeretem, csüggedten és regényesen, a sírjait, lámpáit a ködben, a
viaszgyertyák olcsó füstjét, a címereket, melyek családi kripták
homlokán komorkodnak. Cifraság mindenütt. A kövér talaj, mely
hullákon hízott meg és a virágok és az arany délutánok csak a szívek
szerelméről beszélnek. A termékeny ellentétet bámulom itten.
Ábrándosan szeretem a temetőket, mint kiscseléd a konyha piros
papirjait, mint sápkóros leány az esküvőket és a színházat.
*
Mikor megkezdődik az élők végtelen körmenete a halottakhoz,
bámulok azon, hogy ők, akik legtöbben vannak, akik a legnagyobb
népet és hadsereget alkotják, a világ igazi nagyhatalma, a mi
háromszázhatvanöt napunkból évente csak egyetlen egyet
követelnek maguknak. A kínai halottak jóval szigorubbak. „Kinában –
olvasom egy utirajzban – a halál annyi helyet foglal el, mint az élet.
Mihelyt elhunyt valaki, fontos és gyanus személyiséggé válik, –
bizonyos ártalmas pártfogóvá, – aki haragos és durcás, valaki, aki
jelen van, s akit ki kell engesztelni. Élők és halottak közt a kötelékek
korántsem oldódnak el, a szertartások folytatódnak és állandósulnak.
Szüntelen el-elzarándokolnak a családi sírhoz, tömjént égetnek,
tarackot durrogatnak, rizst és malacot visznek a halottaknak, leadják
náluk a névjegyüket egy papirlap alakjában, melyet kaviccsal
nyomtatnak le.“ Mi sokkal feledékenyebbek vagyunk. Elfelejtjük,
hogy még mindég hagytak nálunk annyi eleven-erőt, mely a föld
összes dinamógépeit elindithatná. Itt terjeng közöttünk a hatásuk,
beszívjuk a tüdőnkbe, táplálja a vérünket. A toll, mivel írunk, a papir,
mire írunk, a lámpa, minél írunk, mind-mind az övék, az ő
találmányuk és tulajdonuk, csak kölcsön kaptuk tőlük rövid
használatra.
*
A temető érzékeny. Mélyebben, elevenebben él, mint bármi. Ha
letépem egy virágát, összeborzong és feljajdul. A suttogás, ami a
mezőn meg se hallik, kiáltássá dagad. Ezer és ezer hajszálgyökér
bogozódik minden tárgy köré, életek legombolyódott fonalai, vágyak
és letört akaratok, melyek még kinyulnak a sírból és követelik
jogaikat. Kikötő van itt. Minden sír egy kis öböl és minden koporsó
ladik, amely a tomboló oceánon átcsapzott szemfedővel vergődött
idáig, és miután leszedte vitorláját, révbe ért. Ez a nyugodalom
csalogatja ide azokat a nagyon magányos sétálókat, akiknek még
halottjuk sincsen, és mégis idejönnek, a sírás roppant és mély
szükségéért. Itt minden sír. Mig itt vagyunk, csak mi sírunk. De mikor
este kiballagunk a kapun, és kattognak a zárak, sírni kezdenek a fák,
a füvek, a keresztek és a márványangyalok, a büszke, feszes
márványangyalok is kezükre engedik szelíd fejüket és ők is sírnak.
Ez az a bezárt könyv, amit még nem ismerek. Az életből az
egyetlen dolog, amit még nem ismerek. Sokszor halhatatlan vágyat
érzek erre és valami unszol itt a temetőkapunál, a küszöbön, hogy
lebocsássam a mérőónt és megmérjem a mélységét.
*
Szeretem a temetőket. Nem, mert valami befejeződik itt. De mert
valami, valami elkezdődik…
VILÁG VÉGE.
Az a nap 6
A diák 10
Tébolyult nyár 14
Fecskék 18
Gyűlölet 22
Angyalok és tigrisek 24
Enni és aludni 27
Kis kortársaink 31
Az élet divatja 35
Csontok 40
A halál pilulái 44
Le „Kaiser“ 48
Kalendárium 51
Aranyvonat 54
Kalauznék 56
Soklevelü boglárka 59
És a költő? 63
Legenda egy háborus husvétra 66
Regényes emberek
Székely fi az arany sárkányok közt 72
Rózsaszínhaju trafikos kisasszony 73
Menyasszony a kávéházban 74
Alföldi baka a juniusi füvön 75
A bányász 76
Liliomos katona 78
Kiskáté 80
Emlék 1912 május 23-ról 86
„Ricordo di Venezia“ 92
Séta a velencei temetőben 96
Tengerre magyar 98
Az örmény paradicsom 102
Sárga, fojtó délután 107
Római jegyzetek 108
Páris
I. A naiv város 111
II. Morgue 113
III. Baudelaire sírja 116
IV. Autrichien 119
V. Kis párisi gondolatok 121
Elsuhanó régi belga táj 123
Belgrádi képek 125
Lapp atyafiak 131
„Fürdői emlék“ 134
Budapest, a kávéváros 138
Bécs, a verkliváros 142
RÓZSAVÍZ
Ó Í Ő Ó Ó Á Ó Á Ó
ITT A RÓZSAVÍZRŐL, A HÓRÓL, A KARÁCSONYRÓL, A VIRÁGOKRÓL,
A FÖLDI ÉLET ÜNNEPNAPJAIRÓL ÉS CSENDES SZENVEDÉSEIRŐL
SZÓLÓ FELJEGYZÉSEK VANNAK EGYBEGYŰJTVE. –
VALLOMÁSOK
Nyomdafesték 174
Orvos és halál 184
A mindenható bacillus előtt 189
Sárga kultura 192
Mehmed szultán utja 195
Kutyából szalonna 200
Öngyilkosok 204
Temetők 209
Világ vége 212
*** END OF THE PROJECT GUTENBERG EBOOK TINTA ***
Updated editions will replace the previous one—the old editions will
be renamed.
1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside the
United States, check the laws of your country in addition to the
terms of this agreement before downloading, copying, displaying,
performing, distributing or creating derivative works based on this
work or any other Project Gutenberg™ work. The Foundation makes
no representations concerning the copyright status of any work in
any country other than the United States.
1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if you
provide access to or distribute copies of a Project Gutenberg™ work
in a format other than “Plain Vanilla ASCII” or other format used in
the official version posted on the official Project Gutenberg™ website
(www.gutenberg.org), you must, at no additional cost, fee or
expense to the user, provide a copy, a means of exporting a copy, or
a means of obtaining a copy upon request, of the work in its original
“Plain Vanilla ASCII” or other form. Any alternate format must
include the full Project Gutenberg™ License as specified in
paragraph 1.E.1.
• You pay a royalty fee of 20% of the gross profits you derive
from the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”
• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.
1.F.
1.F.4. Except for the limited right of replacement or refund set forth
in paragraph 1.F.3, this work is provided to you ‘AS-IS’, WITH NO
OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.
Please check the Project Gutenberg web pages for current donation
methods and addresses. Donations are accepted in a number of
other ways including checks, online payments and credit card
donations. To donate, please visit: www.gutenberg.org/donate.
Most people start at our website which has the main PG search
facility: www.gutenberg.org.
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.
ebooknice.com