From 3f76b516b935c11bb0425e3c56b7fe12ff6b0dba Mon Sep 17 00:00:00 2001 From: Heli Devine Date: Thu, 13 Jun 2024 21:21:53 +0300 Subject: [PATCH] small web app from first lecture --- .../bootstrap/BootstrapData.java | 80 +++++++++++++++ .../controllers/AuthorController.java | 24 +++++ .../controllers/BookController.java | 23 +++++ .../spring6webapp/domain/Author.java | 76 +++++++++++++++ .../spring6webapp/domain/Book.java | 88 +++++++++++++++++ .../spring6webapp/domain/Publisher.java | 97 +++++++++++++++++++ .../repositories/AuthorRepository.java | 7 ++ .../repositories/BookRepository.java | 7 ++ .../repositories/PublisherRepository.java | 7 ++ .../spring6webapp/services/AuthorService.java | 8 ++ .../services/AuthorServiceImpl.java | 20 ++++ .../spring6webapp/services/BookService.java | 8 ++ .../services/BookServiceImpl.java | 20 ++++ src/main/resources/templates/authors.html | 24 +++++ src/main/resources/templates/books.html | 24 +++++ 15 files changed, 513 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java create mode 100644 src/main/java/guru/springframework/spring6webapp/controllers/AuthorController.java create mode 100644 src/main/java/guru/springframework/spring6webapp/controllers/BookController.java create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/Author.java create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/Book.java create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/Publisher.java create mode 100644 src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java create mode 100644 src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java create mode 100644 src/main/java/guru/springframework/spring6webapp/repositories/PublisherRepository.java create mode 100644 src/main/java/guru/springframework/spring6webapp/services/AuthorService.java create mode 100644 src/main/java/guru/springframework/spring6webapp/services/AuthorServiceImpl.java create mode 100644 src/main/java/guru/springframework/spring6webapp/services/BookService.java create mode 100644 src/main/java/guru/springframework/spring6webapp/services/BookServiceImpl.java create mode 100644 src/main/resources/templates/authors.html create mode 100644 src/main/resources/templates/books.html diff --git a/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java b/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java new file mode 100644 index 000000000..36c178ae0 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java @@ -0,0 +1,80 @@ +package guru.springframework.spring6webapp.bootstrap; + +import guru.springframework.spring6webapp.domain.Author; +import guru.springframework.spring6webapp.domain.Book; +import guru.springframework.spring6webapp.domain.Publisher; +import guru.springframework.spring6webapp.repositories.AuthorRepository; +import guru.springframework.spring6webapp.repositories.BookRepository; +import guru.springframework.spring6webapp.repositories.PublisherRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class BootstrapData implements CommandLineRunner { + + private final AuthorRepository authorRepository; + private final BookRepository bookRepository; + private final PublisherRepository publisherRepository; + + public BootstrapData(AuthorRepository authorRepository, BookRepository bookRepository, PublisherRepository publisherRepository) { + this.authorRepository = authorRepository; + this.bookRepository = bookRepository; + this.publisherRepository = publisherRepository; + } + + @Override + public void run(String... args) throws Exception { + + Author eric = new Author(); + eric.setFirstName("Eric"); + eric.setLastName("Evans"); + + Book ddd = new Book(); + ddd.setTitle("Domain Driven Design"); + ddd.setIsbn("11122224444"); + + Author ericSaved = authorRepository.save(eric); + Book dddSaved = bookRepository.save(ddd); + + Author rod = new Author(); + rod.setFirstName("Rod"); + rod.setLastName("Johnson"); + + Book noEJB = new Book(); + noEJB.setTitle("J2EE Development without EJB"); + noEJB.setIsbn("4445556666"); + + Author rodSaved = authorRepository.save(rod); + Book noEJBSaved = bookRepository.save(noEJB); + + ericSaved.getBooks().add(dddSaved); + rodSaved.getBooks().add(noEJBSaved); + dddSaved.getAuthors().add(ericSaved); + noEJBSaved.getAuthors().add(rodSaved); + + Publisher publisher = new Publisher(); + publisher.setPublisherName("Java publisher"); + publisher.setAddress("street 12"); + publisher.setCity("New York"); + publisher.setZip("12345"); + publisher.setState("NY"); + + Publisher savedPublisher = publisherRepository.save(publisher); + + dddSaved.setPublisher(savedPublisher); + noEJBSaved.setPublisher(savedPublisher); + + authorRepository.save(ericSaved); + authorRepository.save(rodSaved); + bookRepository.save(dddSaved); + bookRepository.save(noEJBSaved); + + + System.out.println("In Bootstrap"); + System.out.println("Author count: " +authorRepository.count()); + System.out.println("Book count: " + bookRepository.count()); + System.out.println("Publisher count: " + publisherRepository.count()); + + + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/controllers/AuthorController.java b/src/main/java/guru/springframework/spring6webapp/controllers/AuthorController.java new file mode 100644 index 000000000..1a8fea797 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/controllers/AuthorController.java @@ -0,0 +1,24 @@ +package guru.springframework.spring6webapp.controllers; + +import guru.springframework.spring6webapp.services.AuthorService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class AuthorController { + + private final AuthorService authorService; + + public AuthorController(AuthorService authorService) { + this.authorService = authorService; + } + + @RequestMapping("/authors") + public String getAuthors(Model model) { + + model.addAttribute("authors", authorService.findAll()); + return "authors"; + + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/controllers/BookController.java b/src/main/java/guru/springframework/spring6webapp/controllers/BookController.java new file mode 100644 index 000000000..c60a489f4 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/controllers/BookController.java @@ -0,0 +1,23 @@ +package guru.springframework.spring6webapp.controllers; + + +import guru.springframework.spring6webapp.services.BookService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class BookController { + + private final BookService bookService; + + public BookController(BookService bookService) { + this.bookService = bookService; + } + + @RequestMapping("/books") + public String getBooks(Model model) { + model.addAttribute("books", bookService.findAll()); + return "books"; + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/src/main/java/guru/springframework/spring6webapp/domain/Author.java new file mode 100644 index 000000000..795fa16cf --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -0,0 +1,76 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String firstName; + private String lastName; + + @ManyToMany(mappedBy = "authors") + private Set books = new HashSet<>(); + + public Set getBooks() { + return books; + } + + public void setBooks(Set books) { + this.books = books; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @Override + public String toString() { + return "Author{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", books=" + books + + '}'; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + + Author author = (Author) object; + + return getId() != null ? getId().equals(author.getId()) : author.getId() == null; + } + + @Override + public int hashCode() { + return getId() != null ? getId().hashCode() : 0; + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/src/main/java/guru/springframework/spring6webapp/domain/Book.java new file mode 100644 index 000000000..a0d7464e7 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -0,0 +1,88 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String title; + private String isbn; + + @ManyToMany + @JoinTable(name = "author book", joinColumns =@JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "author_id")) + private Set authors = new HashSet<>(); + + public Publisher getPublisher() { + return publisher; + } + + public void setPublisher(Publisher publisher) { + this.publisher = publisher; + } + + @ManyToOne + private Publisher publisher; + + public Set getAuthors() { + return authors; + } + + public void setAuthors(Set authors) { + this.authors = authors; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", isbn='" + isbn + '\'' + + ", authors=" + authors + + '}'; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + + Book book = (Book) object; + + return getId() != null ? getId().equals(book.getId()) : book.getId() == null; + } + + @Override + public int hashCode() { + return getId() != null ? getId().hashCode() : 0; + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java b/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java new file mode 100644 index 000000000..15391e38d --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java @@ -0,0 +1,97 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.Set; + + +@Entity +public class Publisher { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String publisherName; + private String address; + private String city; + private String state; + private String zip; + + @OneToMany(mappedBy = "publisher") + private Set books; + + @Override + public String toString() { + return "Publisher{" + + "id=" + id + + ", publisherName='" + publisherName + '\'' + + ", address='" + address + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zip='" + zip + '\'' + + '}'; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPublisherName() { + return publisherName; + } + + public void setPublisherName(String publisherName) { + this.publisherName = publisherName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + + Publisher publisher = (Publisher) object; + + return getId() != null ? getId().equals(publisher.getId()) : publisher.getId() == null; + } + + @Override + public int hashCode() { + return getId() != null ? getId().hashCode() : 0; + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java b/src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java new file mode 100644 index 000000000..5ff4c917a --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.repositories; + +import guru.springframework.spring6webapp.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java b/src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java new file mode 100644 index 000000000..384b6ad41 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.repositories; + +import guru.springframework.spring6webapp.domain.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring6webapp/repositories/PublisherRepository.java b/src/main/java/guru/springframework/spring6webapp/repositories/PublisherRepository.java new file mode 100644 index 000000000..c0b3218cc --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/repositories/PublisherRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.repositories; + +import guru.springframework.spring6webapp.domain.Publisher; +import org.springframework.data.repository.CrudRepository; + +public interface PublisherRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring6webapp/services/AuthorService.java b/src/main/java/guru/springframework/spring6webapp/services/AuthorService.java new file mode 100644 index 000000000..1d1ac9e42 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/services/AuthorService.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6webapp.services; + +import guru.springframework.spring6webapp.domain.Author; + +public interface AuthorService { + + Iterable findAll(); +} diff --git a/src/main/java/guru/springframework/spring6webapp/services/AuthorServiceImpl.java b/src/main/java/guru/springframework/spring6webapp/services/AuthorServiceImpl.java new file mode 100644 index 000000000..f894ccba8 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/services/AuthorServiceImpl.java @@ -0,0 +1,20 @@ +package guru.springframework.spring6webapp.services; + +import guru.springframework.spring6webapp.domain.Author; +import guru.springframework.spring6webapp.repositories.AuthorRepository; +import org.springframework.stereotype.Service; + +@Service +public class AuthorServiceImpl implements AuthorService { + + private final AuthorRepository authorRepository; + + public AuthorServiceImpl(AuthorRepository authorRepository) { + this.authorRepository = authorRepository; + } + + @Override + public Iterable findAll() { + return authorRepository.findAll(); + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/services/BookService.java b/src/main/java/guru/springframework/spring6webapp/services/BookService.java new file mode 100644 index 000000000..1cfef45fa --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/services/BookService.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6webapp.services; + +import guru.springframework.spring6webapp.domain.Book; + +public interface BookService { + + Iterable findAll(); +} diff --git a/src/main/java/guru/springframework/spring6webapp/services/BookServiceImpl.java b/src/main/java/guru/springframework/spring6webapp/services/BookServiceImpl.java new file mode 100644 index 000000000..d1b2b0675 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/services/BookServiceImpl.java @@ -0,0 +1,20 @@ +package guru.springframework.spring6webapp.services; + +import guru.springframework.spring6webapp.domain.Book; +import guru.springframework.spring6webapp.repositories.BookRepository; +import org.springframework.stereotype.Service; + +@Service +public class BookServiceImpl implements BookService { + + private final BookRepository bookRepository; + + public BookServiceImpl(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + @Override + public Iterable findAll() { + return bookRepository.findAll(); + } +} diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html new file mode 100644 index 000000000..4e469bf56 --- /dev/null +++ b/src/main/resources/templates/authors.html @@ -0,0 +1,24 @@ + + + + + Spring Framework Guru + + +

Author List

+ + + + + + + + + + + + +
IDFirst NameLast Name
123 First NameLast Name
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html new file mode 100644 index 000000000..c0af60cad --- /dev/null +++ b/src/main/resources/templates/books.html @@ -0,0 +1,24 @@ + + + + + Spring Framework Guru + + +

Book List

+ + + + + + + + + + + + +
IDTitlePublisher
123 Spring in ActionWrox
+ + + \ No newline at end of file