diff --git a/2024-05/spring-19-ajax/ajax-demo.html b/2024-05/spring-19-ajax/ajax-demo.html new file mode 100644 index 00000000..9e302da4 --- /dev/null +++ b/2024-05/spring-19-ajax/ajax-demo.html @@ -0,0 +1,91 @@ + + + + Технологии JS для отправки запросов + + + + + + + + + + + + + + + + +

+

+

+

+ +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024-05/spring-19-ajax/pom.xml b/2024-05/spring-19-ajax/pom.xml
new file mode 100644
index 00000000..0a47af1c
--- /dev/null
+++ b/2024-05/spring-19-ajax/pom.xml
@@ -0,0 +1,17 @@
+
+
+    4.0.0
+
+    ru.otus
+    spring-mvc-ajax
+    1.0
+
+    pom
+
+    
+        spring-ajax-demo
+        spring-boot-and-react-demo
+    
+
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/pom.xml b/2024-05/spring-19-ajax/spring-ajax-demo/pom.xml
new file mode 100644
index 00000000..5f882673
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/pom.xml
@@ -0,0 +1,80 @@
+
+
+    4.0.0
+
+    ru.otus
+    spring-ajax-demo
+    1.0
+
+    
+        org.springframework.boot
+        spring-boot-starter-parent
+        3.3.2
+        
+    
+
+    
+        17
+        17
+        1.18.32
+    
+
+    
+        
+            org.springframework.boot
+            spring-boot-starter
+        
+
+        
+            org.springframework.boot
+            spring-boot-starter-web
+        
+
+        
+            org.springframework.boot
+            spring-boot-starter-thymeleaf
+        
+
+        
+            org.webjars
+            jquery
+            3.7.1
+        
+
+
+        
+            com.h2database
+            h2
+            runtime
+        
+
+        
+            org.springframework.boot
+            spring-boot-starter-data-jpa
+        
+
+        
+            org.projectlombok
+            lombok
+            ${lombok.version}
+            provided
+        
+
+        
+            org.springframework.boot
+            spring-boot-starter-validation
+        
+
+    
+
+    
+        
+            
+                org.springframework.boot
+                spring-boot-maven-plugin
+            
+        
+    
+
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/Main.java b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..a4da86de
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,13 @@
+package ru.otus.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Main {
+    // http://localhost:8080/
+    public static void main(String[] args) {
+        SpringApplication.run(Main.class);
+    }
+
+}
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/domain/Person.java b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..4c7af816
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,26 @@
+package ru.otus.spring.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name = "persons")
+public class Person {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long id;
+
+    @Column(name = "name")
+    private String name;
+}
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/page/PersonPagesController.java b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/page/PersonPagesController.java
new file mode 100644
index 00000000..5e59b329
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/page/PersonPagesController.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.page;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class PersonPagesController {
+
+    @GetMapping("/")
+    public String listPersonsPage(Model model) {
+        model.addAttribute("keywords", "list users in Omsk, omsk, list users, list users free");
+        return "list";
+    }
+
+    @GetMapping("/add")
+    public String addPersonPage() {
+        return "add";
+    }
+}
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/repostory/PersonRepository.java
new file mode 100644
index 00000000..4fb88650
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/repostory/PersonRepository.java
@@ -0,0 +1,11 @@
+package ru.otus.spring.repostory;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.otus.spring.domain.Person;
+
+import java.util.List;
+
+public interface PersonRepository extends CrudRepository {
+
+    List findAll();
+}
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/rest/PersonController.java b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/rest/PersonController.java
new file mode 100644
index 00000000..b3a0f8f4
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/rest/PersonController.java
@@ -0,0 +1,32 @@
+package ru.otus.spring.rest;
+
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import ru.otus.spring.repostory.PersonRepository;
+import ru.otus.spring.rest.dto.PersonDto;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@RestController
+public class PersonController {
+
+    private final PersonRepository repository;
+
+    @GetMapping("/api/persons")
+    public List getAllPersons() {
+        return repository.findAll().stream().map(PersonDto::toDto)
+                .collect(Collectors.toList());
+    }
+
+    @PostMapping("/api/persons")
+    public PersonDto addPerson(@Valid @RequestBody PersonDto personDto) {
+        var savedPerson = repository.save(personDto.toDomainObject());
+        return PersonDto.toDto(savedPerson);
+    }
+}
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/rest/dto/PersonDto.java b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/rest/dto/PersonDto.java
new file mode 100644
index 00000000..1411e383
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/java/ru/otus/spring/rest/dto/PersonDto.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016 Russian Post
+ *
+ * This source code is Russian Post Confidential Proprietary.
+ * This software is protected by copyright. All rights and titles are reserved.
+ * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software.
+ * Otherwise this violation would be treated by law and would be subject to legal prosecution.
+ * Legal use of the software provides receipt of a license from the right name only.
+ */
+package ru.otus.spring.rest.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+import ru.otus.spring.domain.Person;
+
+@Data
+@AllArgsConstructor
+public class PersonDto {
+
+    private long id;
+    @Length(min = 3)
+    private String name;
+
+    public static PersonDto toDto(Person person) {
+        return new PersonDto(person.getId(), person.getName());
+    }
+
+    public Person toDomainObject() {
+        return new Person(id, name);
+    }
+}
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/application.yml b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/application.yml
new file mode 100644
index 00000000..02e01231
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+spring:
+  datasource:
+    url: jdbc:h2:mem:testdb
+    initialization-mode: always
+
+  jpa:
+    generate-ddl: false
+    hibernate:
+      ddl-auto: none
+
+    show-sql: true
\ No newline at end of file
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/data.sql b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/data.sql
new file mode 100644
index 00000000..e60c79ca
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/data.sql
@@ -0,0 +1 @@
+INSERT INTO persons (name) VALUES ('Pushkin'), ('Lermontov')
\ No newline at end of file
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/schema.sql b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/schema.sql
new file mode 100644
index 00000000..2190e858
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/schema.sql
@@ -0,0 +1,8 @@
+DROP TABLE IF EXISTS persons;
+
+CREATE TABLE persons (
+    id BIGSERIAL,
+    name VARCHAR(250),
+
+    PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/templates/add.html b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/templates/add.html
new file mode 100644
index 00000000..bbbbe4f0
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/templates/add.html
@@ -0,0 +1,60 @@
+
+
+
+    
+    Edit person
+    
+    
+
+
+
+

Form for new person creation:

+
+
+ + +
+ +
+ + +
+
+ +

Saved person:

+

+
+
+
diff --git a/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/templates/list.html b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/templates/list.html
new file mode 100644
index 00000000..e407567f
--- /dev/null
+++ b/2024-05/spring-19-ajax/spring-ajax-demo/src/main/resources/templates/list.html
@@ -0,0 +1,60 @@
+
+
+
+    
+    
+    List of all persons
+    
+    
+
+
+

Persons:

+ +Add new + + + + + + + + + +
IDName
+ + + + + diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/.gitignore b/2024-05/spring-19-ajax/spring-boot-and-react-demo/.gitignore new file mode 100644 index 00000000..b11e399f --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/.gitignore @@ -0,0 +1,30 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + + +node/ +/node_modules +/output +package-lock.json diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/package.json b/2024-05/spring-19-ajax/spring-boot-and-react-demo/package.json new file mode 100644 index 00000000..22d1433b --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/package.json @@ -0,0 +1,28 @@ +{ + "name": "client", + "version": "1.0.0", + "description": "Simple react demo", + "main": "index.js", + "scripts": { + "dev": "webpack-dev-server --config webpack.dev.config.js", + "build": "webpack" + }, + "author": "", + "license": "ISC", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@babel/core": "^7.19.1", + "babel-loader": "^8.2.5", + "@babel/preset-env": "^7.19.1", + "@babel/preset-react": "^7.18.6", + "react-css-modules": "^4.7.11", + "html-webpack-plugin": "^5.5.0", + "terser-webpack-plugin": "^5.3.6", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.11.1" + } +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/pom.xml b/2024-05/spring-19-ajax/spring-boot-and-react-demo/pom.xml new file mode 100644 index 00000000..f1463661 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + ru.otus + spring-boot-and-react-demo + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + + + 17 + 17 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + com.h2database + h2 + runtime + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + com.github.eirslett + frontend-maven-plugin + 1.12.1 + + + install node and npm + + install-node-and-npm + + + v16.13.2 + 8.3.2 + + + + npm install + + npm + + generate-resources + + install + + + + npm run build + + npm + + generate-resources + + run build + + + + + + + diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/Main.java b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..9c34a6f3 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,15 @@ +package ru.otus.spring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + + // http://localhost:8080 + // http://localhost:8080/api/persons + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/domain/Person.java b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..81dae69e --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,40 @@ +package ru.otus.spring.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "persons") +public class Person { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + private String name; + + public Person() { + } + + public Person(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..4b20e5b7 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.CrudRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends CrudRepository { + + List findAll(); +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/rest/PersonController.java b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..47c36b18 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,25 @@ +package ru.otus.spring.rest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import ru.otus.spring.repostory.PersonRepository; +import ru.otus.spring.rest.dto.PersonDto; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +public class PersonController { + + private final PersonRepository repository; + + public PersonController(PersonRepository repository) { + this.repository = repository; + } + + @GetMapping("/api/persons") + public List getAllPersons() { + return repository.findAll().stream().map(PersonDto::toDto) + .collect(Collectors.toList()); + } +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/rest/dto/PersonDto.java b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/rest/dto/PersonDto.java new file mode 100644 index 00000000..03918447 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/java/ru/otus/spring/rest/dto/PersonDto.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest.dto; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private int id = -1; + private String name; + + public PersonDto() { + } + + public PersonDto(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static PersonDto toDto(Person person) { + return new PersonDto(person.getId(), person.getName()); + } +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/application.yml b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/application.yml new file mode 100644 index 00000000..02e01231 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: always + + jpa: + generate-ddl: false + hibernate: + ddl-auto: none + + show-sql: true \ No newline at end of file diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/data.sql b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/data.sql new file mode 100644 index 00000000..e60c79ca --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/data.sql @@ -0,0 +1 @@ +INSERT INTO persons (name) VALUES ('Pushkin'), ('Lermontov') \ No newline at end of file diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/schema.sql b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/schema.sql new file mode 100644 index 00000000..2190e858 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/main/resources/schema.sql @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS persons; + +CREATE TABLE persons ( + id BIGSERIAL, + name VARCHAR(250), + + PRIMARY KEY (id) +); \ No newline at end of file diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/components/App.js b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/components/App.js new file mode 100644 index 00000000..4a638db3 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/components/App.js @@ -0,0 +1,58 @@ +import React from 'react' + +const styles = { + personsTable: { + border: "1px solid steelblue", + width: "300px", + borderCollapse: "collapse", + }, + + personsTableItem: { + padding: "5px", + border: "1px solid steelblue" + } +} + +const Header = (props) => ( +

{props.title}

+); + +export default class App extends React.Component { + + constructor() { + super(); + this.state = {persons: []}; + } + + componentDidMount() { + fetch('/api/persons') + .then(response => response.json()) + .then(persons => this.setState({persons})); + } + + render() { + return ( + +
+ + + + + + + + + { + this.state.persons.map((person, i) => ( + + + + + )) + } + +
IDName
{person.id}{person.name}
+ + ) + } +}; diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/index.html b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/index.html new file mode 100644 index 00000000..86fc7182 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/index.html @@ -0,0 +1,15 @@ + + + + Minimal React Boilerplate + + + + +
+ + + + diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/index.js b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/index.js new file mode 100644 index 00000000..b054022e --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/src/ui/index.js @@ -0,0 +1,8 @@ +import React from 'react' +import ReactDOM from 'react-dom' +import App from './components/App' + +ReactDOM.render( + , + document.getElementById('root') +) \ No newline at end of file diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/webpack.config.js b/2024-05/spring-19-ajax/spring-boot-and-react-demo/webpack.config.js new file mode 100644 index 00000000..a1a380c5 --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/webpack.config.js @@ -0,0 +1,51 @@ +const TerserPlugin = require("terser-webpack-plugin"); +const HtmlWebpackPlugin = require('html-webpack-plugin') +const path = require('path'); +const webpack = require('webpack'); + +module.exports = { + entry: './src/ui/index.js', + mode: "production", + output: { + path: path.resolve(__dirname, 'target/classes/public/'), + filename: 'bundle.min.js', + libraryTarget: 'umd' + }, + + module: { + rules: [ + { + test: /\.js$/, + exclude: /(node_modules|bower_components|build)/, + use: { + loader: 'babel-loader', + options: { + presets: ["@babel/preset-env", '@babel/preset-react'] + } + } + } + ] + }, + + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + extractComments: true, + }), + ], + }, + + plugins: [ + new webpack.DefinePlugin({ + "process.env": { + NODE_ENV: JSON.stringify("production") + } + }), + + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'src/ui/index.html' + }) + ] +} diff --git a/2024-05/spring-19-ajax/spring-boot-and-react-demo/webpack.dev.config.js b/2024-05/spring-19-ajax/spring-boot-and-react-demo/webpack.dev.config.js new file mode 100644 index 00000000..b7caee3f --- /dev/null +++ b/2024-05/spring-19-ajax/spring-boot-and-react-demo/webpack.dev.config.js @@ -0,0 +1,63 @@ +const HtmlWebpackPlugin = require('html-webpack-plugin') +const path = require('path'); + +module.exports = { + entry: './src/ui/index.js', + devtool: 'inline-source-map', + mode: 'development', + output: { + path: path.resolve(__dirname), + filename: 'bundle.js', + libraryTarget: 'umd' + }, + + devServer: { + static: path.resolve(__dirname) + '/src/ui', + compress: true, + port: 9000, + host: 'localhost', + open: true, +/* + setupMiddlewares: (middlewares, devServer) => { + middlewares.unshift({ + name: 'inital-data-mw', + path: '/api/persons', + middleware: (req, res) => res.send([ + {id: '1', name: 'Привяу'} + ]) + }); + return middlewares; + }, +*/ + proxy: { + '*': { + target: 'http://localhost:8080', + secure: false, + changeOrigin: true + } + } + + + }, + + module: { + rules: [ + { + test: /\.js$/, + exclude: /(node_modules|bower_components|build)/, + use: { + loader: 'babel-loader', + options: { + presets: ["@babel/preset-env", '@babel/preset-react'] + } + } + } + ] + }, + plugins: [ + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'src/ui/index.html' + }) + ] +}