From b38fd903d2f30f1c0b25de6e3b7cf561e2c26c63 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:08:14 +0300 Subject: [PATCH 01/40] [JPA] Enhance Isolation in project. --- a-thymeleaf/build.gradle | 36 --- a-thymeleaf/gradlew | 234 ------------------ a-thymeleaf/gradlew.bat | 89 ------- a-thymeleaf/settings.gradle | 1 - .../labs/thymeleaf/ThymeleafApplication.java | 32 --- .../labs/thymeleaf/config/WebMvcConfig.java | 69 ------ .../controllers/PracticeController.java | 68 ----- .../labs/thymeleaf/models/StudentModel.java | 65 ----- .../src/main/resources/application.properties | 4 - .../main/resources/local/practice.properties | 4 - .../resources/local/shared/navbar.properties | 3 - .../resources/templates/account/login.html | 19 -- .../resources/templates/practice/first.html | 16 -- .../resources/templates/practice/fourth.html | 17 -- .../resources/templates/practice/second.html | 46 ---- .../resources/templates/practice/third.html | 67 ----- .../resources/templates/shared/footer.html | 3 - .../main/resources/templates/shared/head.html | 4 - .../resources/templates/shared/header.html | 3 - .../resources/templates/shared/navbar.html | 15 -- docs/en/a-thymeleaf/lab-work.md | 73 ------ .../practice/configure-thymeleaf.md | 119 --------- .../a-thymeleaf/practice/create-first-view.md | 63 ----- docs/en/a-thymeleaf/practice/form-handling.md | 74 ------ docs/en/a-thymeleaf/practice/forms.md | 120 --------- .../practice/fragments-and-layouts.md | 130 ---------- docs/en/a-thymeleaf/practice/iteration.md | 107 -------- docs/en/a-thymeleaf/practice/literals.md | 55 ---- docs/en/a-thymeleaf/practice/validation.md | 85 ------- .../practice/variables-and-controller.md | 67 ----- .../practice/working-with-variables.md | 92 ------- docs/ru/a-thymeleaf/lab-work.md | 74 ------ .../practice/configure-thymeleaf.md | 119 --------- .../a-thymeleaf/practice/create-first-view.md | 63 ----- docs/ru/a-thymeleaf/practice/form-handling.md | 74 ------ docs/ru/a-thymeleaf/practice/forms.md | 120 --------- .../practice/fragments-and-layouts.md | 130 ---------- docs/ru/a-thymeleaf/practice/iteration.md | 107 -------- docs/ru/a-thymeleaf/practice/literals.md | 55 ---- docs/ru/a-thymeleaf/practice/validation.md | 85 ------- .../practice/variables-and-controller.md | 67 ----- .../practice/working-with-variables.md | 92 ------- docs/srcs/a-thymeleaf/first-view.png | Bin 7080 -> 0 bytes docs/srcs/a-thymeleaf/fourth-view.png | Bin 23618 -> 0 bytes docs/srcs/a-thymeleaf/home-page.png | Bin 13921 -> 0 bytes docs/srcs/a-thymeleaf/layout.png | Bin 50263 -> 0 bytes docs/srcs/a-thymeleaf/login-page.png | Bin 12495 -> 0 bytes docs/srcs/a-thymeleaf/login-validation.png | Bin 14150 -> 0 bytes docs/srcs/a-thymeleaf/modify-user-page.png | Bin 17129 -> 0 bytes .../srcs/a-thymeleaf/second-view-enhanced.png | Bin 10468 -> 0 bytes docs/srcs/a-thymeleaf/second-view.png | Bin 9090 -> 0 bytes docs/srcs/a-thymeleaf/signup-page.png | Bin 14133 -> 0 bytes docs/srcs/a-thymeleaf/third-view-error.png | Bin 6204 -> 0 bytes docs/srcs/a-thymeleaf/third-view-success.png | Bin 5944 -> 0 bytes docs/srcs/a-thymeleaf/third-view.png | Bin 5754 -> 0 bytes docs/srcs/a-thymeleaf/users-page.png | Bin 13978 -> 0 bytes 56 files changed, 2766 deletions(-) delete mode 100644 a-thymeleaf/build.gradle delete mode 100644 a-thymeleaf/gradlew delete mode 100644 a-thymeleaf/gradlew.bat delete mode 100644 a-thymeleaf/settings.gradle delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java delete mode 100644 a-thymeleaf/src/main/resources/application.properties delete mode 100644 a-thymeleaf/src/main/resources/local/practice.properties delete mode 100644 a-thymeleaf/src/main/resources/local/shared/navbar.properties delete mode 100644 a-thymeleaf/src/main/resources/templates/account/login.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/first.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/fourth.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/second.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/third.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/footer.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/head.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/header.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/navbar.html delete mode 100644 docs/en/a-thymeleaf/lab-work.md delete mode 100644 docs/en/a-thymeleaf/practice/configure-thymeleaf.md delete mode 100644 docs/en/a-thymeleaf/practice/create-first-view.md delete mode 100644 docs/en/a-thymeleaf/practice/form-handling.md delete mode 100644 docs/en/a-thymeleaf/practice/forms.md delete mode 100644 docs/en/a-thymeleaf/practice/fragments-and-layouts.md delete mode 100644 docs/en/a-thymeleaf/practice/iteration.md delete mode 100644 docs/en/a-thymeleaf/practice/literals.md delete mode 100644 docs/en/a-thymeleaf/practice/validation.md delete mode 100644 docs/en/a-thymeleaf/practice/variables-and-controller.md delete mode 100644 docs/en/a-thymeleaf/practice/working-with-variables.md delete mode 100644 docs/ru/a-thymeleaf/lab-work.md delete mode 100644 docs/ru/a-thymeleaf/practice/configure-thymeleaf.md delete mode 100644 docs/ru/a-thymeleaf/practice/create-first-view.md delete mode 100644 docs/ru/a-thymeleaf/practice/form-handling.md delete mode 100644 docs/ru/a-thymeleaf/practice/forms.md delete mode 100644 docs/ru/a-thymeleaf/practice/fragments-and-layouts.md delete mode 100644 docs/ru/a-thymeleaf/practice/iteration.md delete mode 100644 docs/ru/a-thymeleaf/practice/literals.md delete mode 100644 docs/ru/a-thymeleaf/practice/validation.md delete mode 100644 docs/ru/a-thymeleaf/practice/variables-and-controller.md delete mode 100644 docs/ru/a-thymeleaf/practice/working-with-variables.md delete mode 100644 docs/srcs/a-thymeleaf/first-view.png delete mode 100644 docs/srcs/a-thymeleaf/fourth-view.png delete mode 100644 docs/srcs/a-thymeleaf/home-page.png delete mode 100644 docs/srcs/a-thymeleaf/layout.png delete mode 100644 docs/srcs/a-thymeleaf/login-page.png delete mode 100644 docs/srcs/a-thymeleaf/login-validation.png delete mode 100644 docs/srcs/a-thymeleaf/modify-user-page.png delete mode 100644 docs/srcs/a-thymeleaf/second-view-enhanced.png delete mode 100644 docs/srcs/a-thymeleaf/second-view.png delete mode 100644 docs/srcs/a-thymeleaf/signup-page.png delete mode 100644 docs/srcs/a-thymeleaf/third-view-error.png delete mode 100644 docs/srcs/a-thymeleaf/third-view-success.png delete mode 100644 docs/srcs/a-thymeleaf/third-view.png delete mode 100644 docs/srcs/a-thymeleaf/users-page.png diff --git a/a-thymeleaf/build.gradle b/a-thymeleaf/build.gradle deleted file mode 100644 index 2ed8e23..0000000 --- a/a-thymeleaf/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - // Java - id 'java' - - // Spring - id "org.springframework.boot" version "3.2.2" - id "io.spring.dependency-management" version "1.1.4" -} - -repositories { - mavenCentral() -} - -group = 'edu.labs.thymeleaf' -version = '1.0-SNAPSHOT' - -java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - - -dependencies { - // Spring - def springVersion = '3.2.2' - implementation "org.springframework.boot:spring-boot-starter-web" - testImplementation 'org.springframework.boot:spring-boot-starter-test' - - // Thymeleaf - def thymeleafVersion = "3.1.2.RELEASE" - implementation "org.thymeleaf:thymeleaf-spring6:$thymeleafVersion" -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/a-thymeleaf/gradlew b/a-thymeleaf/gradlew deleted file mode 100644 index 1b6c787..0000000 --- a/a-thymeleaf/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/a-thymeleaf/gradlew.bat b/a-thymeleaf/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/a-thymeleaf/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/a-thymeleaf/settings.gradle b/a-thymeleaf/settings.gradle deleted file mode 100644 index 8304350..0000000 --- a/a-thymeleaf/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'a-thymeleaf' diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java deleted file mode 100644 index add1971..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package edu.labs.thymeleaf; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; - -@SpringBootApplication -public class ThymeleafApplication { - - private static final Logger logger = LoggerFactory.getLogger(ThymeleafApplication.class); - - public static void main(String[] args) { - SpringApplication app = new SpringApplication(ThymeleafApplication.class); - ConfigurableApplicationContext context = app.run(args); - - logServerInfo(context); - } - - private static void logServerInfo(ConfigurableApplicationContext context) { - var env = context.getEnvironment(); - String port = env.getProperty("server.port"); - String contextPath = env.getProperty("server.servlet.context-path"); - - log("Server running at: http://localhost:" + port + contextPath); - } - - private static void log(String message){ - logger.info(message); - } -} \ No newline at end of file diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java deleted file mode 100644 index 2d8570b..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -package edu.labs.thymeleaf.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ReloadableResourceBundleMessageSource; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.thymeleaf.spring6.SpringTemplateEngine; -import org.thymeleaf.spring6.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; -import org.springframework.context.MessageSource; -import java.time.LocalDateTime; - -@Configuration -public class WebMvcConfig implements WebMvcConfigurer { - - - @Bean - public ClassLoaderTemplateResolver templateResolver() { - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - templateResolver.setPrefix("/templates/"); - templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode(TemplateMode.HTML); - templateResolver.setCharacterEncoding("UTF-8"); - - return templateResolver; - } - - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames( - "classpath:local/practice", - "classpath:local/shared/navbar" - ); - - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - - @Bean - public SpringTemplateEngine templateEngine() { - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(templateResolver()); - templateEngine.setTemplateEngineMessageSource(messageSource()); - - return templateEngine; - } - - - - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } -} \ No newline at end of file diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java deleted file mode 100644 index 2ba0eeb..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java +++ /dev/null @@ -1,68 +0,0 @@ -package edu.labs.thymeleaf.controllers; - -import edu.labs.thymeleaf.models.StudentModel; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; - -import java.util.ArrayList; -import java.util.List; - -@Controller -public class PracticeController { - - private final List students = new ArrayList<>(); - - public PracticeController(){ - // Populate the list with users - this.students.add(new StudentModel(1,"First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(3, "Fourth", "User", false, 3)); - } - - @GetMapping("/second") - public String secondPracticeView(Model model){ - model.addAttribute("title", "second task"); - model.addAttribute("students", this.students); - return "practice/second"; - } - - @GetMapping("/third") - public String thirdPracticeView(Model model){ - model.addAttribute("title", "third task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - - @PostMapping("/removeStudent") - public String removeStudent(){ - - return "redirect:/third?removedStudent"; - } - - @GetMapping("/fourth") - public String fourthPracticeView(Model model){ - model.addAttribute("title", "fourth task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - - return "practice/fourth"; - } -} diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java deleted file mode 100644 index 20320e3..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java +++ /dev/null @@ -1,65 +0,0 @@ -package edu.labs.thymeleaf.models; - -public class StudentModel { - private Integer id; - private String firstName; - private String sureName; - private Boolean isGraduated; - private Integer mark; - - public StudentModel() { - } - - public StudentModel(Integer id, String firstName, String sureName, Boolean isGraduated, Integer mark) { - this.id = id; - this.firstName = firstName; - this.sureName = sureName; - this.isGraduated = isGraduated; - this.mark = mark; - } - - // Getter and setter methods for id - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - // Getter and setter methods for firstName - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - // Getter and setter methods for sureName - public String getSureName() { - return sureName; - } - - public void setSureName(String sureName) { - this.sureName = sureName; - } - - // Getter and setter methods for isGraduated - public Boolean getIsGraduated() { - return isGraduated; - } - - public void setIsGraduated(Boolean isGraduated) { - this.isGraduated = isGraduated; - } - - // Getter and setter methods for mark - public Integer getMark() { - return mark; - } - - public void setMark(Integer mark) { - this.mark = mark; - } -} diff --git a/a-thymeleaf/src/main/resources/application.properties b/a-thymeleaf/src/main/resources/application.properties deleted file mode 100644 index 551dbe7..0000000 --- a/a-thymeleaf/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Server Configurations -spring.application.name= FirstLabWork -server.port=8080 -server.servlet.context-path=/ \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/local/practice.properties b/a-thymeleaf/src/main/resources/local/practice.properties deleted file mode 100644 index 8ca4c87..0000000 --- a/a-thymeleaf/src/main/resources/local/practice.properties +++ /dev/null @@ -1,4 +0,0 @@ -student.name= MyName -student.group= PRE-121 -message.welcome= Welcome, {0} -message.info= Your Group is: {0} diff --git a/a-thymeleaf/src/main/resources/local/shared/navbar.properties b/a-thymeleaf/src/main/resources/local/shared/navbar.properties deleted file mode 100644 index ebea752..0000000 --- a/a-thymeleaf/src/main/resources/local/shared/navbar.properties +++ /dev/null @@ -1,3 +0,0 @@ -nav.string.login=Login -nav.string.signup=Signup -nav.message.welcome= Welcome, {0} diff --git a/a-thymeleaf/src/main/resources/templates/account/login.html b/a-thymeleaf/src/main/resources/templates/account/login.html deleted file mode 100644 index 72f28f1..0000000 --- a/a-thymeleaf/src/main/resources/templates/account/login.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - -
-
- - -
- - - - - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/first.html b/a-thymeleaf/src/main/resources/templates/practice/first.html deleted file mode 100644 index 2b37a93..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/first.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Title - - - -

Project Name

-

Current Date and Time

-

-

-
- Next Task - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/fourth.html b/a-thymeleaf/src/main/resources/templates/practice/fourth.html deleted file mode 100644 index dcd0056..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/fourth.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -
- - -
- - -
- - - diff --git a/a-thymeleaf/src/main/resources/templates/practice/second.html b/a-thymeleaf/src/main/resources/templates/practice/second.html deleted file mode 100644 index 50350c2..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/second.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Page Title - - - -

Default

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
GoodVery GoodExcellentNot PassedBlueBlueRedNo Diploma
- - Next Task - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/third.html b/a-thymeleaf/src/main/resources/templates/practice/third.html deleted file mode 100644 index 73ca371..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/third.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Page Title - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
-

Error:

-
- -
-

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- -
-
- -
- Remove Student - -
-

Student Removed Successfully!

-
- -
-

- - -

- -
- -
- - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/footer.html b/a-thymeleaf/src/main/resources/templates/shared/footer.html deleted file mode 100644 index 0de5f36..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/footer.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

Copyrights of lab is for student

-
\ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/head.html b/a-thymeleaf/src/main/resources/templates/shared/head.html deleted file mode 100644 index 452c561..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/head.html +++ /dev/null @@ -1,4 +0,0 @@ - - - Page Title - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/header.html b/a-thymeleaf/src/main/resources/templates/shared/header.html deleted file mode 100644 index 67fc23d..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/header.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/navbar.html b/a-thymeleaf/src/main/resources/templates/shared/navbar.html deleted file mode 100644 index 5b48dbb..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/navbar.html +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/en/a-thymeleaf/lab-work.md b/docs/en/a-thymeleaf/lab-work.md deleted file mode 100644 index 6c21076..0000000 --- a/docs/en/a-thymeleaf/lab-work.md +++ /dev/null @@ -1,73 +0,0 @@ -# Thymeleaf Lab Work - -Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. - -## Goal of the Lab Work - -The primary goal of this lab work is to provide you with practical experience and proficiency in using Thymeleaf within a Spring environment. Thymeleaf is widely utilized for server-side rendering in web development, and through these tasks, you will gain valuable insights into its configuration, usage of variables, controllers, form handling, and more. - -## Practice Tasks - -1. [Task 1: Configure Thymeleaf in Spring](practice/configure-thymeleaf.md) -2. [Task 2: Create First View](practice/create-first-view.md) -3. [Task 3: Working With Variables](practice/working-with-variables.md) -4. [Task 4: Variables and Controller](practice/variables-and-controller.md) -5. [Task 5: Iteration](practice/iteration.md) -6. [Task 6: Literals](practice/literals.md) -7. [Task 7: Forms](practice/forms.md) -8. [Task 8: Form Handling](practice/form-handling.md) -9. [Task 9: Query Parameter and Validation](practice/validation.md) -10. [Task 10: Fragments and Layouts](practice/fragments-and-layouts.md) - - -## Lab Work Tasks - -1. **Task 1: Create HTML Layout with Fragments** - - - Create individual fragments for different parts of an HTML page, such as navbar, header, head, and footer. - - Assemble these fragments in a single HTML file to form a complete layout - - For example: - ![layout.png](../../srcs/a-thymeleaf/layout.png) - -2. **Task 2: Create Home Page with Localization** - - - Implement a home page accessible at the path `/`. - - Utilize the layout created in Task 1 for structuring the home page. - - Use `#{}` expressions for all text content within the home page, demonstrating localization or messages from a file.properties file. - - For Example: - - ![home-page.png](../../srcs/a-thymeleaf/home-page.png) - -3. **Task 3: Create Login and Register Forms** - - - Design and implement login and register forms for user authentication. - - Utilize Thymeleaf's model binding to handle form data. - - For Example: - - ![login-page.png](../../srcs/a-thymeleaf/login-page.png) - - ![signup-page.png](../../srcs/a-thymeleaf/signup-page.png) - -4. **Task 4: Validate Login and Register Actions** - - - Implement validation for login and register actions. - - Use query parameters to pass error messages in case of validation failures. - - Ensure secure and proper handling of user input. - - For Example: - - ![login-validation.png](../../srcs/a-thymeleaf/login-validation.png) - -5. **Task 5: Create Users Page** - - - Develop a Users page that displays a table of users. - - Implement iteration to dynamically populate the table with user data. - - Provide functionality to delete or modify user entries from the page. - - For Example: - - ![users-page.png](../../srcs/a-thymeleaf/users-page.png) - - ![modify-user-page.png](../../srcs/a-thymeleaf/modify-user-page.png) - -Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. - -Happy coding! diff --git a/docs/en/a-thymeleaf/practice/configure-thymeleaf.md b/docs/en/a-thymeleaf/practice/configure-thymeleaf.md deleted file mode 100644 index 2c016c4..0000000 --- a/docs/en/a-thymeleaf/practice/configure-thymeleaf.md +++ /dev/null @@ -1,119 +0,0 @@ -# Configure Thymeleaf in Spring - -**Description:** - -This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. - -## **Steps:** - -1. **Create Thymeleaf Configuration Class:** - - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. - - Extend the class with `WebMvcConfigurer`. - - Example: - - ```java - package edu.labs.thymeleaf.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - @Configuration - public class WebMvcConfig implements WebMvcConfigurer { - // Configuration code goes here - } - ``` - - Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. - -2. **Configure Thymeleaf Template Resolver:** - - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. - - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. - - ```java - @Bean - public ClassLoaderTemplateResolver templateResolver() { - // Create a ClassLoaderTemplateResolver bean - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - // Set the path where Thymeleaf will find templates - templateResolver.setPrefix("/templates/"); - - // Set the file extension for templates - templateResolver.setSuffix(".html"); - - // Set the template mode to HTML - templateResolver.setTemplateMode(TemplateMode.HTML); - - // Set the character encoding for templates - templateResolver.setCharacterEncoding("UTF-8"); - - // Return the configured template resolver bean - return templateResolver; - } - ``` - -3. **Configure Message Source:** - - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. - - Set the default encoding. - - ```java - @Bean - public MessageSource messageSource() { - // Create a ReloadableResourceBundleMessageSource bean - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - - // Set the default encoding for messages - messageSource.setDefaultEncoding("UTF-8"); - - // Return the configured message source bean - return messageSource; - } - ``` - -4. **Configure Thymeleaf View Resolver:** - - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. - - Set the template engine. - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - // Create a ThymeleafViewResolver bean - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - - // Set the template engine for the view resolver - resolver.setTemplateEngine(templateEngine()); - - // Return the configured ThymeleafViewResolver bean - return resolver; - } - ``` - -5. **Configure Thymeleaf Template Engine:** - - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. - - Set the template resolver and template engine message source. - - ```java - @Bean - public SpringTemplateEngine templateEngine() { - // Create a SpringTemplateEngine bean - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - - // Set the template resolver for the template engine - templateEngine.setTemplateResolver(templateResolver()); - - // Set the template engine message source - templateEngine.setTemplateEngineMessageSource(messageSource()); - - // Return the configured SpringTemplateEngine bean - return templateEngine; - } - ``` - ---- - -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). - -# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/create-first-view.md b/docs/en/a-thymeleaf/practice/create-first-view.md deleted file mode 100644 index 30577eb..0000000 --- a/docs/en/a-thymeleaf/practice/create-first-view.md +++ /dev/null @@ -1,63 +0,0 @@ -# Create First View - -**Description:** - -In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. - -## **Steps:** - -1. **Create the View File:** - - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. - - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. - - ```plaintext - Project Directory - └── src - └── main - └── resources - └── templates - └── practice - └── first.html - ``` - - Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. - -2. **Register the View in Configuration Class:** - - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). - - Add the following method to register the Thymeleaf view: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } - ``` - - This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. - -3. **Test the View:** - - Run your Spring application. - - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. - -4. **Optional: Configure Redirect from Root Path:** - - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - - // Redirect from root path to the first view - registry.addRedirectViewController("/", "/first"); - } - ``` - - Now, visiting `http://localhost:8080/` will automatically redirect to the first view. - ---- - -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - -# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/form-handling.md b/docs/en/a-thymeleaf/practice/form-handling.md deleted file mode 100644 index c7b6b7b..0000000 --- a/docs/en/a-thymeleaf/practice/form-handling.md +++ /dev/null @@ -1,74 +0,0 @@ -# Form Handling - -**Description:** - -In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. - -**Steps:** - -1. **Show Form View (PracticeController):** - - - Open the `PracticeController` class and add a method to show the form view: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Other methods... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Explanation: - - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. - - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. - - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. - -2. **Handle Form Submission (PracticeController):** - - - Add a method in `PracticeController` to handle form submissions: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Explanation: - - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. - - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. - - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). - -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. - -# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/forms.md b/docs/en/a-thymeleaf/practice/forms.md deleted file mode 100644 index 3f4da68..0000000 --- a/docs/en/a-thymeleaf/practice/forms.md +++ /dev/null @@ -1,120 +0,0 @@ -# Forms - -**Description:** - -In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. - -**Steps:** - -1. **Create Third View (third.html):** - - - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. - - ```html - - - - - Add Student Form - - -
- Add Student - -
- -

- - -

-
-
- - - ``` - -2. **Configure Form Submission:** - - - In the `form` tag, configure the form submission details: - - ```html -
- ``` - - - Explanation: - - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. - - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. - - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. - - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. - -3. **Pass the 'id' Field:** - - - In the form, locate the section for the `id` field: - - ```html - -

- - -

- ``` - - - Explanation: - - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. - - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. - -4. **Repeat these steps:** - - - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. - - There is code example: - ```html - - - - - Add Student Form - - -
- Add Student - - - -

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- - - -
- - - ``` - -## Result -Your view should look like that: - -![third-view.png](../../../srcs/a-thymeleaf/third-view.png) - -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. - -# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/fragments-and-layouts.md b/docs/en/a-thymeleaf/practice/fragments-and-layouts.md deleted file mode 100644 index 73bfd1a..0000000 --- a/docs/en/a-thymeleaf/practice/fragments-and-layouts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Fragments and Layouts - -**Description:** - -In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. - -## **Steps:** - -1. **Update `first.html` with a Fragment:** - - - Open the `first.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
-

This is the information section of the first view.

-
- - - - ``` - -2. **Update `second.html` with a Fragment:** - - - Open the `second.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `` inside the `` tag: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Update `third.html` with a Fragment:** - - - Open the `third.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
- -
-
- - - - ``` - -4. **Create `fourth.html` with Fragments Usage:** - - - Create a new file named `fourth.html` in the `practice` directory. - - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Explanation: - - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. - - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. - -## Result -Your view should look like that: - -![fourth-view.png](../../../srcs/a-thymeleaf/fourth-view.png) - -**Conclusion:** - -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. - -# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/iteration.md b/docs/en/a-thymeleaf/practice/iteration.md deleted file mode 100644 index 516c3e8..0000000 --- a/docs/en/a-thymeleaf/practice/iteration.md +++ /dev/null @@ -1,107 +0,0 @@ -# Iteration - -**Description:** - -In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. - -**Steps:** - -1. **Create StudentModel:** - - In the `models/` package, create a `StudentModel` class with the following attributes: - - ```java - public class StudentModel { - private Integer id = 0; - private String firstName = ""; - private String sureName = ""; - private Boolean isGraduated = false; - private Integer mark = 0; - - // Constructor, getters, and setters - } - ``` - -2. **Populate List of Students in PracticeController:** - - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: - - ```java - @Controller - public class PracticeController { - private final List students = new ArrayList<>(); - - public PracticeController() { - // Populate the list with users - this.students.add(new StudentModel(1, "First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); - } - - // Rest of the controller methods - } - ``` - -3. **Pass Students to secondView:** - - In the `secondView` method of the `PracticeController`, add the list of students to the model. - - ```java - @Controller - public class PracticeController { - // Other methods... - - @GetMapping("/second") - public String secondView(Model model) { - // Pass the list of students to the view - model.addAttribute("students", students); - // Rest of the method... - } - } - ``` - -4. **Render Students Table in second.html:** - - Open the `second.html` Thymeleaf view file. - -5. **Render Table Header:** - - Add the table header section within the `` tag: - - ```html - - - - - - - - - - - -
IdFirstNamesureNameGraduatedMark
- ``` - -6. **Render Table Body with Iteration:** - - Add the table body section within the `` tag and iterate over the list of students to render each row: - - ```html - - - - - - - - - - - ``` - -## Result -Your page should look like that: - -![second-view.png](../../../srcs/a-thymeleaf/second-view.png) - -**Conclusion:** - -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. - -# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/literals.md b/docs/en/a-thymeleaf/practice/literals.md deleted file mode 100644 index a6a7730..0000000 --- a/docs/en/a-thymeleaf/practice/literals.md +++ /dev/null @@ -1,55 +0,0 @@ -# Literals - -**Description:** - -In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. - -**Steps:** - -1. **Update students-table Fragment in second.html:** - - Open the `second.html` Thymeleaf view file. - -2. **Enhance Literal for Student Id:** - - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. - - ```html - - ``` - -3. **Enhance Literal for Graduated Field:** - - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. - - ```html - - ``` - -4. **Enhance Literal for Mark Field:** - - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. - - ```html - Good - Very Good - Excellent - Not Passed - ``` - -5. **Add Literal for Diploma Type Field:** - - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. - - ```html - Blue - Blue - Red - No Diploma - ``` - -## Result -Your view should look like that: - -![second-view-enhanced.png](../../../srcs/a-thymeleaf/second-view-enhanced.png) - -**Conclusion:** - -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. - -# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/validation.md b/docs/en/a-thymeleaf/practice/validation.md deleted file mode 100644 index 88fc727..0000000 --- a/docs/en/a-thymeleaf/practice/validation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Query Parameter and Validation - -**Description:** - -In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. - -**Steps:** - -1. **Adapt the View (thirdView.html):** - - - Open the `third.html` file and add sections to display both success and error messages: - - ```html - - - - - - - - -
-

Student Added Successfully!

-
- -
-

Error:

-
- - - - - ``` - - - Explanation: - - The `
` checks if the query parameter `error` is present in the URL. - - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. - -2. **Handle Form Submission with Additional Validation (PracticeController):** - - - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Result -Your view should look like that: - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-success.png) - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-error.png) - - -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. - -# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/variables-and-controller.md b/docs/en/a-thymeleaf/practice/variables-and-controller.md deleted file mode 100644 index ca4ad12..0000000 --- a/docs/en/a-thymeleaf/practice/variables-and-controller.md +++ /dev/null @@ -1,67 +0,0 @@ -# Variables and Controller - -**Description:** - -In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. - -**Steps:** - -1. **Create the New View File:** - - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. - - ```plaintext - Project Directory - └── src - └── main - └── resources - └── templates - └── practice - └── second.html - ``` - -2. **Define the Controller:** - - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. - - ```java - @Controller - public class PracticeController { - - @GetMapping("/second") - public String secondView(Model model) { - // Pass variables to the view - model.addAttribute("title", "Second Page"); - - // Return the view name - return "practice/second"; - } - } - ``` - - This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. - -3. **Update the View to Use Controller-Passed Variable:** - - Open the `second.html` Thymeleaf view file. - - Use the `title` variable passed from the controller in the `

` tag. - - ```html - - - - - Title - - -

Welcome to the Second Page

- - Go Back to Home - - - ``` - - The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. - -**Conclusion:** - -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task - -# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/working-with-variables.md b/docs/en/a-thymeleaf/practice/working-with-variables.md deleted file mode 100644 index e8a6dd5..0000000 --- a/docs/en/a-thymeleaf/practice/working-with-variables.md +++ /dev/null @@ -1,92 +0,0 @@ -# Working with variables - -**Description:** - -In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. - -## **Steps:** - -1. **Define Local Variables in Thymeleaf View:** - - Open your Thymeleaf view file (e.g., `first.html`). - - Explore the usage of local variables defined directly within the view. - - In the example code provided: - - ```html - - - Title - - ``` - - The local variable `title` is defined within the `` section of the HTML. - -2. **Localization Variables from Properties File:** - - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: - - ```java - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames("classpath:local/practice"); - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - ``` - - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: - - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Note on `{0}`:** - - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. - - - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. - - In the example code provided: - - ```html -

-

- ``` - - The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. - -3. **Static Variables in Thymeleaf Configuration Class:** - - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - ``` - - - Access these static variables in the Thymeleaf view using the `#vars` syntax. - - In the example code provided: - - ```html -

Project Name

-

Current Date and Time

- ``` - -## Result - -now your page should look like that: - -![first-view.png](../../../srcs/a-thymeleaf/first-view.png) - -**Conclusion:** - -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. - -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. - -# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/lab-work.md b/docs/ru/a-thymeleaf/lab-work.md deleted file mode 100644 index 0cb08df..0000000 --- a/docs/ru/a-thymeleaf/lab-work.md +++ /dev/null @@ -1,74 +0,0 @@ -# Лабораторная работа по Thymeleaf - -Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. - -## Цель лабораторной работы - -Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство использования Thymeleaf в среде Spring. Thymeleaf широко используется для серверного рендеринга в веб-разработке, и через эти задачи вы получите ценные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом. - -## Практические задачи - -1. [Задача 1: Настройка Thymeleaf в Spring](practice/configure-thymeleaf.md) -2. [Задача 2: Создание первого представления](practice/create-first-view.md) -3. [Задача 3: Работа с переменными](practice/working-with-variables.md) -4. [Задача 4: Переменные и контроллер](practice/variables-and-controller.md) -5. [Задача 5: Итерация](practice/iteration.md) -6. [Задача 6: Литералы](practice/literals.md) -7. [Задача 7: Формы](practice/forms.md) -8. [Задача 8: Обработка форм](practice/form-handling.md) -9. [Задача 9: Query Parameter и валидация](practice/validation.md) -10. [Задача 10: Фрагменты и макеты](practice/fragments-and-layouts.md) - - -## Задачи лабораторной работы - -1. **Задача 1: Создание HTML-макета с фрагментами** - - - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, head и подвал. - - Соберите эти фрагменты в один HTML-файл, чтобы создать полный макет. - - Например: - - ![layout.png](../../srcs/a-thymeleaf/layout.png) - -2. **Задача 2: Создание домашней страницы с локализацией** - - - Реализуйте домашнюю страницу, доступную по пути `/`. - - Используйте созданный в Задаче 1 макет для структурирования домашней страницы. - - Используйте выражения `#{}` для всего текстового содержимого на домашней странице, демонстрируя локализацию или сообщения из файла .properties. - - Например: - - ![home-page.png](../../srcs/a-thymeleaf/home-page.png) - -3. **Задача 3: Создание форм входа и регистрации** - - - Разработайте и реализуйте формы входа и регистрации для аутентификации пользователей. - - Используйте привязку модели Thymeleaf для обработки данных формы. - - Например: - - ![login-page.png](../../srcs/a-thymeleaf/login-page.png) - - ![signup-page.png](../../srcs/a-thymeleaf/signup-page.png) - -4. **Задача 4: Валидация действий входа и регистрации** - - - Реализуйте валидацию для действий входа и регистрации. - - Используйте параметры запроса для передачи сообщений об ошибках в случае неудачной валидации. - - Обеспечьте безопасное и правильное обращение с вводом пользователя. - - Например: - - ![login-validation.png](../../srcs/a-thymeleaf/login-validation.png) - -5. **Задача 5: Создание страницы пользователей** - - - Разработайте страницу "Пользователи", отображающую таблицу пользователей. - - Реализуйте итерацию для динамического заполнения таблицы данными пользователей. - - Предоставьте функциональность удаления или изменения записей пользователя со страницы. - - Например: - - ![users-page.png](../../srcs/a-thymeleaf/users-page.png) - - ![modify-user-page.png](../../srcs/a-thymeleaf/modify-user-page.png) - -Не стесняйтесь исследовать и выполнять эти задачи в своем собственном темпе. Каждая задача разработана для дополнительного развития ваших навыков в Thymeleaf и веб-разработке. Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться. - -Счастливого кодирования! \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md b/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md deleted file mode 100644 index f767e45..0000000 --- a/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md +++ /dev/null @@ -1,119 +0,0 @@ -# Настройка Thymeleaf в Spring - -**Описание:** - -Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения беспроблемной интеграции шаблонного движка для веб-разработки. - -## **Шаги:** - -1. **Создайте Класс Конфигурации Thymeleaf:** - - В вашем проекте Spring создайте новый Java-класс, аннотированный `@Configuration`. Мы рекомендуем разместить этот класс в пакете `config`. - - Расширьте класс с `WebMvcConfigurer`. - - Пример: - - ```java - package edu.labs.thymeleaf.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - @Configuration - public class WebMvcConfig implements WebMvcConfigurer { - // Код конфигурации размещается здесь - } - ``` - - Размещение класса конфигурации в пакете `config` повышает организованность и обеспечивает четкую структуру в вашем проекте. Скорректируйте имя пакета в зависимости от структуры вашего проекта. - -2. **Настройте Разрешитель Шаблонов Thymeleaf:** - - Определите метод, аннотированный `@Bean`, для конфигурации разрешителя шаблонов Thymeleaf. - - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов. - - ```java - @Bean - public ClassLoaderTemplateResolver templateResolver() { - // Создайте bean ClassLoaderTemplateResolver - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - // Установите путь, где Thymeleaf будет искать шаблоны - templateResolver.setPrefix("/templates/"); - - // Установите расширение файла для шаблонов - templateResolver.setSuffix(".html"); - - // Установите режим шаблона в HTML - templateResolver.setTemplateMode(TemplateMode.HTML); - - // Установите кодировку символов для шаблонов - templateResolver.setCharacterEncoding("UTF-8"); - - // Верните настроенный bean разрешителя шаблонов - return templateResolver; - } - ``` - -3. **Настройте Источник Сообщений:** - - Добавьте метод, аннотированный `@Bean`, для настройки источника сообщений с использованием `ReloadableResourceBundleMessageSource`. - - Установите кодировку по умолчанию. - - ```java - @Bean - public MessageSource messageSource() { - // Создайте bean ReloadableResourceBundleMessageSource - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - - // Установите кодировку по умолчанию для сообщений - messageSource.setDefaultEncoding("UTF-8"); - - // Верните настроенный bean источника сообщений - return messageSource; - } - ``` - -4. **Настройте Разрешитель Представлений Thymeleaf:** - - Создайте метод, аннотированный `@Bean`, для настройки разрешителя представлений Thymeleaf. - - Установите шаблонный движок. - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - // Создайте bean ThymeleafViewResolver - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - - // Установите шаблонный движок для разрешителя представлений - resolver.setTemplateEngine(templateEngine()); - - // Верните настроенный bean ThymeleafViewResolver - return resolver; - } - ``` - -5. **Настройте Шаблонный Движок Thymeleaf:** - - Реализуйте метод, аннотированный `@Bean`, для настройки шаблонного движка Thymeleaf. - - Установите разрешитель шаблонов и источник сообщений шаблонного движка. - - ```java - @Bean - public SpringTemplateEngine templateEngine() { - // Создайте bean SpringTemplateEngine - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - - // Установите разрешитель шаблонов для шаблонного движка - templateEngine.setTemplateResolver(templateResolver()); - - // Установите источник сообщений шаблонного движка - templateEngine.setTemplateEngineMessageSource(messageSource()); - - // Верните настроенный bean SpringTemplateEngine - return templateEngine; - } - ``` - ---- - -**Заключение:** - -Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html). - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/create-first-view.md b/docs/ru/a-thymeleaf/practice/create-first-view.md deleted file mode 100644 index a2ed7b7..0000000 --- a/docs/ru/a-thymeleaf/practice/create-first-view.md +++ /dev/null @@ -1,63 +0,0 @@ -# Создание Первого Представления - -**Описание:** - -В данной задаче мы создадим первое представление Thymeleaf для вашего приложения Spring. Следуйте указанному пути к файлам, определенному в конфигурации Thymeleaf, и зарегистрируйте представление в приложении. - -## **Шаги:** - -1. **Создайте Файл Представления:** - - Перейдите в каталог, указанный в конфигурации Thymeleaf как префикс для шаблонов. - - По умолчанию префикс настроен как `/templates/`. Следовательно, создайте файл представления Thymeleaf в этом каталоге. - - ```plaintext - Каталог Проекта - └── src - └── main - └── resources - └── templates - └── practice - └── first.html - ``` - - Убедитесь, что файл представления имеет правильное имя (например, `first.html`). Каталог `/templates/` важен для того, чтобы Thymeleaf мог правильно находить и обрабатывать ваши шаблоны. - -2. **Зарегистрируйте Представление в Конфигурационном Классе:** - - Откройте конфигурационный класс, где вы настраивали Thymeleaf (например, `WebMvcConfig`). - - Добавьте следующий метод для регистрации представления Thymeleaf: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // Первое представление - registry.addViewController("/first").setViewName("practice/first"); - } - ``` - - Этот метод сопоставляет URL-путь `/first` с представлением Thymeleaf с именем "practice/first". Скорректируйте путь в соответствии с структурой вашего проекта. - -3. **Проверьте Представление:** - - Запустите ваше приложение Spring. - - Откройте веб-браузер и перейдите по адресу `http://localhost:8080/first`. Вы должны увидеть отображенное представление Thymeleaf. - -4. **Дополнительно: Настройте Перенаправление с Корневого Пути:** - - Чтобы установить первое представление в качестве страницы по умолчанию, вы можете добавить перенаправление с корневого пути ("/") на путь первого представления в методе `addViewControllers`: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // Первое представление - registry.addViewController("/first").setViewName("practice/first"); - - // Перенаправление с корневого пути на первое представление - registry.addRedirectViewController("/", "/first"); - } - ``` - - Теперь при посещении `http://localhost:8080/` произойдет автоматическое перенаправление на первое представление. - ---- - -**Вывод:** - -Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/form-handling.md b/docs/ru/a-thymeleaf/practice/form-handling.md deleted file mode 100644 index 607eba6..0000000 --- a/docs/ru/a-thymeleaf/practice/form-handling.md +++ /dev/null @@ -1,74 +0,0 @@ -# Обработка Формы - -**Описание:** - -В этом продолжении мы сосредоточимся на обработке отправки форм и отображении представления с использованием `PracticeController`. Это включает передачу модели в представление при его отображении и реализацию логики обработки отправки формы. - -**Шаги:** - -1. **Отображение Представления Формы (PracticeController):** - - - Откройте класс `PracticeController` и добавьте метод для отображения представления формы: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Другие методы... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Объяснение: - - `@GetMapping("/third")`: Эта аннотация сопоставляет метод с обработкой GET-запросов для конечной точки `/third`. - - `showAddStudentForm(Model model)`: Этот метод принимает параметр `Model`, добавляет в него новый объект `StudentModel` и возвращает имя представления (`"thirdView"` в данном случае). Обновлено для отражения правильного названия представления. - - Модель заполняется новым экземпляром `StudentModel`, который будет использоваться для привязки полей формы. - -2. **Обработка Отправки Формы (PracticeController):** - - - Добавьте метод в `PracticeController` для обработки отправки формы: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Другие методы... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Объяснение: - - `@PostMapping("/addStudent")`: Эта аннотация сопоставляет метод с обработкой POST-запросов для конечной точки `/addStudent`. - - `addStudent(@ModelAttribute("model") StudentModel model)`: Этот метод принимает атрибут `model` из отправленной формы (`@ModelAttribute`) и обрабатывает его. Данные формы автоматически привязываются к объекту `model`. - - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия. - - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`). - -**Заключение:** - -Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/forms.md b/docs/ru/a-thymeleaf/practice/forms.md deleted file mode 100644 index 28345b5..0000000 --- a/docs/ru/a-thymeleaf/practice/forms.md +++ /dev/null @@ -1,120 +0,0 @@ -# Формы - -**Описание:** - -В этом задании вы создадите новое представление Thymeleaf с именем `third.html` и реализуете логику обработки форм в контроллере `PracticeController`. Форма позволит пользователям добавлять новых студентов с определенными данными, и контроллер будет обрабатывать отправку формы. - -**Шаги:** - -1. **Создайте третье представление (third.html):** - - - Создайте новый файл представления Thymeleaf с именем `third.html` в каталоге `/src/main/resources/templates/practice`. - - ```html - - - - - Добавление студента - - -
- Добавление студента - -
- -

- - -

-
-
- - - ``` - -2. **Настройте отправку формы:** - - - В теге `form` настройте детали отправки формы: - - ```html -
- ``` - - - Объяснение: - - `action="#"`: Этот атрибут указывает URL, на который будут отправлены данные формы при отправке. `#` указывает, что форма будет отправлена на тот же URL, с которого она была запрошена. - - `th:action="@{/addStudent}"`: Этот атрибут Thymeleaf динамически устанавливает атрибут `action` на основе выражения Thymeleaf. `@{/addStudent}` генерирует абсолютный URL для конечной точки `/addStudent`. - - `th:object="${model}"`: Этот атрибут связывает форму с объектом-моделью (`model`). Thymeleaf использует этот объект для привязки полей формы к свойствам во время отправки формы и рендеринга. - - `method="post"`: Этот атрибут указывает HTTP-метод, используемый при отправке данных формы на сервер. Установлено значение `post`, указывающее, что данные формы будут отправлены в теле запроса. - -3. **Передайте поле 'id':** - - - В форме найдите раздел для поля `id`: - - ```html - -

- - -

- ``` - - - Объяснение: - - `th:field="*{id}"`: Этот атрибут Thymeleaf привязывает поле ввода к свойству `id` объекта `model`. Это гарантирует, что значение, введенное в поле ввода, будет установлено в свойство `id` при отправке формы. - - `id="id"` и `name="id"`: Эти атрибуты предоставляют идентификаторы для поля ввода. - -4. **Повторите эти шаги:** - - - Повторите эти шаги для каждого оставшегося поля (`firstName`, `sureName`, `isGraduated` и `mark`). Убедитесь, что вы обновляете атрибуты `label`, `id`, `name` и `th:field` соответственно. - - Вот пример кода: - ```html - - - - - Добавление студента - - -
- Добавление студента - - - -

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- - - -
- - - ``` - -## Результат -Ваше представление должно выглядеть так: - -![third-view.png](../../../srcs/a-thymeleaf/third-view.png) - -**Заключение:** - -Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md b/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md deleted file mode 100644 index faf86c1..0000000 --- a/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Фрагменты и макеты - -**Описание:** - -В этом разделе мы реализуем фрагменты и макеты Thymeleaf. Мы обновим существующие представления, чтобы включить в них фрагменты, а затем создадим новое представление, использующее эти фрагменты. - -## **Шаги:** - -1. **Обновите `first.html` с фрагментом:** - - - Откройте файл `first.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: - - ```html - - - - - - - -
-

Это информационный раздел первого представления.

-
- - - - ``` - -2. **Обновите `second.html` с фрагментом:** - - - Откройте файл `second.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `` внутри тега ``: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Обновите `third.html` с фрагментом:** - - - Откройте файл `third.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: - - ```html - - - - - - - -
- Добавление студента - -
-

Студент успешно добавлен!

-
- -
- -
-
- - - - ``` - -4. **Создайте `fourth.html` с использованием фрагментов:** - - - Создайте новый файл с именем `fourth.html` в каталоге `practice`. - - Используйте атрибуты `th:insert` и `th:replace`, чтобы включить фрагменты из других представлений: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Объяснение: - - `th:insert` используется для включения содержимого указанного фрагмента (`info` и `add-student-form`) в файл `fourth.html`. - - `th:replace` используется для замены содержимого указанного фрагмента (`students-table`) в файле `fourth.html`. - -## Результат -Ваше представление должно выглядеть так: - -![fourth-view.png](../../../srcs/a-thymeleaf/fourth-view.png) - -**Заключение:** - -Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`. - -# Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)** diff --git a/docs/ru/a-thymeleaf/practice/iteration.md b/docs/ru/a-thymeleaf/practice/iteration.md deleted file mode 100644 index b135fdf..0000000 --- a/docs/ru/a-thymeleaf/practice/iteration.md +++ /dev/null @@ -1,107 +0,0 @@ -# Итерация - -**Описание:** - -В этом задании вы изучите концепцию итерации в Thymeleaf, создав класс `StudentModel` в пакете `models/` и заполнив список студентов в контроллере `PracticeController`. Целью является передача списка студентов в представление `secondView` и отображение таблицы с данными студентов. - -**Шаги:** - -1. **Создайте класс StudentModel:** - - В пакете `models/` создайте класс `StudentModel` со следующими атрибутами: - - ```java - public class StudentModel { - private Integer id = 0; - private String firstName = ""; - private String sureName = ""; - private Boolean isGraduated = false; - private Integer mark = 0; - - // Конструктор, геттеры и сеттеры - } - ``` - -2. **Заполните список студентов в контроллере PracticeController:** - - В классе `PracticeController` создайте список `StudentModel` и заполните его фиктивными данными студентов: - - ```java - @Controller - public class PracticeController { - private final List students = new ArrayList<>(); - - public PracticeController() { - // Заполните список пользователями - this.students.add(new StudentModel(1, "First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); - } - - // Остальные методы контроллера - } - ``` - -3. **Передайте студентов в secondView:** - - В методе `secondView` контроллера `PracticeController` добавьте список студентов в модель. - - ```java - @Controller - public class PracticeController { - // Остальные методы... - - @GetMapping("/second") - public String secondView(Model model) { - // Передайте список студентов в представление - model.addAttribute("students", students); - // Остальная часть метода... - } - } - ``` - -4. **Отобразите таблицу студентов в second.html:** - - Откройте файл представления Thymeleaf `second.html`. - -5. **Отобразите заголовок таблицы:** - - Добавьте раздел заголовка таблицы внутри тега ``: - - ```html - - - - - - - - - - - -
IdFirstNamesureNameGraduatedMark
- ``` - -6. **Отобразите тело таблицы с использованием итерации:** - - Добавьте раздел тела таблицы внутри тега `` и выполните итерацию по списку студентов для отображения каждой строки: - - ```html - - - - - - - - - - - ``` - -## Результат -Ваша страница должна выглядеть так: - -![second-view.png](../../../srcs/a-thymeleaf/second-view.png) - -**Заключение:** - -Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md) diff --git a/docs/ru/a-thymeleaf/practice/literals.md b/docs/ru/a-thymeleaf/practice/literals.md deleted file mode 100644 index 15bb6d6..0000000 --- a/docs/ru/a-thymeleaf/practice/literals.md +++ /dev/null @@ -1,55 +0,0 @@ -# Литералы - -**Описание:** - -В этом задании вы улучшите представление Thymeleaf `second.html`, внедрив литералы для отображения измененных значений в зависимости от определенных условий. Литералы включают добавление константного значения к `id`, отображение "Да" или "Нет" для поля "Graduated" и предоставление описательных меток для полей "Mark" и "Diploma Type". - -**Шаги:** - -1. **Обновите фрагмент students-table в second.html:** - - Откройте файл представления Thymeleaf `second.html`. - -2. **Улучшите литерал для идентификатора студента:** - - Измените выражение для поля `id`, добавив константное значение (например, 100000) к фактическому идентификатору студента. - - ```html - - ``` - -3. **Улучшите литерал для поля "Graduated":** - - Обновите выражение для поля "Graduated" так, чтобы отображалось "Да", если студент закончил обучение, и "Нет" в противном случае. - - ```html - - ``` - -4. **Улучшите литерал для поля "Mark":** - - Добавьте условные выражения для отображения описательных меток для поля "Mark" в зависимости от оценки студента. - - ```html - Хорошо - Очень хорошо - Отлично - Не сдано - ``` - -5. **Добавьте литерал для поля "Diploma Type":** - - Добавьте условные выражения для отображения описательных меток для поля "Diploma Type" в зависимости от оценки студента и статуса окончания обучения. - - ```html - Синяя - Синяя - Красная - Нет диплома - ``` - -## Результат -Ваше представление должно выглядеть примерно так: - -![second-view-enhanced.png](../../../srcs/a-thymeleaf/second-view-enhanced.png) - -**Заключение:** - -Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md) diff --git a/docs/ru/a-thymeleaf/practice/validation.md b/docs/ru/a-thymeleaf/practice/validation.md deleted file mode 100644 index edd443b..0000000 --- a/docs/ru/a-thymeleaf/practice/validation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Запросы и валидация - -**Описание:** - -В этом продолжении мы рассмотрим использование параметров запроса для отображения сообщений в представлении после обработки отправленных форм. Это включает в себя адаптацию `thirdView` для отображения сообщений об успешном выполнении и сообщений об ошибках на основе параметров запроса. - -**Шаги:** - -1. **Адаптация представления (thirdView.html):** - - - Откройте файл `third.html` и добавьте секции для отображения сообщений об успехе и ошибок: - - ```html - - - - - - - - -
-

Студент успешно добавлен!

-
- -
-

Ошибка:

-
- - - - - ``` - - - Объяснение: - - `
` проверяет, присутствует ли параметр запроса `error` в URL. - - Если параметр присутствует, отображается сообщение об ошибке красного цвета, полученное из `${param.error}`. - -2. **Обработка отправки формы с дополнительной валидацией (PracticeController):** - - - Обновите метод `addStudent` в `PracticeController` для включения дополнительной валидации оценки студента с использованием структуры `if-else`: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Остальные методы... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Дополнительная валидация: Проверка, что оценка не более 5. - if (model.getMark() > 5) { - // Если оценка больше 5, выполняется перенаправление с сообщением об ошибке. - return "redirect:/third?error=Оценка не должна быть более 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Результат -Ваша страница должна выглядеть так: - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-success.png) - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-error.png) - - -**Заключение:** - -Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md) diff --git a/docs/ru/a-thymeleaf/practice/variables-and-controller.md b/docs/ru/a-thymeleaf/practice/variables-and-controller.md deleted file mode 100644 index b4a2d9f..0000000 --- a/docs/ru/a-thymeleaf/practice/variables-and-controller.md +++ /dev/null @@ -1,67 +0,0 @@ -# Переменные и контроллер - -**Описание:** - -В этом задании вы создадите новое представление Thymeleaf с именем `second.html` и изучите концепцию передачи переменных из контроллера в представление. Вместо определения заголовка как локальной переменной в представлении, мы передадим его через контроллер. - -**Шаги:** - -1. **Создание нового файла представления:** - - Создайте новый файл представления Thymeleaf с именем `second.html` в каталоге `/src/main/resources/templates/`. - - ```plaintext - Каталог проекта - └── src - └── main - └── resources - └── templates - └── practice - └── second.html - ``` - -2. **Определение контроллера:** - - В вашем классе контроллера (например, `PracticeController`) определите метод, который сопоставляется с URL-путем, связанным с новым представлением. Передайте нужную переменную (например, `title`) в модель. - - ```java - @Controller - public class PracticeController { - - @GetMapping("/second") - public String secondView(Model model) { - // Передача переменных в представление - model.addAttribute("title", "Вторая страница"); - - // Возврат имени представления - return "practice/second"; - } - } - ``` - - Этот метод контроллера сопоставляется с URL-путем `/second` и передает переменную `title` со значением "Вторая страница" в представление Thymeleaf. - -3. **Обновление представления для использования переменной, переданной контроллером:** - - Откройте файл представления Thymeleaf `second.html`. - - Используйте переменную `title`, переданную контроллером, в теге `

`. - - ```html - - - - - Заголовок - - -

Добро пожаловать на вторую страницу

- - Вернуться на главную - - - ``` - - Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера. - -**Заключение:** - -Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md) diff --git a/docs/ru/a-thymeleaf/practice/working-with-variables.md b/docs/ru/a-thymeleaf/practice/working-with-variables.md deleted file mode 100644 index b10623c..0000000 --- a/docs/ru/a-thymeleaf/practice/working-with-variables.md +++ /dev/null @@ -1,92 +0,0 @@ -# Работа с переменными - -**Описание:** - -В этом задании вы исследуете и используете различные типы локальных переменных в Thymeleaf в представлениях вашего приложения Spring. К ним относятся переменные, определенные непосредственно в представлении, переменные, переданные из контроллера, переменные, определенные в файле свойств для локализации, и статические переменные, определенные в классе конфигурации Thymeleaf. - -## **Шаги:** - -1. **Определение локальных переменных в представлении Thymeleaf:** - - Откройте файл представления Thymeleaf (например, `first.html`). - - Изучите использование локальных переменных, определенных непосредственно в представлении. - - В предоставленном примере кода: - - ```html - - - Title - - ``` - - Локальная переменная `title` определена внутри секции `` HTML. - -2. **Локализация переменных из файла свойств:** - - Просмотрите конфигурацию бина `MessageSource` в вашем классе конфигурации Thymeleaf: - - ```java - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames("classpath:local/practice"); - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - ``` - - Создайте файл `practice.properties` в папке `/src/main/resources/local/` и добавьте следующее содержимое: - - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Примечание о `{0}`:** - - Обозначение `{0}` в локализационных сообщениях представляет собой заполнитель для переменной. Когда сообщение отображается, заполнитель `{0}` заменяется фактическим значением, предоставленным в сообщении. Например, в сообщении `Welcome, {0}`, `{0}` будет заменено значением переменной, таким как имя. - - - Изучите использование локализованных переменных в представлении Thymeleaf с использованием синтаксиса `#{}`. - - В предоставленном примере кода: - - ```html -

-

- ``` - - Переменные `student.name`, `student.group`, `message.welcome` и `message.info` все реализуют эту идею. - -3. **Статические переменные в классе конфигурации Thymeleaf:** - - В своем классе конфигурации Thymeleaf добавьте статические переменные с использованием метода `addStaticVariable`: - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - ``` - - - Получите доступ к этим статическим переменным в представлении Thymeleaf с использованием синтаксиса `#vars`. - - В предоставленном примере кода: - - ```html -

Project Name

-

Current Date and Time

- ``` - -## Результат - -теперь ваша страница должна выглядеть так: - -![first-view.png](../../../srcs/a-thymeleaf/first-view.png) - -**Заключение:** - -Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring. - -Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md) diff --git a/docs/srcs/a-thymeleaf/first-view.png b/docs/srcs/a-thymeleaf/first-view.png deleted file mode 100644 index 01516fc51e4bbfcc81e6af9381de5c4fc0186ef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7080 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 diff --git a/docs/srcs/a-thymeleaf/fourth-view.png b/docs/srcs/a-thymeleaf/fourth-view.png deleted file mode 100644 index 63bfac4f5c10f6c3da2ace40e928fb3c04a59891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23618 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 AyZ`_I diff --git a/docs/srcs/a-thymeleaf/home-page.png b/docs/srcs/a-thymeleaf/home-page.png deleted file mode 100644 index e17aeaf8de0ea5f00e4ec4525722e47f263052d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13921 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 diff --git a/docs/srcs/a-thymeleaf/layout.png b/docs/srcs/a-thymeleaf/layout.png deleted file mode 100644 index 6f2606d7810ce7e490bcb97545e35e6779473855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50263 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�&_|BSEZT4C} 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 TxAdL5?&p~64@dFe1^xVAax%tZ diff --git a/docs/srcs/a-thymeleaf/login-page.png b/docs/srcs/a-thymeleaf/login-page.png deleted file mode 100644 index db0c84fac2ecd5c3c643db6061c52fa019fb6707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12495 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 owTH*zLbx-l7aU~10t&vWRN^l+0`6hCZ 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 V!UDM;h_XQU@9N(vy!H6E{|lEozajtt diff --git a/docs/srcs/a-thymeleaf/second-view-enhanced.png b/docs/srcs/a-thymeleaf/second-view-enhanced.png deleted file mode 100644 index ffedb8a481cffcd21cf28497550d3b86b0cbb2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10468 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 diff --git a/docs/srcs/a-thymeleaf/second-view.png b/docs/srcs/a-thymeleaf/second-view.png deleted file mode 100644 index 5bf0480f4f2de462656782c6a00dd1a6c830fa73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9090 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 FKLC`GFQNbd diff --git a/docs/srcs/a-thymeleaf/third-view-success.png b/docs/srcs/a-thymeleaf/third-view-success.png deleted file mode 100644 index 0aaa4a6a3cdfe37df4b9314aa8b78b35d0cf7967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5944 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 BJYN6+ diff --git a/docs/srcs/a-thymeleaf/users-page.png b/docs/srcs/a-thymeleaf/users-page.png deleted file mode 100644 index 70a6a767f02c76ee97a6ef4408cf02a93d9d1d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13978 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 Date: Tue, 14 May 2024 03:10:10 +0300 Subject: [PATCH 02/40] [SpringSecurity] Enhance Isolation in project. --- a-thymeleaf/build.gradle | 36 --- a-thymeleaf/gradlew | 234 ------------------ a-thymeleaf/gradlew.bat | 89 ------- a-thymeleaf/settings.gradle | 1 - .../labs/thymeleaf/ThymeleafApplication.java | 32 --- .../labs/thymeleaf/config/WebMvcConfig.java | 69 ------ .../controllers/PracticeController.java | 68 ----- .../labs/thymeleaf/models/StudentModel.java | 65 ----- .../src/main/resources/application.properties | 4 - .../main/resources/local/practice.properties | 4 - .../resources/local/shared/navbar.properties | 3 - .../resources/templates/account/login.html | 19 -- .../resources/templates/practice/first.html | 16 -- .../resources/templates/practice/fourth.html | 17 -- .../resources/templates/practice/second.html | 46 ---- .../resources/templates/practice/third.html | 67 ----- .../resources/templates/shared/footer.html | 3 - .../main/resources/templates/shared/head.html | 4 - .../resources/templates/shared/header.html | 3 - .../resources/templates/shared/navbar.html | 15 -- docs/en/a-thymeleaf/lab-work.md | 73 ------ .../practice/configure-thymeleaf.md | 119 --------- .../a-thymeleaf/practice/create-first-view.md | 63 ----- docs/en/a-thymeleaf/practice/form-handling.md | 74 ------ docs/en/a-thymeleaf/practice/forms.md | 120 --------- .../practice/fragments-and-layouts.md | 130 ---------- docs/en/a-thymeleaf/practice/iteration.md | 107 -------- docs/en/a-thymeleaf/practice/literals.md | 55 ---- docs/en/a-thymeleaf/practice/validation.md | 85 ------- .../practice/variables-and-controller.md | 67 ----- .../practice/working-with-variables.md | 92 ------- docs/ru/a-thymeleaf/lab-work.md | 74 ------ .../practice/configure-thymeleaf.md | 119 --------- .../a-thymeleaf/practice/create-first-view.md | 63 ----- docs/ru/a-thymeleaf/practice/form-handling.md | 74 ------ docs/ru/a-thymeleaf/practice/forms.md | 120 --------- .../practice/fragments-and-layouts.md | 130 ---------- docs/ru/a-thymeleaf/practice/iteration.md | 107 -------- docs/ru/a-thymeleaf/practice/literals.md | 55 ---- docs/ru/a-thymeleaf/practice/validation.md | 85 ------- .../practice/variables-and-controller.md | 67 ----- .../practice/working-with-variables.md | 92 ------- docs/srcs/a-thymeleaf/first-view.png | Bin 7080 -> 0 bytes docs/srcs/a-thymeleaf/fourth-view.png | Bin 23618 -> 0 bytes docs/srcs/a-thymeleaf/home-page.png | Bin 13921 -> 0 bytes docs/srcs/a-thymeleaf/layout.png | Bin 50263 -> 0 bytes docs/srcs/a-thymeleaf/login-page.png | Bin 12495 -> 0 bytes docs/srcs/a-thymeleaf/login-validation.png | Bin 14150 -> 0 bytes docs/srcs/a-thymeleaf/modify-user-page.png | Bin 17129 -> 0 bytes .../srcs/a-thymeleaf/second-view-enhanced.png | Bin 10468 -> 0 bytes docs/srcs/a-thymeleaf/second-view.png | Bin 9090 -> 0 bytes docs/srcs/a-thymeleaf/signup-page.png | Bin 14133 -> 0 bytes docs/srcs/a-thymeleaf/third-view-error.png | Bin 6204 -> 0 bytes docs/srcs/a-thymeleaf/third-view-success.png | Bin 5944 -> 0 bytes docs/srcs/a-thymeleaf/third-view.png | Bin 5754 -> 0 bytes docs/srcs/a-thymeleaf/users-page.png | Bin 13978 -> 0 bytes 56 files changed, 2766 deletions(-) delete mode 100644 a-thymeleaf/build.gradle delete mode 100644 a-thymeleaf/gradlew delete mode 100644 a-thymeleaf/gradlew.bat delete mode 100644 a-thymeleaf/settings.gradle delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java delete mode 100644 a-thymeleaf/src/main/resources/application.properties delete mode 100644 a-thymeleaf/src/main/resources/local/practice.properties delete mode 100644 a-thymeleaf/src/main/resources/local/shared/navbar.properties delete mode 100644 a-thymeleaf/src/main/resources/templates/account/login.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/first.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/fourth.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/second.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/third.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/footer.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/head.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/header.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/navbar.html delete mode 100644 docs/en/a-thymeleaf/lab-work.md delete mode 100644 docs/en/a-thymeleaf/practice/configure-thymeleaf.md delete mode 100644 docs/en/a-thymeleaf/practice/create-first-view.md delete mode 100644 docs/en/a-thymeleaf/practice/form-handling.md delete mode 100644 docs/en/a-thymeleaf/practice/forms.md delete mode 100644 docs/en/a-thymeleaf/practice/fragments-and-layouts.md delete mode 100644 docs/en/a-thymeleaf/practice/iteration.md delete mode 100644 docs/en/a-thymeleaf/practice/literals.md delete mode 100644 docs/en/a-thymeleaf/practice/validation.md delete mode 100644 docs/en/a-thymeleaf/practice/variables-and-controller.md delete mode 100644 docs/en/a-thymeleaf/practice/working-with-variables.md delete mode 100644 docs/ru/a-thymeleaf/lab-work.md delete mode 100644 docs/ru/a-thymeleaf/practice/configure-thymeleaf.md delete mode 100644 docs/ru/a-thymeleaf/practice/create-first-view.md delete mode 100644 docs/ru/a-thymeleaf/practice/form-handling.md delete mode 100644 docs/ru/a-thymeleaf/practice/forms.md delete mode 100644 docs/ru/a-thymeleaf/practice/fragments-and-layouts.md delete mode 100644 docs/ru/a-thymeleaf/practice/iteration.md delete mode 100644 docs/ru/a-thymeleaf/practice/literals.md delete mode 100644 docs/ru/a-thymeleaf/practice/validation.md delete mode 100644 docs/ru/a-thymeleaf/practice/variables-and-controller.md delete mode 100644 docs/ru/a-thymeleaf/practice/working-with-variables.md delete mode 100644 docs/srcs/a-thymeleaf/first-view.png delete mode 100644 docs/srcs/a-thymeleaf/fourth-view.png delete mode 100644 docs/srcs/a-thymeleaf/home-page.png delete mode 100644 docs/srcs/a-thymeleaf/layout.png delete mode 100644 docs/srcs/a-thymeleaf/login-page.png delete mode 100644 docs/srcs/a-thymeleaf/login-validation.png delete mode 100644 docs/srcs/a-thymeleaf/modify-user-page.png delete mode 100644 docs/srcs/a-thymeleaf/second-view-enhanced.png delete mode 100644 docs/srcs/a-thymeleaf/second-view.png delete mode 100644 docs/srcs/a-thymeleaf/signup-page.png delete mode 100644 docs/srcs/a-thymeleaf/third-view-error.png delete mode 100644 docs/srcs/a-thymeleaf/third-view-success.png delete mode 100644 docs/srcs/a-thymeleaf/third-view.png delete mode 100644 docs/srcs/a-thymeleaf/users-page.png diff --git a/a-thymeleaf/build.gradle b/a-thymeleaf/build.gradle deleted file mode 100644 index 2ed8e23..0000000 --- a/a-thymeleaf/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - // Java - id 'java' - - // Spring - id "org.springframework.boot" version "3.2.2" - id "io.spring.dependency-management" version "1.1.4" -} - -repositories { - mavenCentral() -} - -group = 'edu.labs.thymeleaf' -version = '1.0-SNAPSHOT' - -java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - - -dependencies { - // Spring - def springVersion = '3.2.2' - implementation "org.springframework.boot:spring-boot-starter-web" - testImplementation 'org.springframework.boot:spring-boot-starter-test' - - // Thymeleaf - def thymeleafVersion = "3.1.2.RELEASE" - implementation "org.thymeleaf:thymeleaf-spring6:$thymeleafVersion" -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/a-thymeleaf/gradlew b/a-thymeleaf/gradlew deleted file mode 100644 index 1b6c787..0000000 --- a/a-thymeleaf/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/a-thymeleaf/gradlew.bat b/a-thymeleaf/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/a-thymeleaf/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/a-thymeleaf/settings.gradle b/a-thymeleaf/settings.gradle deleted file mode 100644 index 8304350..0000000 --- a/a-thymeleaf/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'a-thymeleaf' diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java deleted file mode 100644 index add1971..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package edu.labs.thymeleaf; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; - -@SpringBootApplication -public class ThymeleafApplication { - - private static final Logger logger = LoggerFactory.getLogger(ThymeleafApplication.class); - - public static void main(String[] args) { - SpringApplication app = new SpringApplication(ThymeleafApplication.class); - ConfigurableApplicationContext context = app.run(args); - - logServerInfo(context); - } - - private static void logServerInfo(ConfigurableApplicationContext context) { - var env = context.getEnvironment(); - String port = env.getProperty("server.port"); - String contextPath = env.getProperty("server.servlet.context-path"); - - log("Server running at: http://localhost:" + port + contextPath); - } - - private static void log(String message){ - logger.info(message); - } -} \ No newline at end of file diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java deleted file mode 100644 index 2d8570b..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -package edu.labs.thymeleaf.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ReloadableResourceBundleMessageSource; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.thymeleaf.spring6.SpringTemplateEngine; -import org.thymeleaf.spring6.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; -import org.springframework.context.MessageSource; -import java.time.LocalDateTime; - -@Configuration -public class WebMvcConfig implements WebMvcConfigurer { - - - @Bean - public ClassLoaderTemplateResolver templateResolver() { - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - templateResolver.setPrefix("/templates/"); - templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode(TemplateMode.HTML); - templateResolver.setCharacterEncoding("UTF-8"); - - return templateResolver; - } - - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames( - "classpath:local/practice", - "classpath:local/shared/navbar" - ); - - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - - @Bean - public SpringTemplateEngine templateEngine() { - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(templateResolver()); - templateEngine.setTemplateEngineMessageSource(messageSource()); - - return templateEngine; - } - - - - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } -} \ No newline at end of file diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java deleted file mode 100644 index 2ba0eeb..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java +++ /dev/null @@ -1,68 +0,0 @@ -package edu.labs.thymeleaf.controllers; - -import edu.labs.thymeleaf.models.StudentModel; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; - -import java.util.ArrayList; -import java.util.List; - -@Controller -public class PracticeController { - - private final List students = new ArrayList<>(); - - public PracticeController(){ - // Populate the list with users - this.students.add(new StudentModel(1,"First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(3, "Fourth", "User", false, 3)); - } - - @GetMapping("/second") - public String secondPracticeView(Model model){ - model.addAttribute("title", "second task"); - model.addAttribute("students", this.students); - return "practice/second"; - } - - @GetMapping("/third") - public String thirdPracticeView(Model model){ - model.addAttribute("title", "third task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - - @PostMapping("/removeStudent") - public String removeStudent(){ - - return "redirect:/third?removedStudent"; - } - - @GetMapping("/fourth") - public String fourthPracticeView(Model model){ - model.addAttribute("title", "fourth task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - - return "practice/fourth"; - } -} diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java deleted file mode 100644 index 20320e3..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java +++ /dev/null @@ -1,65 +0,0 @@ -package edu.labs.thymeleaf.models; - -public class StudentModel { - private Integer id; - private String firstName; - private String sureName; - private Boolean isGraduated; - private Integer mark; - - public StudentModel() { - } - - public StudentModel(Integer id, String firstName, String sureName, Boolean isGraduated, Integer mark) { - this.id = id; - this.firstName = firstName; - this.sureName = sureName; - this.isGraduated = isGraduated; - this.mark = mark; - } - - // Getter and setter methods for id - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - // Getter and setter methods for firstName - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - // Getter and setter methods for sureName - public String getSureName() { - return sureName; - } - - public void setSureName(String sureName) { - this.sureName = sureName; - } - - // Getter and setter methods for isGraduated - public Boolean getIsGraduated() { - return isGraduated; - } - - public void setIsGraduated(Boolean isGraduated) { - this.isGraduated = isGraduated; - } - - // Getter and setter methods for mark - public Integer getMark() { - return mark; - } - - public void setMark(Integer mark) { - this.mark = mark; - } -} diff --git a/a-thymeleaf/src/main/resources/application.properties b/a-thymeleaf/src/main/resources/application.properties deleted file mode 100644 index 551dbe7..0000000 --- a/a-thymeleaf/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Server Configurations -spring.application.name= FirstLabWork -server.port=8080 -server.servlet.context-path=/ \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/local/practice.properties b/a-thymeleaf/src/main/resources/local/practice.properties deleted file mode 100644 index 8ca4c87..0000000 --- a/a-thymeleaf/src/main/resources/local/practice.properties +++ /dev/null @@ -1,4 +0,0 @@ -student.name= MyName -student.group= PRE-121 -message.welcome= Welcome, {0} -message.info= Your Group is: {0} diff --git a/a-thymeleaf/src/main/resources/local/shared/navbar.properties b/a-thymeleaf/src/main/resources/local/shared/navbar.properties deleted file mode 100644 index ebea752..0000000 --- a/a-thymeleaf/src/main/resources/local/shared/navbar.properties +++ /dev/null @@ -1,3 +0,0 @@ -nav.string.login=Login -nav.string.signup=Signup -nav.message.welcome= Welcome, {0} diff --git a/a-thymeleaf/src/main/resources/templates/account/login.html b/a-thymeleaf/src/main/resources/templates/account/login.html deleted file mode 100644 index 72f28f1..0000000 --- a/a-thymeleaf/src/main/resources/templates/account/login.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - -
-
- - -
- - - - - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/first.html b/a-thymeleaf/src/main/resources/templates/practice/first.html deleted file mode 100644 index 2b37a93..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/first.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Title - - - -

Project Name

-

Current Date and Time

-

-

-
-
Next Task - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/fourth.html b/a-thymeleaf/src/main/resources/templates/practice/fourth.html deleted file mode 100644 index dcd0056..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/fourth.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -
- - -
- - -
- - - diff --git a/a-thymeleaf/src/main/resources/templates/practice/second.html b/a-thymeleaf/src/main/resources/templates/practice/second.html deleted file mode 100644 index 50350c2..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/second.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Page Title - - - -

Default

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
GoodVery GoodExcellentNot PassedBlueBlueRedNo Diploma
- - Next Task - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/third.html b/a-thymeleaf/src/main/resources/templates/practice/third.html deleted file mode 100644 index 73ca371..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/third.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Page Title - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
-

Error:

-
- -
-

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- -
-
- -
- Remove Student - -
-

Student Removed Successfully!

-
- -
-

- - -

- -
- -
- - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/footer.html b/a-thymeleaf/src/main/resources/templates/shared/footer.html deleted file mode 100644 index 0de5f36..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/footer.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

Copyrights of lab is for student

-
\ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/head.html b/a-thymeleaf/src/main/resources/templates/shared/head.html deleted file mode 100644 index 452c561..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/head.html +++ /dev/null @@ -1,4 +0,0 @@ - - - Page Title - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/header.html b/a-thymeleaf/src/main/resources/templates/shared/header.html deleted file mode 100644 index 67fc23d..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/header.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/navbar.html b/a-thymeleaf/src/main/resources/templates/shared/navbar.html deleted file mode 100644 index 5b48dbb..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/navbar.html +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/en/a-thymeleaf/lab-work.md b/docs/en/a-thymeleaf/lab-work.md deleted file mode 100644 index 6c21076..0000000 --- a/docs/en/a-thymeleaf/lab-work.md +++ /dev/null @@ -1,73 +0,0 @@ -# Thymeleaf Lab Work - -Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. - -## Goal of the Lab Work - -The primary goal of this lab work is to provide you with practical experience and proficiency in using Thymeleaf within a Spring environment. Thymeleaf is widely utilized for server-side rendering in web development, and through these tasks, you will gain valuable insights into its configuration, usage of variables, controllers, form handling, and more. - -## Practice Tasks - -1. [Task 1: Configure Thymeleaf in Spring](practice/configure-thymeleaf.md) -2. [Task 2: Create First View](practice/create-first-view.md) -3. [Task 3: Working With Variables](practice/working-with-variables.md) -4. [Task 4: Variables and Controller](practice/variables-and-controller.md) -5. [Task 5: Iteration](practice/iteration.md) -6. [Task 6: Literals](practice/literals.md) -7. [Task 7: Forms](practice/forms.md) -8. [Task 8: Form Handling](practice/form-handling.md) -9. [Task 9: Query Parameter and Validation](practice/validation.md) -10. [Task 10: Fragments and Layouts](practice/fragments-and-layouts.md) - - -## Lab Work Tasks - -1. **Task 1: Create HTML Layout with Fragments** - - - Create individual fragments for different parts of an HTML page, such as navbar, header, head, and footer. - - Assemble these fragments in a single HTML file to form a complete layout - - For example: - ![layout.png](../../srcs/a-thymeleaf/layout.png) - -2. **Task 2: Create Home Page with Localization** - - - Implement a home page accessible at the path `/`. - - Utilize the layout created in Task 1 for structuring the home page. - - Use `#{}` expressions for all text content within the home page, demonstrating localization or messages from a file.properties file. - - For Example: - - ![home-page.png](../../srcs/a-thymeleaf/home-page.png) - -3. **Task 3: Create Login and Register Forms** - - - Design and implement login and register forms for user authentication. - - Utilize Thymeleaf's model binding to handle form data. - - For Example: - - ![login-page.png](../../srcs/a-thymeleaf/login-page.png) - - ![signup-page.png](../../srcs/a-thymeleaf/signup-page.png) - -4. **Task 4: Validate Login and Register Actions** - - - Implement validation for login and register actions. - - Use query parameters to pass error messages in case of validation failures. - - Ensure secure and proper handling of user input. - - For Example: - - ![login-validation.png](../../srcs/a-thymeleaf/login-validation.png) - -5. **Task 5: Create Users Page** - - - Develop a Users page that displays a table of users. - - Implement iteration to dynamically populate the table with user data. - - Provide functionality to delete or modify user entries from the page. - - For Example: - - ![users-page.png](../../srcs/a-thymeleaf/users-page.png) - - ![modify-user-page.png](../../srcs/a-thymeleaf/modify-user-page.png) - -Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. - -Happy coding! diff --git a/docs/en/a-thymeleaf/practice/configure-thymeleaf.md b/docs/en/a-thymeleaf/practice/configure-thymeleaf.md deleted file mode 100644 index 2c016c4..0000000 --- a/docs/en/a-thymeleaf/practice/configure-thymeleaf.md +++ /dev/null @@ -1,119 +0,0 @@ -# Configure Thymeleaf in Spring - -**Description:** - -This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. - -## **Steps:** - -1. **Create Thymeleaf Configuration Class:** - - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. - - Extend the class with `WebMvcConfigurer`. - - Example: - - ```java - package edu.labs.thymeleaf.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - @Configuration - public class WebMvcConfig implements WebMvcConfigurer { - // Configuration code goes here - } - ``` - - Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. - -2. **Configure Thymeleaf Template Resolver:** - - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. - - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. - - ```java - @Bean - public ClassLoaderTemplateResolver templateResolver() { - // Create a ClassLoaderTemplateResolver bean - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - // Set the path where Thymeleaf will find templates - templateResolver.setPrefix("/templates/"); - - // Set the file extension for templates - templateResolver.setSuffix(".html"); - - // Set the template mode to HTML - templateResolver.setTemplateMode(TemplateMode.HTML); - - // Set the character encoding for templates - templateResolver.setCharacterEncoding("UTF-8"); - - // Return the configured template resolver bean - return templateResolver; - } - ``` - -3. **Configure Message Source:** - - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. - - Set the default encoding. - - ```java - @Bean - public MessageSource messageSource() { - // Create a ReloadableResourceBundleMessageSource bean - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - - // Set the default encoding for messages - messageSource.setDefaultEncoding("UTF-8"); - - // Return the configured message source bean - return messageSource; - } - ``` - -4. **Configure Thymeleaf View Resolver:** - - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. - - Set the template engine. - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - // Create a ThymeleafViewResolver bean - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - - // Set the template engine for the view resolver - resolver.setTemplateEngine(templateEngine()); - - // Return the configured ThymeleafViewResolver bean - return resolver; - } - ``` - -5. **Configure Thymeleaf Template Engine:** - - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. - - Set the template resolver and template engine message source. - - ```java - @Bean - public SpringTemplateEngine templateEngine() { - // Create a SpringTemplateEngine bean - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - - // Set the template resolver for the template engine - templateEngine.setTemplateResolver(templateResolver()); - - // Set the template engine message source - templateEngine.setTemplateEngineMessageSource(messageSource()); - - // Return the configured SpringTemplateEngine bean - return templateEngine; - } - ``` - ---- - -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). - -# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/create-first-view.md b/docs/en/a-thymeleaf/practice/create-first-view.md deleted file mode 100644 index 30577eb..0000000 --- a/docs/en/a-thymeleaf/practice/create-first-view.md +++ /dev/null @@ -1,63 +0,0 @@ -# Create First View - -**Description:** - -In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. - -## **Steps:** - -1. **Create the View File:** - - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. - - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. - - ```plaintext - Project Directory - └── src - └── main - └── resources - └── templates - └── practice - └── first.html - ``` - - Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. - -2. **Register the View in Configuration Class:** - - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). - - Add the following method to register the Thymeleaf view: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } - ``` - - This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. - -3. **Test the View:** - - Run your Spring application. - - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. - -4. **Optional: Configure Redirect from Root Path:** - - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - - // Redirect from root path to the first view - registry.addRedirectViewController("/", "/first"); - } - ``` - - Now, visiting `http://localhost:8080/` will automatically redirect to the first view. - ---- - -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - -# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/form-handling.md b/docs/en/a-thymeleaf/practice/form-handling.md deleted file mode 100644 index c7b6b7b..0000000 --- a/docs/en/a-thymeleaf/practice/form-handling.md +++ /dev/null @@ -1,74 +0,0 @@ -# Form Handling - -**Description:** - -In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. - -**Steps:** - -1. **Show Form View (PracticeController):** - - - Open the `PracticeController` class and add a method to show the form view: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Other methods... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Explanation: - - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. - - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. - - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. - -2. **Handle Form Submission (PracticeController):** - - - Add a method in `PracticeController` to handle form submissions: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Explanation: - - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. - - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. - - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). - -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. - -# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/forms.md b/docs/en/a-thymeleaf/practice/forms.md deleted file mode 100644 index 3f4da68..0000000 --- a/docs/en/a-thymeleaf/practice/forms.md +++ /dev/null @@ -1,120 +0,0 @@ -# Forms - -**Description:** - -In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. - -**Steps:** - -1. **Create Third View (third.html):** - - - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. - - ```html - - - - - Add Student Form - - -
- Add Student - -
- -

- - -

-
-
- - - ``` - -2. **Configure Form Submission:** - - - In the `form` tag, configure the form submission details: - - ```html -
- ``` - - - Explanation: - - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. - - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. - - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. - - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. - -3. **Pass the 'id' Field:** - - - In the form, locate the section for the `id` field: - - ```html - -

- - -

- ``` - - - Explanation: - - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. - - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. - -4. **Repeat these steps:** - - - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. - - There is code example: - ```html - - - - - Add Student Form - - -
- Add Student - - - -

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- - - -
- - - ``` - -## Result -Your view should look like that: - -![third-view.png](../../../srcs/a-thymeleaf/third-view.png) - -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. - -# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/fragments-and-layouts.md b/docs/en/a-thymeleaf/practice/fragments-and-layouts.md deleted file mode 100644 index 73bfd1a..0000000 --- a/docs/en/a-thymeleaf/practice/fragments-and-layouts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Fragments and Layouts - -**Description:** - -In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. - -## **Steps:** - -1. **Update `first.html` with a Fragment:** - - - Open the `first.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
-

This is the information section of the first view.

-
- - - - ``` - -2. **Update `second.html` with a Fragment:** - - - Open the `second.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `` inside the `` tag: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Update `third.html` with a Fragment:** - - - Open the `third.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
- -
-
- - - - ``` - -4. **Create `fourth.html` with Fragments Usage:** - - - Create a new file named `fourth.html` in the `practice` directory. - - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Explanation: - - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. - - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. - -## Result -Your view should look like that: - -![fourth-view.png](../../../srcs/a-thymeleaf/fourth-view.png) - -**Conclusion:** - -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. - -# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/iteration.md b/docs/en/a-thymeleaf/practice/iteration.md deleted file mode 100644 index 516c3e8..0000000 --- a/docs/en/a-thymeleaf/practice/iteration.md +++ /dev/null @@ -1,107 +0,0 @@ -# Iteration - -**Description:** - -In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. - -**Steps:** - -1. **Create StudentModel:** - - In the `models/` package, create a `StudentModel` class with the following attributes: - - ```java - public class StudentModel { - private Integer id = 0; - private String firstName = ""; - private String sureName = ""; - private Boolean isGraduated = false; - private Integer mark = 0; - - // Constructor, getters, and setters - } - ``` - -2. **Populate List of Students in PracticeController:** - - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: - - ```java - @Controller - public class PracticeController { - private final List students = new ArrayList<>(); - - public PracticeController() { - // Populate the list with users - this.students.add(new StudentModel(1, "First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); - } - - // Rest of the controller methods - } - ``` - -3. **Pass Students to secondView:** - - In the `secondView` method of the `PracticeController`, add the list of students to the model. - - ```java - @Controller - public class PracticeController { - // Other methods... - - @GetMapping("/second") - public String secondView(Model model) { - // Pass the list of students to the view - model.addAttribute("students", students); - // Rest of the method... - } - } - ``` - -4. **Render Students Table in second.html:** - - Open the `second.html` Thymeleaf view file. - -5. **Render Table Header:** - - Add the table header section within the `` tag: - - ```html - - - - - - - - - - - -
IdFirstNamesureNameGraduatedMark
- ``` - -6. **Render Table Body with Iteration:** - - Add the table body section within the `` tag and iterate over the list of students to render each row: - - ```html - - - - - - - - - - - ``` - -## Result -Your page should look like that: - -![second-view.png](../../../srcs/a-thymeleaf/second-view.png) - -**Conclusion:** - -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. - -# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/literals.md b/docs/en/a-thymeleaf/practice/literals.md deleted file mode 100644 index a6a7730..0000000 --- a/docs/en/a-thymeleaf/practice/literals.md +++ /dev/null @@ -1,55 +0,0 @@ -# Literals - -**Description:** - -In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. - -**Steps:** - -1. **Update students-table Fragment in second.html:** - - Open the `second.html` Thymeleaf view file. - -2. **Enhance Literal for Student Id:** - - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. - - ```html - - ``` - -3. **Enhance Literal for Graduated Field:** - - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. - - ```html - - ``` - -4. **Enhance Literal for Mark Field:** - - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. - - ```html - Good - Very Good - Excellent - Not Passed - ``` - -5. **Add Literal for Diploma Type Field:** - - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. - - ```html - Blue - Blue - Red - No Diploma - ``` - -## Result -Your view should look like that: - -![second-view-enhanced.png](../../../srcs/a-thymeleaf/second-view-enhanced.png) - -**Conclusion:** - -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. - -# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/validation.md b/docs/en/a-thymeleaf/practice/validation.md deleted file mode 100644 index 88fc727..0000000 --- a/docs/en/a-thymeleaf/practice/validation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Query Parameter and Validation - -**Description:** - -In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. - -**Steps:** - -1. **Adapt the View (thirdView.html):** - - - Open the `third.html` file and add sections to display both success and error messages: - - ```html - - - - - - - - -
-

Student Added Successfully!

-
- -
-

Error:

-
- - - - - ``` - - - Explanation: - - The `
` checks if the query parameter `error` is present in the URL. - - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. - -2. **Handle Form Submission with Additional Validation (PracticeController):** - - - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Result -Your view should look like that: - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-success.png) - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-error.png) - - -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. - -# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/variables-and-controller.md b/docs/en/a-thymeleaf/practice/variables-and-controller.md deleted file mode 100644 index ca4ad12..0000000 --- a/docs/en/a-thymeleaf/practice/variables-and-controller.md +++ /dev/null @@ -1,67 +0,0 @@ -# Variables and Controller - -**Description:** - -In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. - -**Steps:** - -1. **Create the New View File:** - - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. - - ```plaintext - Project Directory - └── src - └── main - └── resources - └── templates - └── practice - └── second.html - ``` - -2. **Define the Controller:** - - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. - - ```java - @Controller - public class PracticeController { - - @GetMapping("/second") - public String secondView(Model model) { - // Pass variables to the view - model.addAttribute("title", "Second Page"); - - // Return the view name - return "practice/second"; - } - } - ``` - - This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. - -3. **Update the View to Use Controller-Passed Variable:** - - Open the `second.html` Thymeleaf view file. - - Use the `title` variable passed from the controller in the `

` tag. - - ```html - - - - - Title - - -

Welcome to the Second Page

- - Go Back to Home - - - ``` - - The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. - -**Conclusion:** - -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task - -# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/working-with-variables.md b/docs/en/a-thymeleaf/practice/working-with-variables.md deleted file mode 100644 index e8a6dd5..0000000 --- a/docs/en/a-thymeleaf/practice/working-with-variables.md +++ /dev/null @@ -1,92 +0,0 @@ -# Working with variables - -**Description:** - -In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. - -## **Steps:** - -1. **Define Local Variables in Thymeleaf View:** - - Open your Thymeleaf view file (e.g., `first.html`). - - Explore the usage of local variables defined directly within the view. - - In the example code provided: - - ```html - - - Title - - ``` - - The local variable `title` is defined within the `` section of the HTML. - -2. **Localization Variables from Properties File:** - - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: - - ```java - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames("classpath:local/practice"); - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - ``` - - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: - - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Note on `{0}`:** - - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. - - - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. - - In the example code provided: - - ```html -

-

- ``` - - The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. - -3. **Static Variables in Thymeleaf Configuration Class:** - - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - ``` - - - Access these static variables in the Thymeleaf view using the `#vars` syntax. - - In the example code provided: - - ```html -

Project Name

-

Current Date and Time

- ``` - -## Result - -now your page should look like that: - -![first-view.png](../../../srcs/a-thymeleaf/first-view.png) - -**Conclusion:** - -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. - -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. - -# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/lab-work.md b/docs/ru/a-thymeleaf/lab-work.md deleted file mode 100644 index 0cb08df..0000000 --- a/docs/ru/a-thymeleaf/lab-work.md +++ /dev/null @@ -1,74 +0,0 @@ -# Лабораторная работа по Thymeleaf - -Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. - -## Цель лабораторной работы - -Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство использования Thymeleaf в среде Spring. Thymeleaf широко используется для серверного рендеринга в веб-разработке, и через эти задачи вы получите ценные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом. - -## Практические задачи - -1. [Задача 1: Настройка Thymeleaf в Spring](practice/configure-thymeleaf.md) -2. [Задача 2: Создание первого представления](practice/create-first-view.md) -3. [Задача 3: Работа с переменными](practice/working-with-variables.md) -4. [Задача 4: Переменные и контроллер](practice/variables-and-controller.md) -5. [Задача 5: Итерация](practice/iteration.md) -6. [Задача 6: Литералы](practice/literals.md) -7. [Задача 7: Формы](practice/forms.md) -8. [Задача 8: Обработка форм](practice/form-handling.md) -9. [Задача 9: Query Parameter и валидация](practice/validation.md) -10. [Задача 10: Фрагменты и макеты](practice/fragments-and-layouts.md) - - -## Задачи лабораторной работы - -1. **Задача 1: Создание HTML-макета с фрагментами** - - - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, head и подвал. - - Соберите эти фрагменты в один HTML-файл, чтобы создать полный макет. - - Например: - - ![layout.png](../../srcs/a-thymeleaf/layout.png) - -2. **Задача 2: Создание домашней страницы с локализацией** - - - Реализуйте домашнюю страницу, доступную по пути `/`. - - Используйте созданный в Задаче 1 макет для структурирования домашней страницы. - - Используйте выражения `#{}` для всего текстового содержимого на домашней странице, демонстрируя локализацию или сообщения из файла .properties. - - Например: - - ![home-page.png](../../srcs/a-thymeleaf/home-page.png) - -3. **Задача 3: Создание форм входа и регистрации** - - - Разработайте и реализуйте формы входа и регистрации для аутентификации пользователей. - - Используйте привязку модели Thymeleaf для обработки данных формы. - - Например: - - ![login-page.png](../../srcs/a-thymeleaf/login-page.png) - - ![signup-page.png](../../srcs/a-thymeleaf/signup-page.png) - -4. **Задача 4: Валидация действий входа и регистрации** - - - Реализуйте валидацию для действий входа и регистрации. - - Используйте параметры запроса для передачи сообщений об ошибках в случае неудачной валидации. - - Обеспечьте безопасное и правильное обращение с вводом пользователя. - - Например: - - ![login-validation.png](../../srcs/a-thymeleaf/login-validation.png) - -5. **Задача 5: Создание страницы пользователей** - - - Разработайте страницу "Пользователи", отображающую таблицу пользователей. - - Реализуйте итерацию для динамического заполнения таблицы данными пользователей. - - Предоставьте функциональность удаления или изменения записей пользователя со страницы. - - Например: - - ![users-page.png](../../srcs/a-thymeleaf/users-page.png) - - ![modify-user-page.png](../../srcs/a-thymeleaf/modify-user-page.png) - -Не стесняйтесь исследовать и выполнять эти задачи в своем собственном темпе. Каждая задача разработана для дополнительного развития ваших навыков в Thymeleaf и веб-разработке. Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться. - -Счастливого кодирования! \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md b/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md deleted file mode 100644 index f767e45..0000000 --- a/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md +++ /dev/null @@ -1,119 +0,0 @@ -# Настройка Thymeleaf в Spring - -**Описание:** - -Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения беспроблемной интеграции шаблонного движка для веб-разработки. - -## **Шаги:** - -1. **Создайте Класс Конфигурации Thymeleaf:** - - В вашем проекте Spring создайте новый Java-класс, аннотированный `@Configuration`. Мы рекомендуем разместить этот класс в пакете `config`. - - Расширьте класс с `WebMvcConfigurer`. - - Пример: - - ```java - package edu.labs.thymeleaf.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - @Configuration - public class WebMvcConfig implements WebMvcConfigurer { - // Код конфигурации размещается здесь - } - ``` - - Размещение класса конфигурации в пакете `config` повышает организованность и обеспечивает четкую структуру в вашем проекте. Скорректируйте имя пакета в зависимости от структуры вашего проекта. - -2. **Настройте Разрешитель Шаблонов Thymeleaf:** - - Определите метод, аннотированный `@Bean`, для конфигурации разрешителя шаблонов Thymeleaf. - - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов. - - ```java - @Bean - public ClassLoaderTemplateResolver templateResolver() { - // Создайте bean ClassLoaderTemplateResolver - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - // Установите путь, где Thymeleaf будет искать шаблоны - templateResolver.setPrefix("/templates/"); - - // Установите расширение файла для шаблонов - templateResolver.setSuffix(".html"); - - // Установите режим шаблона в HTML - templateResolver.setTemplateMode(TemplateMode.HTML); - - // Установите кодировку символов для шаблонов - templateResolver.setCharacterEncoding("UTF-8"); - - // Верните настроенный bean разрешителя шаблонов - return templateResolver; - } - ``` - -3. **Настройте Источник Сообщений:** - - Добавьте метод, аннотированный `@Bean`, для настройки источника сообщений с использованием `ReloadableResourceBundleMessageSource`. - - Установите кодировку по умолчанию. - - ```java - @Bean - public MessageSource messageSource() { - // Создайте bean ReloadableResourceBundleMessageSource - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - - // Установите кодировку по умолчанию для сообщений - messageSource.setDefaultEncoding("UTF-8"); - - // Верните настроенный bean источника сообщений - return messageSource; - } - ``` - -4. **Настройте Разрешитель Представлений Thymeleaf:** - - Создайте метод, аннотированный `@Bean`, для настройки разрешителя представлений Thymeleaf. - - Установите шаблонный движок. - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - // Создайте bean ThymeleafViewResolver - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - - // Установите шаблонный движок для разрешителя представлений - resolver.setTemplateEngine(templateEngine()); - - // Верните настроенный bean ThymeleafViewResolver - return resolver; - } - ``` - -5. **Настройте Шаблонный Движок Thymeleaf:** - - Реализуйте метод, аннотированный `@Bean`, для настройки шаблонного движка Thymeleaf. - - Установите разрешитель шаблонов и источник сообщений шаблонного движка. - - ```java - @Bean - public SpringTemplateEngine templateEngine() { - // Создайте bean SpringTemplateEngine - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - - // Установите разрешитель шаблонов для шаблонного движка - templateEngine.setTemplateResolver(templateResolver()); - - // Установите источник сообщений шаблонного движка - templateEngine.setTemplateEngineMessageSource(messageSource()); - - // Верните настроенный bean SpringTemplateEngine - return templateEngine; - } - ``` - ---- - -**Заключение:** - -Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html). - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/create-first-view.md b/docs/ru/a-thymeleaf/practice/create-first-view.md deleted file mode 100644 index a2ed7b7..0000000 --- a/docs/ru/a-thymeleaf/practice/create-first-view.md +++ /dev/null @@ -1,63 +0,0 @@ -# Создание Первого Представления - -**Описание:** - -В данной задаче мы создадим первое представление Thymeleaf для вашего приложения Spring. Следуйте указанному пути к файлам, определенному в конфигурации Thymeleaf, и зарегистрируйте представление в приложении. - -## **Шаги:** - -1. **Создайте Файл Представления:** - - Перейдите в каталог, указанный в конфигурации Thymeleaf как префикс для шаблонов. - - По умолчанию префикс настроен как `/templates/`. Следовательно, создайте файл представления Thymeleaf в этом каталоге. - - ```plaintext - Каталог Проекта - └── src - └── main - └── resources - └── templates - └── practice - └── first.html - ``` - - Убедитесь, что файл представления имеет правильное имя (например, `first.html`). Каталог `/templates/` важен для того, чтобы Thymeleaf мог правильно находить и обрабатывать ваши шаблоны. - -2. **Зарегистрируйте Представление в Конфигурационном Классе:** - - Откройте конфигурационный класс, где вы настраивали Thymeleaf (например, `WebMvcConfig`). - - Добавьте следующий метод для регистрации представления Thymeleaf: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // Первое представление - registry.addViewController("/first").setViewName("practice/first"); - } - ``` - - Этот метод сопоставляет URL-путь `/first` с представлением Thymeleaf с именем "practice/first". Скорректируйте путь в соответствии с структурой вашего проекта. - -3. **Проверьте Представление:** - - Запустите ваше приложение Spring. - - Откройте веб-браузер и перейдите по адресу `http://localhost:8080/first`. Вы должны увидеть отображенное представление Thymeleaf. - -4. **Дополнительно: Настройте Перенаправление с Корневого Пути:** - - Чтобы установить первое представление в качестве страницы по умолчанию, вы можете добавить перенаправление с корневого пути ("/") на путь первого представления в методе `addViewControllers`: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // Первое представление - registry.addViewController("/first").setViewName("practice/first"); - - // Перенаправление с корневого пути на первое представление - registry.addRedirectViewController("/", "/first"); - } - ``` - - Теперь при посещении `http://localhost:8080/` произойдет автоматическое перенаправление на первое представление. - ---- - -**Вывод:** - -Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/form-handling.md b/docs/ru/a-thymeleaf/practice/form-handling.md deleted file mode 100644 index 607eba6..0000000 --- a/docs/ru/a-thymeleaf/practice/form-handling.md +++ /dev/null @@ -1,74 +0,0 @@ -# Обработка Формы - -**Описание:** - -В этом продолжении мы сосредоточимся на обработке отправки форм и отображении представления с использованием `PracticeController`. Это включает передачу модели в представление при его отображении и реализацию логики обработки отправки формы. - -**Шаги:** - -1. **Отображение Представления Формы (PracticeController):** - - - Откройте класс `PracticeController` и добавьте метод для отображения представления формы: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Другие методы... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Объяснение: - - `@GetMapping("/third")`: Эта аннотация сопоставляет метод с обработкой GET-запросов для конечной точки `/third`. - - `showAddStudentForm(Model model)`: Этот метод принимает параметр `Model`, добавляет в него новый объект `StudentModel` и возвращает имя представления (`"thirdView"` в данном случае). Обновлено для отражения правильного названия представления. - - Модель заполняется новым экземпляром `StudentModel`, который будет использоваться для привязки полей формы. - -2. **Обработка Отправки Формы (PracticeController):** - - - Добавьте метод в `PracticeController` для обработки отправки формы: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Другие методы... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Объяснение: - - `@PostMapping("/addStudent")`: Эта аннотация сопоставляет метод с обработкой POST-запросов для конечной точки `/addStudent`. - - `addStudent(@ModelAttribute("model") StudentModel model)`: Этот метод принимает атрибут `model` из отправленной формы (`@ModelAttribute`) и обрабатывает его. Данные формы автоматически привязываются к объекту `model`. - - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия. - - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`). - -**Заключение:** - -Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/forms.md b/docs/ru/a-thymeleaf/practice/forms.md deleted file mode 100644 index 28345b5..0000000 --- a/docs/ru/a-thymeleaf/practice/forms.md +++ /dev/null @@ -1,120 +0,0 @@ -# Формы - -**Описание:** - -В этом задании вы создадите новое представление Thymeleaf с именем `third.html` и реализуете логику обработки форм в контроллере `PracticeController`. Форма позволит пользователям добавлять новых студентов с определенными данными, и контроллер будет обрабатывать отправку формы. - -**Шаги:** - -1. **Создайте третье представление (third.html):** - - - Создайте новый файл представления Thymeleaf с именем `third.html` в каталоге `/src/main/resources/templates/practice`. - - ```html - - - - - Добавление студента - - -
- Добавление студента - -
- -

- - -

-
-
- - - ``` - -2. **Настройте отправку формы:** - - - В теге `form` настройте детали отправки формы: - - ```html -
- ``` - - - Объяснение: - - `action="#"`: Этот атрибут указывает URL, на который будут отправлены данные формы при отправке. `#` указывает, что форма будет отправлена на тот же URL, с которого она была запрошена. - - `th:action="@{/addStudent}"`: Этот атрибут Thymeleaf динамически устанавливает атрибут `action` на основе выражения Thymeleaf. `@{/addStudent}` генерирует абсолютный URL для конечной точки `/addStudent`. - - `th:object="${model}"`: Этот атрибут связывает форму с объектом-моделью (`model`). Thymeleaf использует этот объект для привязки полей формы к свойствам во время отправки формы и рендеринга. - - `method="post"`: Этот атрибут указывает HTTP-метод, используемый при отправке данных формы на сервер. Установлено значение `post`, указывающее, что данные формы будут отправлены в теле запроса. - -3. **Передайте поле 'id':** - - - В форме найдите раздел для поля `id`: - - ```html - -

- - -

- ``` - - - Объяснение: - - `th:field="*{id}"`: Этот атрибут Thymeleaf привязывает поле ввода к свойству `id` объекта `model`. Это гарантирует, что значение, введенное в поле ввода, будет установлено в свойство `id` при отправке формы. - - `id="id"` и `name="id"`: Эти атрибуты предоставляют идентификаторы для поля ввода. - -4. **Повторите эти шаги:** - - - Повторите эти шаги для каждого оставшегося поля (`firstName`, `sureName`, `isGraduated` и `mark`). Убедитесь, что вы обновляете атрибуты `label`, `id`, `name` и `th:field` соответственно. - - Вот пример кода: - ```html - - - - - Добавление студента - - -
- Добавление студента - - - -

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- - - -
- - - ``` - -## Результат -Ваше представление должно выглядеть так: - -![third-view.png](../../../srcs/a-thymeleaf/third-view.png) - -**Заключение:** - -Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md b/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md deleted file mode 100644 index faf86c1..0000000 --- a/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Фрагменты и макеты - -**Описание:** - -В этом разделе мы реализуем фрагменты и макеты Thymeleaf. Мы обновим существующие представления, чтобы включить в них фрагменты, а затем создадим новое представление, использующее эти фрагменты. - -## **Шаги:** - -1. **Обновите `first.html` с фрагментом:** - - - Откройте файл `first.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: - - ```html - - - - - - - -
-

Это информационный раздел первого представления.

-
- - - - ``` - -2. **Обновите `second.html` с фрагментом:** - - - Откройте файл `second.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `` внутри тега ``: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Обновите `third.html` с фрагментом:** - - - Откройте файл `third.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: - - ```html - - - - - - - -
- Добавление студента - -
-

Студент успешно добавлен!

-
- -
- -
-
- - - - ``` - -4. **Создайте `fourth.html` с использованием фрагментов:** - - - Создайте новый файл с именем `fourth.html` в каталоге `practice`. - - Используйте атрибуты `th:insert` и `th:replace`, чтобы включить фрагменты из других представлений: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Объяснение: - - `th:insert` используется для включения содержимого указанного фрагмента (`info` и `add-student-form`) в файл `fourth.html`. - - `th:replace` используется для замены содержимого указанного фрагмента (`students-table`) в файле `fourth.html`. - -## Результат -Ваше представление должно выглядеть так: - -![fourth-view.png](../../../srcs/a-thymeleaf/fourth-view.png) - -**Заключение:** - -Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`. - -# Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)** diff --git a/docs/ru/a-thymeleaf/practice/iteration.md b/docs/ru/a-thymeleaf/practice/iteration.md deleted file mode 100644 index b135fdf..0000000 --- a/docs/ru/a-thymeleaf/practice/iteration.md +++ /dev/null @@ -1,107 +0,0 @@ -# Итерация - -**Описание:** - -В этом задании вы изучите концепцию итерации в Thymeleaf, создав класс `StudentModel` в пакете `models/` и заполнив список студентов в контроллере `PracticeController`. Целью является передача списка студентов в представление `secondView` и отображение таблицы с данными студентов. - -**Шаги:** - -1. **Создайте класс StudentModel:** - - В пакете `models/` создайте класс `StudentModel` со следующими атрибутами: - - ```java - public class StudentModel { - private Integer id = 0; - private String firstName = ""; - private String sureName = ""; - private Boolean isGraduated = false; - private Integer mark = 0; - - // Конструктор, геттеры и сеттеры - } - ``` - -2. **Заполните список студентов в контроллере PracticeController:** - - В классе `PracticeController` создайте список `StudentModel` и заполните его фиктивными данными студентов: - - ```java - @Controller - public class PracticeController { - private final List students = new ArrayList<>(); - - public PracticeController() { - // Заполните список пользователями - this.students.add(new StudentModel(1, "First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); - } - - // Остальные методы контроллера - } - ``` - -3. **Передайте студентов в secondView:** - - В методе `secondView` контроллера `PracticeController` добавьте список студентов в модель. - - ```java - @Controller - public class PracticeController { - // Остальные методы... - - @GetMapping("/second") - public String secondView(Model model) { - // Передайте список студентов в представление - model.addAttribute("students", students); - // Остальная часть метода... - } - } - ``` - -4. **Отобразите таблицу студентов в second.html:** - - Откройте файл представления Thymeleaf `second.html`. - -5. **Отобразите заголовок таблицы:** - - Добавьте раздел заголовка таблицы внутри тега ``: - - ```html - - - - - - - - - - - -
IdFirstNamesureNameGraduatedMark
- ``` - -6. **Отобразите тело таблицы с использованием итерации:** - - Добавьте раздел тела таблицы внутри тега `` и выполните итерацию по списку студентов для отображения каждой строки: - - ```html - - - - - - - - - - - ``` - -## Результат -Ваша страница должна выглядеть так: - -![second-view.png](../../../srcs/a-thymeleaf/second-view.png) - -**Заключение:** - -Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md) diff --git a/docs/ru/a-thymeleaf/practice/literals.md b/docs/ru/a-thymeleaf/practice/literals.md deleted file mode 100644 index 15bb6d6..0000000 --- a/docs/ru/a-thymeleaf/practice/literals.md +++ /dev/null @@ -1,55 +0,0 @@ -# Литералы - -**Описание:** - -В этом задании вы улучшите представление Thymeleaf `second.html`, внедрив литералы для отображения измененных значений в зависимости от определенных условий. Литералы включают добавление константного значения к `id`, отображение "Да" или "Нет" для поля "Graduated" и предоставление описательных меток для полей "Mark" и "Diploma Type". - -**Шаги:** - -1. **Обновите фрагмент students-table в second.html:** - - Откройте файл представления Thymeleaf `second.html`. - -2. **Улучшите литерал для идентификатора студента:** - - Измените выражение для поля `id`, добавив константное значение (например, 100000) к фактическому идентификатору студента. - - ```html - - ``` - -3. **Улучшите литерал для поля "Graduated":** - - Обновите выражение для поля "Graduated" так, чтобы отображалось "Да", если студент закончил обучение, и "Нет" в противном случае. - - ```html - - ``` - -4. **Улучшите литерал для поля "Mark":** - - Добавьте условные выражения для отображения описательных меток для поля "Mark" в зависимости от оценки студента. - - ```html - Хорошо - Очень хорошо - Отлично - Не сдано - ``` - -5. **Добавьте литерал для поля "Diploma Type":** - - Добавьте условные выражения для отображения описательных меток для поля "Diploma Type" в зависимости от оценки студента и статуса окончания обучения. - - ```html - Синяя - Синяя - Красная - Нет диплома - ``` - -## Результат -Ваше представление должно выглядеть примерно так: - -![second-view-enhanced.png](../../../srcs/a-thymeleaf/second-view-enhanced.png) - -**Заключение:** - -Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md) diff --git a/docs/ru/a-thymeleaf/practice/validation.md b/docs/ru/a-thymeleaf/practice/validation.md deleted file mode 100644 index edd443b..0000000 --- a/docs/ru/a-thymeleaf/practice/validation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Запросы и валидация - -**Описание:** - -В этом продолжении мы рассмотрим использование параметров запроса для отображения сообщений в представлении после обработки отправленных форм. Это включает в себя адаптацию `thirdView` для отображения сообщений об успешном выполнении и сообщений об ошибках на основе параметров запроса. - -**Шаги:** - -1. **Адаптация представления (thirdView.html):** - - - Откройте файл `third.html` и добавьте секции для отображения сообщений об успехе и ошибок: - - ```html - - - - - - - - -
-

Студент успешно добавлен!

-
- -
-

Ошибка:

-
- - - - - ``` - - - Объяснение: - - `
` проверяет, присутствует ли параметр запроса `error` в URL. - - Если параметр присутствует, отображается сообщение об ошибке красного цвета, полученное из `${param.error}`. - -2. **Обработка отправки формы с дополнительной валидацией (PracticeController):** - - - Обновите метод `addStudent` в `PracticeController` для включения дополнительной валидации оценки студента с использованием структуры `if-else`: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Остальные методы... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Дополнительная валидация: Проверка, что оценка не более 5. - if (model.getMark() > 5) { - // Если оценка больше 5, выполняется перенаправление с сообщением об ошибке. - return "redirect:/third?error=Оценка не должна быть более 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Результат -Ваша страница должна выглядеть так: - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-success.png) - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-error.png) - - -**Заключение:** - -Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md) diff --git a/docs/ru/a-thymeleaf/practice/variables-and-controller.md b/docs/ru/a-thymeleaf/practice/variables-and-controller.md deleted file mode 100644 index b4a2d9f..0000000 --- a/docs/ru/a-thymeleaf/practice/variables-and-controller.md +++ /dev/null @@ -1,67 +0,0 @@ -# Переменные и контроллер - -**Описание:** - -В этом задании вы создадите новое представление Thymeleaf с именем `second.html` и изучите концепцию передачи переменных из контроллера в представление. Вместо определения заголовка как локальной переменной в представлении, мы передадим его через контроллер. - -**Шаги:** - -1. **Создание нового файла представления:** - - Создайте новый файл представления Thymeleaf с именем `second.html` в каталоге `/src/main/resources/templates/`. - - ```plaintext - Каталог проекта - └── src - └── main - └── resources - └── templates - └── practice - └── second.html - ``` - -2. **Определение контроллера:** - - В вашем классе контроллера (например, `PracticeController`) определите метод, который сопоставляется с URL-путем, связанным с новым представлением. Передайте нужную переменную (например, `title`) в модель. - - ```java - @Controller - public class PracticeController { - - @GetMapping("/second") - public String secondView(Model model) { - // Передача переменных в представление - model.addAttribute("title", "Вторая страница"); - - // Возврат имени представления - return "practice/second"; - } - } - ``` - - Этот метод контроллера сопоставляется с URL-путем `/second` и передает переменную `title` со значением "Вторая страница" в представление Thymeleaf. - -3. **Обновление представления для использования переменной, переданной контроллером:** - - Откройте файл представления Thymeleaf `second.html`. - - Используйте переменную `title`, переданную контроллером, в теге `

`. - - ```html - - - - - Заголовок - - -

Добро пожаловать на вторую страницу

- - Вернуться на главную - - - ``` - - Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера. - -**Заключение:** - -Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md) diff --git a/docs/ru/a-thymeleaf/practice/working-with-variables.md b/docs/ru/a-thymeleaf/practice/working-with-variables.md deleted file mode 100644 index b10623c..0000000 --- a/docs/ru/a-thymeleaf/practice/working-with-variables.md +++ /dev/null @@ -1,92 +0,0 @@ -# Работа с переменными - -**Описание:** - -В этом задании вы исследуете и используете различные типы локальных переменных в Thymeleaf в представлениях вашего приложения Spring. К ним относятся переменные, определенные непосредственно в представлении, переменные, переданные из контроллера, переменные, определенные в файле свойств для локализации, и статические переменные, определенные в классе конфигурации Thymeleaf. - -## **Шаги:** - -1. **Определение локальных переменных в представлении Thymeleaf:** - - Откройте файл представления Thymeleaf (например, `first.html`). - - Изучите использование локальных переменных, определенных непосредственно в представлении. - - В предоставленном примере кода: - - ```html - - - Title - - ``` - - Локальная переменная `title` определена внутри секции `` HTML. - -2. **Локализация переменных из файла свойств:** - - Просмотрите конфигурацию бина `MessageSource` в вашем классе конфигурации Thymeleaf: - - ```java - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames("classpath:local/practice"); - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - ``` - - Создайте файл `practice.properties` в папке `/src/main/resources/local/` и добавьте следующее содержимое: - - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Примечание о `{0}`:** - - Обозначение `{0}` в локализационных сообщениях представляет собой заполнитель для переменной. Когда сообщение отображается, заполнитель `{0}` заменяется фактическим значением, предоставленным в сообщении. Например, в сообщении `Welcome, {0}`, `{0}` будет заменено значением переменной, таким как имя. - - - Изучите использование локализованных переменных в представлении Thymeleaf с использованием синтаксиса `#{}`. - - В предоставленном примере кода: - - ```html -

-

- ``` - - Переменные `student.name`, `student.group`, `message.welcome` и `message.info` все реализуют эту идею. - -3. **Статические переменные в классе конфигурации Thymeleaf:** - - В своем классе конфигурации Thymeleaf добавьте статические переменные с использованием метода `addStaticVariable`: - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - ``` - - - Получите доступ к этим статическим переменным в представлении Thymeleaf с использованием синтаксиса `#vars`. - - В предоставленном примере кода: - - ```html -

Project Name

-

Current Date and Time

- ``` - -## Результат - -теперь ваша страница должна выглядеть так: - -![first-view.png](../../../srcs/a-thymeleaf/first-view.png) - -**Заключение:** - -Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring. - -Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md) diff --git a/docs/srcs/a-thymeleaf/first-view.png b/docs/srcs/a-thymeleaf/first-view.png deleted file mode 100644 index 01516fc51e4bbfcc81e6af9381de5c4fc0186ef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7080 zcmd5>`8yQe+g7QlBw4aoW34cS$X*#rma%0UTQSxcSq3wfN->s9mLUn*_kCYx=p)&Q z!5GUB#ya+yvGe+T-@oDgUhgmGx_^0=^PKCs&wZW~uCMou+*^28J_$ zQ@qD?;dBkT|7eYYfe)qydSdKny_(V-$={yZve3^h1=07I39yBZ>0iFuG(CMmuI~K# z*Z!=(W?CdZ$VA3LJ$^tAAHNa4a8cFaXDIEQiiz?^({Ni3ZuDBJEho3h`)L-D(M)7I|g@wxpO9jjBZVOY#M@DBDn6xgkoq6nZjg5ivU*Pe7 z3vy#nqU|b6-ij=VC6?Io+t~2~PjBVe&K|whSz9{gd5zlAi(KT(n)T1*K&enT4T7ac zi@~=NUzn4od{k{8@P>=q(YK80rKZOF$>CAKq{QA5T%ayu-T#(U3NeYo2mOONYF~#j z&;6X3{DPe=*CF}U>@7ncBzNulnT`aGli2X>2cE@u(HkWE3s6MlO&8vr8R9F_{YvPO zE%kk;6QH#i7eyJ4FjZd~#ta}qfMlN~H6PbJ6VRPXvG6Ma<5Foc6!{LJrsgUxgUV0^ zOdMohwIKbbY9$=t5FyVeMh!AW8BS^w@2Ip`7z7hhJG zobsSI(kDkrZV&wx;#bXNMF6oclZD2j5$g1@k2$pBud1Vxlkoam87~(GL387!Uiw@$ z_kPK`Q1_J0>rp1*otx?3^;WByaR}!cf@~^B> zI(~mH9Mr`x236cvx~R@WG~c?9^hw|^4b|V=TpkWdrI3{3Iw4+DOWW@$mgU>7QrOv( zd-YN_JkTEdEx%jHTDdtFxl#_61-TkHdGRgr0W*FIOkRY8M=ArX%+V!BpgwJc{Pv$B z+)otq6 ziFI8i@ppZSwNX8Zmsqh$MF=ZnHhq(|JRJ9K&_G7IKg3op0J}=C0=moNuVVK7<5&VS z<+jxk*rto{UeM)Hkeirr96NYfku)Y55eFC63Rw05SiNHS!Z~yD6Hg3da<6x9u%& znPx+$ePK|5eC#_?y~j30PS*80H^Nqvuz44vhQW{Tms=47^A=ux0Suw4yUG|`HFV!Y9>#tE?r}3mZssy~ z+ui|4C*&zLZklg7(54s4Wqu88W)B}V_(dt>Ak?p0f&-Q6m9^y$n}c-7hbwHMeZ$D{}OWm>pS9S>apw2kWq7 zafPekrdJ2)2yh+qpeG813=Cq+=hNLm7&{6+L0_$!%_MDfY6liJD0pL?|M4`7K+PB5 zvavv-tJV->x;Bm3y=+7l>^N|(pqfSH(okvj-}jCOyCk@@sTb7fYH@l<@|1#xeY2xI zGf=SN$Wgkqg1(o|^#~5@RB2|@PZfLynQ$%1U;nh+F5}DHyc(Fgqm!$)-XoULsWsFp z6`a^BUh8KbN3wD&x!+J?rKD@dyPkxigf6wlYn&L2fo#y^x#*GZjU4#|+-62P7RxK& zT*7qS_f5ny0@>?B!#+P+RG0BuB8|qqT53wPl5!9f zW8Hyfj>ly#K--hmW$fw)<66bEzaL!$o(7|*v=l%+MV|$aeW^|k@eAtG>33P|%e~=# z%lPj+f%C~zUE9$mS3f?oH&yOG+Z;mf%69Sa&%7micgY2vpqBn{NF z;=|6kC=qEIGKHC_c)O4;f@u!GV- z)a74qEKkx^B8uG>ah-qW(e=p-1ePnAQQuQ_bE%m|ahG`l90UoPS=-arUb=xm3pJZ$ z@U`LY&$(ktpw21@mFhefYP=@|G4hpok$muj~l=W z37wqAtqhbDjT}Zd7Zijy;_PEs^PmL+xXC!-Q2M+!qzm^+OZRm}Tr2G3>^Y0)eT7gKB z*RJimkjA2d6V6X<%VMkL2!sRzSb-c57%;~8(wd*y;~2k5?z4z@`g+TFq<(Ss@ekZ2 z+-?EiW5XO>{+zOM;JIJnmbnu+!#2qh{6dXc{3jvPpnGg2Ju1j2Ou5`1SB+5K6Jw&| z#vb5ug;kle4p!oR;K0f=%#f9T9Dpu3o5){PX)4Df;mfZG$>?vh7ShPS$#&rhU|;f_ zZ?L4KiQ3p7;ulX@orW~JOBEOYMqS z+V0O(K2?y$jHLtxJJ&`Ks;t+7zxX@e%564fd@Ef3H>H<)Zn(tq=(TC|R-@CTk3Z>B zs&&T_c5+5t8#Dh|fOv3hEOoaceO^zqJ&^cTRa~VUm+sR4`rk$ek$sVBLGNV_Y~>Dq z_^vjb*v)k{&9^?S4RcxFsSUB7xSWjT?c7)^Nodc~N!+{rpicHW8$%291B&6+BNP+E zhmikg0B;S7lTm2E-f>Nd_HHnRZqs9;tjCo&dj!|DO;=YS4F{fbm1yzwVgFpu&5h^q z+L5>;C9C@Vwi14o)KR68`cprI1xPRP8?a1H7|^~fn|HqEip?1EUXG_{H~tHrJT_S# z_%6|8A<#=I1mgVok+x|K8d!9$tL_UPNKkPGb<=QByyuB#S4(r-tF9Rou3+c~1bhxD z!9Z`L9B&D#ET`gsj3JFDuI94B@tVHk(Iy!T^$zlV0rjF`{giXcRf_96eK=x5Yx@mp zqciyD z>-1RWiQvhEpW6gkBq=}BMCI|`>uRGE8AQ;(a1i9m-koI zzNtw>ywWFnIEv1~BcPk)5ctF*|Xu23O;zKr^w?V-W2HQC-Bbnk=NT z96uRMq@!3{COKfKYb}KLj)bSR0sF8JPeAo6-5mF>X3_aeDJbE^>bEc^B9J zt#ht14duy|SKHuuwyZvYZAqs{%*=wu6Jg-A{{|e3{ znX*;qyu=R2v%d>-0DSx20XNT-5;z;b;SjIpzUB=lS1r#s{MxoY{J}Duq2x1e$`?0F z&=zfs^uL`l0&qcM-F9p~hSE%|^caG^g*)|W4M-2oQtj)iB*ieAW;6bd256D-lX)#A zwl>%^)21uVRGor^hE%P8PwwRP&Tgt3vBsFd_p z@l}C*0q$TFL0>keHy2*r7*UsT_Q!frnz^C08Z(76vRnqr%u9Rmw}M@X zyYZ*ubs1T@_L7K0in1R-AJGOaeNFYM(b7OciU`=V2M8`M%V|nRt~ACe0v6RE0IrMJsx|g1nwOpj7xVh|M-N;+Kmlx)!%-b zt?HZp;g#tHFkb7^sd7245(>GokCnM3%E?VUHZ7WV_9HE|PDZS!HdOGiboMC0_xyp; zh0W>9-f}KTlkM>5yf!es!lPo>8j_HUDXjaB*gH7DP^WKh!(_kTH80qGrcb{wP`+t5 zEqk#OL0Tl(A5{u0-9%3)6&urZ40%(06AryNO3x(aNQJeP0VcspXB2NrY8p; zgDzDL(4%|*@CXbsMqE#TVZ)wU!lwhoqq3TZ@r>4j0sCt-Iai5sgXmY4kH0?yz< zjlFTHR`x1ejN_y47~hy$$`}Tf;Z3oN3OLZPw{&d3ds%4RCAqYn0&%SHGyf;-={+_c zmOoC9Y8b0p4BMSpRM+((y%ovv59mSEurv@EKER| zZ(dpj*)yU?$_85oLKH7cRF^PSNR%nhXodVFcx?NatM{IJz@qm|2cd}bNv(1nAun`< zv;i9t5iRm(O)vj5@FZd3I$OAZkpZs8SeosQ1doXPxs|U?Z`_s|E4)W)t!h2~-Ht4Ox{8?&hp~Zb&0#ThaaFa!;Yv7#C4PAtk z-Bz6?=y%PVlU(&;LV6h}YlIui#kpJ4RFwS5#PPR}33HCapRSt{Dj+83F&igQB z2V2@O$k}SP+CxNNEF*R`)vMlF-e%!uNpA?xE}gyIKGtGf9thrPn*aXgoBkLzR;CkhIdJVOue7$b$kEQ|Kci2PZ2kXTnmYqpDs>szvm#8nU z)#!-Iv;h4shs5lrNYf%aB=FJqGKwfe`xT1YOgT#pWQ<6Fc#jAG`&Qv|-D|+`6@Hs{ zLs~6Uad)FPdoS*dywuJ`SS5ijJMY#yj;f~@tQ4}v4AG>zKv{q6vliO9c12KmIElY@ zcB*X7pGP^>hihVg;O8|0u8Uvpm|>0y)I0F~0CbyDJP{aAyXX@TaMh~M`i^}a;BItv zv{&d)!HPhNtexgOe~LOncdWcYc*qCyqE(1{N>K^>@ms}5bhLs-yj)qVW~wYMwuQ|| zb8|-dE}So)=(ieLTo%eV0#~_JQ5D8Qcu7uY((?-H5%4r71BoVCx-MxqQW8oIjG*^Lb}HTD*1CPS416cI9iuG>09Ga(e)EXgZx!whY2Ex?_qF{A)C=HAia_&o63q@7b6B;qF{koG?KdYV!9>uz zUbx`g0JA*|*bdA%R21+Z2N*WY8ab1cJ?@(Fb_utXVDn@bae=Nqc7dZ;DCA}_{>X)!`jDFri1{Z?6T&7bvTlLCb$QJqY4o(R zt6mPxff=U*%|ptH)`NM5m2M+88#{8n;oYtE6hg&H-i)7_+iAUBqsCs#nl&Qb<@INa zNvYJLzwcCAC8>ihAwUf2PIoebf5ncP zVlUE86uLQLmWO3IKRg3@ol@G<0c%i%w{;$q1sWAqpILMMxhi+pQhfLl_m*3P zoC?43e zO6$OZ;1$GchB6(lYcWpS8qJRYcQNXk@FJm4P?WepP@6NvOYhrv9R&yV8tErzTcG7% zQ5;0eFAu2&SM52e1!9;B%`s~kfQo+DNngjWxX$NFFobT&G{dyCnI&k3XU*^I9@?qH zNXHB*ir%hz_;yG&Vn?g{+kqDHaoeAswe$WUVWNHY(YLbCM45TDoJtD1#c0qE{n+a diff --git a/docs/srcs/a-thymeleaf/fourth-view.png b/docs/srcs/a-thymeleaf/fourth-view.png deleted file mode 100644 index 63bfac4f5c10f6c3da2ace40e928fb3c04a59891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23618 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 AyZ`_I diff --git a/docs/srcs/a-thymeleaf/home-page.png b/docs/srcs/a-thymeleaf/home-page.png deleted file mode 100644 index e17aeaf8de0ea5f00e4ec4525722e47f263052d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13921 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 diff --git a/docs/srcs/a-thymeleaf/layout.png b/docs/srcs/a-thymeleaf/layout.png deleted file mode 100644 index 6f2606d7810ce7e490bcb97545e35e6779473855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50263 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�&_|BSEZT4C} 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 TxAdL5?&p~64@dFe1^xVAax%tZ diff --git a/docs/srcs/a-thymeleaf/login-page.png b/docs/srcs/a-thymeleaf/login-page.png deleted file mode 100644 index db0c84fac2ecd5c3c643db6061c52fa019fb6707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12495 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 owTH*zLbx-l7aU~10t&vWRN^l+0`6hCZ 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 V!UDM;h_XQU@9N(vy!H6E{|lEozajtt diff --git a/docs/srcs/a-thymeleaf/second-view-enhanced.png b/docs/srcs/a-thymeleaf/second-view-enhanced.png deleted file mode 100644 index ffedb8a481cffcd21cf28497550d3b86b0cbb2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10468 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 diff --git a/docs/srcs/a-thymeleaf/second-view.png b/docs/srcs/a-thymeleaf/second-view.png deleted file mode 100644 index 5bf0480f4f2de462656782c6a00dd1a6c830fa73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9090 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 FKLC`GFQNbd diff --git a/docs/srcs/a-thymeleaf/third-view-success.png b/docs/srcs/a-thymeleaf/third-view-success.png deleted file mode 100644 index 0aaa4a6a3cdfe37df4b9314aa8b78b35d0cf7967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5944 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 BJYN6+ diff --git a/docs/srcs/a-thymeleaf/users-page.png b/docs/srcs/a-thymeleaf/users-page.png deleted file mode 100644 index 70a6a767f02c76ee97a6ef4408cf02a93d9d1d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13978 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 Date: Tue, 14 May 2024 03:26:51 +0300 Subject: [PATCH 03/40] [Transactions] Enhance Isolation in project. --- a-thymeleaf/build.gradle | 36 --- a-thymeleaf/gradlew | 234 ------------------ a-thymeleaf/gradlew.bat | 89 ------- a-thymeleaf/settings.gradle | 1 - .../labs/thymeleaf/ThymeleafApplication.java | 32 --- .../labs/thymeleaf/config/WebMvcConfig.java | 69 ------ .../controllers/PracticeController.java | 68 ----- .../labs/thymeleaf/models/StudentModel.java | 65 ----- .../src/main/resources/application.properties | 4 - .../main/resources/local/practice.properties | 4 - .../resources/local/shared/navbar.properties | 3 - .../resources/templates/account/login.html | 19 -- .../resources/templates/practice/first.html | 16 -- .../resources/templates/practice/fourth.html | 17 -- .../resources/templates/practice/second.html | 46 ---- .../resources/templates/practice/third.html | 67 ----- .../resources/templates/shared/footer.html | 3 - .../main/resources/templates/shared/head.html | 4 - .../resources/templates/shared/header.html | 3 - .../resources/templates/shared/navbar.html | 15 -- docs/en/a-thymeleaf/lab-work.md | 73 ------ .../practice/configure-thymeleaf.md | 119 --------- .../a-thymeleaf/practice/create-first-view.md | 63 ----- docs/en/a-thymeleaf/practice/form-handling.md | 74 ------ docs/en/a-thymeleaf/practice/forms.md | 120 --------- .../practice/fragments-and-layouts.md | 130 ---------- docs/en/a-thymeleaf/practice/iteration.md | 107 -------- docs/en/a-thymeleaf/practice/literals.md | 55 ---- docs/en/a-thymeleaf/practice/validation.md | 85 ------- .../practice/variables-and-controller.md | 67 ----- .../practice/working-with-variables.md | 92 ------- docs/en/b-springsecurity/lab-work.md | 33 --- .../practice/add-dummy-users.md | 68 ----- .../authorize-server-authenticated.md | 42 ---- .../practice/authorize-server-authority.md | 43 ---- .../practice/authorize-server-role.md | 43 ---- .../practice/base-implementation-user.md | 188 -------------- .../practice/configure-spring-security.md | 84 ------- .../practice/configure-thymeleaf-security.md | 33 --- .../practice/create-identity-to-users.md | 65 ----- .../practice/custom-login-form.md | 44 ---- .../practice/password-encryption.md | 85 ------- .../practice/setup-server-authorization.md | 45 ---- docs/ru/a-thymeleaf/lab-work.md | 74 ------ .../practice/configure-thymeleaf.md | 119 --------- .../a-thymeleaf/practice/create-first-view.md | 63 ----- docs/ru/a-thymeleaf/practice/form-handling.md | 74 ------ docs/ru/a-thymeleaf/practice/forms.md | 120 --------- .../practice/fragments-and-layouts.md | 130 ---------- docs/ru/a-thymeleaf/practice/iteration.md | 107 -------- docs/ru/a-thymeleaf/practice/literals.md | 55 ---- docs/ru/a-thymeleaf/practice/validation.md | 85 ------- .../practice/variables-and-controller.md | 67 ----- .../practice/working-with-variables.md | 92 ------- docs/ru/b-springsecurity/lab-work.md | 26 -- .../practice/add-dummy-users.md | 68 ----- .../authorize-server-authenticated.md | 38 --- .../practice/authorize-server-authority.md | 39 --- .../practice/authorize-server-role.md | 39 --- .../practice/base-implementation-user.md | 186 -------------- .../practice/configure-spring-security.md | 79 ------ .../practice/configure-thymeleaf-security.md | 29 --- .../practice/create-identity-to-users.md | 61 ----- .../practice/custom-login-form.md | 40 --- .../practice/password-encryption.md | 82 ------ .../practice/setup-server-authorization.md | 45 ---- docs/ru/c-jpa/lab-work.md | 54 ---- .../practice/creation/characteristics.md | 111 --------- .../c-jpa/practice/creation/create-entity.md | 62 ----- docs/ru/c-jpa/practice/creation/fetching.md | 47 ---- .../c-jpa/practice/creation/relationships.md | 46 ---- docs/ru/c-jpa/practice/dependencies/driver.md | 102 -------- docs/ru/c-jpa/practice/dependencies/jpa.md | 59 ----- .../practice/interacting/jpa-repository.md | 54 ---- .../interacting/jpa-repository/create.md | 40 --- .../interacting/jpa-repository/delete.md | 43 ---- .../interacting/jpa-repository/query.md | 43 ---- .../interacting/jpa-repository/read.md | 44 ---- .../c-jpa/practice/interacting/repository.md | 52 ---- .../practice/interacting/repository/create.md | 48 ---- .../practice/interacting/repository/delete.md | 49 ---- .../practice/interacting/repository/query.md | 50 ---- .../practice/interacting/repository/read.md | 48 ---- .../practice/interacting/repository/update.md | 48 ---- docs/srcs/a-thymeleaf/first-view.png | Bin 7080 -> 0 bytes docs/srcs/a-thymeleaf/fourth-view.png | Bin 23618 -> 0 bytes docs/srcs/a-thymeleaf/home-page.png | Bin 13921 -> 0 bytes docs/srcs/a-thymeleaf/layout.png | Bin 50263 -> 0 bytes docs/srcs/a-thymeleaf/login-page.png | Bin 12495 -> 0 bytes docs/srcs/a-thymeleaf/login-validation.png | Bin 14150 -> 0 bytes docs/srcs/a-thymeleaf/modify-user-page.png | Bin 17129 -> 0 bytes .../srcs/a-thymeleaf/second-view-enhanced.png | Bin 10468 -> 0 bytes docs/srcs/a-thymeleaf/second-view.png | Bin 9090 -> 0 bytes docs/srcs/a-thymeleaf/signup-page.png | Bin 14133 -> 0 bytes docs/srcs/a-thymeleaf/third-view-error.png | Bin 6204 -> 0 bytes docs/srcs/a-thymeleaf/third-view-success.png | Bin 5944 -> 0 bytes docs/srcs/a-thymeleaf/third-view.png | Bin 5754 -> 0 bytes docs/srcs/a-thymeleaf/users-page.png | Bin 13978 -> 0 bytes docs/srcs/c-jpa/er-diagram.png | Bin 89446 -> 0 bytes docs/srcs/c-jpa/task-er-diagram.png | Bin 120020 -> 0 bytes 100 files changed, 5271 deletions(-) delete mode 100644 a-thymeleaf/build.gradle delete mode 100644 a-thymeleaf/gradlew delete mode 100644 a-thymeleaf/gradlew.bat delete mode 100644 a-thymeleaf/settings.gradle delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java delete mode 100644 a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java delete mode 100644 a-thymeleaf/src/main/resources/application.properties delete mode 100644 a-thymeleaf/src/main/resources/local/practice.properties delete mode 100644 a-thymeleaf/src/main/resources/local/shared/navbar.properties delete mode 100644 a-thymeleaf/src/main/resources/templates/account/login.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/first.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/fourth.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/second.html delete mode 100644 a-thymeleaf/src/main/resources/templates/practice/third.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/footer.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/head.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/header.html delete mode 100644 a-thymeleaf/src/main/resources/templates/shared/navbar.html delete mode 100644 docs/en/a-thymeleaf/lab-work.md delete mode 100644 docs/en/a-thymeleaf/practice/configure-thymeleaf.md delete mode 100644 docs/en/a-thymeleaf/practice/create-first-view.md delete mode 100644 docs/en/a-thymeleaf/practice/form-handling.md delete mode 100644 docs/en/a-thymeleaf/practice/forms.md delete mode 100644 docs/en/a-thymeleaf/practice/fragments-and-layouts.md delete mode 100644 docs/en/a-thymeleaf/practice/iteration.md delete mode 100644 docs/en/a-thymeleaf/practice/literals.md delete mode 100644 docs/en/a-thymeleaf/practice/validation.md delete mode 100644 docs/en/a-thymeleaf/practice/variables-and-controller.md delete mode 100644 docs/en/a-thymeleaf/practice/working-with-variables.md delete mode 100644 docs/en/b-springsecurity/lab-work.md delete mode 100644 docs/en/b-springsecurity/practice/add-dummy-users.md delete mode 100644 docs/en/b-springsecurity/practice/authorize-server-authenticated.md delete mode 100644 docs/en/b-springsecurity/practice/authorize-server-authority.md delete mode 100644 docs/en/b-springsecurity/practice/authorize-server-role.md delete mode 100644 docs/en/b-springsecurity/practice/base-implementation-user.md delete mode 100644 docs/en/b-springsecurity/practice/configure-spring-security.md delete mode 100644 docs/en/b-springsecurity/practice/configure-thymeleaf-security.md delete mode 100644 docs/en/b-springsecurity/practice/create-identity-to-users.md delete mode 100644 docs/en/b-springsecurity/practice/custom-login-form.md delete mode 100644 docs/en/b-springsecurity/practice/password-encryption.md delete mode 100644 docs/en/b-springsecurity/practice/setup-server-authorization.md delete mode 100644 docs/ru/a-thymeleaf/lab-work.md delete mode 100644 docs/ru/a-thymeleaf/practice/configure-thymeleaf.md delete mode 100644 docs/ru/a-thymeleaf/practice/create-first-view.md delete mode 100644 docs/ru/a-thymeleaf/practice/form-handling.md delete mode 100644 docs/ru/a-thymeleaf/practice/forms.md delete mode 100644 docs/ru/a-thymeleaf/practice/fragments-and-layouts.md delete mode 100644 docs/ru/a-thymeleaf/practice/iteration.md delete mode 100644 docs/ru/a-thymeleaf/practice/literals.md delete mode 100644 docs/ru/a-thymeleaf/practice/validation.md delete mode 100644 docs/ru/a-thymeleaf/practice/variables-and-controller.md delete mode 100644 docs/ru/a-thymeleaf/practice/working-with-variables.md delete mode 100644 docs/ru/b-springsecurity/lab-work.md delete mode 100644 docs/ru/b-springsecurity/practice/add-dummy-users.md delete mode 100644 docs/ru/b-springsecurity/practice/authorize-server-authenticated.md delete mode 100644 docs/ru/b-springsecurity/practice/authorize-server-authority.md delete mode 100644 docs/ru/b-springsecurity/practice/authorize-server-role.md delete mode 100644 docs/ru/b-springsecurity/practice/base-implementation-user.md delete mode 100644 docs/ru/b-springsecurity/practice/configure-spring-security.md delete mode 100644 docs/ru/b-springsecurity/practice/configure-thymeleaf-security.md delete mode 100644 docs/ru/b-springsecurity/practice/create-identity-to-users.md delete mode 100644 docs/ru/b-springsecurity/practice/custom-login-form.md delete mode 100644 docs/ru/b-springsecurity/practice/password-encryption.md delete mode 100644 docs/ru/b-springsecurity/practice/setup-server-authorization.md delete mode 100644 docs/ru/c-jpa/lab-work.md delete mode 100644 docs/ru/c-jpa/practice/creation/characteristics.md delete mode 100644 docs/ru/c-jpa/practice/creation/create-entity.md delete mode 100644 docs/ru/c-jpa/practice/creation/fetching.md delete mode 100644 docs/ru/c-jpa/practice/creation/relationships.md delete mode 100644 docs/ru/c-jpa/practice/dependencies/driver.md delete mode 100644 docs/ru/c-jpa/practice/dependencies/jpa.md delete mode 100644 docs/ru/c-jpa/practice/interacting/jpa-repository.md delete mode 100644 docs/ru/c-jpa/practice/interacting/jpa-repository/create.md delete mode 100644 docs/ru/c-jpa/practice/interacting/jpa-repository/delete.md delete mode 100644 docs/ru/c-jpa/practice/interacting/jpa-repository/query.md delete mode 100644 docs/ru/c-jpa/practice/interacting/jpa-repository/read.md delete mode 100644 docs/ru/c-jpa/practice/interacting/repository.md delete mode 100644 docs/ru/c-jpa/practice/interacting/repository/create.md delete mode 100644 docs/ru/c-jpa/practice/interacting/repository/delete.md delete mode 100644 docs/ru/c-jpa/practice/interacting/repository/query.md delete mode 100644 docs/ru/c-jpa/practice/interacting/repository/read.md delete mode 100644 docs/ru/c-jpa/practice/interacting/repository/update.md delete mode 100644 docs/srcs/a-thymeleaf/first-view.png delete mode 100644 docs/srcs/a-thymeleaf/fourth-view.png delete mode 100644 docs/srcs/a-thymeleaf/home-page.png delete mode 100644 docs/srcs/a-thymeleaf/layout.png delete mode 100644 docs/srcs/a-thymeleaf/login-page.png delete mode 100644 docs/srcs/a-thymeleaf/login-validation.png delete mode 100644 docs/srcs/a-thymeleaf/modify-user-page.png delete mode 100644 docs/srcs/a-thymeleaf/second-view-enhanced.png delete mode 100644 docs/srcs/a-thymeleaf/second-view.png delete mode 100644 docs/srcs/a-thymeleaf/signup-page.png delete mode 100644 docs/srcs/a-thymeleaf/third-view-error.png delete mode 100644 docs/srcs/a-thymeleaf/third-view-success.png delete mode 100644 docs/srcs/a-thymeleaf/third-view.png delete mode 100644 docs/srcs/a-thymeleaf/users-page.png delete mode 100644 docs/srcs/c-jpa/er-diagram.png delete mode 100644 docs/srcs/c-jpa/task-er-diagram.png diff --git a/a-thymeleaf/build.gradle b/a-thymeleaf/build.gradle deleted file mode 100644 index 2ed8e23..0000000 --- a/a-thymeleaf/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - // Java - id 'java' - - // Spring - id "org.springframework.boot" version "3.2.2" - id "io.spring.dependency-management" version "1.1.4" -} - -repositories { - mavenCentral() -} - -group = 'edu.labs.thymeleaf' -version = '1.0-SNAPSHOT' - -java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - - -dependencies { - // Spring - def springVersion = '3.2.2' - implementation "org.springframework.boot:spring-boot-starter-web" - testImplementation 'org.springframework.boot:spring-boot-starter-test' - - // Thymeleaf - def thymeleafVersion = "3.1.2.RELEASE" - implementation "org.thymeleaf:thymeleaf-spring6:$thymeleafVersion" -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/a-thymeleaf/gradlew b/a-thymeleaf/gradlew deleted file mode 100644 index 1b6c787..0000000 --- a/a-thymeleaf/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/a-thymeleaf/gradlew.bat b/a-thymeleaf/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/a-thymeleaf/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/a-thymeleaf/settings.gradle b/a-thymeleaf/settings.gradle deleted file mode 100644 index 8304350..0000000 --- a/a-thymeleaf/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'a-thymeleaf' diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java deleted file mode 100644 index add1971..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package edu.labs.thymeleaf; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; - -@SpringBootApplication -public class ThymeleafApplication { - - private static final Logger logger = LoggerFactory.getLogger(ThymeleafApplication.class); - - public static void main(String[] args) { - SpringApplication app = new SpringApplication(ThymeleafApplication.class); - ConfigurableApplicationContext context = app.run(args); - - logServerInfo(context); - } - - private static void logServerInfo(ConfigurableApplicationContext context) { - var env = context.getEnvironment(); - String port = env.getProperty("server.port"); - String contextPath = env.getProperty("server.servlet.context-path"); - - log("Server running at: http://localhost:" + port + contextPath); - } - - private static void log(String message){ - logger.info(message); - } -} \ No newline at end of file diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java deleted file mode 100644 index 2d8570b..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -package edu.labs.thymeleaf.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ReloadableResourceBundleMessageSource; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.thymeleaf.spring6.SpringTemplateEngine; -import org.thymeleaf.spring6.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; -import org.springframework.context.MessageSource; -import java.time.LocalDateTime; - -@Configuration -public class WebMvcConfig implements WebMvcConfigurer { - - - @Bean - public ClassLoaderTemplateResolver templateResolver() { - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - templateResolver.setPrefix("/templates/"); - templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode(TemplateMode.HTML); - templateResolver.setCharacterEncoding("UTF-8"); - - return templateResolver; - } - - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames( - "classpath:local/practice", - "classpath:local/shared/navbar" - ); - - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - - @Bean - public SpringTemplateEngine templateEngine() { - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(templateResolver()); - templateEngine.setTemplateEngineMessageSource(messageSource()); - - return templateEngine; - } - - - - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } -} \ No newline at end of file diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java deleted file mode 100644 index 2ba0eeb..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java +++ /dev/null @@ -1,68 +0,0 @@ -package edu.labs.thymeleaf.controllers; - -import edu.labs.thymeleaf.models.StudentModel; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; - -import java.util.ArrayList; -import java.util.List; - -@Controller -public class PracticeController { - - private final List students = new ArrayList<>(); - - public PracticeController(){ - // Populate the list with users - this.students.add(new StudentModel(1,"First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(3, "Fourth", "User", false, 3)); - } - - @GetMapping("/second") - public String secondPracticeView(Model model){ - model.addAttribute("title", "second task"); - model.addAttribute("students", this.students); - return "practice/second"; - } - - @GetMapping("/third") - public String thirdPracticeView(Model model){ - model.addAttribute("title", "third task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - - @PostMapping("/removeStudent") - public String removeStudent(){ - - return "redirect:/third?removedStudent"; - } - - @GetMapping("/fourth") - public String fourthPracticeView(Model model){ - model.addAttribute("title", "fourth task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - - return "practice/fourth"; - } -} diff --git a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java b/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java deleted file mode 100644 index 20320e3..0000000 --- a/a-thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java +++ /dev/null @@ -1,65 +0,0 @@ -package edu.labs.thymeleaf.models; - -public class StudentModel { - private Integer id; - private String firstName; - private String sureName; - private Boolean isGraduated; - private Integer mark; - - public StudentModel() { - } - - public StudentModel(Integer id, String firstName, String sureName, Boolean isGraduated, Integer mark) { - this.id = id; - this.firstName = firstName; - this.sureName = sureName; - this.isGraduated = isGraduated; - this.mark = mark; - } - - // Getter and setter methods for id - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - // Getter and setter methods for firstName - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - // Getter and setter methods for sureName - public String getSureName() { - return sureName; - } - - public void setSureName(String sureName) { - this.sureName = sureName; - } - - // Getter and setter methods for isGraduated - public Boolean getIsGraduated() { - return isGraduated; - } - - public void setIsGraduated(Boolean isGraduated) { - this.isGraduated = isGraduated; - } - - // Getter and setter methods for mark - public Integer getMark() { - return mark; - } - - public void setMark(Integer mark) { - this.mark = mark; - } -} diff --git a/a-thymeleaf/src/main/resources/application.properties b/a-thymeleaf/src/main/resources/application.properties deleted file mode 100644 index 551dbe7..0000000 --- a/a-thymeleaf/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Server Configurations -spring.application.name= FirstLabWork -server.port=8080 -server.servlet.context-path=/ \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/local/practice.properties b/a-thymeleaf/src/main/resources/local/practice.properties deleted file mode 100644 index 8ca4c87..0000000 --- a/a-thymeleaf/src/main/resources/local/practice.properties +++ /dev/null @@ -1,4 +0,0 @@ -student.name= MyName -student.group= PRE-121 -message.welcome= Welcome, {0} -message.info= Your Group is: {0} diff --git a/a-thymeleaf/src/main/resources/local/shared/navbar.properties b/a-thymeleaf/src/main/resources/local/shared/navbar.properties deleted file mode 100644 index ebea752..0000000 --- a/a-thymeleaf/src/main/resources/local/shared/navbar.properties +++ /dev/null @@ -1,3 +0,0 @@ -nav.string.login=Login -nav.string.signup=Signup -nav.message.welcome= Welcome, {0} diff --git a/a-thymeleaf/src/main/resources/templates/account/login.html b/a-thymeleaf/src/main/resources/templates/account/login.html deleted file mode 100644 index 72f28f1..0000000 --- a/a-thymeleaf/src/main/resources/templates/account/login.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - -
-
- - -
- - - - - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/first.html b/a-thymeleaf/src/main/resources/templates/practice/first.html deleted file mode 100644 index 2b37a93..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/first.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Title - - - -

Project Name

-

Current Date and Time

-

-

-
-
Next Task - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/fourth.html b/a-thymeleaf/src/main/resources/templates/practice/fourth.html deleted file mode 100644 index dcd0056..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/fourth.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -
- - -
- - -
- - - diff --git a/a-thymeleaf/src/main/resources/templates/practice/second.html b/a-thymeleaf/src/main/resources/templates/practice/second.html deleted file mode 100644 index 50350c2..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/second.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Page Title - - - -

Default

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
GoodVery GoodExcellentNot PassedBlueBlueRedNo Diploma
- - Next Task - - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/practice/third.html b/a-thymeleaf/src/main/resources/templates/practice/third.html deleted file mode 100644 index 73ca371..0000000 --- a/a-thymeleaf/src/main/resources/templates/practice/third.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Page Title - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
-

Error:

-
- -
-

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- -
-
- -
- Remove Student - -
-

Student Removed Successfully!

-
- -
-

- - -

- -
- -
- - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/footer.html b/a-thymeleaf/src/main/resources/templates/shared/footer.html deleted file mode 100644 index 0de5f36..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/footer.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

Copyrights of lab is for student

-
\ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/head.html b/a-thymeleaf/src/main/resources/templates/shared/head.html deleted file mode 100644 index 452c561..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/head.html +++ /dev/null @@ -1,4 +0,0 @@ - - - Page Title - \ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/header.html b/a-thymeleaf/src/main/resources/templates/shared/header.html deleted file mode 100644 index 67fc23d..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/header.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/a-thymeleaf/src/main/resources/templates/shared/navbar.html b/a-thymeleaf/src/main/resources/templates/shared/navbar.html deleted file mode 100644 index 5b48dbb..0000000 --- a/a-thymeleaf/src/main/resources/templates/shared/navbar.html +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/en/a-thymeleaf/lab-work.md b/docs/en/a-thymeleaf/lab-work.md deleted file mode 100644 index 6c21076..0000000 --- a/docs/en/a-thymeleaf/lab-work.md +++ /dev/null @@ -1,73 +0,0 @@ -# Thymeleaf Lab Work - -Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. - -## Goal of the Lab Work - -The primary goal of this lab work is to provide you with practical experience and proficiency in using Thymeleaf within a Spring environment. Thymeleaf is widely utilized for server-side rendering in web development, and through these tasks, you will gain valuable insights into its configuration, usage of variables, controllers, form handling, and more. - -## Practice Tasks - -1. [Task 1: Configure Thymeleaf in Spring](practice/configure-thymeleaf.md) -2. [Task 2: Create First View](practice/create-first-view.md) -3. [Task 3: Working With Variables](practice/working-with-variables.md) -4. [Task 4: Variables and Controller](practice/variables-and-controller.md) -5. [Task 5: Iteration](practice/iteration.md) -6. [Task 6: Literals](practice/literals.md) -7. [Task 7: Forms](practice/forms.md) -8. [Task 8: Form Handling](practice/form-handling.md) -9. [Task 9: Query Parameter and Validation](practice/validation.md) -10. [Task 10: Fragments and Layouts](practice/fragments-and-layouts.md) - - -## Lab Work Tasks - -1. **Task 1: Create HTML Layout with Fragments** - - - Create individual fragments for different parts of an HTML page, such as navbar, header, head, and footer. - - Assemble these fragments in a single HTML file to form a complete layout - - For example: - ![layout.png](../../srcs/a-thymeleaf/layout.png) - -2. **Task 2: Create Home Page with Localization** - - - Implement a home page accessible at the path `/`. - - Utilize the layout created in Task 1 for structuring the home page. - - Use `#{}` expressions for all text content within the home page, demonstrating localization or messages from a file.properties file. - - For Example: - - ![home-page.png](../../srcs/a-thymeleaf/home-page.png) - -3. **Task 3: Create Login and Register Forms** - - - Design and implement login and register forms for user authentication. - - Utilize Thymeleaf's model binding to handle form data. - - For Example: - - ![login-page.png](../../srcs/a-thymeleaf/login-page.png) - - ![signup-page.png](../../srcs/a-thymeleaf/signup-page.png) - -4. **Task 4: Validate Login and Register Actions** - - - Implement validation for login and register actions. - - Use query parameters to pass error messages in case of validation failures. - - Ensure secure and proper handling of user input. - - For Example: - - ![login-validation.png](../../srcs/a-thymeleaf/login-validation.png) - -5. **Task 5: Create Users Page** - - - Develop a Users page that displays a table of users. - - Implement iteration to dynamically populate the table with user data. - - Provide functionality to delete or modify user entries from the page. - - For Example: - - ![users-page.png](../../srcs/a-thymeleaf/users-page.png) - - ![modify-user-page.png](../../srcs/a-thymeleaf/modify-user-page.png) - -Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. - -Happy coding! diff --git a/docs/en/a-thymeleaf/practice/configure-thymeleaf.md b/docs/en/a-thymeleaf/practice/configure-thymeleaf.md deleted file mode 100644 index 2c016c4..0000000 --- a/docs/en/a-thymeleaf/practice/configure-thymeleaf.md +++ /dev/null @@ -1,119 +0,0 @@ -# Configure Thymeleaf in Spring - -**Description:** - -This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. - -## **Steps:** - -1. **Create Thymeleaf Configuration Class:** - - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. - - Extend the class with `WebMvcConfigurer`. - - Example: - - ```java - package edu.labs.thymeleaf.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - @Configuration - public class WebMvcConfig implements WebMvcConfigurer { - // Configuration code goes here - } - ``` - - Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. - -2. **Configure Thymeleaf Template Resolver:** - - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. - - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. - - ```java - @Bean - public ClassLoaderTemplateResolver templateResolver() { - // Create a ClassLoaderTemplateResolver bean - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - // Set the path where Thymeleaf will find templates - templateResolver.setPrefix("/templates/"); - - // Set the file extension for templates - templateResolver.setSuffix(".html"); - - // Set the template mode to HTML - templateResolver.setTemplateMode(TemplateMode.HTML); - - // Set the character encoding for templates - templateResolver.setCharacterEncoding("UTF-8"); - - // Return the configured template resolver bean - return templateResolver; - } - ``` - -3. **Configure Message Source:** - - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. - - Set the default encoding. - - ```java - @Bean - public MessageSource messageSource() { - // Create a ReloadableResourceBundleMessageSource bean - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - - // Set the default encoding for messages - messageSource.setDefaultEncoding("UTF-8"); - - // Return the configured message source bean - return messageSource; - } - ``` - -4. **Configure Thymeleaf View Resolver:** - - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. - - Set the template engine. - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - // Create a ThymeleafViewResolver bean - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - - // Set the template engine for the view resolver - resolver.setTemplateEngine(templateEngine()); - - // Return the configured ThymeleafViewResolver bean - return resolver; - } - ``` - -5. **Configure Thymeleaf Template Engine:** - - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. - - Set the template resolver and template engine message source. - - ```java - @Bean - public SpringTemplateEngine templateEngine() { - // Create a SpringTemplateEngine bean - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - - // Set the template resolver for the template engine - templateEngine.setTemplateResolver(templateResolver()); - - // Set the template engine message source - templateEngine.setTemplateEngineMessageSource(messageSource()); - - // Return the configured SpringTemplateEngine bean - return templateEngine; - } - ``` - ---- - -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). - -# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/create-first-view.md b/docs/en/a-thymeleaf/practice/create-first-view.md deleted file mode 100644 index 30577eb..0000000 --- a/docs/en/a-thymeleaf/practice/create-first-view.md +++ /dev/null @@ -1,63 +0,0 @@ -# Create First View - -**Description:** - -In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. - -## **Steps:** - -1. **Create the View File:** - - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. - - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. - - ```plaintext - Project Directory - └── src - └── main - └── resources - └── templates - └── practice - └── first.html - ``` - - Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. - -2. **Register the View in Configuration Class:** - - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). - - Add the following method to register the Thymeleaf view: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } - ``` - - This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. - -3. **Test the View:** - - Run your Spring application. - - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. - -4. **Optional: Configure Redirect from Root Path:** - - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - - // Redirect from root path to the first view - registry.addRedirectViewController("/", "/first"); - } - ``` - - Now, visiting `http://localhost:8080/` will automatically redirect to the first view. - ---- - -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - -# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/form-handling.md b/docs/en/a-thymeleaf/practice/form-handling.md deleted file mode 100644 index c7b6b7b..0000000 --- a/docs/en/a-thymeleaf/practice/form-handling.md +++ /dev/null @@ -1,74 +0,0 @@ -# Form Handling - -**Description:** - -In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. - -**Steps:** - -1. **Show Form View (PracticeController):** - - - Open the `PracticeController` class and add a method to show the form view: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Other methods... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Explanation: - - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. - - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. - - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. - -2. **Handle Form Submission (PracticeController):** - - - Add a method in `PracticeController` to handle form submissions: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Explanation: - - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. - - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. - - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). - -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. - -# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/forms.md b/docs/en/a-thymeleaf/practice/forms.md deleted file mode 100644 index 3f4da68..0000000 --- a/docs/en/a-thymeleaf/practice/forms.md +++ /dev/null @@ -1,120 +0,0 @@ -# Forms - -**Description:** - -In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. - -**Steps:** - -1. **Create Third View (third.html):** - - - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. - - ```html - - - - - Add Student Form - - -
- Add Student - -
- -

- - -

-
-
- - - ``` - -2. **Configure Form Submission:** - - - In the `form` tag, configure the form submission details: - - ```html -
- ``` - - - Explanation: - - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. - - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. - - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. - - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. - -3. **Pass the 'id' Field:** - - - In the form, locate the section for the `id` field: - - ```html - -

- - -

- ``` - - - Explanation: - - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. - - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. - -4. **Repeat these steps:** - - - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. - - There is code example: - ```html - - - - - Add Student Form - - -
- Add Student - - - -

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- - - -
- - - ``` - -## Result -Your view should look like that: - -![third-view.png](../../../srcs/a-thymeleaf/third-view.png) - -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. - -# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/fragments-and-layouts.md b/docs/en/a-thymeleaf/practice/fragments-and-layouts.md deleted file mode 100644 index 73bfd1a..0000000 --- a/docs/en/a-thymeleaf/practice/fragments-and-layouts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Fragments and Layouts - -**Description:** - -In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. - -## **Steps:** - -1. **Update `first.html` with a Fragment:** - - - Open the `first.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
-

This is the information section of the first view.

-
- - - - ``` - -2. **Update `second.html` with a Fragment:** - - - Open the `second.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `` inside the `` tag: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Update `third.html` with a Fragment:** - - - Open the `third.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
- -
-
- - - - ``` - -4. **Create `fourth.html` with Fragments Usage:** - - - Create a new file named `fourth.html` in the `practice` directory. - - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Explanation: - - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. - - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. - -## Result -Your view should look like that: - -![fourth-view.png](../../../srcs/a-thymeleaf/fourth-view.png) - -**Conclusion:** - -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. - -# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/iteration.md b/docs/en/a-thymeleaf/practice/iteration.md deleted file mode 100644 index 516c3e8..0000000 --- a/docs/en/a-thymeleaf/practice/iteration.md +++ /dev/null @@ -1,107 +0,0 @@ -# Iteration - -**Description:** - -In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. - -**Steps:** - -1. **Create StudentModel:** - - In the `models/` package, create a `StudentModel` class with the following attributes: - - ```java - public class StudentModel { - private Integer id = 0; - private String firstName = ""; - private String sureName = ""; - private Boolean isGraduated = false; - private Integer mark = 0; - - // Constructor, getters, and setters - } - ``` - -2. **Populate List of Students in PracticeController:** - - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: - - ```java - @Controller - public class PracticeController { - private final List students = new ArrayList<>(); - - public PracticeController() { - // Populate the list with users - this.students.add(new StudentModel(1, "First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); - } - - // Rest of the controller methods - } - ``` - -3. **Pass Students to secondView:** - - In the `secondView` method of the `PracticeController`, add the list of students to the model. - - ```java - @Controller - public class PracticeController { - // Other methods... - - @GetMapping("/second") - public String secondView(Model model) { - // Pass the list of students to the view - model.addAttribute("students", students); - // Rest of the method... - } - } - ``` - -4. **Render Students Table in second.html:** - - Open the `second.html` Thymeleaf view file. - -5. **Render Table Header:** - - Add the table header section within the `` tag: - - ```html - - - - - - - - - - - -
IdFirstNamesureNameGraduatedMark
- ``` - -6. **Render Table Body with Iteration:** - - Add the table body section within the `` tag and iterate over the list of students to render each row: - - ```html - - - - - - - - - - - ``` - -## Result -Your page should look like that: - -![second-view.png](../../../srcs/a-thymeleaf/second-view.png) - -**Conclusion:** - -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. - -# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/literals.md b/docs/en/a-thymeleaf/practice/literals.md deleted file mode 100644 index a6a7730..0000000 --- a/docs/en/a-thymeleaf/practice/literals.md +++ /dev/null @@ -1,55 +0,0 @@ -# Literals - -**Description:** - -In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. - -**Steps:** - -1. **Update students-table Fragment in second.html:** - - Open the `second.html` Thymeleaf view file. - -2. **Enhance Literal for Student Id:** - - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. - - ```html - - ``` - -3. **Enhance Literal for Graduated Field:** - - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. - - ```html - - ``` - -4. **Enhance Literal for Mark Field:** - - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. - - ```html - Good - Very Good - Excellent - Not Passed - ``` - -5. **Add Literal for Diploma Type Field:** - - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. - - ```html - Blue - Blue - Red - No Diploma - ``` - -## Result -Your view should look like that: - -![second-view-enhanced.png](../../../srcs/a-thymeleaf/second-view-enhanced.png) - -**Conclusion:** - -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. - -# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/validation.md b/docs/en/a-thymeleaf/practice/validation.md deleted file mode 100644 index 88fc727..0000000 --- a/docs/en/a-thymeleaf/practice/validation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Query Parameter and Validation - -**Description:** - -In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. - -**Steps:** - -1. **Adapt the View (thirdView.html):** - - - Open the `third.html` file and add sections to display both success and error messages: - - ```html - - - - - - - - -
-

Student Added Successfully!

-
- -
-

Error:

-
- - - - - ``` - - - Explanation: - - The `
` checks if the query parameter `error` is present in the URL. - - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. - -2. **Handle Form Submission with Additional Validation (PracticeController):** - - - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Result -Your view should look like that: - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-success.png) - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-error.png) - - -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. - -# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/variables-and-controller.md b/docs/en/a-thymeleaf/practice/variables-and-controller.md deleted file mode 100644 index ca4ad12..0000000 --- a/docs/en/a-thymeleaf/practice/variables-and-controller.md +++ /dev/null @@ -1,67 +0,0 @@ -# Variables and Controller - -**Description:** - -In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. - -**Steps:** - -1. **Create the New View File:** - - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. - - ```plaintext - Project Directory - └── src - └── main - └── resources - └── templates - └── practice - └── second.html - ``` - -2. **Define the Controller:** - - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. - - ```java - @Controller - public class PracticeController { - - @GetMapping("/second") - public String secondView(Model model) { - // Pass variables to the view - model.addAttribute("title", "Second Page"); - - // Return the view name - return "practice/second"; - } - } - ``` - - This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. - -3. **Update the View to Use Controller-Passed Variable:** - - Open the `second.html` Thymeleaf view file. - - Use the `title` variable passed from the controller in the `

` tag. - - ```html - - - - - Title - - -

Welcome to the Second Page

- - Go Back to Home - - - ``` - - The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. - -**Conclusion:** - -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task - -# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/en/a-thymeleaf/practice/working-with-variables.md b/docs/en/a-thymeleaf/practice/working-with-variables.md deleted file mode 100644 index e8a6dd5..0000000 --- a/docs/en/a-thymeleaf/practice/working-with-variables.md +++ /dev/null @@ -1,92 +0,0 @@ -# Working with variables - -**Description:** - -In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. - -## **Steps:** - -1. **Define Local Variables in Thymeleaf View:** - - Open your Thymeleaf view file (e.g., `first.html`). - - Explore the usage of local variables defined directly within the view. - - In the example code provided: - - ```html - - - Title - - ``` - - The local variable `title` is defined within the `` section of the HTML. - -2. **Localization Variables from Properties File:** - - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: - - ```java - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames("classpath:local/practice"); - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - ``` - - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: - - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Note on `{0}`:** - - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. - - - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. - - In the example code provided: - - ```html -

-

- ``` - - The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. - -3. **Static Variables in Thymeleaf Configuration Class:** - - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - ``` - - - Access these static variables in the Thymeleaf view using the `#vars` syntax. - - In the example code provided: - - ```html -

Project Name

-

Current Date and Time

- ``` - -## Result - -now your page should look like that: - -![first-view.png](../../../srcs/a-thymeleaf/first-view.png) - -**Conclusion:** - -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. - -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. - -# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/lab-work.md b/docs/en/b-springsecurity/lab-work.md deleted file mode 100644 index cde2198..0000000 --- a/docs/en/b-springsecurity/lab-work.md +++ /dev/null @@ -1,33 +0,0 @@ -# Spring Security Lab Work - -Welcome to the Spring Security Lab Work! The goal of this series of tasks is to help you practice and get know to Spring Security, and make an enough startup project. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of security integration in a Spring application. - -## Goal of the Lab Work - -The primary goal of this lab work is to provide you with practical experience and proficiency in using security within a Spring environment. Spring Security is widely utilized for authentication, authorization and securing your project, and through these tasks, you will gain valuable insights into its configuration, authentication, authorization, and more. - -## Practice Tasks - -1. [Task 1: Configure Spring Security](practice/configure-spring-security.md) -2. [Task 2: Create a Base Implementation for User](practice/base-implementation-user.md) -3. [Task 3: Password Encryption](practice/password-encryption.md) -4. [Task 4: Add a Dummy Users](practice/add-dummy-users.md) -5. [Task 5: Create Identity to Users](practice/create-identity-to-users.md) -6. [Task 6: Create a Base for Authorization in Server](practice/setup-server-authorization.md) -7. [Task 7: Authorize Authenticated Users](practice/authorize-server-authenticated.md) -8. [Task 8: Authorize by Role](practice/authorize-server-role.md) -9. [Task 9: Authorize by Authority](practice/authorize-server-authority.md) -10. [Task 10: Configure Thymeleaf Security](practice/configure-thymeleaf-security.md) -11. [Task 11: Authorize Authenticated Users](practice/authorize-client-authenticated.md) -12. [Task 12: Authorize by Role](practice/authorize-client-role.md) -13. [Task 13: Authorize by Authority](practice/authorize-client-authority.md) -14. [Task 14: Custom Login Form](practice/custom-login-form.md) - -## Lab Work Tasks - -- multi chain security -- create allowed paths -- create authenticated paths ( form-based ) -- create admin page ( role based ) -- hide and show content in depends on authorities and role. - diff --git a/docs/en/b-springsecurity/practice/add-dummy-users.md b/docs/en/b-springsecurity/practice/add-dummy-users.md deleted file mode 100644 index 194caf0..0000000 --- a/docs/en/b-springsecurity/practice/add-dummy-users.md +++ /dev/null @@ -1,68 +0,0 @@ -# Add Dummy Users - -This task outlines the process of updating the `CustomUserDetailsService` class to include a method for adding dummy users to the in-memory storage to serving as a simple demonstration of user creation. - -## Goal - -Update the `CustomUserDetailsService` class to include a method for adding dummy users, allowing for the initialization of user data in the in-memory storage. - -## Steps - -1. **Update CustomUserDetailsService Class:** - - First, we need to update the `CustomUserDetailsService` class to include a method for adding dummy users. We'll leverage this method during bean initialization to populate the in-memory storage with dummy user data. - - ```java - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; - private final PasswordEncoder passwordEncoder; - - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository, PasswordEncoder passwordEncoder) { - this.usersRepository = usersRepository; - this.passwordEncoder = passwordEncoder; - - // Call the addDummyUsers method to add dummy users during bean initialization - addDummyUsers(); - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // Retrieve user details from the repository - CustomUserDetails userDetails = usersRepository.findByUsername(username); - if (userDetails == null) { - throw new UsernameNotFoundException("User not found with username: " + username); - } - return userDetails; - } - - // Method to add dummy users - private void addDummyUsers() { - // Create dummy users - CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); - CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); - CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); - - // Add users to the repository - usersRepository.save(admin); - usersRepository.save(moderator); - usersRepository.save(user); - } - } - ``` - - In this updated class: - - We've added a constructor that accepts `UsersRepository` and `PasswordEncoder` as dependencies. - - During bean initialization, the constructor calls the `addDummyUsers` method to populate the in-memory storage with dummy users. - - The `addDummyUsers` method creates dummy users with hardcoded usernames and passwords. - - Finally, the dummy users are saved to the repository using the `save` method. - -## Conclusion - -Congratulations! You have successfully added dummy users to simulate a database in your Spring Security-enabled application. By initializing a list of dummy users in the UserRepositoryImpl class and populating it during application startup, you can now authenticate and authorize users within your application. - ---- - -# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/authorize-server-authenticated.md b/docs/en/b-springsecurity/practice/authorize-server-authenticated.md deleted file mode 100644 index 11b7182..0000000 --- a/docs/en/b-springsecurity/practice/authorize-server-authenticated.md +++ /dev/null @@ -1,42 +0,0 @@ -# Authorize Authenticated User - -This task outlines the process of authorizing authenticated users in your application. By requiring authentication for specific paths or endpoints, you can ensure that only logged-in users can access certain resources. - -## Goal - -Authorize access to the `/second` path only for authenticated users while allowing public access to other paths. - -## Steps - -1. **Update Security Configuration:** - - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify that access to the `/second` path should be restricted to authenticated users. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Other endpoints... - .requestMatchers("/second").authenticated() - // Other endpoints... - ); - } - } - ``` - - In this configuration: - - We use `.authorizeHttpRequests()` to define authorization rules. - - The `.requestMatchers("/second").authenticated()` statement specifies that access to the `/second` path should be restricted to authenticated users. - -## Conclusion - -You have successfully configured authorization to allow access to the `/second` path only for authenticated users. By requiring authentication for this path. - ---- - -# [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/authorize-server-authority.md b/docs/en/b-springsecurity/practice/authorize-server-authority.md deleted file mode 100644 index 2851857..0000000 --- a/docs/en/b-springsecurity/practice/authorize-server-authority.md +++ /dev/null @@ -1,43 +0,0 @@ -# Authorize by Authority - -This task outlines the process of authorizing users based on their authorities in your application. By assigning different authorities to users, you can control access to specific functionalities or actions. - -## Goal - -Authorize access to the `/addStudent` path for users with the `WRITE` authority and the `/removeStudent` path for users with the `DELETE` authority. - -## Steps - -1. **Update Security Configuration:** - - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify authority-based access control for the `/addStudent` and `/removeStudent` paths. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Other Endpoints... - .requestMatchers("/addStudent").hasAuthority("WRITE") - .requestMatchers("/removeStudent").hasAuthority("DELETE") - // Other Endpoints... - ); - } - } - ``` - - In this configuration: - - The `.requestMatchers("/addStudent").hasAuthority("WRITE")` statement specifies that access to the `/addStudent` path should be restricted to users with the `WRITE` authority. - - Similarly, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` restricts access to the `/removeStudent` path to users with the `DELETE` authority. - -## Conclusion - -You have successfully configured authority-based access control for the `/addStudent` and `/removeStudent` paths in your application. By assigning specific authorities to users, you can control access to different functionalities or actions based on their permissions. - ---- - -# [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/authorize-server-role.md b/docs/en/b-springsecurity/practice/authorize-server-role.md deleted file mode 100644 index e9eff58..0000000 --- a/docs/en/b-springsecurity/practice/authorize-server-role.md +++ /dev/null @@ -1,43 +0,0 @@ -# Authorize by Role - -This task outlines the process of authorizing users based on their roles in your application. By assigning different roles to users, you can control access to specific resources or functionalities. - -## Goal - -Authorize access to the `/third` path for users with the `ROLE_MODERATOR` role and the `/fourth` path for users with the `ROLE_ADMIN` role. - -## Steps - -1. **Update Security Configuration:** - - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify role-based access control for the `/third` and `/fourth` paths. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Other Endpoints... - .requestMatchers("/third").hasAuthority("ROLE_MODERATOR") - .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN") - // Other Endpoints... - ); - } - } - ``` - - In this configuration: - - The `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` statement specifies that access to the `/third` path should be restricted to users with the `ROLE_MODERATOR` authority. - - Similarly, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` restricts access to the `/fourth` path to users with the `ROLE_ADMIN` authority. - -## Conclusion - -You have successfully configured role-based access control for the `/third` and `/fourth` paths in your application. By assigning specific roles to users, you can control access to different parts of your application based on their permissions. - ---- - -# [NEXT TASK: Authorize by Authority](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/base-implementation-user.md b/docs/en/b-springsecurity/practice/base-implementation-user.md deleted file mode 100644 index 302d063..0000000 --- a/docs/en/b-springsecurity/practice/base-implementation-user.md +++ /dev/null @@ -1,188 +0,0 @@ -# Create Base Implementation for User - -In this task, we will focus on creating a base implementation for managing users in your application. This includes defining the UserDetails entity, creating a repository to manage user data, and implementing a UserDetailsService to load user details during authentication. - -## Goal - -The goal of this task is to establish a solid foundation for managing users within your application. By implementing UserDetails, UsersRepository, and UserDetailsService, you will be able to authenticate users, manage their details, and perform user-related operations efficiently. - -## Steps - -1. **Define UserDetails Entity** - - Start by defining a UserDetails entity that represents the user details in your application. This entity should implement the UserDetails interface provided by Spring Security. - - ```java - package edu.labs.yourproject.model; - - import org.springframework.security.core.GrantedAuthority; - import org.springframework.security.core.userdetails.UserDetails; - - import java.util.Collection; - - public class CustomUserDetails implements UserDetails { - - // Implement UserDetails methods here - - } - ``` - - Implement the methods required by the UserDetails interface to provide user details such as username, password, authorities, etc. - -2. **Create UsersRepository Class** - - Since we are using in-memory storage for now, we'll create a simple UsersRepository class to manage user data. - - a. **Create UsersRepository Class** - - Create a new Java class named `UsersRepository` inside the `edu.labs.yourproject.repository` package. - - ```java - package edu.labs.yourproject.repository; - - import org.springframework.stereotype.Repository; - import edu.labs.yourproject.model.CustomUserDetails; - - @Repository - public class UsersRepository { - - private List users = new ArrayList<>(); - - // Add methods for managing users as needed - } - ``` - - This class will serve as the repository for managing user data. We'll add methods to retrieve, add, update, and delete users in subsequent steps. - - b. **Add findByUsername Method** - - Add a method named `findByUsername` to the `UsersRepository` class. This method will retrieve user details by username from the repository. - - ```java - public CustomUserDetails findByUsername(String username) { - for (CustomUserDetails user : users) { - if (user.getUsername().equals(username)) { - return user; - } - } - return null; // User not found - } - ``` - - The `findByUsername` method is used to retrieve user details by username from the repository. In this placeholder implementation, it returns `null`, but you'll replace it with the actual logic to fetch user details from the database or any other data source. - -3. **Implement UserDetailsService** - - In this step, we will implement a UserDetailsService to load user details during authentication. This service will retrieve user information from the UsersRepository. - - a. **Create CustomUserDetailsService Class** - - Start by creating a new class named `CustomUserDetailsService` within your project's service package. This class will implement the UserDetailsService interface provided by Spring Security. - - ```java - package edu.labs.yourproject.service; - - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.security.core.userdetails.UserDetails; - import org.springframework.security.core.userdetails.UserDetailsService; - import org.springframework.security.core.userdetails.UsernameNotFoundException; - import org.springframework.stereotype.Service; - import com.yourcompany.yourproject.model.CustomUserDetails; - import com.yourcompany.yourproject.repository.UsersRepository; - - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; - - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository) { - this.usersRepository = usersRepository; - } - - // Implement methods here - } - ``` - - We create the `CustomUserDetailsService` class and autowire the `UsersRepository` dependency using constructor injection. - - b. **Override loadUserByUsername Method** - - Override the `loadUserByUsername` method defined in the UserDetailsService interface. This method will retrieve user details from the UsersRepository based on the provided username. - - ```java - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // Retrieve user details from the in-memory repository - CustomUserDetails userDetails = usersRepository.findByUsername(username); - if (userDetails == null) { - throw new UsernameNotFoundException("User not found with username: " + username); - } - return userDetails; - } - ``` - - Inside the `loadUserByUsername` method, we call the `findByUsername` method of the UsersRepository to retrieve user details by username. If the user is not found, we throw a UsernameNotFoundException. - -4. **Configure Beans in WebSecurityConfig** - - Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define beans for CustomUserDetails and UserDetailsRepository. - - ```java - package edu.labs.yourproject.config; - - import edu.labs.yourproject.model.CustomUserDetails; - import edu.labs.yourproject.repository.UserDetailsRepository; - import org.springframework.context.annotation.Bean; - import org.springframework.context.annotation.Configuration; - - @Configuration - @EnableWebSecurity - public class WebSecurityConfig { - - // The rest of code is here... - - @Bean - public CustomUserDetailsService customUserDetailsService() { - // Instantiate and configure CustomUserDetails bean - return new CustomUserDetailsService(); - } - - @Bean - public UserDetailsRepository userDetailsRepository() { - // Instantiate and configure UserDetailsRepository bean - return new UserDetailsRepository(); - } - } - ``` - - Define two bean methods: `CustomUserDetailsService()` and `userDetailsRepository()`. These methods instantiate and configure CustomUserDetailsService and UserDetailsRepository beans, respectively. - -## Folder Structure - -Your project's folder structure should resemble the following: - -``` -src -└── main - └── java - └── edu - └── labs - └── yourproject - ├── model - │ └── CustomUserDetails.java - ├── repository - │ └── UsersRepository.java - └── service - └── CustomUserDetailsService.java -``` - -This folder structure indicates where to create the `CustomUserDetailsService` class and the `UsersRepository` interface within your project. Organizing your classes in this manner helps maintain a clear and structured codebase. - -## Conclusion - -Congratulations! You have successfully created a base implementation for managing users in your application. With UserDetails, UsersRepository, and UserDetailsService in place, you can now authenticate users, manage their details, and perform user-related operations efficiently. - ---- - -# [NEXT TASK: Password Encryption](password-encryption.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/configure-spring-security.md b/docs/en/b-springsecurity/practice/configure-spring-security.md deleted file mode 100644 index b4d8035..0000000 --- a/docs/en/b-springsecurity/practice/configure-spring-security.md +++ /dev/null @@ -1,84 +0,0 @@ -# Configure Spring Security - -In this task, we will focus on configuring Spring Security in your project. Spring Security provides comprehensive security features for Java applications, including authentication, authorization, and protection against common security threats. - -## Goal - -The goal of this task is to integrate Spring Security into your existing project, ensuring that your application is secure and protected against unauthorized access. - -## Steps - -1. **Add Spring Security Dependency** - - - For Maven Projects: - - Add the following dependency to your project's `pom.xml` file: - - ```xml - - org.springframework.boot - spring-boot-starter-security - - ``` - - - For Gradle Projects: - - Add the following dependency to your project's `build.gradle` file: - - ```groovy - implementation 'org.springframework.boot:spring-boot-starter-security' - ``` - - Ensure that you include the appropriate version of Spring Security for your project. - -2. **Create Security Configuration Class** - - Create a new Java class named `WebSecurityConfig` within your project's source folder structure. Typically, this class resides in the `config` package. The file should be named `WebSecurityConfig.java`. - - Your project's folder structure should resemble the following: - - ``` - src - └── main - └── java - └── edu - └── labs - └── yourproject - ├── config - │ └── WebMvcConfig.java - │ └── WebSecurityConfig.java - └── controller - └── PracticeController.java - ``` - -3. **Configure Security Configuration Class** - - Inside the `WebSecurityConfig` class, annotate it with `@Configuration` and `@EnableWebSecurity` to indicate that it is a configuration class for Spring Security. also will annotate `configure` method with `@Bean` - - ```java - package edu.labs.yourproject.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; - import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - - @Configuration - @EnableWebSecurity - public class WebSecurityConfig { - - @Bean - public SecurityFilterChain configure(HttpSecurity http) throws Exception { - http - // Security configuration here - return http.build(); - } - } - ``` - -## Conclusion - -Congratulations! You have successfully configured Spring Security in your project. Your application is now equipped with robust security features to protect against unauthorized access and ensure the confidentiality and integrity of user data. - ---- - -# [Next Task: Create a Base Implementation for User](base-implementation-user.md) diff --git a/docs/en/b-springsecurity/practice/configure-thymeleaf-security.md b/docs/en/b-springsecurity/practice/configure-thymeleaf-security.md deleted file mode 100644 index f96301f..0000000 --- a/docs/en/b-springsecurity/practice/configure-thymeleaf-security.md +++ /dev/null @@ -1,33 +0,0 @@ -# Configure Thymeleaf with Spring Security - -## Goal -The goal of this task is to integrate Thymeleaf with Spring Security, enabling the use of additional Thymeleaf dialects and utilities provided by the `thymeleaf-extras-springsecurity6` library. - -## Steps - -1. **Gradle (Groovy):** - - Add the `thymeleaf-extras-springsecurity6` dependency to your `build.gradle` file: - - ```groovy - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE' - ``` - -2. **Maven:** - - Add the following dependency to your `pom.xml` file: - - ```xml - - org.thymeleaf.extras - thymeleaf-extras-springsecurity6 - 3.0.4.RELEASE - - ``` - -## Conclusion -After adding the dependency, Thymeleaf will be configured to work seamlessly with Spring Security, providing additional features and utilities for integrating security-related functionality into your web application. Remember to sync your project to download the dependency and make it available for use. - ---- - -[NEXT TASK:]() diff --git a/docs/en/b-springsecurity/practice/create-identity-to-users.md b/docs/en/b-springsecurity/practice/create-identity-to-users.md deleted file mode 100644 index 10a5955..0000000 --- a/docs/en/b-springsecurity/practice/create-identity-to-users.md +++ /dev/null @@ -1,65 +0,0 @@ -# Create Identity for Users - -This task outlines the process of adding authorities and roles to the users created in the previous step, "Add Dummy Users." By assigning roles and authorities to users, we establish their identity within the application and control their access to various resources and functionalities. - -## Goal - -Enhance the user profiles created in the previous step by assigning roles and authorities, thereby defining their identities and access permissions within the application. - -## Steps - -1. **Update User Profiles with Roles and Authorities:** - - We'll update the dummy user profiles created in the `CustomUserDetailsService` class to include roles and authorities. This involves assigning specific roles to each user, such as `ADMIN`, `MODERATOR`, or `USER`, and granting corresponding authorities based on their roles. - - ```java - // Inside addDummyUsers() method - - // Define roles - String adminRole = "ROLE_ADMIN"; - String moderatorRole = "ROLE_MODERATOR"; - String userRole = "ROLE_USER"; - - // Define authorities - List adminAuthorities = Arrays.asList( - new SimpleGrantedAuthority(adminRole), - new SimpleGrantedAuthority("READ"), - new SimpleGrantedAuthority("WRITE") - ); - - List moderatorAuthorities = Arrays.asList( - new SimpleGrantedAuthority(moderatorRole), - new SimpleGrantedAuthority("READ") - ); - - List userAuthorities = Collections.singletonList( - new SimpleGrantedAuthority(userRole) - ); - - // Create dummy users with roles and authorities - CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); - admin.setAuthorities(adminAuthorities); - admin.setRole(adminRole); - - CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); - moderator.setAuthorities(moderatorAuthorities); - moderator.setRole(moderatorRole); - - CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); - user.setAuthorities(userAuthorities); - user.setRole(userRole); - ``` - - In this updated code: - - We define roles and authorities as variables for clarity and ease of maintenance. - - Each user profile now includes a list of authorities based on their assigned roles. - - Authorities are represented as `SimpleGrantedAuthority` objects and added to the user profiles accordingly. - - Additionally, we set the role for each user to enable role-based access control in subsequent steps. - -## Conclusion - -You have successfully enhanced the user profiles in your application by assigning roles and authorities to the dummy users. By defining their identities and access permissions, you can now control the actions and functionalities available to each user within the application. - ---- - -# [NEXT TASK: Create a Base for Authorization in Server](setup-server-authorization.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/custom-login-form.md b/docs/en/b-springsecurity/practice/custom-login-form.md deleted file mode 100644 index d05342f..0000000 --- a/docs/en/b-springsecurity/practice/custom-login-form.md +++ /dev/null @@ -1,44 +0,0 @@ -# Custom Login Form - -This task guides you through the process of enabling a custom login form for authentication using Spring Security. By implementing a custom login form, users can securely authenticate into your application. - -## Goal - -Activate the custom login form page that has already been created in specific path. - -## Steps - -1. **Update Security Configuration:** - - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify the custom login page. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Add other authorization configurations here - ) - .formLogin((login) -> login - .loginPage("/custom-login-page") // Specify the custom login page URL - // Add other form login configurations here - ); - } - } - ``` - - In this configuration: - - The `.loginPage("/custom-login-page")` statement specifies the URL of the custom login page. - - You can add additional configurations to customize the form login behavior, such as setting login success or failure URLs, defining form field names, etc. - -## Conclusion - -You have successfully enabled the custom login form page for authentication in your application. Users can now access the custom login page to securely log in and authenticate into the system. - ---- - -# [TASKS](../lab-work.md) diff --git a/docs/en/b-springsecurity/practice/password-encryption.md b/docs/en/b-springsecurity/practice/password-encryption.md deleted file mode 100644 index 4c9c18d..0000000 --- a/docs/en/b-springsecurity/practice/password-encryption.md +++ /dev/null @@ -1,85 +0,0 @@ -# Password Encryption - -In this task, we will configure password encryption for user authentication in a Spring Security-enabled application. Encrypting passwords enhances security by storing them securely in the database. - -## Goal - -The goal of this setup is to configure password encryption using the BCryptPasswordEncoder provided by Spring Security. This ensures that passwords are securely hashed before being stored in the database. - -## Steps - -1. **Add BCryptPasswordEncoder Bean** - - Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define a bean for BCryptPasswordEncoder. - - ```java - package edu.labs.yourproject.config; - - import org.springframework.context.annotation.Bean; - import org.springframework.context.annotation.Configuration; - import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - - @Configuration - public class WebSecurityConfig { - - @Bean - public BCryptPasswordEncoder passwordEncoder() { - // Instantiate and configure BCryptPasswordEncoder bean - return new BCryptPasswordEncoder(); - } - } - ``` - - Define a bean method `passwordEncoder()` that instantiates and configures a BCryptPasswordEncoder bean. This bean will be used to encode passwords before storing them in the database. - -2. **Encrypt Passwords** - - a. **Update CustomUserDetailsService Class** - - Open the CustomUserDetailsService class located in your project's service package (`edu.labs.yourproject.service`). Inject the BCryptPasswordEncoder bean into this class. - - ```java - package edu.labs.yourproject.service; - - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - import org.springframework.stereotype.Service; - import edu.labs.yourproject.model.CustomUserDetails; - import edu.labs.yourproject.repository.UsersRepository; - - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; - - @Autowired - private BCryptPasswordEncoder passwordEncoder; - - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository) { - this.usersRepository = usersRepository; - } - } - ``` - - b. **Implement Registration Method** - - Define a method in the CustomUserDetailsService class to handle user registration. In this method, encrypt the user's password before saving it to the database. - - ```java - public void registerUser(CustomUserDetails user) { - // Encrypt password before saving user - String encodedPassword = passwordEncoder.encode(user.getPassword()); - user.setPassword(encodedPassword); - usersRepository.save(user); - } - ``` - - This method takes a CustomUserDetails object representing the user to be registered. It encrypts the user's password using the BCryptPasswordEncoder bean and then saves the user to the database. - -## Conclusion - -Congratulations! You have successfully set up password encryption using BCryptPasswordEncoder in your Spring Security-enabled application. By encrypting passwords, you enhance the security of user authentication and protect sensitive user data. - ---- -# [NEXT TASK: Add a Dummy Users](add-dummy-users.md) \ No newline at end of file diff --git a/docs/en/b-springsecurity/practice/setup-server-authorization.md b/docs/en/b-springsecurity/practice/setup-server-authorization.md deleted file mode 100644 index d14dfe9..0000000 --- a/docs/en/b-springsecurity/practice/setup-server-authorization.md +++ /dev/null @@ -1,45 +0,0 @@ -# Setup Server Authorization - -This task you through setting up authorization in your application by configuring security rules using Spring Security. By defining authorization rules, you can control access to specific paths and endpoints within your application. - -## Goal - -Configure authorization rules to restrict or allow access to various paths and endpoints in the application. - -## Steps - -1. **Add Security Configuration:** - - In the `WebSecurityConfig` class, add the `configure(HttpSecurity http)` method to define security rules for the application. We'll use the paths and endpoints defined in the previous lab work. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - .requestMatchers("/first").permitAll() - .requestMatchers("/second").permitAll() - .requestMatchers("/third").permitAll() - .requestMatchers("/fourth").permitAll() - .requestMatchers("/addStudent").permitAll() - .requestMatchers("/removeStudent").permitAll() - ); - } - } - ``` - - In this configuration: - - We use `.authorizeHttpRequests()` to define authorization rules. - - Inside the lambda expression, we specify which requests should be permitted. - -## Conclusion - -You have successfully set up authorization rules in your application to control access to different paths and endpoints. By defining specific permissions for each path, you can ensure that users can only access the resources they are authorized to use. - ---- - -# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/lab-work.md b/docs/ru/a-thymeleaf/lab-work.md deleted file mode 100644 index 0cb08df..0000000 --- a/docs/ru/a-thymeleaf/lab-work.md +++ /dev/null @@ -1,74 +0,0 @@ -# Лабораторная работа по Thymeleaf - -Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. - -## Цель лабораторной работы - -Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство использования Thymeleaf в среде Spring. Thymeleaf широко используется для серверного рендеринга в веб-разработке, и через эти задачи вы получите ценные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом. - -## Практические задачи - -1. [Задача 1: Настройка Thymeleaf в Spring](practice/configure-thymeleaf.md) -2. [Задача 2: Создание первого представления](practice/create-first-view.md) -3. [Задача 3: Работа с переменными](practice/working-with-variables.md) -4. [Задача 4: Переменные и контроллер](practice/variables-and-controller.md) -5. [Задача 5: Итерация](practice/iteration.md) -6. [Задача 6: Литералы](practice/literals.md) -7. [Задача 7: Формы](practice/forms.md) -8. [Задача 8: Обработка форм](practice/form-handling.md) -9. [Задача 9: Query Parameter и валидация](practice/validation.md) -10. [Задача 10: Фрагменты и макеты](practice/fragments-and-layouts.md) - - -## Задачи лабораторной работы - -1. **Задача 1: Создание HTML-макета с фрагментами** - - - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, head и подвал. - - Соберите эти фрагменты в один HTML-файл, чтобы создать полный макет. - - Например: - - ![layout.png](../../srcs/a-thymeleaf/layout.png) - -2. **Задача 2: Создание домашней страницы с локализацией** - - - Реализуйте домашнюю страницу, доступную по пути `/`. - - Используйте созданный в Задаче 1 макет для структурирования домашней страницы. - - Используйте выражения `#{}` для всего текстового содержимого на домашней странице, демонстрируя локализацию или сообщения из файла .properties. - - Например: - - ![home-page.png](../../srcs/a-thymeleaf/home-page.png) - -3. **Задача 3: Создание форм входа и регистрации** - - - Разработайте и реализуйте формы входа и регистрации для аутентификации пользователей. - - Используйте привязку модели Thymeleaf для обработки данных формы. - - Например: - - ![login-page.png](../../srcs/a-thymeleaf/login-page.png) - - ![signup-page.png](../../srcs/a-thymeleaf/signup-page.png) - -4. **Задача 4: Валидация действий входа и регистрации** - - - Реализуйте валидацию для действий входа и регистрации. - - Используйте параметры запроса для передачи сообщений об ошибках в случае неудачной валидации. - - Обеспечьте безопасное и правильное обращение с вводом пользователя. - - Например: - - ![login-validation.png](../../srcs/a-thymeleaf/login-validation.png) - -5. **Задача 5: Создание страницы пользователей** - - - Разработайте страницу "Пользователи", отображающую таблицу пользователей. - - Реализуйте итерацию для динамического заполнения таблицы данными пользователей. - - Предоставьте функциональность удаления или изменения записей пользователя со страницы. - - Например: - - ![users-page.png](../../srcs/a-thymeleaf/users-page.png) - - ![modify-user-page.png](../../srcs/a-thymeleaf/modify-user-page.png) - -Не стесняйтесь исследовать и выполнять эти задачи в своем собственном темпе. Каждая задача разработана для дополнительного развития ваших навыков в Thymeleaf и веб-разработке. Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться. - -Счастливого кодирования! \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md b/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md deleted file mode 100644 index f767e45..0000000 --- a/docs/ru/a-thymeleaf/practice/configure-thymeleaf.md +++ /dev/null @@ -1,119 +0,0 @@ -# Настройка Thymeleaf в Spring - -**Описание:** - -Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения беспроблемной интеграции шаблонного движка для веб-разработки. - -## **Шаги:** - -1. **Создайте Класс Конфигурации Thymeleaf:** - - В вашем проекте Spring создайте новый Java-класс, аннотированный `@Configuration`. Мы рекомендуем разместить этот класс в пакете `config`. - - Расширьте класс с `WebMvcConfigurer`. - - Пример: - - ```java - package edu.labs.thymeleaf.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - @Configuration - public class WebMvcConfig implements WebMvcConfigurer { - // Код конфигурации размещается здесь - } - ``` - - Размещение класса конфигурации в пакете `config` повышает организованность и обеспечивает четкую структуру в вашем проекте. Скорректируйте имя пакета в зависимости от структуры вашего проекта. - -2. **Настройте Разрешитель Шаблонов Thymeleaf:** - - Определите метод, аннотированный `@Bean`, для конфигурации разрешителя шаблонов Thymeleaf. - - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов. - - ```java - @Bean - public ClassLoaderTemplateResolver templateResolver() { - // Создайте bean ClassLoaderTemplateResolver - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - // Установите путь, где Thymeleaf будет искать шаблоны - templateResolver.setPrefix("/templates/"); - - // Установите расширение файла для шаблонов - templateResolver.setSuffix(".html"); - - // Установите режим шаблона в HTML - templateResolver.setTemplateMode(TemplateMode.HTML); - - // Установите кодировку символов для шаблонов - templateResolver.setCharacterEncoding("UTF-8"); - - // Верните настроенный bean разрешителя шаблонов - return templateResolver; - } - ``` - -3. **Настройте Источник Сообщений:** - - Добавьте метод, аннотированный `@Bean`, для настройки источника сообщений с использованием `ReloadableResourceBundleMessageSource`. - - Установите кодировку по умолчанию. - - ```java - @Bean - public MessageSource messageSource() { - // Создайте bean ReloadableResourceBundleMessageSource - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - - // Установите кодировку по умолчанию для сообщений - messageSource.setDefaultEncoding("UTF-8"); - - // Верните настроенный bean источника сообщений - return messageSource; - } - ``` - -4. **Настройте Разрешитель Представлений Thymeleaf:** - - Создайте метод, аннотированный `@Bean`, для настройки разрешителя представлений Thymeleaf. - - Установите шаблонный движок. - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - // Создайте bean ThymeleafViewResolver - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - - // Установите шаблонный движок для разрешителя представлений - resolver.setTemplateEngine(templateEngine()); - - // Верните настроенный bean ThymeleafViewResolver - return resolver; - } - ``` - -5. **Настройте Шаблонный Движок Thymeleaf:** - - Реализуйте метод, аннотированный `@Bean`, для настройки шаблонного движка Thymeleaf. - - Установите разрешитель шаблонов и источник сообщений шаблонного движка. - - ```java - @Bean - public SpringTemplateEngine templateEngine() { - // Создайте bean SpringTemplateEngine - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - - // Установите разрешитель шаблонов для шаблонного движка - templateEngine.setTemplateResolver(templateResolver()); - - // Установите источник сообщений шаблонного движка - templateEngine.setTemplateEngineMessageSource(messageSource()); - - // Верните настроенный bean SpringTemplateEngine - return templateEngine; - } - ``` - ---- - -**Заключение:** - -Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html). - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/create-first-view.md b/docs/ru/a-thymeleaf/practice/create-first-view.md deleted file mode 100644 index a2ed7b7..0000000 --- a/docs/ru/a-thymeleaf/practice/create-first-view.md +++ /dev/null @@ -1,63 +0,0 @@ -# Создание Первого Представления - -**Описание:** - -В данной задаче мы создадим первое представление Thymeleaf для вашего приложения Spring. Следуйте указанному пути к файлам, определенному в конфигурации Thymeleaf, и зарегистрируйте представление в приложении. - -## **Шаги:** - -1. **Создайте Файл Представления:** - - Перейдите в каталог, указанный в конфигурации Thymeleaf как префикс для шаблонов. - - По умолчанию префикс настроен как `/templates/`. Следовательно, создайте файл представления Thymeleaf в этом каталоге. - - ```plaintext - Каталог Проекта - └── src - └── main - └── resources - └── templates - └── practice - └── first.html - ``` - - Убедитесь, что файл представления имеет правильное имя (например, `first.html`). Каталог `/templates/` важен для того, чтобы Thymeleaf мог правильно находить и обрабатывать ваши шаблоны. - -2. **Зарегистрируйте Представление в Конфигурационном Классе:** - - Откройте конфигурационный класс, где вы настраивали Thymeleaf (например, `WebMvcConfig`). - - Добавьте следующий метод для регистрации представления Thymeleaf: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // Первое представление - registry.addViewController("/first").setViewName("practice/first"); - } - ``` - - Этот метод сопоставляет URL-путь `/first` с представлением Thymeleaf с именем "practice/first". Скорректируйте путь в соответствии с структурой вашего проекта. - -3. **Проверьте Представление:** - - Запустите ваше приложение Spring. - - Откройте веб-браузер и перейдите по адресу `http://localhost:8080/first`. Вы должны увидеть отображенное представление Thymeleaf. - -4. **Дополнительно: Настройте Перенаправление с Корневого Пути:** - - Чтобы установить первое представление в качестве страницы по умолчанию, вы можете добавить перенаправление с корневого пути ("/") на путь первого представления в методе `addViewControllers`: - - ```java - public void addViewControllers(ViewControllerRegistry registry) { - // Первое представление - registry.addViewController("/first").setViewName("practice/first"); - - // Перенаправление с корневого пути на первое представление - registry.addRedirectViewController("/", "/first"); - } - ``` - - Теперь при посещении `http://localhost:8080/` произойдет автоматическое перенаправление на первое представление. - ---- - -**Вывод:** - -Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/form-handling.md b/docs/ru/a-thymeleaf/practice/form-handling.md deleted file mode 100644 index 607eba6..0000000 --- a/docs/ru/a-thymeleaf/practice/form-handling.md +++ /dev/null @@ -1,74 +0,0 @@ -# Обработка Формы - -**Описание:** - -В этом продолжении мы сосредоточимся на обработке отправки форм и отображении представления с использованием `PracticeController`. Это включает передачу модели в представление при его отображении и реализацию логики обработки отправки формы. - -**Шаги:** - -1. **Отображение Представления Формы (PracticeController):** - - - Откройте класс `PracticeController` и добавьте метод для отображения представления формы: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Другие методы... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Объяснение: - - `@GetMapping("/third")`: Эта аннотация сопоставляет метод с обработкой GET-запросов для конечной точки `/third`. - - `showAddStudentForm(Model model)`: Этот метод принимает параметр `Model`, добавляет в него новый объект `StudentModel` и возвращает имя представления (`"thirdView"` в данном случае). Обновлено для отражения правильного названия представления. - - Модель заполняется новым экземпляром `StudentModel`, который будет использоваться для привязки полей формы. - -2. **Обработка Отправки Формы (PracticeController):** - - - Добавьте метод в `PracticeController` для обработки отправки формы: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Другие методы... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Объяснение: - - `@PostMapping("/addStudent")`: Эта аннотация сопоставляет метод с обработкой POST-запросов для конечной точки `/addStudent`. - - `addStudent(@ModelAttribute("model") StudentModel model)`: Этот метод принимает атрибут `model` из отправленной формы (`@ModelAttribute`) и обрабатывает его. Данные формы автоматически привязываются к объекту `model`. - - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия. - - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`). - -**Заключение:** - -Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/forms.md b/docs/ru/a-thymeleaf/practice/forms.md deleted file mode 100644 index 28345b5..0000000 --- a/docs/ru/a-thymeleaf/practice/forms.md +++ /dev/null @@ -1,120 +0,0 @@ -# Формы - -**Описание:** - -В этом задании вы создадите новое представление Thymeleaf с именем `third.html` и реализуете логику обработки форм в контроллере `PracticeController`. Форма позволит пользователям добавлять новых студентов с определенными данными, и контроллер будет обрабатывать отправку формы. - -**Шаги:** - -1. **Создайте третье представление (third.html):** - - - Создайте новый файл представления Thymeleaf с именем `third.html` в каталоге `/src/main/resources/templates/practice`. - - ```html - - - - - Добавление студента - - -
- Добавление студента - -
- -

- - -

-
-
- - - ``` - -2. **Настройте отправку формы:** - - - В теге `form` настройте детали отправки формы: - - ```html -
- ``` - - - Объяснение: - - `action="#"`: Этот атрибут указывает URL, на который будут отправлены данные формы при отправке. `#` указывает, что форма будет отправлена на тот же URL, с которого она была запрошена. - - `th:action="@{/addStudent}"`: Этот атрибут Thymeleaf динамически устанавливает атрибут `action` на основе выражения Thymeleaf. `@{/addStudent}` генерирует абсолютный URL для конечной точки `/addStudent`. - - `th:object="${model}"`: Этот атрибут связывает форму с объектом-моделью (`model`). Thymeleaf использует этот объект для привязки полей формы к свойствам во время отправки формы и рендеринга. - - `method="post"`: Этот атрибут указывает HTTP-метод, используемый при отправке данных формы на сервер. Установлено значение `post`, указывающее, что данные формы будут отправлены в теле запроса. - -3. **Передайте поле 'id':** - - - В форме найдите раздел для поля `id`: - - ```html - -

- - -

- ``` - - - Объяснение: - - `th:field="*{id}"`: Этот атрибут Thymeleaf привязывает поле ввода к свойству `id` объекта `model`. Это гарантирует, что значение, введенное в поле ввода, будет установлено в свойство `id` при отправке формы. - - `id="id"` и `name="id"`: Эти атрибуты предоставляют идентификаторы для поля ввода. - -4. **Повторите эти шаги:** - - - Повторите эти шаги для каждого оставшегося поля (`firstName`, `sureName`, `isGraduated` и `mark`). Убедитесь, что вы обновляете атрибуты `label`, `id`, `name` и `th:field` соответственно. - - Вот пример кода: - ```html - - - - - Добавление студента - - -
- Добавление студента - - - -

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- - - -
- - - ``` - -## Результат -Ваше представление должно выглядеть так: - -![third-view.png](../../../srcs/a-thymeleaf/third-view.png) - -**Заключение:** - -Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md) \ No newline at end of file diff --git a/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md b/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md deleted file mode 100644 index faf86c1..0000000 --- a/docs/ru/a-thymeleaf/practice/fragments-and-layouts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Фрагменты и макеты - -**Описание:** - -В этом разделе мы реализуем фрагменты и макеты Thymeleaf. Мы обновим существующие представления, чтобы включить в них фрагменты, а затем создадим новое представление, использующее эти фрагменты. - -## **Шаги:** - -1. **Обновите `first.html` с фрагментом:** - - - Откройте файл `first.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: - - ```html - - - - - - - -
-

Это информационный раздел первого представления.

-
- - - - ``` - -2. **Обновите `second.html` с фрагментом:** - - - Откройте файл `second.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `` внутри тега ``: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Обновите `third.html` с фрагментом:** - - - Откройте файл `third.html` в каталоге `practice`. - - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: - - ```html - - - - - - - -
- Добавление студента - -
-

Студент успешно добавлен!

-
- -
- -
-
- - - - ``` - -4. **Создайте `fourth.html` с использованием фрагментов:** - - - Создайте новый файл с именем `fourth.html` в каталоге `practice`. - - Используйте атрибуты `th:insert` и `th:replace`, чтобы включить фрагменты из других представлений: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Объяснение: - - `th:insert` используется для включения содержимого указанного фрагмента (`info` и `add-student-form`) в файл `fourth.html`. - - `th:replace` используется для замены содержимого указанного фрагмента (`students-table`) в файле `fourth.html`. - -## Результат -Ваше представление должно выглядеть так: - -![fourth-view.png](../../../srcs/a-thymeleaf/fourth-view.png) - -**Заключение:** - -Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`. - -# Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)** diff --git a/docs/ru/a-thymeleaf/practice/iteration.md b/docs/ru/a-thymeleaf/practice/iteration.md deleted file mode 100644 index b135fdf..0000000 --- a/docs/ru/a-thymeleaf/practice/iteration.md +++ /dev/null @@ -1,107 +0,0 @@ -# Итерация - -**Описание:** - -В этом задании вы изучите концепцию итерации в Thymeleaf, создав класс `StudentModel` в пакете `models/` и заполнив список студентов в контроллере `PracticeController`. Целью является передача списка студентов в представление `secondView` и отображение таблицы с данными студентов. - -**Шаги:** - -1. **Создайте класс StudentModel:** - - В пакете `models/` создайте класс `StudentModel` со следующими атрибутами: - - ```java - public class StudentModel { - private Integer id = 0; - private String firstName = ""; - private String sureName = ""; - private Boolean isGraduated = false; - private Integer mark = 0; - - // Конструктор, геттеры и сеттеры - } - ``` - -2. **Заполните список студентов в контроллере PracticeController:** - - В классе `PracticeController` создайте список `StudentModel` и заполните его фиктивными данными студентов: - - ```java - @Controller - public class PracticeController { - private final List students = new ArrayList<>(); - - public PracticeController() { - // Заполните список пользователями - this.students.add(new StudentModel(1, "First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); - } - - // Остальные методы контроллера - } - ``` - -3. **Передайте студентов в secondView:** - - В методе `secondView` контроллера `PracticeController` добавьте список студентов в модель. - - ```java - @Controller - public class PracticeController { - // Остальные методы... - - @GetMapping("/second") - public String secondView(Model model) { - // Передайте список студентов в представление - model.addAttribute("students", students); - // Остальная часть метода... - } - } - ``` - -4. **Отобразите таблицу студентов в second.html:** - - Откройте файл представления Thymeleaf `second.html`. - -5. **Отобразите заголовок таблицы:** - - Добавьте раздел заголовка таблицы внутри тега ``: - - ```html - - - - - - - - - - - -
IdFirstNamesureNameGraduatedMark
- ``` - -6. **Отобразите тело таблицы с использованием итерации:** - - Добавьте раздел тела таблицы внутри тега `` и выполните итерацию по списку студентов для отображения каждой строки: - - ```html - - - - - - - - - - - ``` - -## Результат -Ваша страница должна выглядеть так: - -![second-view.png](../../../srcs/a-thymeleaf/second-view.png) - -**Заключение:** - -Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md) diff --git a/docs/ru/a-thymeleaf/practice/literals.md b/docs/ru/a-thymeleaf/practice/literals.md deleted file mode 100644 index 15bb6d6..0000000 --- a/docs/ru/a-thymeleaf/practice/literals.md +++ /dev/null @@ -1,55 +0,0 @@ -# Литералы - -**Описание:** - -В этом задании вы улучшите представление Thymeleaf `second.html`, внедрив литералы для отображения измененных значений в зависимости от определенных условий. Литералы включают добавление константного значения к `id`, отображение "Да" или "Нет" для поля "Graduated" и предоставление описательных меток для полей "Mark" и "Diploma Type". - -**Шаги:** - -1. **Обновите фрагмент students-table в second.html:** - - Откройте файл представления Thymeleaf `second.html`. - -2. **Улучшите литерал для идентификатора студента:** - - Измените выражение для поля `id`, добавив константное значение (например, 100000) к фактическому идентификатору студента. - - ```html - - ``` - -3. **Улучшите литерал для поля "Graduated":** - - Обновите выражение для поля "Graduated" так, чтобы отображалось "Да", если студент закончил обучение, и "Нет" в противном случае. - - ```html - - ``` - -4. **Улучшите литерал для поля "Mark":** - - Добавьте условные выражения для отображения описательных меток для поля "Mark" в зависимости от оценки студента. - - ```html - Хорошо - Очень хорошо - Отлично - Не сдано - ``` - -5. **Добавьте литерал для поля "Diploma Type":** - - Добавьте условные выражения для отображения описательных меток для поля "Diploma Type" в зависимости от оценки студента и статуса окончания обучения. - - ```html - Синяя - Синяя - Красная - Нет диплома - ``` - -## Результат -Ваше представление должно выглядеть примерно так: - -![second-view-enhanced.png](../../../srcs/a-thymeleaf/second-view-enhanced.png) - -**Заключение:** - -Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md) diff --git a/docs/ru/a-thymeleaf/practice/validation.md b/docs/ru/a-thymeleaf/practice/validation.md deleted file mode 100644 index edd443b..0000000 --- a/docs/ru/a-thymeleaf/practice/validation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Запросы и валидация - -**Описание:** - -В этом продолжении мы рассмотрим использование параметров запроса для отображения сообщений в представлении после обработки отправленных форм. Это включает в себя адаптацию `thirdView` для отображения сообщений об успешном выполнении и сообщений об ошибках на основе параметров запроса. - -**Шаги:** - -1. **Адаптация представления (thirdView.html):** - - - Откройте файл `third.html` и добавьте секции для отображения сообщений об успехе и ошибок: - - ```html - - - - - - - - -
-

Студент успешно добавлен!

-
- -
-

Ошибка:

-
- - - - - ``` - - - Объяснение: - - `
` проверяет, присутствует ли параметр запроса `error` в URL. - - Если параметр присутствует, отображается сообщение об ошибке красного цвета, полученное из `${param.error}`. - -2. **Обработка отправки формы с дополнительной валидацией (PracticeController):** - - - Обновите метод `addStudent` в `PracticeController` для включения дополнительной валидации оценки студента с использованием структуры `if-else`: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Остальные методы... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Дополнительная валидация: Проверка, что оценка не более 5. - if (model.getMark() > 5) { - // Если оценка больше 5, выполняется перенаправление с сообщением об ошибке. - return "redirect:/third?error=Оценка не должна быть более 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Результат -Ваша страница должна выглядеть так: - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-success.png) - -![third-view-error.png](../../../srcs/a-thymeleaf/third-view-error.png) - - -**Заключение:** - -Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md) diff --git a/docs/ru/a-thymeleaf/practice/variables-and-controller.md b/docs/ru/a-thymeleaf/practice/variables-and-controller.md deleted file mode 100644 index b4a2d9f..0000000 --- a/docs/ru/a-thymeleaf/practice/variables-and-controller.md +++ /dev/null @@ -1,67 +0,0 @@ -# Переменные и контроллер - -**Описание:** - -В этом задании вы создадите новое представление Thymeleaf с именем `second.html` и изучите концепцию передачи переменных из контроллера в представление. Вместо определения заголовка как локальной переменной в представлении, мы передадим его через контроллер. - -**Шаги:** - -1. **Создание нового файла представления:** - - Создайте новый файл представления Thymeleaf с именем `second.html` в каталоге `/src/main/resources/templates/`. - - ```plaintext - Каталог проекта - └── src - └── main - └── resources - └── templates - └── practice - └── second.html - ``` - -2. **Определение контроллера:** - - В вашем классе контроллера (например, `PracticeController`) определите метод, который сопоставляется с URL-путем, связанным с новым представлением. Передайте нужную переменную (например, `title`) в модель. - - ```java - @Controller - public class PracticeController { - - @GetMapping("/second") - public String secondView(Model model) { - // Передача переменных в представление - model.addAttribute("title", "Вторая страница"); - - // Возврат имени представления - return "practice/second"; - } - } - ``` - - Этот метод контроллера сопоставляется с URL-путем `/second` и передает переменную `title` со значением "Вторая страница" в представление Thymeleaf. - -3. **Обновление представления для использования переменной, переданной контроллером:** - - Откройте файл представления Thymeleaf `second.html`. - - Используйте переменную `title`, переданную контроллером, в теге `

`. - - ```html - - - - - Заголовок - - -

Добро пожаловать на вторую страницу

- - Вернуться на главную - - - ``` - - Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера. - -**Заключение:** - -Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md) diff --git a/docs/ru/a-thymeleaf/practice/working-with-variables.md b/docs/ru/a-thymeleaf/practice/working-with-variables.md deleted file mode 100644 index b10623c..0000000 --- a/docs/ru/a-thymeleaf/practice/working-with-variables.md +++ /dev/null @@ -1,92 +0,0 @@ -# Работа с переменными - -**Описание:** - -В этом задании вы исследуете и используете различные типы локальных переменных в Thymeleaf в представлениях вашего приложения Spring. К ним относятся переменные, определенные непосредственно в представлении, переменные, переданные из контроллера, переменные, определенные в файле свойств для локализации, и статические переменные, определенные в классе конфигурации Thymeleaf. - -## **Шаги:** - -1. **Определение локальных переменных в представлении Thymeleaf:** - - Откройте файл представления Thymeleaf (например, `first.html`). - - Изучите использование локальных переменных, определенных непосредственно в представлении. - - В предоставленном примере кода: - - ```html - - - Title - - ``` - - Локальная переменная `title` определена внутри секции `` HTML. - -2. **Локализация переменных из файла свойств:** - - Просмотрите конфигурацию бина `MessageSource` в вашем классе конфигурации Thymeleaf: - - ```java - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames("classpath:local/practice"); - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - ``` - - Создайте файл `practice.properties` в папке `/src/main/resources/local/` и добавьте следующее содержимое: - - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Примечание о `{0}`:** - - Обозначение `{0}` в локализационных сообщениях представляет собой заполнитель для переменной. Когда сообщение отображается, заполнитель `{0}` заменяется фактическим значением, предоставленным в сообщении. Например, в сообщении `Welcome, {0}`, `{0}` будет заменено значением переменной, таким как имя. - - - Изучите использование локализованных переменных в представлении Thymeleaf с использованием синтаксиса `#{}`. - - В предоставленном примере кода: - - ```html -

-

- ``` - - Переменные `student.name`, `student.group`, `message.welcome` и `message.info` все реализуют эту идею. - -3. **Статические переменные в классе конфигурации Thymeleaf:** - - В своем классе конфигурации Thymeleaf добавьте статические переменные с использованием метода `addStaticVariable`: - - ```java - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - ``` - - - Получите доступ к этим статическим переменным в представлении Thymeleaf с использованием синтаксиса `#vars`. - - В предоставленном примере кода: - - ```html -

Project Name

-

Current Date and Time

- ``` - -## Результат - -теперь ваша страница должна выглядеть так: - -![first-view.png](../../../srcs/a-thymeleaf/first-view.png) - -**Заключение:** - -Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring. - -Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций. - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md) diff --git a/docs/ru/b-springsecurity/lab-work.md b/docs/ru/b-springsecurity/lab-work.md deleted file mode 100644 index f79bc17..0000000 --- a/docs/ru/b-springsecurity/lab-work.md +++ /dev/null @@ -1,26 +0,0 @@ -# Лабораторные работы по Spring Security - -Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам практиковаться и познакомиться с Spring Security, а также создать достаточно полноценный проект. Будь вы начинающим или стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring. - -## Цель лабораторных работ - -Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего проекта, и через эти задачи вы получите ценные знания о его конфигурации, аутентификации, авторизации и многом другом. - -## Задачи практики - -1. [Задача 1: Настройка Spring Security](practice/configure-spring-security.md) -2. [Задача 2: Создание базовой реализации для пользователя](practice/base-implementation-user.md) -3. [Задача 3: Шифрование пароля](practice/password-encryption.md) -4. [Задача 4: Добавление фиктивных пользователей](practice/add-dummy-users.md) -5. [Задача 5: Создание идентификации для пользователей](practice/create-identity-to-users.md) -6. [Задача 6: Создание базы для авторизации на сервере](practice/setup-server-authorization.md) -7. [Задача 7: Авторизация аутентифицированных пользователей](practice/authorize-server-authenticated.md) -8. [Задача 8: Авторизация по ролям](practice/authorize-server-role.md) -9. [Задача 9: Авторизация по полномочиям](practice/authorize-server-authority.md) -10. [Задача 10: Настройка Thymeleaf Security](practice/configure-thymeleaf-security.md) -11. [Задача 11: Авторизация аутентифицированных пользователей](practice/authorize-client-authenticated.md) -12. [Задача 12: Авторизация по ролям](practice/authorize-client-role.md) -13. [Задача 13: Авторизация по полномочиям](practice/authorize-client-authority.md) -14. [Задача 14: Пользовательская форма входа](practice/custom-login-form.md) - -## Задачи лабораторной работы diff --git a/docs/ru/b-springsecurity/practice/add-dummy-users.md b/docs/ru/b-springsecurity/practice/add-dummy-users.md deleted file mode 100644 index d439254..0000000 --- a/docs/ru/b-springsecurity/practice/add-dummy-users.md +++ /dev/null @@ -1,68 +0,0 @@ -# Добавление фиктивных пользователей - -В этом задании описан процесс обновления класса `CustomUserDetailsService` для включения метода добавления фиктивных пользователей в хранилище в памяти, чтобы использовать его в качестве простого демонстрационного примера создания пользователей. - -## Цель - -Обновить класс `CustomUserDetailsService`, чтобы включить метод добавления фиктивных пользователей, позволяющий инициализировать данные пользователей в хранилище в памяти. - -## Шаги - -1. **Обновление класса CustomUserDetailsService:** - - Сначала нам нужно обновить класс `CustomUserDetailsService`, чтобы добавить метод добавления фиктивных пользователей. Мы будем использовать этот метод во время инициализации бина для заполнения хранилища в памяти данными о фиктивных пользователях. - - ```java - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; - private final PasswordEncoder passwordEncoder; - - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository, PasswordEncoder passwordEncoder) { - this.usersRepository = usersRepository; - this.passwordEncoder = passwordEncoder; - - // Вызываем метод addDummyUsers для добавления фиктивных пользователей во время инициализации бина - addDummyUsers(); - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // Получаем данные пользователя из репозитория - CustomUserDetails userDetails = usersRepository.findByUsername(username); - if (userDetails == null) { - throw new UsernameNotFoundException("Пользователь с именем пользователя не найден: " + username); - } - return userDetails; - } - - // Метод для добавления фиктивных пользователей - private void addDummyUsers() { - // Создаем фиктивных пользователей - CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); - CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); - CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); - - // Добавляем пользователей в репозиторий - usersRepository.save(admin); - usersRepository.save(moderator); - usersRepository.save(user); - } - } - ``` - - В этом обновленном классе: - - Мы добавили конструктор, который принимает `UsersRepository` и `PasswordEncoder` в качестве зависимостей. - - Во время инициализации бина конструктор вызывает метод `addDummyUsers` для заполнения хранилища в памяти фиктивными пользователями. - - Метод `addDummyUsers` создает фиктивных пользователей с захардкоженными именами пользователей и паролями. - - Наконец, фиктивные пользователи сохраняются в репозитории с помощью метода `save`. - -## Заключение - -Поздравляем! Вы успешно добавили фиктивных пользователей для имитации базы данных в вашем приложении с использованием Spring Security. Путем инициализации списка фиктивных пользователей в классе UserRepositoryImpl и заполнения его во время запуска приложения вы теперь можете аутентифицировать и авторизовывать пользователей в вашем приложении. - ---- - -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создание идентификации для пользователей](create-identity-to-users.md) diff --git a/docs/ru/b-springsecurity/practice/authorize-server-authenticated.md b/docs/ru/b-springsecurity/practice/authorize-server-authenticated.md deleted file mode 100644 index 93f418e..0000000 --- a/docs/ru/b-springsecurity/practice/authorize-server-authenticated.md +++ /dev/null @@ -1,38 +0,0 @@ -# Авторизация аутентифицированного пользователя - -Это задание описывает процесс авторизации аутентифицированных пользователей в вашем приложении. Путем требования аутентификации для определенных путей или конечных точек вы можете гарантировать, что только вошедшие в систему пользователи могут получить доступ к определенным ресурсам. - -## Цель - -Авторизовать доступ к пути `/second` только для аутентифицированных пользователей, разрешив публичный доступ к другим путям. - -## Шаги - -1. **Обновление конфигурации безопасности:** - - В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` так, чтобы доступ к пути `/second` был ограничен только для аутентифицированных пользователей. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Другие конечные точки... - .requestMatchers("/second").authenticated() - // Другие конечные точки... - ); - } - } - ``` - - В этой конфигурации: - - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации. - - Заявление `.requestMatchers("/second").authenticated()` указывает, что доступ к пути `/second` должен быть ограничен только для аутентифицированных пользователей. - -## Заключение - -Вы успешно настроили авторизацию для разрешения доступа к пути `/second` только для аутентифицированных пользователей. Путем требования аутентификации для этого пути. diff --git a/docs/ru/b-springsecurity/practice/authorize-server-authority.md b/docs/ru/b-springsecurity/practice/authorize-server-authority.md deleted file mode 100644 index d6f7346..0000000 --- a/docs/ru/b-springsecurity/practice/authorize-server-authority.md +++ /dev/null @@ -1,39 +0,0 @@ -# Авторизация по правам - -В этом задании описывается процесс авторизации пользователей на основе их прав в вашем приложении. Присваивая различные права пользователям, вы можете контролировать доступ к определенным функциональностям или действиям. - -## Цель - -Авторизовать доступ к пути `/addStudent` для пользователей с правами `WRITE` и к пути `/removeStudent` для пользователей с правами `DELETE`. - -## Шаги - -1. **Обновление конфигурации безопасности:** - - В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для определения контроля доступа на основе прав для путей `/addStudent` и `/removeStudent`. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Другие конечные точки... - .requestMatchers("/addStudent").hasAuthority("WRITE") - .requestMatchers("/removeStudent").hasAuthority("DELETE") - // Другие конечные точки... - ); - } - } - ``` - - В этой конфигурации: - - Заявление `.requestMatchers("/addStudent").hasAuthority("WRITE")` указывает, что доступ к пути `/addStudent` должен быть ограничен для пользователей с правами `WRITE`. - - Аналогично, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` ограничивает доступ к пути `/removeStudent` для пользователей с правами `DELETE`. - -## Заключение - -Вы успешно настроили контроль доступа на основе прав для путей `/addStudent` и `/removeStudent` в вашем приложении. Присваивая конкретные права пользователям, вы можете контролировать доступ к различным функциональностям или действиям на основе их разрешений. diff --git a/docs/ru/b-springsecurity/practice/authorize-server-role.md b/docs/ru/b-springsecurity/practice/authorize-server-role.md deleted file mode 100644 index 6b6ff73..0000000 --- a/docs/ru/b-springsecurity/practice/authorize-server-role.md +++ /dev/null @@ -1,39 +0,0 @@ -# Авторизация по ролям - -Это задание описывает процесс авторизации пользователей на основе их ролей в вашем приложении. Присваивая различные роли пользователям, вы можете контролировать доступ к определенным ресурсам или функциональностям. - -## Цель - -Авторизовать доступ к пути `/third` для пользователей с ролью `ROLE_MODERATOR` и к пути `/fourth` для пользователей с ролью `ROLE_ADMIN`. - -## Шаги - -1. **Обновление конфигурации безопасности:** - - В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для определения контроля доступа на основе ролей для путей `/third` и `/fourth`. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Другие конечные точки... - .requestMatchers("/third").hasAuthority("ROLE_MODERATOR") - .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN") - // Другие конечные точки... - ); - } - } - ``` - - В этой конфигурации: - - Заявление `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` указывает, что доступ к пути `/third` должен быть ограничен для пользователей с авторитетом `ROLE_MODERATOR`. - - Аналогично, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` ограничивает доступ к пути `/fourth` для пользователей с авторитетом `ROLE_ADMIN`. - -## Заключение - -Вы успешно настроили контроль доступа на основе ролей для путей `/third` и `/fourth` в вашем приложении. Присваивая конкретные роли пользователям, вы можете контролировать доступ к различным частям вашего приложения на основе их разрешений. diff --git a/docs/ru/b-springsecurity/practice/base-implementation-user.md b/docs/ru/b-springsecurity/practice/base-implementation-user.md deleted file mode 100644 index 83c9688..0000000 --- a/docs/ru/b-springsecurity/practice/base-implementation-user.md +++ /dev/null @@ -1,186 +0,0 @@ -# Создание базовой реализации для управления пользователями - -В этом задании мы сосредоточимся на создании базовой реализации для управления пользователями в вашем приложении. Это включает в себя определение сущности UserDetails, создание репозитория для управления данными пользователей и реализацию UserDetailsService для загрузки деталей пользователей во время аутентификации. - -## Цель - -Цель этого задания - установить надежное основание для управления пользователями в вашем приложении. Реализовав UserDetails, UsersRepository и UserDetailsService, вы сможете аутентифицировать пользователей, управлять их данными и эффективно выполнять операции, связанные с пользователями. - -## Шаги - -1. **Определение сущности UserDetails** - - Начните с определения сущности UserDetails, которая представляет детали пользователя в вашем приложении. Эта сущность должна реализовывать интерфейс UserDetails, предоставляемый Spring Security. - - ```java - package edu.labs.yourproject.model; - - import org.springframework.security.core.GrantedAuthority; - import org.springframework.security.core.userdetails.UserDetails; - - import java.util.Collection; - - public class CustomUserDetails implements UserDetails { - - // Реализуйте методы UserDetails здесь - - } - ``` - - Реализуйте методы, необходимые интерфейсом UserDetails, для предоставления деталей пользователя, таких как имя пользователя, пароль, права доступа и т. д. - -2. **Создание класса UsersRepository** - - Поскольку мы используем хранилище в памяти на данный момент, создадим простой класс UsersRepository для управления данными пользователей. - - a. **Создание класса UsersRepository** - - Создайте новый класс Java с именем `UsersRepository` внутри пакета `edu.labs.yourproject.repository`. - - ```java - package edu.labs.yourproject.repository; - - import org.springframework.stereotype.Repository; - import edu.labs.yourproject.model.CustomUserDetails; - - @Repository - public class UsersRepository { - - private List users = new ArrayList<>(); - - // Добавьте методы для управления пользователями по мере необходимости - } - ``` - - Этот класс будет служить репозиторием для управления данными пользователей. Мы добавим методы для извлечения, добавления, обновления и удаления пользователей в последующих шагах. - - b. **Добавление метода findByUsername** - - Добавьте метод с именем `findByUsername` в класс `UsersRepository`. Этот метод будет извлекать детали пользователя по имени пользователя из репозитория. - - ```java - public CustomUserDetails findByUsername(String username) { - for (CustomUserDetails user : users) { - if (user.getUsername().equals(username)) { - return user; - } - } - return null; // Пользователь не найден - } - ``` - - Метод `findByUsername` используется для извлечения деталей пользователя по имени пользователя из репозитория. В этой заполнительной реализации он возвращает `null`, но вы замените его фактической логикой извлечения деталей пользователя из базы данных или любого другого источника данных. - -3. **Реализация UserDetailsService** - - На этом шаге мы реализуем UserDetailsService для загрузки деталей пользователя во время аутентификации. Этот сервис будет извлекать информацию о пользователе из UsersRepository. - - a. **Создание класса CustomUserDetailsService** - - Начните с создания нового класса с именем `CustomUserDetailsService` в пакете сервиса вашего проекта. Этот класс будет реализовывать интерфейс UserDetailsService, предоставляемый Spring Security. - - ```java - package edu.labs.yourproject.service; - - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.security.core.userdetails.UserDetails; - import org.springframework.security.core.userdetails.UserDetailsService; - import org.springframework.security.core.userdetails.UsernameNotFoundException; - import org.springframework.stereotype.Service; - import com.yourcompany.yourproject.model.CustomUserDetails; - import com.yourcompany.yourproject.repository.UsersRepository; - - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; - - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository) { - this.usersRepository = usersRepository; - } - - // Здесь реализуются методы - } - ``` - - Мы создаем класс `CustomUserDetailsService` и проводим инъекцию зависимости `UsersRepository` с помощ - -ью конструктора. - - b. **Переопределение метода loadUserByUsername** - - Переопределите метод `loadUserByUsername`, определенный в интерфейсе UserDetailsService. Этот метод будет извлекать детали пользователя из UsersRepository на основе предоставленного имени пользователя. - - ```java - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // Извлечение деталей пользователя из репозитория в памяти - CustomUserDetails userDetails = usersRepository.findByUsername(username); - if (userDetails == null) { - throw new UsernameNotFoundException("Пользователь с именем пользователя не найден: " + username); - } - return userDetails; - } - ``` - - Внутри метода `loadUserByUsername` мы вызываем метод `findByUsername` у UsersRepository для извлечения деталей пользователя по имени пользователя. Если пользователь не найден, мы генерируем исключение UsernameNotFoundException. - -4. **Настройка бинов в WebSecurityConfig** - - Откройте класс WebSecurityConfig, расположенный в пакете конфигурации вашего проекта (`edu.labs.yourproject.config`). Внутри этого класса определите бины для CustomUserDetails и UserDetailsRepository. - - ```java - package edu.labs.yourproject.config; - - import edu.labs.yourproject.model.CustomUserDetails; - import edu.labs.yourproject.repository.UserDetailsRepository; - import org.springframework.context.annotation.Bean; - import org.springframework.context.annotation.Configuration; - - @Configuration - @EnableWebSecurity - public class WebSecurityConfig { - - // Весь остальной код здесь... - - @Bean - public CustomUserDetailsService customUserDetailsService() { - // Создание и настройка бина CustomUserDetails - return new CustomUserDetailsService(); - } - - @Bean - public UserDetailsRepository userDetailsRepository() { - // Создание и настройка бина UserDetailsRepository - return new UserDetailsRepository(); - } - } - ``` - - Определите два метода бина: `CustomUserDetailsService()` и `userDetailsRepository()`. Эти методы создают и настраивают бины CustomUserDetailsService и UserDetailsRepository соответственно. - -## Структура папок - -Структура папок вашего проекта должна выглядеть примерно так: - -``` -src -└── main - └── java - └── edu - └── labs - └── yourproject - ├── model - │ └── CustomUserDetails.java - ├── repository - │ └── UsersRepository.java - └── service - └── CustomUserDetailsService.java -``` - -Эта структура папок показывает, где создать класс `CustomUserDetailsService` и интерфейс `UsersRepository` в вашем проекте. Организация ваших классов таким образом помогает поддерживать чистый и структурированный код. - -## Заключение - -Поздравляю! Вы успешно создали базовую реализацию для управления пользователями в вашем приложении. С UserDetails, UsersRepository и UserDetailsService вы можете аутентифицировать пользователей, управлять их данными и выполнять операции, связанные с пользователями, эффективно. diff --git a/docs/ru/b-springsecurity/practice/configure-spring-security.md b/docs/ru/b-springsecurity/practice/configure-spring-security.md deleted file mode 100644 index f556b3f..0000000 --- a/docs/ru/b-springsecurity/practice/configure-spring-security.md +++ /dev/null @@ -1,79 +0,0 @@ -# Настройка Spring Security - -В этом задании мы сосредоточимся на настройке Spring Security в вашем проекте. Spring Security предоставляет обширные средства безопасности для Java-приложений, включая аутентификацию, авторизацию и защиту от распространенных угроз безопасности. - -## Цель - -Цель этого задания - интегрировать Spring Security в ваш существующий проект, гарантируя, что ваше приложение защищено от несанкционированного доступа. - -## Шаги - -1. **Добавление зависимости Spring Security** - - - Для проектов Maven: - - Добавьте следующую зависимость в файл `pom.xml` вашего проекта: - - ```xml - - org.springframework.boot - spring-boot-starter-security - - ``` - - - Для проектов Gradle: - - Добавьте следующую зависимость в файл `build.gradle` вашего проекта: - - ```groovy - implementation 'org.springframework.boot:spring-boot-starter-security' - ``` - - Убедитесь, что вы используете соответствующую версию Spring Security для вашего проекта. - -2. **Создание класса конфигурации безопасности** - - Создайте новый класс Java с именем `WebSecurityConfig` в структуре исходных файлов вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`. - - Структура папок вашего проекта должна выглядеть примерно так: - - ``` - src - └── main - └── java - └── edu - └── labs - └── yourproject - ├── config - │ └── WebMvcConfig.java - │ └── WebSecurityConfig.java - └── controller - └── PracticeController.java - ``` - -3. **Настройка класса конфигурации безопасности** - - Внутри класса `WebSecurityConfig` отметьте его аннотациями `@Configuration` и `@EnableWebSecurity`, чтобы указать, что это класс конфигурации для Spring Security. - - ```java - package edu.labs.yourproject.config; - - import org.springframework.context.annotation.Configuration; - import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; - import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - // Конфигурация безопасности здесь - } - } - ``` - -## Заключение - -Поздравляем! Вы успешно настроили Spring Security в своем проекте. Ваше приложение теперь обладает надежными средствами безопасности для защиты от несанкционированного доступа и обеспечения конфиденциальности и целостности данных пользователей. diff --git a/docs/ru/b-springsecurity/practice/configure-thymeleaf-security.md b/docs/ru/b-springsecurity/practice/configure-thymeleaf-security.md deleted file mode 100644 index 78960e2..0000000 --- a/docs/ru/b-springsecurity/practice/configure-thymeleaf-security.md +++ /dev/null @@ -1,29 +0,0 @@ -# Настройка Thymeleaf с Spring Security - -## Цель -Цель этого задания - интегрировать Thymeleaf с Spring Security, обеспечивая использование дополнительных диалектов и утилит, предоставляемых библиотекой `thymeleaf-extras-springsecurity6`. - -## Шаги - -1. **Gradle (Groovy):** - - Добавьте зависимость `thymeleaf-extras-springsecurity6` в ваш файл `build.gradle`: - - ```groovy - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE' - ``` - -2. **Maven:** - - Добавьте следующую зависимость в ваш файл `pom.xml`: - - ```xml - - org.thymeleaf.extras - thymeleaf-extras-springsecurity6 - 3.0.4.RELEASE - - ``` - -## Заключение -После добавления зависимости Thymeleaf будет настроен для работы с Spring Security, предоставляя дополнительные функции и утилиты для интеграции функциональности, связанной с безопасностью, в ваше веб-приложение. Не забудьте синхронизировать ваш проект, чтобы загрузить зависимость и сделать ее доступной для использования. diff --git a/docs/ru/b-springsecurity/practice/create-identity-to-users.md b/docs/ru/b-springsecurity/practice/create-identity-to-users.md deleted file mode 100644 index e96f03c..0000000 --- a/docs/ru/b-springsecurity/practice/create-identity-to-users.md +++ /dev/null @@ -1,61 +0,0 @@ -# Создание идентификации пользователей - -Это задание описывает процесс добавления ролей и полномочий пользователям, созданным на предыдущем этапе, "Добавление фиктивных пользователей". Присваивая роли и полномочия пользователям, мы устанавливаем их идентификацию в приложении и контролируем доступ к различным ресурсам и функционалу. - -## Цель - -Расширить профили пользователей, созданные на предыдущем этапе, присвоив им роли и полномочия, тем самым определив их идентификацию и разрешения на доступ в приложении. - -## Шаги - -1. **Обновление профилей пользователей с ролями и полномочиями:** - - Мы обновим фиктивные профили пользователей, созданные в классе `CustomUserDetailsService`, чтобы добавить роли и полномочия. Это включает в себя назначение конкретных ролей каждому пользователю, таких как `ADMIN`, `MODERATOR` или `USER`, и предоставление соответствующих полномочий на основе их ролей. - - ```java - // Внутри метода addDummyUsers() - - // Определение ролей - String adminRole = "ROLE_ADMIN"; - String moderatorRole = "ROLE_MODERATOR"; - String userRole = "ROLE_USER"; - - // Определение полномочий - List adminAuthorities = Arrays.asList( - new SimpleGrantedAuthority(adminRole), - new SimpleGrantedAuthority("READ"), - new SimpleGrantedAuthority("WRITE") - ); - - List moderatorAuthorities = Arrays.asList( - new SimpleGrantedAuthority(moderatorRole), - new SimpleGrantedAuthority("READ") - ); - - List userAuthorities = Collections.singletonList( - new SimpleGrantedAuthority(userRole) - ); - - // Создание фиктивных пользователей с ролями и полномочиями - CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); - admin.setAuthorities(adminAuthorities); - admin.setRole(adminRole); - - CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); - moderator.setAuthorities(moderatorAuthorities); - moderator.setRole(moderatorRole); - - CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); - user.setAuthorities(userAuthorities); - user.setRole(userRole); - ``` - - В этом обновленном коде: - - Мы определяем роли и полномочия в виде переменных для ясности и удобства обслуживания. - - Теперь каждый профиль пользователя включает список полномочий на основе назначенных им ролей. - - Полномочия представлены объектами `SimpleGrantedAuthority` и добавляются в профили пользователей соответственно. - - Кроме того, мы устанавливаем роль для каждого пользователя, чтобы в дальнейшем использовать контроль доступа на основе ролей. - -## Заключение - -Вы успешно улучшили профили пользователей в вашем приложении, назначив роли и полномочия фиктивным пользователям. Определив их идентификацию и разрешения на доступ, теперь вы можете контролировать действия и функциональность, доступные каждому пользователю в приложении. diff --git a/docs/ru/b-springsecurity/practice/custom-login-form.md b/docs/ru/b-springsecurity/practice/custom-login-form.md deleted file mode 100644 index c9a9681..0000000 --- a/docs/ru/b-springsecurity/practice/custom-login-form.md +++ /dev/null @@ -1,40 +0,0 @@ -# Пользовательский формуляр входа - -Это задание руководит вас через процесс активации пользовательской страницы формы входа для аутентификации с использованием Spring Security. Реализуя пользовательскую страницу входа, пользователи могут безопасно аутентифицироваться в вашем приложении. - -## Цель - -Активировать пользовательскую страницу формы входа, которая уже была создана по определенному пути. - -## Шаги - -1. **Обновить конфигурацию безопасности:** - - В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для указания пользовательской страницы входа. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - // Добавьте другие конфигурации авторизации здесь - ) - .formLogin((login) -> login - .loginPage("/custom-login-page") // Укажите URL пользовательской страницы входа - // Добавьте другие конфигурации формы входа здесь - ); - } - } - ``` - - В этой конфигурации: - - Оператор `.loginPage("/custom-login-page")` указывает URL пользовательской страницы входа. - - Вы можете добавить дополнительные конфигурации для настройки поведения формы входа, такие как установка URL для успешного или неудачного входа, определение имен полей формы и т. д. - -## Заключение - -Вы успешно активировали пользовательскую страницу формы входа для аутентификации в вашем приложении. Пользователи теперь могут получить доступ к пользовательской странице входа, чтобы безопасно войти и аутентифицироваться в системе. diff --git a/docs/ru/b-springsecurity/practice/password-encryption.md b/docs/ru/b-springsecurity/practice/password-encryption.md deleted file mode 100644 index 30633f9..0000000 --- a/docs/ru/b-springsecurity/practice/password-encryption.md +++ /dev/null @@ -1,82 +0,0 @@ -# Шифрование паролей - -В этой задаче мы настроим шифрование паролей для аутентификации пользователей в приложении, использующем Spring Security. Шифрование паролей повышает безопасность, сохраняя их в базе данных в зашифрованном виде. - -## Цель - -Цель этой настройки - настроить шифрование паролей с использованием BCryptPasswordEncoder, предоставляемого Spring Security. Это обеспечит защиту паролей путем их безопасного хеширования перед сохранением в базе данных. - -## Шаги - -1. **Добавление бина BCryptPasswordEncoder** - - Откройте класс WebSecurityConfig, находящийся в пакете конфигурации вашего проекта (`edu.labs.yourproject.config`). Внутри этого класса определите бин для BCryptPasswordEncoder. - - ```java - package edu.labs.yourproject.config; - - import org.springframework.context.annotation.Bean; - import org.springframework.context.annotation.Configuration; - import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - - @Configuration - public class WebSecurityConfig { - - @Bean - public BCryptPasswordEncoder passwordEncoder() { - // Создание и настройка бина BCryptPasswordEncoder - return new BCryptPasswordEncoder(); - } - } - ``` - - Определите метод бина `passwordEncoder()`, который создает и настраивает бин BCryptPasswordEncoder. Этот бин будет использоваться для шифрования паролей перед их сохранением в базе данных. - -2. **Шифрование паролей** - - a. **Обновление класса CustomUserDetailsService** - - Откройте класс CustomUserDetailsService, находящийся в вашем пакете сервисов (`edu.labs.yourproject.service`). Внедрите бин BCryptPasswordEncoder в этот класс. - - ```java - package edu.labs.yourproject.service; - - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - import org.springframework.stereotype.Service; - import edu.labs.yourproject.model.CustomUserDetails; - import edu.labs.yourproject.repository.UsersRepository; - - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; - - @Autowired - private BCryptPasswordEncoder passwordEncoder; - - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository) { - this.usersRepository = usersRepository; - } - } - ``` - - b. **Реализация метода регистрации** - - Определите метод в классе CustomUserDetailsService для обработки регистрации пользователя. В этом методе зашифруйте пароль пользователя перед сохранением его в базе данных. - - ```java - public void registerUser(CustomUserDetails user) { - // Шифрование пароля перед сохранением пользователя - String encodedPassword = passwordEncoder.encode(user.getPassword()); - user.setPassword(encodedPassword); - usersRepository.save(user); - } - ``` - - Этот метод принимает объект CustomUserDetails, представляющий пользователя для регистрации. Он шифрует пароль пользователя с использованием бина BCryptPasswordEncoder, а затем сохраняет пользователя в базе данных. - -## Заключение - -Поздравляем! Вы успешно настроили шифрование паролей с использованием BCryptPasswordEncoder в вашем приложении, использующем Spring Security. Шифрование паролей повышает безопасность аутентификации пользователей и защищает конфиденциальные данные пользователей. diff --git a/docs/ru/b-springsecurity/practice/setup-server-authorization.md b/docs/ru/b-springsecurity/practice/setup-server-authorization.md deleted file mode 100644 index 28672bc..0000000 --- a/docs/ru/b-springsecurity/practice/setup-server-authorization.md +++ /dev/null @@ -1,45 +0,0 @@ -# Настройка авторизации на сервере - -В этой задаче мы настроим авторизацию в вашем приложении, определив правила безопасности с использованием Spring Security. Определяя правила авторизации, вы можете контролировать доступ к определенным путям и конечным точкам в вашем приложении. - -## Цель - -Настроить правила авторизации для ограничения или разрешения доступа к различным путям и конечным точкам в приложении. - -## Шаги - -1. **Добавление конфигурации безопасности:** - - В классе `WebSecurityConfig` добавьте метод `configure(HttpSecurity http)`, чтобы определить правила безопасности для приложения. Мы будем использовать пути и конечные точки, определенные в предыдущей лабораторной работе. - - ```java - @Configuration - @EnableWebSecurity - public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeHttpRequests((requests) -> requests - .requestMatchers("/first").permitAll() - .requestMatchers("/second").permitAll() - .requestMatchers("/third").permitAll() - .requestMatchers("/fourth").permitAll() - .requestMatchers("/addStudent").permitAll() - .requestMatchers("/removeStudent").permitAll() - ); - } - } - ``` - - В этой конфигурации: - - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации. - - Внутри лямбда-выражения мы указываем, какие запросы следует разрешить. - -## Вывод - -Вы успешно настроили правила авторизации в вашем приложении для управления доступом к различным путям и конечным точкам. Определяя конкретные разрешения для каждого пути, вы можете гарантировать, что пользователи смогут получить доступ только к ресурсам, к которым у них есть соответствующие разрешения. - ---- - -# [СЛЕДУЮЩАЯ ЗАДАЧА: Авторизация аутентифицированных пользователей](authorize-server-authenticated.md) diff --git a/docs/ru/c-jpa/lab-work.md b/docs/ru/c-jpa/lab-work.md deleted file mode 100644 index 7f0c8ed..0000000 --- a/docs/ru/c-jpa/lab-work.md +++ /dev/null @@ -1,54 +0,0 @@ -# Лабораторная работа: JPA (Java Persistence API) - -Добро пожаловать на лабораторную работу по Spring Boot с JPA! В этой лабораторной работе вы попрактикуетесь в различных задачах, связанных с настройкой проекта Spring Boot с JPA (Java Persistence API). - -## Цель лабораторной работы - -Цель этой лабораторной работы - предоставить практический опыт работы с основными концепциями и задачами, связанными с работой с Spring Boot и JPA. Завершив практические задачи, вы приобретете навыки настройки зависимостей, определения характеристик сущностей, управления отношениями между сущностями и взаимодействия с базой данных с использованием JpaRepository. - -## Задачи практики - -1. **Настройка зависимостей базы данных** - - [Настройка драйвера базы данных](practice/dependencies/driver.md) - - [Зависимости Spring Boot и JPA](practice/dependencies/jpa.md) - -2. **Создание сущностей, определение характеристик, отношений и стратегий извлечения данных** - - [Создание сущности](practice/creation/create-entity.md) - - [Определение характеристик сущности](practice/creation/characteristics.md) - - [Управление отношениями](practice/creation/relationships.md) - - [Стратегии извлечения](practice/creation/fetching.md) - -3. **Взаимодействие с пользовательским репозиторием** - - [Создание записи](practice/interacting/repository/create.md) - - [Чтение записи](practice/interacting/repository/read.md) - - [Обновление записи](practice/interacting/repository/update.md) - - [Удаление записи](practice/interacting/repository/delete.md) - - [Пользовательские запросы](practice/interacting/repository/query.md) - -4. **Взаимодействие с репозиторием JPA** - - [Создание записи](practice/interacting/jpa-repository/create.md) - - [Чтение записи](practice/interacting/jpa-repository/read.md) - - [Удаление записи](practice/interacting/jpa-repository/delete.md) - - [Пользовательские запросы](practice/interacting/jpa-repository/query.md) - - -## Задачи лабораторной работы - -1. Настройте зависимости базы данных для PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. - -2. Реализуйте следующую схему сущностей и отношений: - ![img.png](../../srcs/c-jpa/task-er-diagram.png) - - 1. Определите характеристики сущностей для сущностей Student, Enrollment и Course на основе диаграммы сущностей и отношений. - - 2. Создайте классы сущностей для Student, Enrollment и Course в соответствии с определенными характеристиками. - - 3. Реализуйте стратегии извлечения для эффективного извлечения данных для оптимизации взаимодействия с базой данных. - - 4. Управляйте отношениями между сущностями, такими как Student, Enrollment и Course, установив соответствующие ассоциации и отображения. - - 5. Взаимодействуйте с базой данных, создав методы для операций CRUD с использованием слоя Repository и EntityManager как минимум в двух репозиториях. - - 6. Взаимодействуйте с базой данных, создав методы для операций CRUD с использованием JpaRepository как минимум в двух репозиториях. - - 7. Реализуйте пользовательские запросы для выполнения расширенных операций извлечения и манипулирования данными, необходимых для бизнес-логики приложения. diff --git a/docs/ru/c-jpa/practice/creation/characteristics.md b/docs/ru/c-jpa/practice/creation/characteristics.md deleted file mode 100644 index 4b5cb6f..0000000 --- a/docs/ru/c-jpa/practice/creation/characteristics.md +++ /dev/null @@ -1,111 +0,0 @@ -# Определение Характеристик Сущностей - -## Введение - -Это руководство фокусируется на определении колонок или характеристик сущностей в проекте Spring Boot с использованием JPA (Java Persistence API). - -## Цель - -Цель этого руководства - предоставить четкие инструкции по определению характеристик сущностей в проекте Spring Boot с JPA, используя аннотации для обеспечения ограничений и поведения для каждого атрибута. - -## Характеристики Сущностей - -### Характеристики Сущности Student: -- `id` (UUID): Первичный ключ для сущности. -- `name` (String): Имя студента (не должно быть пустым). -- `email` (String): Адрес электронной почты студента (должен быть действительным адресом электронной почты). -- `major` (String): Специализация или направление обучения студента (не должно быть пустым). -- `year` (int): Год обучения студента (не должен быть null). -- `international` (boolean): Указывает, является ли студент международным (не должен быть null). - -### Определение Атрибута `id` - -Добавьте атрибут `id` в класс `Student`. Этот атрибут будет служить первичным ключом для сущности. - -```java -@Id -@GeneratedValue(strategy = GenerationType.AUTO) -private UUID id; -``` - -- `@Id`: Указывает, что это поле является первичным ключом для сущности. -- `@GeneratedValue`: Указывает стратегию автоматической генерации значений первичного ключа. - -### Определение Атрибута `name` - -Добавьте атрибут `name` в класс `Student`. Этот атрибут представляет имя студента и не должен быть пустым. - -```java -@NotBlank -private String name; -``` - -- `@NotBlank`: Обеспечивает, что значение `name` не является null и содержит хотя бы один непробельный символ. - -### Определение Атрибута `email` - -Добавьте атрибут `email` в класс `Student`. Этот атрибут представляет адрес электронной почты студента и должен быть действительным адресом электронной почты. - -```java -@NotBlank -@Email -private String email; -``` - -- `@Email`: Проверяет, что значение `email` является действительным адресом электронной почты. - -### Определение Атрибута `major` - -Добавьте атрибут `major` в класс `Student`. Этот атрибут представляет специализацию или направление обучения студента и не должен быть пустым. - -```java -@NotBlank -private String major; -``` - -- `@NotBlank`: Обеспечивает, что значение `major` не является null и содержит хотя бы один непробельный символ. - -### Определение Атрибута `year` - -Добавьте атрибут `year` в класс `Student`. Этот атрибут представляет год обучения студента и не должен быть null. - -```java -@NotNull -private int year; -``` - -- `@NotNull`: Обеспечивает, что значение `year` не является null. - -### Определение Атрибута `international` - -Добавьте атрибут `international` в класс `Student`. Этот атрибут указывает, является ли студент международным, и не должен быть null. - -```java -@NotNull -private boolean international; -``` - -- `@NotNull`: Обеспечивает, что значение `international` не является null. - - -Вы можете повторить предыдущие шаги для создания характеристик сущностей для сущностей `Course` и `Enrollment`, обеспечив правильное применение аннотаций для каждого атрибута. - -### Характеристики Сущности Enrollment: - -- `id` (UUID): Первичный ключ для сущности. -- `enrollmentDate` (Date): Дата записи на курс. -- `grade` (int): Оценка, полученная за курс. - -### Характеристики Сущности Course: - -- `id` (UUID): Первичный ключ для сущности. -- `name` (String): Название курса. -- `instructor` (String): Имя преподавателя курса. -- `schedule` (String): Детали расписания курса. -- `capacity` (int): Максимальная вместимость курса. -- `online` (boolean): Указывает, является ли курс онлайн. -- `startDate` (Date): Дата начала курса. - -## Заключение - -Это руководство представило процесс определения характеристик сущностей в проекте Spring Boot с JPA. Установив атрибуты для таблиц, таких как Student, Course и Enrollment, была обеспечена целостность и последовательность данных. Аннотации были использованы для обеспечения ограничений и поведения для каждого атрибута, обеспечивая прочную основу для модели данных приложения. С определенными характеристиками сущностей. diff --git a/docs/ru/c-jpa/practice/creation/create-entity.md b/docs/ru/c-jpa/practice/creation/create-entity.md deleted file mode 100644 index 7631765..0000000 --- a/docs/ru/c-jpa/practice/creation/create-entity.md +++ /dev/null @@ -1,62 +0,0 @@ -# Создание Сущностей - -## Введение - -Это руководство сосредотачивается на создании сущностей в проекте Spring Boot с использованием JPA (Java Persistence API). Оно предоставляет пошаговые инструкции по настройке структуры каталогов и созданию классов сущностей. - -## Цель - -Цель этого руководства - продемонстрировать, как создавать классы сущностей в проекте Spring Boot, следуя bewt-практикам и используя JPA для сохранения данных. - -## Структура Каталогов - -Для обеспечения хорошо организованного проекта важно установить правильную структуру каталогов. Следуйте этим рекомендациям: - -``` -src/ -└── main/ - └── java/ - └── com/ - └── example/ - └── demo/ - └── entity/ - ├── Student.java - ├── Enrollment.java - └── Course.java - -``` - -В этой структуре: -- Каталог `src/main/java` содержит ваши исходные файлы Java. -- Каталог `com/example/demo/entity` - это место, где вы создадите ваши классы сущностей. - -## Создание Классов Сущностей - -Для создания классов сущностей следуйте этим шагам: - -1. Перейдите в каталог `com/example/demo/entity` в вашем проекте. -2. Создайте новый файл Java-класса для каждой сущности. Вы можете повторить следующие шаги для каждой сущности (например, Student, Enrollment, Course). -3. Определите ваш класс сущности с аннотацией `@Entity`. - -### Пример: - -```java -package com.example.demo.entity; - -import javax.persistence.Entity; - -@Entity -public class Student { - -} -``` - -Аннотация `@Entity` указывает, что этот класс является сущностью JPA. - -Повторите вышеуказанные шаги для создания классов сущностей `Enrollment` и `Course`. - -## Заключение - -Теперь вы создали структуру каталогов для ваших сущностей и создали классы сущностей в вашем приложении. - -# [Далее: Определение Характеристик Сущностей](characteristics.md) diff --git a/docs/ru/c-jpa/practice/creation/fetching.md b/docs/ru/c-jpa/practice/creation/fetching.md deleted file mode 100644 index c9f22ee..0000000 --- a/docs/ru/c-jpa/practice/creation/fetching.md +++ /dev/null @@ -1,47 +0,0 @@ -# Стратегии Извлечения в Spring Boot с JPA: Понимание Ленивой и Агрессивной Загрузки - -## Введение - -Это руководство исследует стратегии извлечения в проекте Spring Boot с использованием JPA (Java Persistence API). Конкретно мы погрузимся в понятия ленивой и агрессивной загрузки и как они применяются в отношениях между сущностями. - -## Цель - -Цель этого руководства - предоставить полное понимание стратегий извлечения в JPA. К концу этого руководства вы поймете, когда использовать ленивую и агрессивную загрузку и как их реализовать в вашем приложении. - -## Стратегии Извлечения - -### Сценарий - -В наших отношениях между сущностями у нас есть отношение Один-ко-Многим между сущностью `Student` и сущностью `Enrollment`. Точно так же, существует отношение Один-ко-Многим между сущностью `Course` и сущностью `Enrollment`. - -#### Сущность Student - -В сущности `Student` у нас есть отношение Один-ко-Многим с сущностью `Enrollment`. У каждого студента может быть несколько записей на курсы. - -Для представления этого отношения мы используем аннотацию `@OneToMany` с `mappedBy = "student"` в сущности `Student`. Здесь у нас есть выбор между стратегиями ленивой и агрессивной загрузки для извлечения связанных записей. - -```java -@OneToMany(mappedBy = "student", fetch = FetchType.EAGER, cascade = CascadeType.ALL) -private List enrollments; -``` - -В этом сценарии мы выбираем агрессивную загрузку (`FetchType.EAGER`). Поскольку мы обычно ожидаем получить доступ ко всем записям студента вместе, агрессивная загрузка гарантирует, что все записи будут извлечены немедленно при загрузке студента. - -#### Сущность Course - -Аналогично, в сущности `Course` у нас также есть отношение Один-ко-Многим с сущностью `Enrollment`. У каждого курса может быть несколько записей на курсы. - -Для представления этого отношения мы используем аннотацию `@OneToMany` с `mappedBy = "course"` в сущности `Course`. Здесь у нас также есть выбор между стратегиями ленивой и агрессивной загрузки для извлечения связанных записей. - -```java -@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL) -private List enrollments; -``` - -В этом сценарии мы выбираем ленивую загрузку (`FetchType.LAZY`). Поскольку нам не всегда нужно получать доступ ко всем записям курса, ленивая загрузка гарантирует, что записи будут извлечены только при явном запросе. - -## Заключение - -Это руководство предоставило понимание концепций ленивой и агрессивной загрузки. Понимая сценарии, когда каждая стратегия извлечения подходит, и умея их реализовывать в ваших сущностях, вы теперь готовы оптимизировать извлечение данных и улучшить производительность вашего приложения. - -# [Далее: Создание Репозитория](../interacting/repository.md) diff --git a/docs/ru/c-jpa/practice/creation/relationships.md b/docs/ru/c-jpa/practice/creation/relationships.md deleted file mode 100644 index bd73e69..0000000 --- a/docs/ru/c-jpa/practice/creation/relationships.md +++ /dev/null @@ -1,46 +0,0 @@ -# Определение Связей Между Сущностями - -## Введение - -Это руководство посвящено пониманию и реализации связей между сущностями в проекте Spring Boot с использованием JPA (Java Persistence API). Конкретно мы рассмотрим отношение между сущностью `Enrollment` и ее связанными сущностями `Student` и `Course`. - -## Цель - -Цель этого руководства - предоставить четкие инструкции по определению и пониманию связей сущностей в проекте Spring Boot с JPA. К концу этого руководства вы поймете, как установить ассоциации между сущностями и реализовать их в вашем приложении. - -## Связи Между Сущностями - -![img.png](../../../../srcs/c-jpa/er-diagram.png) -### Характеристики Сущности Enrollment: - -- `id` (UUID): Первичный ключ для сущности. -- `student` (Student): Студент, связанный с записью на курс. -- `course` (Course): Курс, связанный с записью на курс. -- `enrollmentDate` (Date): Дата записи на курс. -- `grade` (int): Оценка, полученная за курс. - -#### Отношение со Студентом - -Отношение между сущностью `Enrollment` и сущностью `Student` представляет собой сценарий, когда студент записывается на курс. Это отношение Многие-к-Одному, где много записей на курс может быть связано с одним студентом. Чтобы установить это отношение, аннотируйте атрибут `student` в сущности `Enrollment` аннотацией `@ManyToOne`. - -```java -@ManyToOne -@JoinColumn(name = "student_id") -private Student student; -``` - -#### Отношение с Курсом - -Аналогично отношение между сущностью `Enrollment` и сущностью `Course` означает сценарий, когда на курс записывается несколько студентов. Это также отношение Многие-к-Одному, где много записей на курс может быть связано с одним курсом. Аннотируйте атрибут `course` в сущности `Enrollment` аннотацией `@ManyToOne`. - -```java -@ManyToOne -@JoinColumn(name = "course_id") -private Course course; -``` - -## Заключение - -Это руководство прояснило процесс определения связей между сущностями. Установив ассоциации между сущностью `Enrollment` и ее связанными сущностями `Student` и `Course`, вы теперь готовы эффективно реализовывать и управлять связями сущностей в вашем приложении. - -# [Далее: Стратегии Извлечения](fetching.md) diff --git a/docs/ru/c-jpa/practice/dependencies/driver.md b/docs/ru/c-jpa/practice/dependencies/driver.md deleted file mode 100644 index e3d7fc3..0000000 --- a/docs/ru/c-jpa/practice/dependencies/driver.md +++ /dev/null @@ -1,102 +0,0 @@ -# JPA: Настройка зависимостей - -## Введение - -Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги по включению драйверов базы данных для различных баз данных, таких как PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. Следуя этому руководству, вы настроите все необходимые зависимости для установления соединений с этими базами данных в вашем приложении Spring Boot. - -## Цель - -Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особенным акцентом на драйверах баз данных для различных баз данных. - -## Настройка зависимостей - -### Драйверы баз данных - -Для подключения к различным базам данных в вашем приложении Spring Boot включите соответствующие драйверы баз данных. - -#### PostgreSQL - -**Для Gradle:** -```groovy -implementation "org.postgresql:postgresql" -``` - -**Для Maven:** -```xml - - org.postgresql - postgresql - INSERT_VERSION_HERE - -``` - -#### MySQL - -**Для Gradle:** -```groovy -implementation "mysql:mysql-connector-java" -``` - -**Для Maven:** -```xml - - mysql - mysql-connector-java - INSERT_VERSION_HERE - -``` - -#### Драйвер Oracle Database - -**Для Gradle:** -```groovy -implementation 'com.oracle.database.jdbc:ojdbc8' -``` - -**Для Maven:** -```xml - - com.oracle.database.jdbc - ojdbc8 - -``` - -#### Драйвер MongoDB (MongoDB Java Driver) - -**Для Gradle:** -```groovy -implementation 'org.mongodb:mongodb-driver-sync:4.4.3' -``` - -**Для Maven:** -```xml - - org.mongodb - mongodb-driver-sync - 4.4.3 - -``` - -#### Драйвер Microsoft SQL Server JDBC - -**Для Gradle:** -```groovy -implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' -``` - -**Для Maven:** -```xml - - com.microsoft.sqlserver - mssql-jdbc - 9.4.0.jre11 - -``` - -Эти зависимости облегчают подключение к базам данных. - -## Заключение - -Настроив соответствующие драйверы баз данных для различных баз данных, вы будете готовы начать разработку вашего приложения Spring Boot с JPA. - -# [Далее: JPA Настройка зависимостей](jpa.md) \ No newline at end of file diff --git a/docs/ru/c-jpa/practice/dependencies/jpa.md b/docs/ru/c-jpa/practice/dependencies/jpa.md deleted file mode 100644 index 0ad619f..0000000 --- a/docs/ru/c-jpa/practice/dependencies/jpa.md +++ /dev/null @@ -1,59 +0,0 @@ -# JPA: Настройка зависимостей - -## Введение - -Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с JPA (Java Persistence API). Оно охватывает необходимые шаги по включению зависимостей Spring Boot Starter JDBC и Spring Boot Starter Data JPA. - -## Цель - -Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особым упором на зависимости Spring Boot Starter JDBC и Spring Boot Starter Data JPA. - -## Настройка зависимостей - -### Spring Boot Starter JDBC - -Чтобы включить поддержку JDBC в вашем приложении Spring Boot: - -#### Gradle - -```groovy -implementation "org.springframework.boot:spring-boot-starter-jdbc" -``` - -#### Maven - -```xml - - org.springframework.boot - spring-boot-starter-jdbc - -``` - -Эта зависимость обеспечивает автоматическую конфигурацию для доступа к данным на основе JDBC. - -### Spring Boot Starter Data JPA - -Для включения поддержки JPA (Java Persistence API) в вашем приложении Spring Boot: - -#### Gradle - -```groovy -implementation "org.springframework.boot:spring-boot-starter-data-jpa" -``` - -#### Maven - -```xml - - org.springframework.boot - spring-boot-starter-data-jpa - -``` - -Эта зависимость упрощает настройку репозиториев на основе JPA и предоставляет конфигурации по умолчанию для Hibernate. - -## Заключение - -Настроив соответствующие зависимости Spring Boot для JDBC и JPA, вы будете готовы начать разработку вашего приложения Spring Boot с поддержкой JPA. - -[Далее: Создание сущностей](../creation/create-entity.md) diff --git a/docs/ru/c-jpa/practice/interacting/jpa-repository.md b/docs/ru/c-jpa/practice/interacting/jpa-repository.md deleted file mode 100644 index 35dd77d..0000000 --- a/docs/ru/c-jpa/practice/interacting/jpa-repository.md +++ /dev/null @@ -1,54 +0,0 @@ -# Создание JpaRepository - -## Введение - -Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API) с помощью JpaRepository. - -## Цель - -Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать классы репозитория и сервиса для сущности `Course`. - -## Структура каталогов - -``` -src/ -└── main/ - └── java/ - └── com/ - └── example/ - └── demo/ - ├── data/ - │ └── entities/ - │ ├── Student.java - │ ├── Enrollment.java - │ └── Course.java - └── repository/ - ├── StudentRepository.java - └── CourseRepository.java - -``` - -## Класс репозитория - -### CourseRepository.java - -```java -package com.yourcompany.yourproject.repository; - -import com.yourcompany.yourproject.model.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CourseRepository extends JpaRepository { - // Добавьте методы репозитория для сущности курса -} -``` - -Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring. - -## Заключение - -Теперь вы создали класс репозитория для управления сущностью `Course` в вашем приложении. - -# [Далее: Создание записи](jpa-repository/create.md) diff --git a/docs/ru/c-jpa/practice/interacting/jpa-repository/create.md b/docs/ru/c-jpa/practice/interacting/jpa-repository/create.md deleted file mode 100644 index 4dfb0da..0000000 --- a/docs/ru/c-jpa/practice/interacting/jpa-repository/create.md +++ /dev/null @@ -1,40 +0,0 @@ -# Создание записей в таблице с использованием JpaRepository - -## Введение - -Это руководство демонстрирует, как создавать записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository. - -## Цель - -Цель этого руководства - проиллюстрировать процесс создания записей в таблице путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository. - -## Метод репозитория - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.UUID; - -@Repository -public interface CourseRepository extends JpaRepository { - - Course save(Course course); -} -``` - -### Объяснение - -Метод `save(Course course)`, предоставленный JpaRepository, позволяет нам сохранить новую запись в таблице `Course`. - -Вызывая этот метод и передавая объект `Course` в качестве параметра, JpaRepository автоматически обрабатывает процесс сохранения сущности в базе данных. - -## Заключение - -Теперь вы реализовали метод в интерфейсе `CourseRepository` с использованием JpaRepository для создания записей в таблице `Course`. Этот метод предоставляет удобный способ сохранения данных в базе данных с использованием JpaRepository в вашем приложении Spring Boot. - -# [Далее: Чтение записи](read.md) diff --git a/docs/ru/c-jpa/practice/interacting/jpa-repository/delete.md b/docs/ru/c-jpa/practice/interacting/jpa-repository/delete.md deleted file mode 100644 index 2b2e0d9..0000000 --- a/docs/ru/c-jpa/practice/interacting/jpa-repository/delete.md +++ /dev/null @@ -1,43 +0,0 @@ -# Удаление записей из таблицы с использованием JpaRepository - -## Введение - -В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository. - -## Цель - -Цель этого руководства - проиллюстрировать процесс удаления записей из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository. - -## Метод репозитория - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.UUID; - -@Repository -public interface CourseRepository extends JpaRepository { - - void deleteById(UUID id); -} -``` - -## Объяснение - -Метод `deleteById(UUID id)` следует соглашению, распознаваемому JpaRepository, для удаления записей на основе их уникального идентификатора. - -- Ключевое слово `delete` указывает, что этот метод используется для удаления данных. -- `ById` указывает критерий для идентификации записи, которую нужно удалить. В данном случае мы нацелены на запись с определенным идентификатором. - -Следуя этому соглашению по именованию, JpaRepository автоматически генерирует соответствующий SQL-запрос для удаления желаемой записи из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы на удаление, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих предполагаемые операции удаления данных. - -## Заключение - -Теперь вы реализовали метод в интерфейсе `CourseRepository` с использованием JpaRepository для удаления записей из таблицы `Course`. Этот метод предоставляет удобный способ удаления данных из базы данных с использованием JpaRepository в вашем приложении Spring Boot. - -# [Далее: Пользовательский запрос](query.md) diff --git a/docs/ru/c-jpa/practice/interacting/jpa-repository/query.md b/docs/ru/c-jpa/practice/interacting/jpa-repository/query.md deleted file mode 100644 index 7d36333..0000000 --- a/docs/ru/c-jpa/practice/interacting/jpa-repository/query.md +++ /dev/null @@ -1,43 +0,0 @@ -# Пользовательский запрос с использованием JpaRepository - -## Введение - -Это руководство демонстрирует, как реализовать методы пользовательского запроса, используя аннотацию `@Query` в слое репозитория приложения Spring Boot с JPA (Java Persistence API) и JpaRepository. - -## Цель - -Цель этого руководства - проиллюстрировать процесс создания методов пользовательского запроса в интерфейсе репозитория для выполнения определенных операций с базой данных, адаптированных к требованиям приложения. - -## Метод репозитория - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; -import java.util.List; - -@Repository -public interface CourseRepository extends JpaRepository { - - @Query("SELECT c FROM Course c WHERE c.instructor = :instructor") - List findCoursesByInstructor(@Param("instructor") String instructor); -} -``` - -### Объяснение - -Аннотация `@Query` позволяет нам определять пользовательские запросы JPQL (Java Persistence Query Language) непосредственно в интерфейсе репозитория. - -- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` - это запрос JPQL, который выбирает все курсы, где имя инструктора соответствует предоставленному значению. -- Аннотация `@Param("instructor")` привязывает параметр метода `instructor` к именованному параметру `:instructor` в запросе JPQL. - -Используя `@Query`, мы можем создавать сложные запросы, адаптированные к конкретным потребностям извлечения данных, обеспечивая гибкость и контроль над операциями с базой данных. - -## Заключение - -Теперь вы реализовали метод пользовательского запроса в интерфейсе `CourseRepository` с использованием JpaRepository и аннотации `@Query` для извлечения записей из таблицы `Course` на основе конкретного условия. Этот метод предоставляет мощный способ выполнения пользовательских запросов в вашем приложении Spring Boot, обеспечивая точные операции извлечения данных. diff --git a/docs/ru/c-jpa/practice/interacting/jpa-repository/read.md b/docs/ru/c-jpa/practice/interacting/jpa-repository/read.md deleted file mode 100644 index fd765c7..0000000 --- a/docs/ru/c-jpa/practice/interacting/jpa-repository/read.md +++ /dev/null @@ -1,44 +0,0 @@ -# Чтение записей из таблицы с использованием JpaRepository - -## Введение - -Это руководство демонстрирует, как извлекать данные из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository. - -## Цель - -Цель этого руководства - проиллюстрировать процесс чтения данных из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository. - -## Метод репозитория - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.List; - -@Repository -public interface CourseRepository extends JpaRepository { - - List findCoursesByInstructor(String instructor); -} -``` - -### Объяснение - -Сигнатура метода `findCoursesByInstructor(String instructor)` следует определенному соглашению по именованию, распознаваемому Spring Data JPA. - -- Ключевое слово `find` указывает, что этот метод используется для извлечения данных. -- `Courses` представляет тип сущности, который мы хотим извлечь. -- `ByInstructor` указывает критерий для фильтрации результатов. В данном случае мы запрашиваем курсы на основе атрибута `instructor`. - -Следуя этому соглашению по именованию, Spring Data JPA автоматически генерирует соответствующий SQL-запрос за кулисами, чтобы извлечь необходимые данные из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих желаемые операции извлечения данных. - -## Заключение - -Теперь вы реализовали метод в интерфейсе `CourseRepository` с использованием JpaRepository для извлечения данных из таблицы `Course`. Этот метод позволяет эффективно читать данные из базы данных с использованием JpaRepository в вашем приложении Spring Boot. - -# [Далее: Удаление записи](delete.md) diff --git a/docs/ru/c-jpa/practice/interacting/repository.md b/docs/ru/c-jpa/practice/interacting/repository.md deleted file mode 100644 index 7793aba..0000000 --- a/docs/ru/c-jpa/practice/interacting/repository.md +++ /dev/null @@ -1,52 +0,0 @@ -# Создание репозитория - -## Введение - -Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API). - -## Цель - -Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать репозиторий для сущности `Student`. - -## Структура каталогов - -``` -src/ -└── main/ - └── java/ - └── com/ - └── example/ - └── demo/ - ├── data/ - │ └── entites/ - │ ├── Student.java - │ ├── Enrollment.java - │ └── Course.java - └── repository/ - └── StudentRepository.java - -``` - -## Класс репозитория - -### StudentRepository.java - -```java -package com.yourcompany.yourproject.repository; - -import com.yourcompany.yourproject.model.Student; -import org.springframework.stereotype.Repository; - -@Repository -public class StudentRepository { - // Добавьте методы репозитория для сущности студента -} -``` - -Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring. - -## Заключение - -Теперь вы создали репозиторий для управления сущностью `Student` в вашем приложении. - -# [Далее: Создание записи](repository/create.md) diff --git a/docs/ru/c-jpa/practice/interacting/repository/create.md b/docs/ru/c-jpa/practice/interacting/repository/create.md deleted file mode 100644 index 75da7d8..0000000 --- a/docs/ru/c-jpa/practice/interacting/repository/create.md +++ /dev/null @@ -1,48 +0,0 @@ -# Создание новых записей в таблице с использованием слоя репозитория - -## Введение - -Это руководство иллюстрирует, как создавать новые записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). - -## Цель - -Цель этого руководства - продемонстрировать процесс создания новых записей в таблице с использованием слоя репозитория. Мы достигнем этого, реализовав метод в интерфейсе `StudentRepository`, используя `EntityManager` вместо `JpaRepository`. - -## Метод репозитория - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public void saveStudent(Student student) { - entityManager.persist(student); - } -} -``` - -### Объяснение - -- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. - -- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. - -- `entityManager.persist(student)`: Этот код сохраняет новую сущность `Student` в базе данных. - -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для создания новых записей в таблице `Student`, используя слой репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для удовлетворения дополнительных функциональных возможностей по мере необходимости. - -# [Далее: Чтение записи](read.md) diff --git a/docs/ru/c-jpa/practice/interacting/repository/delete.md b/docs/ru/c-jpa/practice/interacting/repository/delete.md deleted file mode 100644 index bc446d3..0000000 --- a/docs/ru/c-jpa/practice/interacting/repository/delete.md +++ /dev/null @@ -1,49 +0,0 @@ -# Удаление записей из таблицы с использованием слоя репозитория - -## Введение - -В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). - -## Цель - -Цель этого руководства - продемонстрировать процесс удаления записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. - -## Метод репозитория - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public void deleteStudent(UUID id) { - Student studentToDelete = entityManager.find(Student.class, id); - entityManager.remove(studentToDelete); - } -} -``` - -### Объяснение - -- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. - -- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. - -- `entityManager.remove(studentToDelete)`: Этот код удаляет сущность `Student` из базы данных. - -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для удаления записей из таблицы `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций удаления по мере необходимости. - -# [Далее: Пользовательский запрос](query.md) diff --git a/docs/ru/c-jpa/practice/interacting/repository/query.md b/docs/ru/c-jpa/practice/interacting/repository/query.md deleted file mode 100644 index 066fb66..0000000 --- a/docs/ru/c-jpa/practice/interacting/repository/query.md +++ /dev/null @@ -1,50 +0,0 @@ -# Создание пользовательских запросов в таблице с использованием слоя репозитория - -## Введение - -В этом руководстве показано, как создавать пользовательские запросы для извлечения записей из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). - -## Цель - -Цель этого руководства - проиллюстрировать процесс создания пользовательских запросов для извлечения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. - -## Метод репозитория - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import java.util.List; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public List findStudentsByMajor(String major) { - return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class) - .setParameter("major", major) - .getResultList(); - } -} -``` - -### Объяснение - -- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. - -- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. - -- `entityManager.createQuery(...)`: Этот код создает пользовательский запрос на JPQL (Java Persistence Query Language) для извлечения записей на основе предоставленного критерия (`major` в этом примере). - -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для создания пользовательских запросов и извлечения записей из таблицы `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций пользовательских запросов по мере необходимости. - -# [Далее: Создание JpaRepository](../jpa-repository.md) diff --git a/docs/ru/c-jpa/practice/interacting/repository/read.md b/docs/ru/c-jpa/practice/interacting/repository/read.md deleted file mode 100644 index c6de655..0000000 --- a/docs/ru/c-jpa/practice/interacting/repository/read.md +++ /dev/null @@ -1,48 +0,0 @@ -# Чтение записей из таблицы с использованием слоя репозитория - -## Введение - -В этом руководстве показано, как читать записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). - -## Цель - -Цель этого руководства - проиллюстрировать процесс чтения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. - -## Метод репозитория - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import java.util.UUID; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public Student findStudentById(UUID id) { - return entityManager.find(Student.class, id); - } -} -``` - -### Объяснение - -- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. - -- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. - -- `entityManager.find(Student.class, id)`: Этот код извлекает сущность `Student` из базы данных на основе предоставленного `id`. - -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для чтения записей из таблицы `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций чтения по мере необходимости. - -# [Далее: Обновление записи](update.md) diff --git a/docs/ru/c-jpa/practice/interacting/repository/update.md b/docs/ru/c-jpa/practice/interacting/repository/update.md deleted file mode 100644 index 1324f92..0000000 --- a/docs/ru/c-jpa/practice/interacting/repository/update.md +++ /dev/null @@ -1,48 +0,0 @@ -# Обновление записей в таблице с использованием слоя репозитория - -## Введение - -Это руководство иллюстрирует, как обновлять записи в таблице с использованием слоя репозитория в приложении Spring Boot с JPA (Java Persistence API). - -## Цель - -Цель этого руководства - продемонстрировать процесс обновления записей в таблице, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. - -## Метод репозитория - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public Student updateStudent(Student student) { - return entityManager.merge(student); - } -} -``` - -### Объяснение - -- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. - -- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. - -- `entityManager.merge(student)`: Этот код обновляет сущность `Student` в базе данных. - -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для обновления записей в таблице `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций обновления по мере необходимости. - -# [Далее: Удаление записи](delete.md) diff --git a/docs/srcs/a-thymeleaf/first-view.png b/docs/srcs/a-thymeleaf/first-view.png deleted file mode 100644 index 01516fc51e4bbfcc81e6af9381de5c4fc0186ef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7080 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 diff --git a/docs/srcs/a-thymeleaf/fourth-view.png b/docs/srcs/a-thymeleaf/fourth-view.png deleted file mode 100644 index 63bfac4f5c10f6c3da2ace40e928fb3c04a59891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23618 zcmdqJ2UOEdw>L^hq*_6cqCP$rN~|DVMeGy{9fE*#LP9Tr5Jf~mzy>G?hy|pC&{7~k zC_IjjuJhfj#RC4x%8@0xro+i>Ha?+~-EmJvZuf-zY?ZhLz4_SI zh9_e2Dphx;)l@okx_rAmRU{3j&$h_#q&By#43`uz8i@Scc@^v#b}7v4x>Fbq7CwY4 zwQgJukKlC+MG@I?;)UYoZ?B8Zk|H9_ACw@XA|l6*NVp20UEeCIEd2H2{D1eYfMz%M z-ku=+YkPaUjm;YZr!>v=Z2%5F@!Hvus=*tJgVY3GcX#jDaUMR}JH1XWmqq7#!0NJ6 zHE##ec#Rq&BID5|qL@%VOO~@N$U3$lAUCWoR@FsKr6+WCXPAt$sH|(8k+PQ8F>5^w z_HPv)`$qM=?{e@FG@h`g(1%%RF%c_$)cy|E*B*n69w>+@oM&t2z-H9gTGN4f$Ap-h z()j_{u&Nx#FK)S$E3M@}+lH6Eb>jlUFQh0z2|5+6rh|JR*Dwi3&ll+jM{9G=c&Lkt zH2crUVg2thI!rdc6m&>^I+U>OMcT-!BClsuXFKH5NFtQ`_1co;W%4>YCB7mXi$9g!9!}r;Or@w#+?JAq$ey5D&HsMpr-BzHkdh;q4<8{ zq2=a0hZxIZ$>BArj(hh$%hkC)#M?&@XTK^36ueS4SnR)#)V^Imq>4w_bAzZc_XWY}@J~VSDh6G4mVId?| z*0|ceQ&ZoS0X?g8>$L_OOWh{XE)_`gZotOLYB%S!qZl7S&q>bod)!psOcSjps+-11 zp891_6|>bK0qT(tGckxNU5e#fqglir=4Eh@ra#|>1l?GR2LWMYv)MIKb3^=}J;=Eu zm|K5HP|GYU)g$M#Gu5NAGrCR8*=w<5Fu@mUc9(>R$ot9{aARyW8>-VhbPe)i^WCyp%pi1ip$6@i1SuH{s4At3dSYo$CrgH3?0~V9~GXuj$z? z>$E`5nr{^IDOG#iCm8SY`jC0WO#LZjQy4*?>5E@DU``Gu`7E_3#?k{fH6(y>a46IZ zn1GtcOOs%jnQV^>HLcz~J%R#ikHxbUc2dl=PO*$~Ag4j$D#wUAc^5!a%vWJ~fxvoQ zTGP6i<)<%=H=K6s(R%wJ@m`q2A0+e)=DjH)Zl*9VVBBmk)JFq0S<#Mga-)_I==?kv zio?`b#m<#pjn~<|yixA1;2N}U1&d2$0!l$UI7Sqj!8kd`oFB5{dHzY=%8W<+b(8fM z<`qW3-`-*(a4(Yfcx)R*xaOL>@OQbhT@EcS0zHtEuQ{lxVrGb8r3j`a^0N=Y=B8J^ z4OUr59R{4qTIY6C%Lw#{;M~I$}d=%wf>$ zy;!N~CnH`9&z9w-t=M?L8o62{p49+yYjP6|U+Oi*o;aJQn*(g_70HxrE-(VW(4KIQ z55Z%Vxh&|^<7in^S9-pv1I(sk%eNJT>;?`CUP5S^hlstNrO6l2Wdp7%{wit(u}A1G zEX~QW*)`G-kYxJHz};+G8A2lVwACy}9fwAAC1bkR!Wh8WAe=_$=5*aS18L5@cWENI zubt%mdxf1Dv;KHMyHsy3(<$1#S&M*?B^k)QN=k2DVps|yqs_j+)edH>nc+1D*|`jV z+4QZLy1)c*O#;4n#VtYKNCw-nSHFjDPmHfz&*<)o z_M|+9xb5IY6$oyvKzHkx#U!3vxv21QY%czoK~&?|>PSOH?iA(p%R*BvVeek2Q{aIK zQc=K!LkNzb-c59d`!VK^VL>BtVD6@sJN+1>?sPT1WCp-!oNg@4za!Yepq$6{(D*ps z`nF-ZNl4a&f?_)WnY7fzU+JViLb_@{G+rgWFbrM~^w%h9{L)5J6A_smTaczQ88E+< zgg3~z897^W@~dxnYwh^>w&uy9!_$xRUf0;U=0gz`3=d zc5pVstO3#_j#26D{y}74Scpxge>LGW8DoL1#K{nd7jUCuMS&WC-AK*?NsEYF`ZX=i zE^~jRnLIKb_^A__vYn|3Wv)ySwK<)8o;5WsG}|3+itKc^FZW&OXjmO6ixrHmS;K6Z z`7w*ipeC1^)gL98_4o%A9ZWlhwq6A|+q5(>A6)xM zT|b4W*^NPVy03;Zx{6k2B2Lnykll*~Q_q?kUOSj)qjFyJUTQgx25-DHoxQ49Mq$Qt zt2V^aIiYVqC4+FlcK@e~T;WIYFq zzQQjVTT8U}Yzy94?KZKUJFc6oGjCSWfIx-Hu)HZOiS<{?;HR@sp9K2`FqlIzK#su@jnz?nkcYv@BP+bgH zyJJyO5i5cdO(kJ89|Rh|5NnAb&`D%34E?ej>^&_HKUsM1#73 zaA|4`XNjB`#qoN6lsV2Vrp0iEZgJ+6TdAgir#qRg?#$#Y-`?j&%`g+$_(&joarFX!M zRECvJxDACh2jbe;<1;iF=0PDGlJeB(p`p-f_}V(vWUY1Ods09;IsyUC*a97#4Bvnq zCqmP}NC%&l6$@YW)SRYZiZE^*|5Wl<_^6^SrYDRd|4f3*iip6k>>C#o5xH}7GjE~|61afA&e5d*^MfK34h}97Vxs#|jpJ*L?Q0|g2c2uzqY;F{E?Fa+N2L2VP zBoH;0g%QduRVs(?vx0a-u0KvRzbSUpuz|OtZI~GFo*`IA#c*%zxt#dDn~IM+;PWWP z3%E9*?!9Mpe!aE)`FXZB=cgbvUtWxTk;1GyUPheDjS70(o6kXL`WCKtIZRo7tFPCm zfCVJslHZA55bnfIoz6<`G_#1$7KXK5eZ0>SA*W@{=8lM#sEnPoS>Nw#8}z#YGc`$M z=N_Ur9LMPUjb3Vs_t0?IH=y8~3NhWqG^b|p?)0`kRjxl>CVNP$Sc;m4CWX|TNYx~d zk%MwDjHzD*;Ga8x>5qcr{~FikohU{@XS5O{WB+~V_9>!T zy|e1H256PqnaGnOkfIdKI;o!oY^wcRMD)H)xbo| zE~HrkQZ6B?Mkz}Py2L?dfY%eak0M@BFp1GFN&bhh*dOLc%5( zpmG4CC5-%(yBuhmRpd98p3%sH1p)rK$G9o z?^fzx{DCs4J2tRCl4wW9VyRb>83O{PhK2lRejspDC7{=F#f)6|lL%;A_plgZusXXI+ni@Syr8 z;fW{xR+_4w@ahW;u$yyA&qhk&n3!8IE8vqGmP-Vq)RSR6S@YY30*AH1iWA}SvKI>A zxUbwP>X_G|FZwN<#_^`_vAK!h8zXUeP{Za7Lx;CRtY{WS#tA-SKU)^kVtnXaMd8FI zFypxE7M$7AS+|B5P`;o|oHL6Ip6)#VT;6r)H#pVy<#L1YY~JZEGo|1=H3k4mn%`D} zju~Y0T(Z2Aae1aK0Xe-{yOX73lN?A`YC)W&a|Cg%vB@0>3skkG-=yyR6c;uXgD} z*7JPcaKn12hsIjvT2*4u87QwJX8!9*&Z4u7&&32FKOW5{rIc7O1Z^%7uG;=kH4MG! zOA$VB?5p_9>ljAjCeU8J^y`Ny)@MRsPl3b>i5#xbISGwd}hGH^e+;sb{S2K=iTH z*!n3;i~7uy33vCX%?gnK{CJ9l>w(xnZ`;ts+bSbLewl@5rv4CPw^uJoCZd{L?^5Q5 z?S@S(xvf82+S(Kb6$z=F>16gq-(6i2jGikl|46^Csh+m_Y-zIoi=@ z862oVDu#g~!~ww(O1p2py!Wl_o*WXLP119b!FGc7*)`@yl%Z)-)F8u94RGTUoC#uF zA8d7rGPY)ZCuwj%?$?CU1tUaBvid-+XWzfc1Vw5bI%{`sK+)SuWk@_2wYFFlYg)?i z&&O}^T$~F%0{o&owUqcKu3J9eQ@wP)F63C5*hlx1d$ih`S>>r}j+STK+#c1B!UH#s zocBLjAcvidwWHV(4*_it18%k|Z+pzIiP9CCSUpPG74XvV-bcB+!H(r(x$)&PV7oiF z#6WwhYtP;`x0iftG@e-q*wVlbttGtljxw<~zog#!TZx8{c?r}CZ>7z=b7ov_KE2)m zjQ4g#h*casAH1;NqWc!fzUkE#i|F~~q70DRU)rgQIy|U8p)z!@Ti$jBJA>dppS286 z4y`}tYE)?St<6C?aH)=*7&zm#s0)qi8-rzpiGNhP)5Tac`@KsMJBAHdE&DidE#NUc zP;(*H3H0`5p<~0A5bkSC9;gL1QAHctE+X>Q#kX1BJP3WF%jo6uJ&=d__~5RT2gh6^ zC8=McC+k|hi_MGZ=)Ppl!;=QKJ2myfiV(~_X2=90NW}*Q50n(WMV+#JHW0z?`b>y) z_)Bb>C~3LH7si%4F={d0&<<{o6<7DbhJ#c4#QR}TNV`5rC-U0as@Xc_%M|engSi;) z{r#UxG$4YU-d4EFP_LN=#rG=2Dn2L*C8UL>vvxvgecKQ1cVOPwxvlMQGgzLbNnyM@|Yey(;=@~#yY73UO+0RH`Eu8t_ z{V@nSE%kvRqv@8eYsY;cCrxzGaFQ+w8YO$hD!y-0h+JPYr1l{n_FPqgsiqhwLU#(39Q%HD@D#&?Mcua{q~-Y@hL(y}7xr+XpWyb@hZsB=IHNJ#aHXpIMd zoQ_dn1#wFaj1uyh9~Zx$5I(-W1=~29PnoyBx9>Jaa|H7{S2IcY82%7$EY+D@C;ap6 zf&ar`$-(i8p2avHpOXoWuD>R73B15~LuKX}gRVehAMf4D+J-CJz77*B=2lLW{miP! z_R-_MFzyC)`C^?VCe}PWs3}RPOba`vN{pQUKz77o>5Vg2Uu%kpoGq51w$AL|ZI-h@ zo@fiae?xsd)cUYdCfuczYv-nTXj%Vsz{~_2<73{Xw5KGjDaa6X9VKVjC|CJCc9$nd zTtwuvrFaFY?a#JX@`lnf&uIJf6@#9I+}b7K%BU)evRA~$s-X9al14PfEIr4cNDP)G zsdlspc5jaT*792O61|iQzA;b#Hl`dO|G^7y>A{QKCEN)QMWZ6Be!*;HKap3ny`E1A zX%YxZ$`z%|3)m)qzFOIOY-(I;@Mw2559-4iPUr%9fny$@>uTf;>LJ&0ISIKDQH(s_ zLh`7BH%*pp;xS*IWtUuM6o-~>(9$Yxtd4C)U`|Hg&=Ri@7+0}TwQ%S1M13prn$R>V z(&2#(PtV|8bCQ(DIz?`p+Dn!h>3p>vT0`*kcV{pXr1$m9-~V;)nqpt%x_UWo`yWh( zteDr8hqG&QN1I0()0&XUzV#MF=p#h2+y>j|&^4J)lc#24KXeNdFXK!FEb!Q3;zgCI zyINPaJdUjJ1H9ALfDG9PvRh6MA82?HK@#&5IQ}8m2`|(2vN)$$(Miu|Q%t#oiMgZ$ zXzGI%;YN7y0M2~4&-~GYmRcFh6FWQc28vjAtlvGtuaNMp9kST(VO+;3-8aFi5M5rP z{W)R;#!Qry(9#Da2Gq5f3O@=(m4!>9+`?U>%!j zU+d?Nj%T$-Tpa+6J6reMzoRbY3ZDJ=26!NFrkXin-qf4*3mik)Y+f%fULmLIEpi2$ zfr`mBmb3aLO8S;v<-gg9vFR&2zgfAG6XRt3WSD(Ips4dRd-FQegL4{8cC7P?KHAKo z#9J`Le>iCtuxS=rMF+->_7V0pX#GJi%4#9-cOmLtr()VC1vRUJxBCp;k3Rz5Sdayt zv-z3DWJ^{0ys3VZ^T~ImM~7gOt^ykFF&0{;fTf5z54%8;y>E6bS+015Ve`bcOL z?2EHLO(ma`iZ=vG-4RM|d8yg5tU^SXw}Uqx7!OX|MUY()ElNE8h*_@YB5==6)#kCc3DTOeBEoR~~O!S))u*6KRS3ks+efkid`o|y}@<|Z+$=!UAb*9Q4eoDgikHW}g3l_#guv!>Qcq|b6 zFzVIp_PRaD$H()PdqsPAV2ue_jb4CuV|K+V@%>l;i83+?)`%&!2?GMpm4@5~HB7q;y z^un1y=~}pU@t&*Uc#(M}NZ8e8lyb#6J&mETBci-c1hMaL^wI z;*@ox)}BeZVtgyT1yXgEEvkpdgEthKMa9^eVQTlIL+(P~4IQh^oRGto5bk0Q$YERA zJpcM>nCQ4+KAfqa&agrf^whA+kx8N?{X4-E>SMgAF=zmwsD~ce(15`>RwUp{qxM0> zB2;ScHiK|TqIx!hl-V$iWooJU)>-waG)9J+{#-n|Fe!CUFhsbO!~C>>r* zCFt42b?Pm4`U}Pr2kEG$X_gAQw`(zmw+BLtfRLP;AdAF|JJ3AVb3ix~&+)(8Jd{ph zSu%IaV%cU68KPDB%2h6jzu`<$m+7U|f+!IGZCbqzjZtMW7JP;hw-7kD*VXk5QQZV- z;+}iFUm(^T_J=6O=yhA_WRrM>@n_Y!)ez*luHnWtXo%f)7X*$r^{%i-&#DTloCj9} zR<6OBOQA!|@l*HDC2HXNqD?b;PiMyYKG(Y`AVsL} zj*K#+@p{hfF1Hv_lFKEKdu$7Is2xVObMQlOHI0)vC4|eV z@p_hhonF7!+fm<^koSY{$;ctjF4W@&k*lV2+qvhS)Y~9dV`zjLZ}+T(BZMpQ-NUTz zDV8X_?}h|*_4vVt52y4?gxl^Ej4f$mI^GHVn$>Z_Z~hvv8MXHIbjH{_TdQJ8>df&v zcIWEjx3&T|P+&vkL7v!qolEO1$s+)zY-hdLb<2v^?(2DRu0m}erM^crR>QI)kH6q! z!raer{7#>UWxW?drK%xYv#3hFZ7q>Un0v2#wZ{J$xbJ~-QbATsbLZ0$5(ras)49O>FQQTM$-Hby0113>_gR+UG$1$<7mm=`Ta;qDU5*y z(|>v^wnH(k#l_LHfqbV!H7Z7QLHvdB?Fke)Mn38a_bp1-fil+;`V!7;+7iOZP6+IB z$k5&cNpqY-FLg;D{0V{-g36wK92%3~LpFQ|geOMG{G#lVdNTel=%BPKkNQf82#$kH zMuF7DuT!9s?fQ{C&2MzLiwdC0PTCxjB*(t)cQZId&wUuP}rpW2y zsqj}{s-CGp+QM$BDd#Izt+F0OjTxQ0VmP%XxQ&1=yoz)!CAjyREB_b(9dgDvHY0eL zusBHqJXA-Lf1T}M2sDiR$&nz`a~o)Ut&8;Hv;e^r3B;*;Ak*zC61O+c z{th@h7gh*DJOlEtHun7R{It24CE?)ga)f>wm3v2Z?);cZF|@ai5V<6;)DpV*>%wJ) z^GoYu75ub)5taS-OYO_z8kZ(+4mWJe$DbRg-1DQ=P7K9#2NHg+yakoTc??#^Z*EP0 znQtvs6>p+sglf}@D`r-_FWUtu&l-E@401)zdS!@`WS;dZoeK4SU-d~%ssCD~BnX$2 zT5S9v&3@qRXp4T1C-m-@F1=p%awX~QYk~_pNU1F5rQ++!M83S(N<;5r7a?cvdu>~* zPP=}fa*5}t)hC;fagdT=eV5Hg~m^tKyy#GCyUiD$F*?iN8|M zv6*$?q%18p(L9P~Wm%S2uzJoc)6lWdd17vsGr0;u@m@jY_%2lx+>-foxU*NgID_hpJoB*_hc|@HXuuTAiNC=neSv)?DuUlYty9K<3jM5}VnyOgrTpj{ zdxMR-b|n*JWVhkDZ>DB%V!S9C!BIbBZW3|n@oxht#rNIlMK=hVtSPZe~*?%<7uA}J9o&{ErE8nuvAw@jHpp#Tl+nEe92dTis?Q7 zZv3hcb^K_*SnPDfAnyNHt4JE&n9gyvr{LTn*0o{Tb>(Ajo9nE!kw*x z6>CueBB#`(Tn`QUrP;%7eA3(5UJKl!9veqkwZwF}1bfBTZBZ56+EwPZPGMd}$d0Z* zO1CI=WToDDC!MxH{pe$ANI;7d)R$HzP&ctIb%`f8}PwJW)Uj8Gj`Y` zZvs;MP8hxUw!vNc+%uKs!<8;Ge?8Qo_mPm^xLPSFqdN7Mt#XO!qai(eW-Au6;`liL zY`1TJT%p151rrV0(m)`JsEl2aZT}K02h%vn8_(L$`iPcivBXy&v6V&gX_BspXW^P^ zu?-e(<^$Dk=Mo$FvRB8Jg*%DAv&^l0IEhAD*x4T7z6JcXijV{2_xcAQ-TPD3xc7Y{ z8Xu{XjE9GJ;1!=mo^r;#ZPeKb*u6Gci&30DQ131h9jOc%x=5@`yEDC@5FxnU75UYh zBIPc1^0?Iyr>1=Dp>{DK_IOI_&`hiK9992@LTEfe%O2;5kUcSOkE&E|89C$h{wQ20 zFD7r)`fNG(w1L)Wf;9hty$dTkFTY~71T%U!!qq6Elpc&pJPGPkSWDP&Zkn9aEVIi) zDc8jU;*7!ZFJlG>zRYM;BHV>GqlHHLYrf$}b@|Uk%m>WT8PLkUgwLBZoD2_~>t6clG4M5z%~Hdq=3Ojr+r;~Ly~PGn2aZ{YnJd=YoW_UpSay=vzt17K zFOg}LX|n@(xb|UukS8j2s9s6R736Gi_uCIJ<Q7Xj$ef(GrP2>Qd!9R8dU2mwOoxxYZeN$EL@bJo958;Ro?zU(|2j; z$hR5{NgpfDd5hd$dU8)}eU4&PQCc>}X0KKAP?oICCUW_`6j#O z>@wXCcArnpBw0xq;WUQmOOjLMjrmT;3xN)9w%(1Io0g2IqMR&peaSRBqWp8m4rHUY zeQ_2Uy%%}wxjla7jY6Bp0+w!8u9rID29geV7G_~*T{dg6vj3wqv7WU<6crd3fk$s( zHeT&Q%f9P(HA8b4G-RPw}~%su#+dEM z=(#eu3+pTO*g=eOd2VDrE)g$>G8?OMgz+D2sfDR&1oKN|g#&feJ>>VS+EW|Gm-wJ$H~N z%4<_J@7~DoJT}B46NH}Cz?RRFnjwMT1``a0T<%#{-_1%{LNZ+T^EP3 z_{U067mE)Qvq$mgg*3*>$;^{A*ymo!8u$~bp>Oofn%vmLz~1h)6O`&Q%VQhIzhKO7 z^7kd7IDxuM7Q1*fNSLMSITQ5fCxNgC`9K8bQzPJ0!L!rP%}baVX=6irHTScrLwd-@ z7xcmM+=N~R>%+C6_a=JAmVrBC%(Tsw^-Daez(d|?7qIRke)@7)Yw_aKt1;qsZaOLc zjTeLa7SP`V^llGHcITO+-O6MWptUg>=i+Y+2bfn5l2@wZcd94ft|A+pbC5cfN_Kd+ zbh6hlVw-&*+5jhi{)DUDx!4zQeK`c^F$qzx;KyWP+HzlfsCye!1< zH(X`n}y{^i`;=brK zK9i88+AA%G z{j<72|69}A@kevYA{9bEJIB43GGJ`h7%H*^6ii~06Qhc8k&VIR3r zrLw$Oox#@BN|)@ZBsjvCV0m zv-9xnsaxHH_B`Xhb1eu^f5*rGg>@z<^M~Au9dSc6^k?Sod{U1r5v2+7#;HqqUKzd& zVIakQ>*4^HvopTNtLnIK;A+y)2@a_3lxf~i<!RM zghEdhkj@=07t-1pk}D==@%dNhTd%W~KkoLJ&Ia*)_^16iFB#o--|LO?BmZb}7r_eS zC(etyNsZA$g7NICzp{Khu3BpLCh#RyicNMhC}mcMQmh9pM+4zOz+_#43(3Ju`@1e~t$*JV|wX z0~En^Gkd>g9{|3(&|6T{xZR_)j5gyZG?Ev>_RPj`u?iSFfJpO0KBKz?wZco2tiY-X zE35Uja}G|$^M*9#92RBZQXF0c!qOYhI#dnawp6SZ8~5wz`jFXb#i&SA~cq_0a*n4X!4s7dOM=tQi_nin!>5K!bzh&faNvb9ITJ z6_chcRlBaJ0%17Lho5#+~F35XRbM6JCrh_UY{)w_Y5-K`? zDXV`~rz|%5$zOh{Q-^c$nv7z^{FZFQY4k$J080k4&efnOHb!Q-5}r5At3at=fax>f z#)n;T^xYGYG51t*{a6P?4PssE7}tK%GLEDS6PHK5HElb7aWH7R67mQZ?3rUt~yDN$>!j)D9Z4E=r95$|`4vS;)?g&P;D8P0Mr zY}^YTguB?dYg`J2qPNijBCeZ(z_#w>c`+x03(qbFeOh2ojE$eVuo{Wza@qMAEh&$s zMjAAr(#lkA>&$*E%&x3~4rhOF)b+>L)F60XXJT1LJzegr?wpm3WnX8UULA|Hk62{Z zccp%Q<%dF=Pj4?l?LNOYp=}aXe6`FS(ksQleN9ZIOSSh-h6d?8aPpoHp!<5_fjTo0 zwFKDjwJK2(?Cfu)fSc$g`? zcx1c(?~kTuil}4yKaLI#vmKCyc??zKR>w&@MYJRAG3m|?Y8wQXT0 zGRA!FlVW>liZ>B}Lg-C)Ip4h%{LZn$mE^T!xEF~k$KVQz)@ok!m4=&4q-m?}r!M8W z^V7Y!5)YP6$}j{)j1bLsSUAt7X>LD=*_0G%h;3he8^jD7T_2`zWH1?0uQ8w*il26@)EH-KF-3N8qx*-0$ ziKj>Hp~9*g&d70p;;w*#)L|P#x^`JAOWXzbr;a_*9e>R5xnMWKW&V6q0AZD+1HLqS zVhc9!-=HvbPl}ZBmJdte;u&~g>QYr&1${h#BCMS;l1GKMbe;cvBBA$z1{HYM*4)~e zr6X|sbeGa085meacCkCWn4!7RK30-S5)R5c8n@2n_=hpOEa&?6AY7CnWdwBDK~t>% zUt>jy8q8U3M~>5kzy~lI@~&!@tjD@Ppfzs41Zh zp&{@)2UB3977(bpU`0?|t*rHXp~p5&UvIY< z{#bA2>15@8dTg@&?Q~3PP}{S|L)O7HHd3xUMEA&?0!mACYW~=`{qspN6vy@$5Ia1%AH3D0ZSDeuo)8(#(=UB(>)&_OKL& zq7&kOa*7@gTcO)07Y<=?O6J^#5GP%kf9e}5iea4}K)I16i~CP?v@b8dyQ%+WiE~t0 z1swCv!8_B+7obqA1j!Y;!$?ceq-2d;%d_~HtD6Y;+-c*i-bq=wBgiVmI)*TJDsV5d zV22#-oCYy??(Uwc`})QC#U?&^_4N$A=8snH#eAFo71~=?W7lN4i#nV+YOo!V%cJ&k zq@B}E>sSulq}MKLpDzee1hG<-1cD@M0B(y8G@c0uIrL4(mgZlW^t|;vqW^qi-XXb$ zRsFp$99cj0`K|CWE4APHnHD#SE7`?=+CvL~#lz&_J@AhGKyy}{`!CHW%V`K* znpQ(}I4E1+=75}1t~3?0r^WKu<@SI>m{Eo_b;i@tbvj3o1vn7vF%S^x{0|(CM9>qD zF!EBO1;06_k&3|)#>r6?X!JSIchc4Zb2+RoM_QCCB1*c=a$Pn75%Rg74(Q@O%T3+c zV!@-11bV%2+{>_$qQFhF5e{5^E{nNC$`z6ANfpH`?axUIEb~5HP@W4Y=a)Pl9(zwJ zX++EOfYg%5B&1MnY2FX=uhwIv$aQpDO)EoDJh*GEr7r3f+yxW(<4mA2w-tRn$fhuL zlMw=nIzX55IAf7FRT+f@To5tEkx;?%N)hBHd{ zkaC1ja@=Zt@|hs;-Q0eo1f@HcxzoS(2(ce27nr+EkailroyPVvRSu20x6;Dsv>O!n z+y6QNPJ0e%snxNY^+%Q)`Xh#|r1S>RZhyXU5B${C0-Py4>$pg=kTd`!CQu2 z*>a=^$R*=SAgfe1q828p2H_|^KNC?Ng8}S3?WP@JZplLNh%zW{0LW?^gqRnT8RoNf za8;6l+xsR;`3>G%w~R9!sQ893G4a{(MUqj1xjx@EkM5Fy3ntfnGZ`+9ml1}fj4{Js z6}KXE+S5(FSA~bjl~y5QtocuV?EiHZ{J#K}R=&-G`8GukzWBr@xq4j4@X8OuaQ9Z1 z)PyioVb?#vt?(M^g7EG{$Y!bK#YaNq8zJQi6|?fL1lL%F{O4Aoc#*z?lGKt{Gm)G5 z{r^C^{#QtL3-8XuwfKI&Q3dv>$ET8pt3y4^wD1eB?x}1PU*# z{rT4N+h>G~bH619R=-`X#@4S1pQW+_+DCtu%J45 zD2d+s50_qwc3i30?eZnkf>ngt`j<)ktYL- z0qD^`O~tlzqei_XPEj4`vurzR!43^@j@h9G~-0~DL?@dP$dw*=a68%g1h zN@>hh%OhPknd8vWt7j@yJErn017aBqq51PHLTFAs$;)S*o&d?V>!C2OqDIiB8wG&gqum#!_m~0OYYDM(j8eeVYd1Oj5P_{dcXC- zuca4DpTj4;S1sG`ENwEnupW++zZQ=BS?#S@ zu@@Xe)D_Pyzj3B1zr!VXL}fK?^7}tHgUR!su4_Ygmlb}paC~uVM_HpL1hFW24(Ns9 zewS?-Ic{hfD`*v&*|GF1K)k+#vB4z}dXv2hNj-~1rq<43QHO_w^ZZCA=k|SNpKA6B z9i%Sfxe^Kse2=DmBEC-L&Icd*CqQKaF<-naG87-kdxzuhU)0Ox-8|)2z3umX2ZsYH z>BwTkLScEvGFx(=`^9jzwwyOPj;uC#;0&;QEi1jWXiO5B?@+%6!Xv5 z#6wsAY3tO*3kt!?O8darg~BP_h4bOKy9bVB7PjD(>Ki@X((VW+%jc)4K@e4a^h~1% z03b3M$KoF^|0?vGKv`^&Q3Z9Ps2p=9J$-US)!9XmqU=hp1Khvjp!W0>@R!pQ4PLS` zBA2Ge!X61!s)c&0Q82iJO7@#56HUvD7=z%Cf}$$d$HF?7vJ=37%~^_-r1}vvO#7Jx z+C@*B2{-PKgTu$`-LAf$)>bnt-j|v7#{I?7X1k1}w7V6-Z%E!5Au3bp2OkJoWl))k z#?K_e2nBsn_l~t;W@p)u$!PB`eZjQyX-0fI)(YE{0 zdDr6^i1+R;IE|&`J+%x!Kv;KH*-meB{=u#Qlp#1BRZvk`aYF7~`r62jm zRJ z)BAg!>&wWiRv0_QkgfTYwQaABz>hC^)~^k29DIvb5&!mI6=Qq6X?HW&5@|vwCVlqr znbRA?X>i%M7ykaJf5@uN?M})?j1XD=7tZy+@^wby>|{;Ys}0jk47yK7!Mxqc;h)fdgFfj_cA*8umNy3IZ!P&`;e z0@QbXYocW|YJe$<4vd?M^`9DB4$c3-u&Ei<7k=uFA5;!2ESD?DZBLSaP=envHe^9D z1I{_gLm{N>)Xz)(zlZ}4Xe(vy6)mAS+gX5dvWsL8L>p?y$UYKMY1$l_4glLcO2;fN zU6H5OyGc=p+RH!f5Pmjx)TJ5Kg4mi9^C(sFJR^U!J#+gVTn97=Sq0rdsJPI8w(<=8 z34Cc0z@i8yd%uP{yI`jTp)n%b;#RP3XpDNKYgkv(#u;H>`u(bqjRnn(Dw0xVMn@5o^O;0mibYhy1+I3lx8yA-$A88=~fy>|lcY8CXk z^vop-=IeBw+@=2UdU#6%#;4F@ovsMKf#a{v7qmv<)AZ-IT>BI)-?n^%yyd5kq~*wG zV^k~g;Pp2!aHaCiMlk5vH=8?NKBM_ASizj)P5{meL7M0Mlg{U2i^f6Ccw zPM3<6@%J6$3&n-cA`qHk!(Z!=Q4vlORvS%@#nMIz!kb09(jiMQjld`n^6D z)R;xyw1GF3FXN0{n{}anOCmF4ip-2Cb0vMESn+HjOLguD_y#1gayC9fJU~b>(UhIe zELr$5q78m$4gAEvoeB=y?I~C~dLJfm{H-r6oQ4l%KDSAh6&3)9G^c<3dF!t`xEBu` zEZF|ncfY6}S$X+ajcdP9<-acWJP~Sh@UQy#Q#Tin{B^1K{j=vbGMhc9q`i#0x|xk> z_WSTZw5x#|(o`FB!OMFdFNO8#(}xZgr0b7w-+s(zFJ46C_lr$MnnfXNVj_Juf9WaR zydW!b*8Ipy_)|Ep=}qov(6Aii8mD0K_;HWV`v;+Lwy`6_JJ=9LOLefndTXPaMz z{8MhzQn)r0LQ(pgY#E2gLlyO`rT-;}kg|wN6|vjBG7WhWM05TvXJnCFPz>Jjm_!@|At@a3j?Tzd5MA8R9bWOJ8fDE)IHRBmn>jK)4Ov5qGb z$|A=;2si23e_cZbPwZQf0K*m)yz_OpW6xbHO}%EXO}jCS{11hu6KB6V4@-xSHBkXWwBhC%bttv zr?^?7{HUP`=OhQ7e&YVh6sTY3*yz>c@#{!W4F=404^FwBM^Tqhl6*5|DdU?RUBF@K{Q1WM#E=+|Ymu;#vaa zC)rDlehAESi1Bkw9NcN%xK~=txQfM&muFx6@=lX7QS|X1j-T*u+bU7k+JpQqmkt`< zzdm85VF8W(zQngbd-dG`_1Sc!uDtb@Go?zw3Zc?ZUPOr;-O0HGBdSP$CnXn-Q(7lkR~{A|jLL?LjH32xCmrvglm zs9l3CIHpXpyr8cW{G?>Mlx5!??SJiZmy?w!OH|z>w9gpSC(~I|Ck3(|ClB3(`9^7z z8zzr%^O`J_oW}~L-`|-;tHm98|4Fc161&h=4vlu3N%-hfeIg;PFMdnIuQ%LS6mhrW zOqI#P>S>0VSD$IsLrnkcokL~|GByDeVPA3@?o~qQ^1n7FHqD)@ieS~gSzwrp-g#U2 z_tATpZRKRS+T8s7X+S$bT>e!H0p+Ik)W_p$$;Y&ml;(1BwW^eo<#CCSUhR^I#YD9e6Zit_LU=0Nr$81Gi1AG|T7kU?WS$#wq&*@T6D_)1k;A{%7MwvS1!jj@~==3Dcj9PugFBX}A6 z6{l#7H<3!sR?s2os~V8oP*-T3tn`(4Pq0h9H2@t<0Z7n^ZYCl9NgZpx^$<01M|Ugw zwyMci=O5dtnW&><$^j$BiA);{)?>@XIwfmGSv$$jBNPPAgD0*|E$6=<>ETlYNiqax?55aMkynzu&1SZ?Wz za83L*dZ-~Mo@F8^aN`TuyXV5^~fU!8uN%I8v_}7tIGnn0o_cagf5wXf(YeOKE7|a zIB}n%CN!6i5loUFPTjM|(uHX?%=1Ei5sI)1=|3KMI@?xA#ZL{Sd%_&h?*4RrnmI14x|Bqe z@)y5FaqotU@H*!1pjOVnRRVHTmCb*UtMjA!3YBs*=pd1(_Xcn=fD8Y7JncAg@Um+e zPb{1s5H=NFk9)nNy|@1(;FyJ9&s5#>=n^{juyt_-r=u58Vn=(xv8_cX&6*Xl=94I0kM5HJH{Kq zJ)^=rq(xd#%Ny?}FG-$l>F#P_zTXk9ZuwzsG4{NXN3Og=as_CRV4Ieo`CH3LJFUQZ zW`Npeg(8^5I3tE}j^r~Gs}V|gHr^n0@9V^U*nK{nO)Z^ zYb%=clZQ{OjR_9%&@{C~UmrMOh1L6j&$b*qByDM;vya*aqA0M$j z+OJZm__d*T9;#IK-5Jv384yR2%)@eMPM zCrC?Tmyf=r-cc2ZH!Emv6)ElVOD^&ZVWsIK#wNbTZJtAAG3AGu+FFrOKXKAS5-0i; z5?r%n$iW9h%4y(zHWhE$kRPoGFz-TFPvgGYxT&c3nZLj|Gl_Gn_Hk8s%wz?J6`uc= zWM|nLnig{GyE0ys-#x2JcUo=>e1v3E5GO-3DyRMOUtZk&sd@u($2qcGZ$B6@MGgSg zJVg;~f2XMMzv~g{RO%vFYUE_W_N_4{{sNPS!nGi@waGl6DC;eiuA7^%V1mLU@WZsm zUZ2V&*QXy20m>=cZ8nF&cYuOXRuR15-cT=6zSbr&m2NWnwOq|F!N`L?GwB*y)Sovkq2 zw}FTlr{ZJZH4Qv$ezdgvxEkR@3ACyboJqT}g?1eQtF0;sW{#SP`ml@)mNV@t^NkX_{ropzC1eBjx|WIA3ahmUbW zmUh+f=VTr1Yi1!8pTw!oq%gFfQ2S7B@<=?pIX%Bi%AcdY@Krng*xbRZGS;#D+C7ZH z=Szj>jFEx9> z!vr$gPtVJqQ*pD4E-svB?G>uSUiLYda=@Ri5iQm>KLr;j*eVSOls!El@kB3YBpL#- z3KoB`M?bz*F7>uUDmUl>iS+wQ0FA`IT6X|w)>2;J2;F1qSI&HKP0HZ5V`#X@F*L>OMZoE@>LAmY=tH`qnc2ZlFaUI&U9b= zQ(Gx3W<^W3MZc+NS}4rGEPi19`RVP{Kw3UJ^AO^n@oetn*kJ3h2dm)^MdQE_ni@gh zG>sk5Aa05ojsIn9l!#7RKi(801{H2-8N)!Qj_rBQ40Q{|Tan6N{mi@LlDhp%F2%glY*{*;`GmQ>vr1-&#r^CYF5pwW? z(ZPFN&SfYDm)kx1W#=bu1(zSIC|E!?s^m(9pcg!V%Mft zShy8@%RVHC^Fxz-$#y~EeEX@Ghs@>2Od&FKrD-el+=| zkG9nl?s(|(Y21cSYu~9xJk}Ma8cU5xd30CFMete>GoM$e_jwn}Dum?V&wjf?-Sr>= zZq7NLfYbFN*%)vV>T%G|(|}ePd|qUO94w2IZ5SEuX*AB*9JHsM`5K;Km2(4t%R#m~ zD0u3XRu?pDR(zQc;1VU60R2BS{r@Fm=xPpVLaeEQkP(H2`P`pDL-`5zR1Y>j z6HA@#9VaAoXCzye%uoV7@WK{w(|>WA;T46EYec8>^NVlygBvRyvUl89YD+x(8&565 AyZ`_I diff --git a/docs/srcs/a-thymeleaf/home-page.png b/docs/srcs/a-thymeleaf/home-page.png deleted file mode 100644 index e17aeaf8de0ea5f00e4ec4525722e47f263052d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13921 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 diff --git a/docs/srcs/a-thymeleaf/layout.png b/docs/srcs/a-thymeleaf/layout.png deleted file mode 100644 index 6f2606d7810ce7e490bcb97545e35e6779473855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50263 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�&_|BSEZT4C} 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 TxAdL5?&p~64@dFe1^xVAax%tZ diff --git a/docs/srcs/a-thymeleaf/login-page.png b/docs/srcs/a-thymeleaf/login-page.png deleted file mode 100644 index db0c84fac2ecd5c3c643db6061c52fa019fb6707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12495 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 owTH*zLbx-l7aU~10t&vWRN^l+0`6hCZ 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 V!UDM;h_XQU@9N(vy!H6E{|lEozajtt diff --git a/docs/srcs/a-thymeleaf/second-view-enhanced.png b/docs/srcs/a-thymeleaf/second-view-enhanced.png deleted file mode 100644 index ffedb8a481cffcd21cf28497550d3b86b0cbb2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10468 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 diff --git a/docs/srcs/a-thymeleaf/second-view.png b/docs/srcs/a-thymeleaf/second-view.png deleted file mode 100644 index 5bf0480f4f2de462656782c6a00dd1a6c830fa73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9090 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 FKLC`GFQNbd diff --git a/docs/srcs/a-thymeleaf/third-view-success.png b/docs/srcs/a-thymeleaf/third-view-success.png deleted file mode 100644 index 0aaa4a6a3cdfe37df4b9314aa8b78b35d0cf7967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5944 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 BJYN6+ diff --git a/docs/srcs/a-thymeleaf/users-page.png b/docs/srcs/a-thymeleaf/users-page.png deleted file mode 100644 index 70a6a767f02c76ee97a6ef4408cf02a93d9d1d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13978 zcmeHuX;_oj);89oo~o7BGE@<4sf+<4q99<115ud;0cA>*DKZ6RNSLWwCs1ibW+j_#6TcICKE{VCVJ{Qr^oZ-yS}&Q``+t%_aCl2JI~HqYp->$ zd#$~>a>V`6S8F$~RZ~;@%IUD9mzvs2f|}YFfWNL*KB1N2`qk8|PdYj7^G<@!F?n@c zQ0c(a^0N-F{Pd>J8Z46c{BRlijnMhw+9$8Gwt8kx(Hv{H+iWa%+y~)k8hmvn_~%Fa zy;t0}zF_TJ<9~3KLE!E0_d1;iFc$NkTzLM&PlGvo_XD;Z4)uN~p662LDQWOZW~LirJbUZtk?y#_=}P3@;6 z8h*-|{hojB1milM{wr@B3stalDzH z$-d=WF*1_O^a|b`;yE?R5xc18Id6*|qE0uo7P>2BlS}Uh=#rmxn`U^y~c8nRqHP>VW z$Y16=q1yo<=~l_Nn=L?Sz46Q-JHh+`9c{*4N$i_Ccl_NoMqwh4>o`86{JV^N_m0#> zIXJ@(`{0f5SASJ*(+MMto0!-30~5RT3x`a7rbBXj-On|4$o?AscofZAlTig}$Fk@3 zLSpZe^`t!^^cyKJV=q#Tp=sRO1g1Qd{;+f6tiJsjIkrl|%GK*E^tiGY%}lOZO{I8Pssj1<^+ zI_Rc}L7Z2a{S)NVz3uN~)$yrvK}CJ%f*+Gkg5!V{@j1F~C=xMaK5>cemYL#_B3R;! zi_+&&FH^_AtXl1uiPn|i%H%Y6J$vTzRLz?1gkM5)c1?A@!-T~K`}oZj4X4yeQhSH@ zMSV?WCnAwfPdlb46{Kgz6JM@S8>#JZxlk2yQS#7H{JvZ=?$fhP){{(}($sqs2%DbL!RDw!0S+qA=m7*}`)OMyPEF_QJ<<&aR z$rF0Ci?xl#+6+FdIb;zu=h5VFdI!iMUG^}6mr$1L#WE$b>Ahm#Fqx3^v}cy>AW5>5 zEZEZyC{P4M#-dw7y$<77dK!*^Ppqu0JVAU_Ug z4PFbQ##<92zYn9^@xpc(Yx92GdP}nUq+Hf$vrNqNi&-z~O;G~SPpmiBrL)WLZ_9+E zmQLc`vA*pD{XN(WpRMd&IbF2Z>D5x!(%Kj8NsWD@0$WMQ+?(bO{jn4`8SyQcGVUOu z5+hFe&n{4?x2{Lnee=_|~Odrz=bRLr2>X z7Sz`k0u6?X;*14I`YfOVNASDIhTFAuNxkf33zgqbpxvQlLpQvSO?hMns|io0bn-GO z4rqH5vbry?3j&A=~zJ{?t81V9RpkB+Lrk3`h^ey z$R9Hi=M9U;J5TEQqtqTjn_llOXMYzWZ(j(xaW16(;_Z;UXUT!+H|-B|ziucKKa=Y% zT_0=hxk`dq2ON`t?YKYBFJVhacvkMVA-lrPx@iTQ>Q{|-o7QY3S4g=ta>2{oYc%Wh zXbC&H6@p9_)h80~IYnTwT`>;%uygi<@&FnsCrp^!QQBS&P0?qjGP9`s;R(7ftW@z3 zgXrC($Qc@}nV%zFl?o0SQPah}QV(IN`=LV)_Iv0--H1(kUrSaK-W9aQ9-uYdp4qe= zvk^4tYje8AXQc_YF%2x?U&_u@xQCxys5=MJ@l!kD5tVDBAqdnHZx+r z_N2LjZ|_4Xb{DaeA&8>^@l;Pj=8_9j5puwO1g+1_qXon-t-}tfLhHwsryY zZwb?_{iEi;t_&7uNAud71}o3*+!@pIxYT1-rrni)J9(&L0=3KIf|lAn^Xu5w9>?sE z25wU1a^d8RDS^bd*r`b4p4hip%1Rk#H28&H!Y5{|S;WF-GThtJpbRR>;f&S$_!lR2 zv=}1xNw`haOxvVQXVe+rq*-DGrvF^3g}EM~nQ_$NWPPBP7DKUc!p;^*$CQ?6N>cpP z%V1^Wq^;T`mM6B? z&Qmv6u+@r*)dgJJnyazp?ymK^+1Dr`Jvn^o^^%mVXnBX1(>_2Ust-1TftpB?qbrx> zIx`y?DKLz1M=GyI+|nHRV8P0)_?W!qWeTfC-+r;IiO~&dlrV-ln5#NACn^Qn3~$)E zJ%C3<@DM$I&E%Xh;X;8HupiYF>K?m)*Xf8e{arnD&=6rWwrFld=^1{){yc5Q9oURH z;$=7tuJE@h8j+3piKHw=+S6T~)ZWyHj-26(_fdL-I$sN7$0=JPG88iE3N=yfOd(fv zAU*6<@`d9WrS;On^3+lrS!<%JZyXWN+)W8!y{z<*rw>q{BAuTf-q+8jXSxojb1O{= zLf(@d5-Q%-e5u9Nd>wn|P%0%8ns+042s|>iL*GML3quXK*pfTFd&U0RtKV?Zh zR$_w&v!jE4ik0*jRp4ryP9YAVF<4npA`w4~xs>W0o{pcQ43^m$_P55K@^cgJU@e_m z@|p>Hs{7OhqaUzo3CEgQjaV4XN{-Fe#MTw|PaNv-oT)xP-#cm+jaFeMnkxM%R-DM7DMMiAx6v`v+oI5uhv^BjahS^h_uiq9T z&48|maY5HmQXHBUtz}>cv65VoAjcxyMs!OxUM?GY#E*G}(z#ULmTDGk0z1*m+dh6Y zR2yZ(!XjFhUJ2eV-+0|~9k&LY6qRyMBA4b1C+~7b(~00tE0pxj5caKYq2BU-A=Ho` z?YdI!rzjtvFZjV^nqoDS`yg{7?MsbD+t=(B{8$Cb;zHc2nAh!pni1nPuC z8AV~5InyF|+oRJjWuE6e4fVs97$}Z;;4djg+#(bS(sFVp-tsFowOUX3_4P2{0c0h` zu!-7Ev7mQY4=Yk2$hIL!V|*?i5P6UMg__!LXqbOS&CSt1O>+X>C3^|6m;f1^58jjU ztD%xX*8U7Q9$J91@2GT*<<@t;jSE*kL{8LdGqCBx<8~6IQEty1bg=;!y0fuB(ia(` z(Px6EAwz>Ddd`r3ZSRP6aDH)ACMRr~plO3bgb^w+7W?KRFaQ$D)=e>c%r)q#3t zaO&xtOA>E2wG*o#`N8n(}V>d%2VZAlrLP?cX?QIlUCDic%w#(Q77{W zA#v@0aS+Ze+p4KO`dYbMfC)~uL;!&BEm-O-&2I9AhsC;PE;C|1D(6Jaf+z8ufdW0J zt*vk7I22%ep~q@vkevJbvgX8F$=hd1w;;7p3NApKN z``KSm>;iU$yKiygC65Kri|1!?Pk?C-|a~xATb0 zZ0crb8A&O~uDxj7aZi)MtEB1IHaQjN>0j91Jo|;{JaEXyr4QRVa8^CTAn3iDsI{Fe ze|w4Z{*@?g*fzK2CzH=#OGaRTaTgVKN?pdP#(tVH26NIbXsiP=O z4MyTfzj}w4M;lOCee{no6W(`77ff@?t+Y$ltx)@^S;H@@#tgU8moy!Kb$C!JNqp@~f@S_l`UR6ndO!Fh=h2YKj}fQa_CMtChl z`NKbQqQIM5Gm;xH#)JTW;8BMk*D3SoEwWd%kBKf}W>-ywg74V+w9tBzmMb==-g0+l z6}cBxwcnIarS~UqU0#mwcanrPFY#Ppvw*A%$U9_27->Ki!`!d3%({H@Xg^dz=@#*I zZoJ(ora^DbD_lH44@xK8uyUkB@+$_lGu@Ua&NMKutsKmXu9`$VcGqCkR2OVgmTfn)IvqGv5!3aq2_-X2tv%?Xk@;#IE!4b9XJqGqZxGN-`pmGyolwulaeT zePNFCa;!4#ds+X*34oefpt({%)IzkB8)GBVXh4WMd1yhj$Ca9T`A&~mXvqdW&`>;b z(JMuS7UN_XHj1b?x-UDL-7vVmrr^p}%;6>*pkm(7T20LnPbP$EW0wv}mtiEJ?y@ZW zKFLxyX)K0Axobo_O0DVG^t>xmLE{QzW6C0`DYX=6=JcT-Z7!wAqwO*TD>*peYLx$g0CP7=W#VP9P4|Hi8CPi-gVd)6spZLVBa4zB-+tNQ)- zB17V29XgKN4qx^A=9?>9Ao&}!%b-zDxGnj}E(eJ{W!6G92Q#El$JF z*_d!O?ugk&KzH@!%Z}IeUA~0mdv3^r1a}o`euE}^hML?a@95k2@No5aM1B2@wpnHd z8h!_DjkT_5hWI)<>K{Vme%9|dUel%jFnA#A^5IEi!p$S0o2G6Z-{$)t5F)QCVt}O> zEC|=Rk&UOxKy-+sTs?_2LCRoP7^)n$|#IszmMmC zGhuVFskj^Y1E}CSsv`UH<%EwW@@DLNs1Jy1D32bnCT_Va{GPR+Q%Ze<6Fgtp--AIb zEtB{!U$h{al>l*)?HM9RaWWu2IK#OqC{!uV@U@Rd4O`PStHqc$xWvCQXk{(gbVu}f z;q?x3Z`5_F`je_Dhtrjb-#a9=OuoL=cJhQ|C>6Tp?XeljdWwB!&MpHe5)c-GESoxB zopDIJvkBBmC%r)~wlAa7!;!vCw!S6s(14IgQ@|r!NDHxsjL*J&xc-wF+TGD}w%^qb zs3+*Gc@WdTlF3@ht|mj<3%42rsXG$Y??h#vpX*MYFY=fO>9;z*asuWR9)|L=4xcsa zb_I2;rdEqIy8B*0kV$FYT5s;1GE?uwQ^Y3v`X}#va44m<7VIF_idInF{8`@OLkYiR z4W-8A`x1lZy6;e|01V}E>KnC|SO-4!YispJ_Jj)@daWnT{Rr|0rBeCx@Z(E8?6`ql z>*hnpGl_af(>uk3BZKUT=FNA+TQjBI0TUshV<#pjN-kgi?dso+slh0-s=NS?YAq0k z+u%5$2Xo1>cj4)6ycWU3$3)W6fR-!Q$tfl}M4#5qP9M7|V(j`U6Ei~p!ZW>fn4awJ zII1Z4t?bI>!-apdRLYUktq&|JgnGY-G&^S0l3sc}Zb@OynghV^V=V4EoSNVAvsm|K z0chBSV=kF0)*r*tEXS7o7V_tlzB9|hSnhOj@VzAeCNfIdqUb)CxqaiO5Oh}0D(R~C zJAP?Hpmv1r15se`XzudM=1eHRhj@OXD?XnGm$2H_%vU)_O@uI$uW%90J<&~S$VA22 za52z)J{=0Xt(T;(3_!rg0L;_VXrd+{g?XKg%iL24zdiPAdiXcDEN_7N1~S^o8!|H; zdW_m~36^a$X0tQFj2%fWauJgoG54@ER@>2WoA<}aH?=p0R`AR`+8zltNw27_A`m|H z^msb+<>Of4aiZBV{@c=Czn~+>!1?CHeds*q;od^s)^ou^!Te~9oYe%j*zO$)=OBzO zHmx`x(h_Trj{R1-c;Md_SE2;E%IJS4u>7B)TjjM6C`?AI>Q>^Zlyw0+slMWvWr)^K zWNweK3PHR75^Nd1;_^VoRTU&hyMC|r=S=3)EK@~KrUcU-Q1`kFMJ%1y?ooVy*r@?g znYeS3hN9rMcCzOMOq+I-baCPu5z=t>mcRCp-HK6fPR3P|n=(CI`|>xh9pP2y8jTmM09i$ZRFG@r>PVzOuMQ14Wi+lv*Wj=dS{m5FGM+dbKpu>ABZ zj_6z9^tZ$D(!;G86R#4MC23!9K?Wh#z(|5!OMA1Ey;_MeBj>C#M`D=Dcz?ij?v92& z4^50qK9h@7v-TuxU8zib_HCAo3jK9vH?K0<@Ab}1F1|LLQ;WXyQA;E;67V@W z@?u>n6-#2~FSW4A!*;pgDap4SQFlB7e5Nrd6i-*jzrmMKtJqegw4@U(dc?J!X&Ah} zO_9KdoQ^U5?1Bha=BdgCSak?LN~S@YAc!-aEqicMPj?`?E{xKW)H^#qMo@0y^!58TKdx*TuIY43=06 zndJLT&C@WpO=dC166u>C71Ucem|a}$ZUIElHvDe>NX)ffZZ$l8bwlEp@2VdlT|y(! z=Iu9=-p-mp@=3Qt2c{u&m6YCoj&`niS(qyv!G}-$`g%6P0$W}quqq#r|#Dvi4T9Os!IGtt-1yX6ax|Vwbg%N`{Njj45G`v@mBoEa52AJLR;Ex} zBK?c=8Lt*w4vO}oG1J*>qj#reN&02XM{M?(#l{lWyg&Xp4LJst)HTYQMlLa zLyUAql)N?Hh*FOB4s{Vl_uN^~)8W z5BXY)HY80&m{8K?5*n%(I*g2iPYzX2eR6bxzfA;1;jG~&GlB_jBi=0T81 zQ37;F)j3Y2e`J4ZANM*U_ zL@dO~T(jIn@0zM{)Wo|Ar;}|hM_*1(bN(29qCsr?xOoh%Br<3!W4Wv?)w$IB{_t17 zWAERDfCB@|FnKk7#a2Y-^VxF$Lqn~7K~hSKv^v^{Raz8OeZJT3k8kM`efCvRtS#2o zn0eLYMluC?qb-#W+^7Q(8OJn#>BKX~AauZv{gsY*PRj@@QzXhx2w zs%BJ@fyTS4s)nL>-`c9dCl^c<5xo&T$C`465hJ}3b@H?WKV>tMrswn;QCS5p% zpww4!DSRU!{#d7?iGyMp4SFk$Y%^rHIgVq`rsYh;qongXteYK6tt(UQa}$r$WJhAu zqAL@?-K>gF{KRKpfX1j8nLS?SL2|E5e10sv>Pe&70~=H}v&@CG!En~GXqC0kN2>AB z>1rs}$i5Omh5xY@PSL1)QLgFGAN>QFqT)#l?I@(LwT->btZTH5jmO9z{R8vF5Rf~o zwL9WdmQtDTvpnYa=-cIo`I7>tGCE{Y*%^L&QQ0aJ-BmWJOKZUi`lRidFIBWC-KKn& z9pPTGJHFg9<^xyj{*8XfFh|+9tx(K$Xcc}o=JH}(owK-%1VzVmykVU!!R#)5W9lR~ zEjTDpCkzQaQ9@l|_gPLCrjx6r4IrHoOc$f!*(H!9wRLA-^gC3yF(cSjx5G%YZ1oPTHr0t5l*di#xz=so5Wp_ngAtk!7aw zL0f=(kSSeB&p?v;gAQUkBko05e6~^q`qbRsvlyjtO|R2lN6%1d;v9koumS(bB^ce? z+SWH)gI3ymA1Ucd7z*oAHbwuwYUV;;<&6|u&`}`#y=~MsAOSN#>6X6^ys5v`FX%IR zk)v1^0P%d;9EX|!BkIp;Gk|!Q2Xt{3IGqz4`w7xp2Z%MDzQyAqN;Eh z9$}BNq_FYiCxss=*3K;M(@jrPDL!;s{lJC->Mp{XEbdO&9&i!=QT9WMe*q7L*F_XeF5Aw2NQ~8Hgk;OPG7!c+_U1r4c^ZbIE+W|s@$rt* zKbAns{F6m*A3%Bf7tpKX>;b>b>Dwn**UOS%D+crZ(n0>A>;fB~cQ}E!u^2{N%)} zx#AC`?Z;IQ{ao>iiKts-QJ~!(WzY5B5Dh_IU+ee2VV0fk;w(*uZ*Q4Q@ow-=x3aPb zIOD6uU@+*(z13@{M}w}~Ly&^FmvVjk#?NY;ThIq_D%BiWCe}m+`3F+l;v>$;Q6bq` z(X#f+&|~~LKat%>KAFW8Y@9gw&0y!eOBK1cP`rbwA3*r*nsgI_P>GpnvrfiQVzVzC z0Z9I#wmK-3&AXjgkree|IZ{|W($IPe8;fzU0SDNb+&OQ9s$|n!h-czEB=GS5&#@N& zGs=4dP4%@I)%SUE6UjxGrNEAX*ZO0}t~TW>0W<4pLHGDe90|j2ayi{b_AM%Sjia>d zU~xgEMY^9QrX!IR5ajuiJ%j&Tk$vJLwS()IZL#Lt{t1FU!FN#hrq;*LeQ*3zHTU;- z??1=huZfm2KGa12P|E&ylbU}8$xjmgu~7b)V3uaY9&2Buwq0-|xDI)*!1k%1C2h^oZq00Jyqv(%AqwwFupUS@7cE{2n{1;;?k2EFz#+5|U}X%+i*GOHT_~!^YS7l14)JY)_nz zHiN@&1^bPX$v)D6DlUbK9-#ny}H>O`; z_Ud(XK<4cTFuvr~{#_*#m%v_meY(bk^HY@%$64YbEQ@#d-d~|bf{uwj2E0sZ=@1xu zCro)zQ+-)qc^W>J@9U&%3<@y_KP43`M6&3_yH(jVyCNVD#^zJ8R>1I~I5scpC1~eF zszUtCLB|#b75i zlr}?Pn4K3I3=IlzXfu{)JNldX$)#Wsx=X+km%!_P8iv=UQlo9?O>*V0^xY+AT_#(X zv-#Kq7vkS86s$o^-Ymdt)=fAUuR?hGYtyTq3>iPY#;c2;wrneJ3|QZ`s)2XWjX5F& zvp`Fjx?JSLc?~97A~sa`CD0T(E12t-&tJHF`S3|qR4~khMIG)=n@vkeIqFQ!X7)f3 zZ+5IGpD>LhNK*T;_Amr&6Qp5aBTsh z$I`I+`ufUFJ;X6|_WnBW*nOLgL6|4c<9nlKTR>CM_r60INS5xe9p*0G?}H%?n|%bu zQ`=J!)U+i+4FowwP>Ivhct@q~@QuvX#N0CCeIR^Qg~dZjyl=(Jt6V#dM)M5F2X?H# z7aU)#O_Ib<*ZJ+5C{wn;Z;wpnpn&F3A@MD2xKbhxPq4*7hH+i``UJlZYI-?S?hR7z zSv$jh_w)PDWE1F+Mu#?OEq8rXEV>4KU`ahUd2;rS{RBeVA0{T&r(fuly(ps^dtm9u zJwWh|5}Q<0|GK*nSp_DIzm$O)gu_&W#_Wi>J3GxoFeB6*$K#yW zj%?dH0i}u8puAR#vmmaVtyeTKu};uhb{KM@)cq_kbx&rxm{gqs z1DO=&D5JL0n4mPKPWip&xxLPm%dx4>Yfn7}@4R_4O^H}O9}ugt6p(m@t0}!2;e^&r zk3ANNxpJA@prMi}G`l4juCUGvOY=-2m~Dn9s(po0t5)|1cC*3cXxN21cFR(2<{Gp1sPm|ySvNaKDcuy z$^Q1)XYcQv-~H=W-MW`5s#Xomdf&IZ*V9iw-3u%$EsB9gjE01Sgz-sCNFE94kv`)0 z5cMJAlQ{$R5G16}NS}lR6kWA<8&DKTdS~)Hyu0Th*UUK|)UuQO!o$U%8sU9-+-k3i zsT)i+HAQGZ@`$a2jSbVV8BKff?u_$%_HZO0r$=PkN;dErGfukeE$Eh5N`N?)*5AID;$p>KW=;Lld6R9 z!sl{fX(`edFQkFj50H@5v(<}^%6~!rtg0|jud-!srCf%2M&!7 z0E(9{x#+Nmgb-hMc))`5@L@*l!v|6b?{X0Qzx$7JYI;?(vD%H7unqqEYtVgaWwUfA zadW~-CFTP=ivKzzK3?3^?P=KkiiM7cuGE*ef|^|)J^&B~9C$J$^rU^HmpyKw$i@?X z_0c^Oika`#N41hYwWUfmB~U1^&x)`f|39rKCjh@ry$9DMSLGfE;qa8=Sv=+rWbJA| zek`{6&<6IM0=t+Hyx>nsPO0acS~O5(+Hrz z&gA4!0DrW{RJ~ONUxmZCqf~m|Hp%tOnx22d?*CU~Wlbf&o3ju@#~ZI^iVD(bBELN& zmo)F>Z)!*;3019?)9Y=Pb~GskfM7|1c87cOiZ!Ctj{2KtZ1Z;k5}0tbRG?-dT1dux zjpkub&;f{P-+3pYM2<+fu4owUVR0SM39{R_GC4jCDJ+oKT&N8Uus5boMduyc-&i9d z5_gfo}Of!6Z7~FCLJTRVq$+#MVy3F#F=PPh8Br?og zeDlrlKXifvKpyN-rHAfI10sMXFYQGmt%OW)$I0Bf+_4Au6`auk-~El(=JqVPK9-V3 z<4o>)^3?b~K85tN$1HMqbaj|mSO!m@BYh4MfU2+E^WSrYx<#DO&HE3Bj{ zuo{ga+IySlHi_iQ6HQ*+7tv9{7_th&m#N@?LGw5Y|6L{x{* zve0{K+8ALF&4oVB(mh(iBtlfvj5pz06ff!JUzQp3Afnc<`Vbx#6kC}K&NDK#ON~sN zf!iFAV_u!mK*SEntIzGioO4>)VaEP@=@SvLC?SB!gXmiz#z~fmf0( zdcne5Rvd>R8FY4e>qj~1Q_;}pb)P;e?I#vj+17K#vka4qXK1Z=g}88^G*}G?#iIo^ zgltr7kDJe;PmVaVYUMZ^QL9v$sufzzqnGkGS{{7EmVX$*YDPoeRg8^I@D^K*`31st zf|?f>o$V5{Lqd`&?$*}B_Q%J!jzYa`gcZGP7m?e~3do8u6HHG9>fEWDCS){IL+u&` zgycdFdS9;`ja?*318H;LYzE&^dW*cSwPwE2bo3OO>V3LUjf?wd-Y5eNOW(1KF{sLwbd zB!lU@^|kV0AFJIlfin)XrV3xgI3uPD+lFor`=aDpv$=FFGzxUOTOi@s`Lg2%5(#I^lI8YJfrV67ISZqj zA@0l)jb*5U8W@BZSV)A$A}2sW?|B1T$+j}3B(A$pu8a?3_eB`(iwMFrGM@JZsR+Xv zIfk%7QXMWk?EJUANUP9I6?XUew3ZbU#E`$4)7`E9-0bH*F4&nZTxjgC`y}N>EPf;4 zrL+g_&T68z#l>vqHLiW7gCnT_vJ5D-_GlXa;R@vwN{fz12v`b4C%>x0U^s@I!DOkk>VXeJQo_5s&NM)9623*7T#JtrhI|H?<3JExKrU|1btzQoyZwKSLw0o&o?oXK^x%v+gd zbWB9O37b#ys=V5tWURtIo;;$2HcReZ%m?~S2#q;7`8MuXbv{l005erNh;APjtzy7x zyA@&06x8@Xd0t;Hzj%V5d``QDNFT%*upQ;XZq_ud)5WNKSI#7T(|BXSupty;b9jmQ zPK2LxG;jFl81>cM%w(=v&KqJu6&1p|S!gb}c}uGHmVA)5uixOu2c`7<{#sZg4U^>{ zTdfG!`;PU@`uGNC_HU4e*v0Xx?8~z^vxI!sh-CVA0Jw6_e-8j~+sLG*9m0iWv;N`@ z9iP5HsH)6x+NNeby=#&%Yu_Q4Gl$=;EnoYWdL{NVy2uN#%B_RBNo1&LYQksr?Y~C0 z>liCroMy~a<-QFSg6O+!`W3#%tXkwxs^`)qYqIyybE+E#dRuEGbZryx-0jV0!oLpY zjOJB{)Uj(PyEiDL>ewH;2iF9%LBR8u@&{+vH4S&G@)XlMmBc5;qAz*vT^jC$jrUBC zznwor;M42B!KWDQ#^yO|FIdndIhWjHVe!(@Qjs6Ns=f%;fa+v=M8?ZC7u?z(V7Gv$ zC3Uzy8zo&x=G7F19fxK`M>n<+ba;7W5XRN;PO7aX5_INwH}r!DIzNts<-+;VX>pa? zy{nF>8dbWT^H^o3k+Kc^H%}je_uXH0f+A*I+<)Z!K(3h#f8Mb<)tRGtPqXQx$50ru`q>mp=m3lZep*(G%Y*)*L64$6x>hQ)Biqh4=cJ zU5t~q5wz{mU#V6#?&h}pjzwUo=dPGIqx?@I5e$3+Ve+`b?e=_|8hXmnPuyLDtQ0@z z1-|oiOA8P2yEV2eU;Wy#^7N#($US-~1!V0%|_&n0SZh^#36-~jLIxRSG;Ow(Ykr+8UlaaU$Cg5Qw(r!M(*p46ZSEqtcz zl7=B=?cr}{8R=y{_h_h15Lp`eiT*EiE z$F!y^?WljV1)r8l$;UEuufrTl;8lLOhJmF|X-xG^P<}(|*Uz6fe|#{MO6b|pH&n4( zhLIC6@Ma_8V*>x3a!2uE?X{!zS#yy^EXpy30{f)B>{wJvwWrz2(b^?L#j{(@#P%@k zXBUbg3UtFbSFV2LR`?|?y0Uo>@!e(W?N8VHc6Xz4nWH8}X^2W*@b6w2ef$Q@&_Z_c zG+mjP_b5k~dBNYv>;_FbB1x1fH<(je@a26EvD3|6jH}^3-)-(&b%hch6IO3jTo@CY zd~)9-;QLLiC?7u-3P9up1eqbAs*BWjskAMjppdPYB_?aCs?=HJ%pVw7-yu;WaHx5N zN9Nj6pd65CK~2Bjp7&D=HTYRYFK%7^p!AIL>b=bCATeqXU4|WKQ(Z^273(%$62CO)sz!K5K-K zO~#a*!3q4V=EkeeZ7LJ?xepD}^(|G>>eM~|r?daX(|M(Y=3`^diOb5)Z;yAf362L< zCM${SW+yQhl&zekc2lnoFK+_|NfwFmE2|Ev9)~dn^HnOCXE=D?ex}fdX2KZA`3kLG z>>pbOGw7*K(UerF<&t|{{wTfDGfAW{fx_l%>f;^sZ;Oe?%@JJPy08#*?LGCQV+Ou( z>#cv77#Oo4S@1s?h-6gN74-`Me38 zl-qhyoh#ctNb=+|^;&<$?F@tY-#k9}1blaP@DVl^9AS*{$%=Pm^oCQ+)Uso2N9$p& zt@F@qYIgsYB(3@EF4@_Hz>N9y{40HSP<_oV>={O;R?N{cvD%ls))Aq?;(HOV7u|PJ z571$XWj-{v$IP5bA>gH`2k*+i=Yy{cCg*m$>GNnMe+u8@w zaJjOY<1)QdR7m2_+P-m(GxmPcRb7xO6GYtcN%3p03-O@Q2AlUvB4@uvQ{Ery_(v%D zMaOFhr?YR-PQBU*pz&y5q!6;QdK{Ichxx9)fG;=WLnEh(!m-6J&9)5P@S<4hW)N- zU~Ft`vgf~vtY+{o%^za9XGRH;;lG%;=nBJ)y-kM3qDR5}KC89!e!+apG}Z__8=Pnw z)QGob958)su^EG)?xKC&wAAvm-q_D4gqCO7lvTFSpz$14KHu3#&;Iu#jtbE^HtVEV z$r+@Pnu|iA0aSbouU6>Im>e@~SV!CTSAwp1`v?-b6x?Ifu_H3U^XRm}C zKxgRn|L#22QuKql?RVOsBl}}9+lZF=ew6nM&)>=$ZVD}$=YX{?{jQSfFrQkwjrg4d zoiTVab0ckyxd@1JCDNU5cwF`qrp71!v46vfHak=V?mz#X_fqYK+JK!klcuj_6%F9j zC?Yls@j6?AH=0 zeF;<969|2`;_+|%P6PKN7NK}StRa)ZsR{r@E zAR#&aspd4FN!{EI-nX?4%#KpO@$|&Od)rRjjH!=dUqV4#s9gnHT;L^^xv=C45x1!D zfQ{!*ay!X!yYhCZWf4O|oAPOw!m1Qtt15)cI5Qm#nHJA6= zS>qMr$0xmR{%b){$7Jx#{&rwM9Sz1h7re%u$4D}YY9>k_ZFDBd1K=E6 z{Yl$Uowh%?_OBk@rIbXNBaz?xE~><9Py`I7Pi;5}<74E4!mUD~YOkuAk?;L5o5g{f=Uf-(N zMr-E%B4@{w{cdQS)LK)ia4LNv*p={OG{#(Sr~YKTX~x&z4uk(8 z$^VRg2R#-!&M%jd9h-;9uzbO{iKrfAKn#xy)mO673;XEEp7c>M8f|DH?SM@ujZ>QL zcatBDj!s|OU+Pof9L=7*!)nj?2U$izn>HOXVa|i2++D-|M8`j*oqsO&2*Hp4(tG~D z`{7$Hz#jeJNWnNFERLJ*&+pAhb{z|G3g3EPBVvd2cS`&W6#Sr>^(&yhO$bTu-d%Mz zUCd0rP*u?V_K>h4-L=np%r@-NXL*5NY zI!hLx)r}rIdjYtgScL0b9XvBH;kmoo7`C~$J3Mt;z|48WoF|?OJ>}4Hh7#Y=Bf=PQ z&w##S7$QRxQ2s*g3|9C#KfKhqgul(P4MCS$_s{fmbuo^D?vjVGN_0cT$~Y{G$VFKj zFP6lfWG4N{`=B=PbS$P%g}P@PZWspEK^yzMQN&H>$XOA$O(sHAKQhA!V%sk}ab`!` z+%0Zk_XBB-w6p;ry--!|DZ*n`M{L$$9)4ix0bl4BU1MpEBol-(yXwx*Jk3~I@n^RVgwP&~f?nua4xFgNsKO@L&kwh#2(M>T339}piw?t_w_;6`DEDxP zs~oGtDIBr)67Rl}U%H8zufPXCmbKiKdq*QXX{+VqfC`H+roSFMHznDfL@t^(X4DuX z-kxU*#cm=@Q;%w1FRkMNmggtl7CeN!-~N#hBNjQ-rj6pP3=>k8f(n>8&CY2TjOPs7 zAAHeJvtXOfr;YSV%InDLRA(c80y^g?wHp99k&r68gpKYD4~Nk``3>T~V=EZ*6iGfteG1Cb?9_^b+#ygA13o!CSCiIqLh7pJpGF?g;7K zK6*Q70lKMPhiTjFb{o?IqL+2V#IwJ=2&lQM0;|Jn%rn0~J{E2Q!zYVIwi<5pdpI&% zRB2wYY*o7mDzd44Y`>As>|gmXV8NOediP*A23a3@;GQ6hb-|U=clt%qGwi+C0%4b^ z#fZnh<5X1K`3X{*!XG@RlfCW=x^)kmADG!8C_gSysr1fN+_F7(pPI@mWNP2HQ4mIS ziL45FQj+V=4KMfD#sgfcIRUySYh%g5d~4@LVLOBCI&_WKrCvg0{H`wZ?L67-5*0V7 zo>C`@CMgZBM>jB)BUdXAqHC&-n`k7tW<{@$TszA^Wn)IvhUwrGxFWSGPXFS>@beCxGbd4E(}dc_WS}TA;)2nezJF zZ)QaGx(?zc9ZPD6+4X5hoU zy%bIjI-TD=E~0rFLEJQjVCYQPw0Ihyf&h8VT_huaVLtV14Op>ygHTY|&q<+e*JB%i zoWU9qC+C%^(@;x&MVK0fsqcCMhc+>B=;_qXy>4yD!XeUvjY^MyMPF0(`XUh0;HG&% zv!7CX@u zfhvD?ApL(v@f6ajwhmSDu5PxaQC&p(iD4L>yIL9uDU+sXBAQM+*~>GxZA&F+p8utm zRq4zHX?Q+ZXFr=W)tQKf!Q~V4Y@8#zcTS}%SeZN>LrRgT>{!%w7(Upp=K-s}<|-#1 zLhfh5iGm2WbjIJ!?e#2?1$B;Ob|6FxLn^?2;w2a0(PJxgvhH zKr*5rch~5UWxTg;&!jAi?5@D}@57cRL*#$s^M4Cb48?2$L(pth0OtS}qvYfmFmX6o z4}a%=Xxg&T_7yi%gR>;p+;+4GxkhVuC}d#_CjE(l59v5gCv5R>E3v$&rU3)6(K^7(sc zr22BL41E95ll@gLt!yEpjkcVnG`l08nz$gyfaGsNX@NvX46dGHdn}Qtf6@*a#nLWp znuY9*Ci^)lm!O%ii2Jbv10g(sgRYUmSRz`jD#u?tL}(o2-SG#jYP3fBb3{#-RUr5* zih4#3P}yUXD!3;Fbzwtg&&ZL4eN;$F=BWep%N<{Ne|IMiSzCVz|A#yC^qr!m*6C0D zCN0mwY_jX7`Vt|dGAvyn%B{cI;ufcQN@ob^zso}9oX=GY3cjUb)~$KPUWM5NXOq)oiv#hAYD&oP&g(wI)I z8+pFG`6H}bhAs#MZIn!bLalfweNZqGI_6A|DccvMv{)w7)x-TQU*j}%`-VlqY zqEcNGRJ=$H?@{>)4NC{VW2HY58u@ob{5H{+sNmxM5$C9>j@3P6Adgw~j!$X~lRhdG z>csz!W3GdO@iL^a>HN;SXI#|?nIXfe2n_VDTj;eSS2EdGSOhlG4F&mD{Ej*=DaFf@ zdTN@n7zyBcHmhd>TNCjRuBYD$xt^l60H8Z!MSg^OO~-FWr%jk~p0?T~je@0ZxGjd5 z!0kWXCTu~OY8|3%!I=EU(yQ^@?VVaR^PF(0 z-_bfBzAp2M?05E@`NbRF01(+T*Ho(Sc@Ifys@boZDXLNZ?HK*ZJ$}+x~8+ukFM3^O)0zwbF5!D@PRzr-|n@kz+@Y3n`vHG z?2%&^hT0f<2Whgy&ts`Vrm26Q!4v}CZlTf-*`I-Ts74Xx=k1M1v|wU^lW)yCMQ^x1 zNF3sS1AUcKlLdHmT|MZCjA^rT(IMjIi#fEb+7nO$s$>v`h>#ldItf{wZoq|!juBmD z=v19FIpG^Ly1-F!SbwS**Kg)3*8LYRlBr2>-Pos+-;L8nDW&x7K04;VBe=)2lO7XF zdST9K5uD7hbBtwDEVGcRHBGTWFd15TU{n~=6XBtg2Me%Coo{kqn_24)DDUO(TElum z8k!DnQ}eKp7_^odnDaV21C(Y^6l*3jKUg>Cc&D8)E{Zs0@Ip^(!`}FKh|3_o+LV`Y zUXQvr+yiD;nfk-}kttcDAUuqb2Hh+J?O=~qg}UrLmI=Fw`IFsd@u^AG9Fp<4LNB8m zSEnDHBYAUH5|JAB7^|avsf+qf>T?ZuLfNWh62@@1p_X0?2~*8gaF*{c4mk*(#z*>$ z`Kzvas|YCfW6E*7A8fj7BB{!Ghe?2ZMm|Me>T8&~Qj|}0r$#w7uf03Bcz;9P6!;V} z!W|U0Ff!7S<$N={9rA`#BdXXEZE>1%@~z?I%`wcxJb+g~s?bZ_?anWf5s0F}P#`d{ zWN#5`dWn-@O6kvLzu^@^0S#a%tJiXIYHzRo;T`|UUi^#lGA-UcYGzp)(A?<@<@ho? z2N$ENk zu}n+}c!cD?p0ku+&_wsE91vu+gN>^6Z5J;l7{6${3nXj%_T#=-#wx;Re#@<{5u99i zVjiv2BMK{;b1QH7c-}o83bF>dyS@G>HE!qwNnVCiTX17+aL--W+A@>Z1`powA|$aL zcCF%;Q-Tob<{7!Y+wvWXvk!VCv3XQ*93jM{!4r#>nYrta^72^D?DWIOB_vKK(Yas6 zSJ3?fs?U)s&~(x-LWb;vL+-bsv>q1gmx zxNx{THgFNY5N!=d-bpgVSBCpKz}5Yyc- z#Bfwz5TVOD)~BH3N&Y({7q^Q^bN`v=s6x!8s;RA(*r_dG^P;m4l<^F0tpWuIwIXj~ zQ>uQi*?SIAhXhTA=}@j@G|id&w@KKB-=X&ZJhv`&)uK;a%9<>0Br@;l>wFug`{V;q zHd@-MV)Getf` z1+6P_%!Em2ZNn{m=g;U!5H{`=-}Y@&rp=`jN*4_SGtVp!%4LJ16}N#u`87prN4JU7 zpo!n0N%$B9jR_U>ev0xL{TZSarH}_q;qc4;wakEKg)i%SuG8rE(6tL&J5|?XowSbv zN?Zy$Pjt{qx#YS`+#d<#&K?~4xvym3V86fRBpE5ql}ly*Yv;KCRW28Kk04rZ3$i@M zCMDeHNK8Hm6X8L?S{djoj&Cre=0H7*qcsX2cqb<} zb|z_JKVwgW!!}%=yM_n{M3W9sPTMh3pv058;9Z?7pLDZ)p!R|E16_tlf>APW zn`PT}c1j5~daXf#zp%II9vsHHGaWjG7zFvGZCyw;gjF&YApSfc|FyBO@>is|G#Z_1 zo=Aq+dL}RbuWD(0s&7@OM+9ikVP=_C)M^9D^f<6rFhBj*#7Ar-_@yHLM;E@ROoX}& z^uzLAW7v|I(%(^5I)Jgy5upcrtNv@A@ZvA}6v@?P*LKEIx0>7QcXDKC8*C}S=iZR^fd7AJB zXPQ-xoVcy85ZkG=7B?i_@JU@ksbu|RR;#GDT(q>d6M@z2!Qx-D{<9EK=ON*jN}in`uc7j;(9NH8%bu zA}l<;M6qeQk=}o+#LYG1%9m`v;#AQvo=>1LI|g5@oFEXPbZ%B6kd0>LU}3JREf=-% zbgDjwwfm9~fiio;J?2~eYH?@;5W0$hMI}+6vQ$(&kvWyJ`RJC@E-b;iq2KZxk+llu zi}4d`zd%ledY{WD*I{55)OBv1Zn_e*?Ee-L_zL=S#hd1ULjKmZ+sE z?u0FqsT<(97(}X7Wmhq9OYR>^dr`BiO0~I%SSF^=7q7mLgC|deg-d$IGZGQf`qs&U z;!RU2dMc8Xc;bqUpPvmFbpD6ASXQP3smJ zmxsX*jQVi(&#Uq!NbhedOOITg_ZOnps%BkXfZ8AjeNdoB#;Y{~Ai1*%A{U+taLs^s-p zhN&E$6~G>~i}S>Tb9%;t!^Ic6RdvgX!OgnJ%(?od!AhZ7;%eqWm&17h<2Eii>}H3C zhk#K5l4D%TG#Zpssq{px)qcPM=eLFp>*RLR^BGd-YIHkte47oKERuRWdaiUVI z3B5_fB+%9QPPY2xe?Zk~J?ro>Z4KT1at9f|3(v5F89q6g5-Yaodt2ZG{r(`3031a6d`&9cN#{UO6+SJaSBs+l6mS-pstH zW6f)iYV_(fWb0VfhJ3*h6?S__7v3ia+SF;O75s{Zrx{etx;Ssve2G6^jBt*ZeqHRl z?21e}5`<`%vP`AE%lVf1T3$ZDKT~_(!xYNr?G!y7+e#~@`5fiHxAG8xnNkjfd<$Bg z{BmIZ6^aZ9Sma+j|zSJ8AU}Hx!-m)oKiUwEU9);*m7-) z!L+Q`@IVRxeNlj~y2WPk`2z(hxW65o(j;6pI%lxkDnO=y9jwCW{|V!i_$%!Xnw`1k z2XjK``Pu{Y`WFx9i^XJK;fIRs8h>m!ub3SJ^uf4PU(i*n-oMl+kV(yU$+eR*g#7r= z?01^PI_z=Fyk)pzDc#w1)!!GK4(5)+nUGoRn)fQhc_77dr9Zxf!Z5LDHGW2v$`e_r zy+V?#2(SDZ!}w>jF3WJzVWRD1&W4l|u-e&5s@4=A4^0RA zU+m$pl(!o@Mgk#@XOD|HYJT`~Wni7cs0NIr8HgcFg!9X?kVxw91=8_JOq9C1EkR`J zfjHxuZQTqjR3ms0rejukp*3!aZU`WO<7F{;%BuPbUfg5Pd0^^Qt|lde!yg-0)WWbv zCBK;R^7%Qk6rO-MCE_)prQanTqMzVCkTAu4>g!lmR3+hXJeX()$_gu7?CVn>7a9Xu zoqo1&n;9P72&qCpK6c3gGAPl;=bwg-3Xz(i>3C-g?JcKce23#~NQPg&dkJBhhJ8HQ zu*;mbq$ia+IYB0KF385xVHK(UqLxt&T&JS<#vzZ$xkzyJM}$b)`nj!ByppI=#@&d#nDYSfujv*rI1j=N14dU3JpcixX@YJC)=3oKh^tGA~u)Dme}GGAI~XCx5KQuRr*xs z10T+q;E5WhQMS2$)YYmE=~;08=btojp1&ome~0NA_K)<24j0}dt+x^R7{P=5NwxBU zD9=v)`#Bk;(*T3ZvQ96rY9~%KD=YWX;!_&%vwfSx&zMLo?S>t#wI%x3T z_v-dEKWBpW%;^YoAbRB>Hq0@=w>n&5O%{v#+X?sWO?MzB&|J8^v3hc7A~& zwnusm*&=_o!r+vnM_rwV$Awfr2I|eooGVpovVq8j!&b=UrySmDK+&eNJ ziYSqOi7?KXi+pvU(;jGV6qZRWXm=!ZDk33|De4+8w#z7wYz}Qcg%tioyV=URk6??< z{gIlxUz74PNkkiH3E$sIeC3H%jG$6%L1{y{jhqVkM+{!ZJZRZ=OuT8Bmb>xqC0b|Tv>NM7zcSS;=ab8N z#e|4@zW*wCE@cD(R=JZxb+bXqKCE2~`Up*|_-IbUU4<93j@%^bWP8YU4QM<80cOxB zTntQ5d_?fyOs`BJ@zB4DhkbEt`Vb5?811C{GQ?M z+3TmV=IuWjTg!!MAGNK0i%wVMA|J$z)Y!&3_KOE`OC_#YtV}Pw3T5`&v8*W_M)%I> zAb4%9^ws{Ywc#zvDA7m!?NiLqb+l+lvqH(cQu!^!xgS|IcoQ_X6I|pyMD5@E3*#opVVtDwn;Y=uf`t9)qJapX|x)h|3(^% zfO?9M=E}z{8TF1gX+Xci!&16x z*zh}(k{YR`KMOEmdYLW0-yEZ=f)_!VLfTee+*N(H@-+|P3Tid|?rtEzt&kcMqwrjt z-In>^UD%{qh)CmhG)To4knt4Mbo2 zP3w=qVUlm1yB*K(?hvmWn*3AUUlQ~&*KDXsm!vngZf_kxQOtgijKcINI$T0mJLp$_ zM||6LfLtx}tOr&CdVzQe4Mit)WAEEF0Wy-+XY-^xN6zR_G@#UO?16Q%TE9-ovgXgo zoOJfo9?Zw2^89PSzme-5w95qe>*Z6?syHmyR4%wb{IgLnb|=3)CwsB?mQ-;KJy!H+ zEmCEM7-E8H{N+kFTQgY8kw6$L)Avqtq3~uT zo9hQ#r};KuSwp?Nx;@E7`Fh>&(ZN-Ut<(zK>uPhD=$Vpj3NM2mWVgU(M93re{-i#AJowR_e`M zE1tIpny9nX7$B(nc?P|*O2+%|g-Zp_Mk@_KGQOjr5(hnmN^mGVjLamkaF%(d?O9a} z&m&lDiVpbH?>rQ4=~4KRV)5OnDua_Lqen9mMJSo0iUDvuQB0+=zX> zJn@1`*ZSrkldwFSP)A}}=pAOO0aF1vfjF5qh6beH@_~S5 z2N$j($kZZa*+UQilFM{cYUxUK&j^b$lSb$9;;&Z~E+hP809-+S^g#Tv$ zFF>{rkI9?HyVfr5FG`_yAUb30s~og(kEqzx#!Js? zQA;*i?yKADj$VuQ@D#W&(XaV~s+*`eF^Kccad`a@VgMmS9X67h^RZdtT-oKkJ3)v1 zD+fLyyCkc1<4Gjl)!ECwQSN`tM8wX-Ea}>8?5#L145|w(war>gsPE-f!riU&WOSd& zt%5J2+nWm&|4n*OV+*r^=2yk?wrS&?MMUq)wIdR9E<6cj{y1}rwPS>!5qy(Y0MP=%!TK8Tr z=0u_1Idc^Bw=)m(B|vu-9aE^$`QRIp9AfscCd!~j{uR@V#)G5sBL2t49u@5Tn?*JW z-Ya{{PKxRVCo?T7=@aI&$AI^bHi{GYamo|$x+0|d-pMyS+%ZU32R%C&A`Yr1Q82B0 z*Wfk1OlbhiInrgt*S866RA2aIHf{fmNDp9I-QaW@#D z>g4?G@y#Y9it>H^s=|LMGXFIzf$_Mgz&ji_;dU=NyM6j{ExL$my9<7IE7_{}OM6}p zr{kKtZe+Q4bvL%&KdmBz$m}l(_+K63oc?nXqAahnA@~-@;7_mlxsun zC4An|rY<3HMpS!O0Wqk)SJ>eFp8MY2Xor0pHz0AcRZ(UHToo{Br>PF9s%*NpzFeDY znLRyd8YT-DMfWWnHjJRwSB^rxT-K_=&QEk9`=3M(3YU@%&k#`()f$FxgE;g`{>(M{ zOp`W~!!kuovoQSnTLcu9;>s9j-k$F7OnKPM$rqP z+tCNZ19wM{EwF!Fc7pmO$UWWFm!t}D>h&OEVgR}5e2{aP<>B?V-6Zl7Y(M-BC|TW>|RBxoK@B_>Y58P?Hb@AV`mhEiToP4IG6j9;5gKr9yq9c z;JG(a_ps)D{W<-l$~mX{I#B#075sA)>C28`PWLj`HT(Rg1&}kM(17rGT?F{Yw$NM4 zF|&Nv$mJN#IBiDrPWQ}V2lv|fZS#^btd3esWR_R%U1?p+bA46JB&PQBIDKk+j|Gy0t_jRoiQR6rDVf`C3(u(r z=NpH$vJ$(SU)Jh#Z&1@jVWvy{zoNAx{Z*Hjv+PfKbs~(dHblh zo##eCPjPRbs&+1tcP@-U?opLQ;esN?R>3``0De5Bne`fT-R}ZSz|jzy?qRm4tO2SH zS1wn~VIn8FTBL%u*f?zr@^yK;qFsfM`1X+PSg#jW(L`rSG1IlZ>l1J-J+w|7LyE-0O<2fjh*4Qo--}zj(2fNcgdTkhVtAOcdm3jngEoNxw%#$dN2Ja0#cHLatcZ*-ye?& zVMojYY%s=^2)Y30>i}GBV-H;}BblXdQRoT|Mu*+l7l97(qe1?VXCf{f-yy3{*B}bO z++b9~xI_Jb=lVjd1a?P37lAB(kUmc-o&to|RAFC%n1L3Q&LqX&^#x^`1KiK%MgYSn zcyI^sG!0_Hg%Y6=>D$>L%H0qDI(>)n`1j_=gaBa5-@{lQEcffZldT<0Tu@kMJIxMC zdSC!p^QsLk&uN8K2JlE>v3pkag$rB*Ahde+Flw=DLOT?VE;NLzq%fS?yLK<)kZHCv zz9m-Yt(=Fe=_4c0Hco({H+mpM^6Ucp)@{y|EfHN5z}p}YFmJxqsuB`mtsC>E7PX{n~2!x}J-MlEKFW=4!u5`r*X+=j)_PvXKXfCx{IvQZ_Jj_5VT^PnNjp{pK z67a8+sU)c4!Ak;=yc%E`#H?ulV(2uM`}RCm!%IefrZ2YSx=>A>JfzVcSi>{aFSsS(aBgHjJV0Y-_ zy=o7)ZfIr$vNEd)@_m|Z9`Tml))e;&;dP*r(<>4}*3G1CE2AN`G(>Heviw_o{Zuaq zoyL3K*Vm_~ua?>@9#+)9C6wp4Sx(v`KHdgA?QY`OB~p0sMTzn9?_dO%$~Bw@cSIe=1E5yX5WXV0s2qE5R!W~;W^s}1xK_F*-(mc1fGE^%0njCJPT z{XSGA3~amgYazs!&_2|y(wgxKMdyq3xGd0spi-}3g%B!W`vsp-n} z{42TUO^TeOEZ@1;#*7DJ?#FFQ2exfiE9Z~PX%)CH@FTtV6ZnW#0;f=^$(<*1vnte6 zX-4EMp4!FywEU|T^RGnt&3hk|d`b!_q2wmID1QV|zOLI)m@Lt$W#VK#KVw!p-dLCX z*5H=lwThAL9^f%sP(X5!qD48m_`JrE%**===`3$cuA)szQE`b^e#DMzlr8(tPK_|V zb71MQk=NaF-)Z-CIW70~m>*(lXo>{N+QdtGk6}+C61>N-Gx%b@?mh3lrB&jB{d!n* z?}HpaF}Do1pDOcI9SIVvOkGwU)jR z^?IFV?aThX^ZMpnysnoN(Qic&K~40YsldyxJUA%xoX<^w zp{Jtm&)S$is3u!SHL-JlTeRggFmfrZR3{JE&h+cQ8bJPUr7`IKIQ1)VM!E#-Tt)DE zJYP}tPbB#yPjI=nMgz_oT_S?67+Mss>~b$pgeo7zaQZgMr{wXn z@V+)b5`Am7;zcc5cqte>t1LPiulXuMY84sXH!c?MI`XRoR9`o4c{=0&V(qU3+RV1N zQ5Y$d;uQB{!QH)r6Wm>j6nA$k4HPKuP~3_JcPJEhEAH;@a6@N$&YYR~ihXCVJY8yp>GK}O^H109{WbHIPg}^o%nFZE?O+@sVbc<|xu?R4swhqT z$~O|@*g?EP`BE2K4z>Jj>G#Gb5wTLGsrUFFcF!A*_VbP-m_zRc@8Ed;k+MPDh5w&< zuStv;ytV-4$S;7GUFR3$rI%_hJxqL2_lJa+05+~PikIhAlO0ucm%-Wl#Cz7-C#w@8 zOapv6`=4|?>Y8Qtvps81uY1Cv8~k)5K8__zd_7h@Xq;Zi(7_q&-Irr7HEK*zcw2Z6 zs8JK&XI#`Zskv}FS6%2zUn4sP%|K0@0}yU|J_hFXX7c56%hnMe&`*Hg3az$1a0dPV z$)FuaC}DmY+vg6*0(GoAYKrqHe&teX+g1Lk)bmMnsObaYxk4#QEvmBnt5K3g^`Z$D~HkEN~n-6Qe{#JeR8cG?&FJY90<7t zAvz%5yC)M-IMg3PV5=znM6J8SyF~5&xsc%0Cx;C(su4ULS$u0F4#sa1&iE?3YYV0G zz4Jv#u`k}y4=9*F3g@9-2mdPFhsZxtvgn?--eapsXCL-M@LYnoYfkgt_Z1ckyUDo!&~6_XmS)O7 z2@Gm9mA53{++g34H!9~iP>P+bN7m|LEH*t^bUx3^_0U^U`2_t@)B>^IvHWiSKlwC< zk4{f~+9P#kH`8hAr|#913Bub3UP;XJ60ByrxQ_jqN9$|`s@&IqqeK4?&p%Ga7kv(= z@&b5AI*K$FVq*BDu)DqY;raIqQaCZ9 zLBBaG4{e42a#k3({*&Pkf09=E`7dU;?_ZQcm?_j>%#?u3qlU0)?IhN(VjSGX&m=|F zHQ=UdTk2I#uBIHhv5ci0kF#cts#3JKA_0u^x>*|kF~wAVwENQ(BV43()X|0E`95rH zAk37~y5JXAHAHSJ?6ax#WnX$qL^($(naCt>Xv22LX|8w9VFEsNz{=s)N;dvYDZibL z3hj9(Cx%U1NYzr6rWFBWP0W0Fu9gk^tf2F^iuscDLnS$ZhDl5I1jcNGtpAqjXlA&x7TwNQan$ z66XWMihfZ}326nOQJVP&G&)7*04x6>Sd25cG?{94!OV>u)zh>!P zA9^F2-1djEX=ZVV7=_c4v7?D(!e9*wD|g^a)(FP!mi`Fbgh0Eu5_#j8(|*` z&c~zP9H|l02?yp8DX%v&A}S^x-xMh|X^>+KK|ltr9<&w47;Ol@iFWZd)UOUaa3n90C;yK^;Px0V-Y|S(`I*EQ2;c3kuhWw`>;GGo7VhgeHBDni$sl@W0x<)jfUCg8+?DOT% zL?%4czMFg$N@qd%Ft>Py^^&t(fJ2uKjU`9M7>OE$TCF`kaObVO+L==*pd9APc>chp zyo_h!AnfC2=NQ z7{pbBX3!=6?&3$-$P@uH3QCvz9$kH;br!dPuZvb(1zE0Y$Uh?nvXZJ+zu)3d)&%7L zN%@%G(O{p_4V791E)rSK9XkX+3dE}(E6mIsUknI6Ot|E(&I!>u!%5Zz7glPjRk%7` z9H&Nsyll#EpJ#tzRMlYT?I0093UjlOM|G*yUO`RfD=PJ&KDgNIHBNuc?=z$%G10Lj z(LI>TF=n+pwE9u)f-7ZVKG@@@YrD;gr}igvZL&<7o}ccO>o)>29YwKa6ciW>y7Kvu ziXZfo&HNUkrpblXh%-Ab+)mvj3Q)3M_0V7)j&s?UqY2{3?Ach_CA73E>01emfB0SK zfS6Ms8B)@ZW8FrB!{bgqllGA7=Fl-krH?f=U`!GKi6EEDeF-@=X&-3187YEpqeUoQ zB*9G`*gz7mpcu30TANTS<#>i_lXv|z(<<9=ytQ{;)vc^($THr3dmQtr%$zq94;y)3 z3PIOm=|oxMdwr|U6N~Sh)-wmO7C6-%vdQMTV^UaK8!OKycZAXjnenrd|GL@lFNP2`W3!bJa#J?u zLb`sEFZN)FX{Q0OqO!1?E(yXgb>REaz_+{F@}o)|UA-p605 zQFE?S>|BdUQup~mO?3dpK&6Rwu_p5)IsO zGz9H{LEQpaNUG-c3svhW&O4}{fQ&eY_%Tig?dHvn!tj}O4a{{Dd0+BD+h32W z$BkU{c_9TkWLDQ3Gvc2o;snm-t2NV0tySN0gu=o`id55*G4sYgS4rGECbO4GKNK9 z9(5)$K>RL)xD1V{8xa()PFCyK*H$YK>cl6Zs=?=gU%|bMMV*uq+cKDrFZ8L=oe9Bu zGon7D@e%R?gKOxv1uZ?VDyZTp;3EedAui499WgYm+hQzvLWZsc z9LLC!QQZ(n!XGy1FHnh%c)No86T%y=H}?5988 z`$g$&_4J77oZ~2IyB{uf0`q{9n>aQeaJef7#Gbkhs?JAI@hIie z5p@khI(>Fda_|E8^03p}Zr-k)h57Lg+tvhZtpf`e-(5bFMz$J~j66Q|Yw2L}T|V3; zYI6y*tcQn30nTH8)|BPU$%RxZwUE)h;{icikvtvd?AVLa+8uN?+}w#HXGB35Vy(1~ z1%?z!#cfjsUf-F!*t45N>Yb!^`i-)K*zJm_mE-`JOoZGH7H_}Uj)6IDqP>*VzW@d3 zq+sx2{9a46DWfFKYz}YnJq~GoD_ec1mmS=%dOP)ayf~@_?_kdsS(97U&{S7{v$DOC zXic(PfUZW6WMc7te{f(ImuYZ-QNUxK*RrPRhB#wsJD8wbj@j;>)3oK*==g`rW{a@P z`o?}N8Y%ydxgH(nZA(hC9GbRK-@8%EX76g(-J8z3pw23plIn{#(ukp;EB}Jhbc`m% zAhvSZ0S;Qaz3MUt*xEOTgE$G^lsUDb!Um}kw9fO^)UYDVEkE}{mG!NX#2BeGV~Kio zRqO56tF)Bo7U}&_&Q!&}^|)HY?We2xPGxgBqwnsc^v6OhjpF@!1 zzm1Gflz4b3uxOmqKiGw93IhW>r_|DTXAK6giGdrc><;a<&dda#mc>~z$#C5&_;Rwk z7VhoU)_#q2Jl%)`b2d!Ts?@_evg-|PE!5qB)@#SuyOre5y#(?p zZFbO8JTondHEdl)Z^~)i0*s~58TSv4npEOdi74cr=HnA}LjpaMG@X&!ci#V||19E6)O`yJe8?~#Mbh8$a8KG!k>2YL98TZm z!)EurieI$#gbD~iFs_I-=OeL8=*+4hy0JGJ;eWfV9O)fKCOl%%D?lE8M28Bubn_y5 ze&uY2ST^8|039pWPB9bVGMFDBfTdVH&R{>MbKEgCt*tk*)f%LxR zhhddO&UJSiBuAA1kfVQMg;nDGV4mJKaxS0fTIet-|H8-f-r;&==Y@sHvlSb-T=R~x zdSG@I8gamu1SN`G?;Ag4zpJ?4Q!VH?hVS?K10rzZQ=VC(1X6>~{jIR#viMLMO42M;*$wZIECtOOQu1@gS&Kc6S;{Q(V$k4T$~AsHL2Es=wC9 zioBq2oFln;kx0{`L&Q*j9uf2~et5VnDikD9AcPLPjCvr4r~&tl`6z|DRHX zkk68{JylO#!v7PcdD)J7F&^uu&>{?jTw>LzO8kDsZ+sc>#4`(NbYq8#>=r88YA{bT zOG-6@?f3dKQbHjHT2IFtsHTCPV}6FFYJmV2-o0kuP}{8-oAg8k|1*tj?6l9$!SOM5 zOwWfk`k7in%TiyT13KjM=`sBVvHk3==-wiv9Z0k_D>@YraRjr=3x&`(!_1{82q5vR z(t2QjpXGnYIpfWD@DlC(*P{C0zb1Jt&ba3@ouQGAR@b+QtK0nEoo0Xk@pyS4l#rbk zobmu$OTp&0Ke#jLoYydNa1s1mScd_g(yPPmA%zmKO&X&N6@r5JY1%sr`<;y$8&ZSfyQYBBS*>IX=~K~B@~XQFC_Zr82FEPX zjZh*!AClk>N7A#G>9hwsl^8WZ82A;2Yc^dfcutF>Lt?^PF}gAiUm(? zpYx~428_@M-BCw^UfXc;n|X|yL_aIh#;ztExa3=CC)|HP)ZUT4?$Gm2 z@P1JytinZeg$c8vPSPBbByJ5*{8*L8%8r7(Gws`6%J(ZSXh0k7AL2s z&&`%ssT>AU@poNjd7NVype00*3(vl%s(h^UCZm-P5qugW2o*c*4D7IGotq%T6NEG* zkobWEF2pigelRW5&|5d_=6wQXQ4>KB`Xen=&CET9-YcV6-hg};<7H$djNqku_P*`` z7(HuLeRU7l&;|r{v;0PxX~uu+crTBvjn|B4qvzvAd+#du?Obet9CwJI!dst}Tx;9n zVKa>DgU;24nnUfDniHew=!Aydske=A5|NLo17WwJ(k}7b3*{EU&-H}&y$ni))wS!Z zYA>|%>TVB;+?q+ZLK2!6F=F_W50?aR)zlhJ=N?_blvml000XoI&Y~AtB3esEIfFE@ z);k{uQ<=eQ5LR~sgwH0tZMG`XtdOa$!kv2dVsc-MPZC^;V8bAiawm=q zwZwD)%uwSIQBAnym24TpEEC1vcEk`1aAiH&x;V>{86ooIjY+>eK!N&a1e18;*WB({ zLoy~2=zs{#n+_cxmI;eg{Mx%1CD&WDA<>2@zbemDMvwck2uZiZtK%Ne@gLe9C>tyD z=Y!{|n^T#SgE4dLm%h zywHbSQ8;@c& zcNC*k_k?Rl9c3m7c$M083I&kM7l2he>@6=z+x=7r4(lm!?4IYZG<-}6{+Q@C68}ez6pBrS)ayd__bH?{7XzN_0(2L zE(g;OD`%n3slBB=PeBsVi9%-k%HhAE4je)78bgZ(iXBccz;U-JdN@k8yjX zQ`RvQE%x+wq+dU{vDxiPyVcCuwx4O;EPR|f zTMa1x%mxH+dU$xo#Q{lU!a^qDXcwzIMuy9ShojFWuWiBoF6T0D`)J8wsbqN%R!R~w zd23hau!=LG=PZwZWVsc#OO!Cla2bn;`SsxPSF-aLt_N!IQ5yTw`_5*w*(pZ{!iRHE zU|IwilMABAp)#p(C1b~H2)NVS=o2sW85K#0=OC9+vjOdFAX&a&)KdPWjJCJmP0*XpC?D^zU))>6zII3Ls|y=Iofnu1uk!t*J(%Q&;WAauj*f`k#Hrz+Eou(x1RvN9<1v zWGjz4k_gU5wxx;%QKV3EES-3C*lXwqXr*j(c{b$3_fRUMAlVwxo$W^(zm0lFAua5o zUV&l77lHaei4V!W5fM>TG$@1qP`$4D{!VOxLc;BZj+c)o+sIE%17@KXtaZXiLFn3G z$*9y2ba{_R%l!|d3@i?~%YN-W&g5IHh#s@*hCmhKPQ=f%j)TF$(~fa=f3}Gw5Ip>K zo;fH;)uft7X);d~F7@O^cQDLef6}^Hyok8)d#e*pnURm8uIWygw+ z_37oNWSc2r>l0To3hE-me6vTO_1g6E8aw@JbrL;Er`GM1doVD7sW`vTYvA-w;>sUmlfJW<;7@FlT}MQ&Jq1oAWGbCpjM@kdRx%#oG~+Kx(P4`7 zNdEAJT-<)iZkO8-VKn{$bpl^yCZzs()jo9XSbTBrDRxU)0BI_mBr%%%T!}VjYRTBmlA>r`85 z63Qown=L_wTnt&NgM-{`WQ!pb{5s9InJ*LmfUA(?Ui20EDhveYykjdD7sh`cyk@jg z&~ZMMa(@urNw}E$_%IinT%#uBxwg(v8Vn2!tnFRk&?2;OvDR&|wX?Qfp57hQ=-Hn* z{NzXaxcIVchXgz|r{5>v&;gIx%;o@7x>I$2A_`zI${#N{;{FUX78y&x!IO$uU$2J- z=r^i_nY!EQl&Hz=hf-5aCfj<($T1p_=*7y)d>A+#0^nisoK;Y z^fi$dR%8~a4!bSu|pSX3m%NBVQb;elv zZd*S7&$#u~T0OOKcFX(%$0a_!lypTL4SZJn#6Dz?4ajvou@9-eqdu5tZSe7TBi))* zn`;S4%>B()9`*7J)NDDxIu)yt`fQRuHcfLpI5Bzw)2Kq$h$5xv>$g-o=H-m%37!TI zHr1u{1wf*GO0oli81R5@7Ord7Lb_2dpRWnUz@ZMRZ5EZ3osEq}y><>_SR&w-LNw^b zaprm1MV|hxnd?~w=O zli^q?{l^TFJB0EJdDvKm@`EJ64foF5id60gaJQ?hJt8>2*@bTi>CI23LF zwjULQbMie48CdFjIP&(t>YAk&tA+^Ol+yA!zGQv>p2MAe8eZ9nIC$*Zv7hN1EqiOM zGN3&)D>XY@=D;jC)iV)K%H{6z9VKRB7d}dfYi2K}k{{RjwkMYXH;B~znTId`R!!z~ znxrchF$ASL|6&Gz!@jg!WAf$W``yJy1JPx@U}sVO7@_r2SY%Z4m>$)_ZPyM~&*Qq5 z?!b9c;2L|KrLQACW$_zyoh3J(togTBDb}T(<_b}T0(hFp+r>=DeHK;Ij_$`>BY69i zj6nN{Glr!|X!y{Pg9`N+Ss+NzrLr=yMmo;#76PCDXETCec-IhxkiG~=wGg69dIYi; z|NdG62RTfJhA(fFRhyUTI^td+bZy(qbR$Lol-??aUk4Uq)>A)_An-M9(wH2^kB6-i zfxRnV%!3P8Svlfp4LVo;BThwFic><6?Joe2C8l;pMfAr{ej(l(2n6HR!?r2lFpACtJdnC}FsOkT?UECv}m!E+_f6|%%nkV6Ui*HdFe zrZ8pEm60HCAUT81#XD%!pgG%?2)v4ea(DSU+>aYoq4ycuI)P=zaWqMr8s@(9=byxa zSv?8TuMGeL0+sQ9XH(SL)lA1u;n$5w`snIy0 zh&V{z`nRU5siKB(tc(~LP9>k!-vlxX&%f^t^Ku`(Kt68!%mX8Z=tN9Er(s&Sgw8}o z;Mr*(N;^N3R?Io8va!f>=(rvxpIvszS2lBU+#o=Q}j_WVaYO<1> zvC0J+h)+&anz1M3s5`wy;j3&CRQX8NS~1C5u{f%b4pmzVPr6n!b5r{oy@AO{tLU_v+Z0*~j|< za8AK9vK@&*x9`M}Jr*viHP!r0iY_(60$1CHtoqnm&gl&elsm<6;#NHc$rdeMYcn7A z_Ya${)(4G%CfsG4n-kg`_8T`lU2>Mv#Wli`VG*#JeFT=W;DL<8=)?^0aF%RV!PEq( zt|Xm>*D5gLC<@h|r8~zOYOcez8m#EizGv?mU_ELYBk(CLU}V|J{T?-MOrIkJ?NQQ* zd{}Ehb|$TI+H7-W^W=bFfYOg%%~+?9cDzquYF?yr$rZ!R&UNjHK-k4IhUrDWa6a ztmGC;Jlss6xRbg))BH0F|0Eq4$yH`zL1Ic@)z@Z~l>6l*R7Mb}d(2D4$U1xwTZ^52 zI&cv*j0a!s=xFeKhwyu~2mNgJ;MVwLSiDJ+g%zfDAOW3?lJmdBwt0_8-2XT3Ks;o> zISK8UD`s2nemqP@Hj~)X>vH9Ie%7UAQOm8Orx@X&L=W@lWi+USy^mO>{&stHEH>CB zE=|DW@s`QLv#e$OI9S>8hDJPue&-N+jjjI&!|SDFyuj^_Lq6-1%dj_JUf27-EC)OI+kKZyxujHB+Tb zLwh`<`w%kdtV72qj3^beW0jf~vcoX1#XyEC^Nyp`>NSMhlmpG=jpgWeC#0-Uz74hP zLAuN68U_oSl=nh%t&;`WW1@H{E1lh0vttolq7Fyv^4<##+)%%=`~L}Il^76ddcU|; zzv!Gk(}K>S_M)3Nqxt^aN?P4xq>3fs=3QgNXzO}jO2wRyD^uYv%?o|TMbAFn$Fuh* z=!p`$X)E(q7a7SGr=Y<|wyzGx8@krz7l*iPjUjV)*N2TarG15Yw@U{gBC_&}~|a$qS$O zTHF)3IL!~Me-hZsZhKxrw7XLmp1?nwkRla4*94m-rdIYWEICZu<=(O~`dKYAJQ_h7 zhuM7fB8)_Ko zAy_jsWpYl(3}Fm)Yv}NTIeq$CKxi}m*rALwKJIZ(*c!^3N?INjC(9p>T_3^tYY88* zvooU%JUO03hln7{woAmk31cV1f~c%ttdh`nF3Ygn`~D~`E*hbV7yT<#(j39f6_q`oy|q6$;tsib zlT2Wl(tRdMZJEjLl-IF!RK(413*|g^lhUvR(Q2lSj~QJ`nZB?E>_pWO*CN{X6eq@W zaT@R?B{;#KikMoJu1ZyeAqCH2D|qF=O|96Ue+)dM0CV*&;Po7JKy#E8 z2E#7oukWR1g-JpElT4sG#ijXYk}-803)(n~h)8@Nde5T_z&W@Z)LgLWmc)7Q0ctY# zAj{%R{6q*sj^SD7i8p|aCR+-3P^t`pw*_|+Mr;%yQqr;H_1jwp7(NIo`_H3UG2|jxHuAj%90wFddyu zkw7Bfs9&0);_pc&T+)HcVu3?ZEFO z0V?lf=vh2o_I60MQxHe7Jtgkpwo${reTNu*#(pT)cDb`h`|PPr^G|}wS2vofn#~^M zE}Mev_2BWHgUa3;1vp=i1j^|G1n4TS93 zGMk>R2{NYmPbjec7afR%GIOt}{=wKJl-<}%Q+e2}gOXC;bdrHuTFTgv)Z+qIyyb_d zL@r`3)<1V`$avx$+TV5x%OMKsLCXT~dt+q^I6J>*?%eEGem&H40>k@&C5w_rGV z%BB3(U_U%@cqIs0=)uaA>a2fgUVqtGA)~u>y^QT~ysllJ3}Jr2HTOrvt9p^Zj``wX zc_fH8LPsy<;zEi;>yAA_7hGju4cU&+yfuW)p)GsJW31h5uvGVoawJC-(>bBB)j4Sw zXyL_tDr}rTHNwEUbC1znTM8NCLaxvfU>3mPZH@g5B$}thhYgL8T&ET3pfdR|Z}y75 zf8%gFaEeYx7>B@t_^xo;w>CFo0n?aZS$XBaTB^6~V(v?15fvq!-!$644t|=Hw$H%z zv{!}eYQyPbdV~GxMQ?Bfaag_x;4KX96dtbx`1)pgrFa*269;FCt8QlIxsQMl?#eEx z*?SyHb^iTD5}_r&dHhfPb~O{(C6%UX-RADVAmms+?1zsE`g|3N0q}WBZ`9P1tL@%INI!j@hFUZF$OPP6yf`w=A|d>Lf(nua2@#vA*V74z0a>!>$DX zsXDO?zCFi`XW3+gOk16JlBB(OB-6wTR^jE7r2Q80&mC|V;#pv08@Zl>Kvb%2tq;MY z8BF&^lVxleOOsc3gcn9+=}iI5%-ppAZz&^k?PrCH-o3kn{SH+vH$%A}2y49mBS+S|z$0<<8Lep}+tOulOiMvhasMiLA^9QmkV^ zXZ85|lc4KEbG<*95lFn#m?k%gF&~LF3HJbuTb<6S9b(Qv(6)BiSy=Npjn4|~E>|3?1kU!>i7 z_|SsZ?20V;=$>_pPQ5ZH&7q^FcBQm+XR?p9+ZY`@6&qi97w}vGNc`ATWnJ zNAYphA-nP?=6fy=!36|AtoMxWd%o; z?)sKo#r3>4O@C@=*#$)3-&>09Gr?bWwyqz#aJ-L`A!JNCyd>$Q~jD zDRlyw2v0CGSB>AJ2%wolTmtE1`&H_Uiu?Qwm3X6CI$ZHn=HTtKm60sg8A;8AHIi+O zRti{ToUD1{a+=hHmmUWn%-C(>8DK9Vs_*}RObE)?{K+T`DTtt-^Ach^+pmnqocz=a zy_S>r4XB-ddil5}=1BU)q?AAWI6<*t6~@ zg`i`s5=eAu6-ie1WyCS04Efk4;Psu=FT)aKE5E-m6WAirotyP=nq+2u?HLNyM6I31 z5T{ga;P|r#%C?D0k$y5iUmQ?s3!h?_bc7)NLNNiEK9Rrh3OADE5HbJpZdGSv zWiS+9IOM}38?eV)o%M|Y{m`nIWa0~yf6~({Ajpr*kRRAM1*6Zka%x^RQ+)vvz4*N+etqx*y?cH1pNg?z!lHTj3H040ARkjL%cAJPkD z`6sw8ygU32uIJ>5GHc2CJ%uJ79WTs*!Z-mQL5#^p9qG+8dk(@6a3P|-l? zppdw^K=G}q2SPT_FU)9bB{4_g6i}_KVf2Xj5<02I5A3_t&jGT2s(Y3WS~|L?F8Ge^ zvnGEIo}5!O6jlekMMIr|-L~a9hd<6Aj___@gBS$-xc~?OmBF;9Gbmhn(t;0_> z+JsH*tBJ>a&WveqP_`v?e#YKykH|~_sDB-f#N=fAlZtHLZ=g+~`UlWfP}4rpKuPa0 zdJ!k3Jk&gr52wSmUYGyR2}Fc~fZ6oghqQ)tAt4<%SJUkt@MQ})b>kBCB3_fp&r7`D z&U|ldV|D$u23M7&W!bzQav0Yu>{&6BWFo9H(VZdNkmVk_09wG;s58tZCC>Yo!V3%; z9OkjxJslq?7ZP%+)ao?ljCvuiGkUQ3#JBG>H*|(BIa(+*WhT2QbkU4Cy~T86gH>-P z?op$!Fd&Y!UJ>8fPgp9Z0?HO)%DD-23b8n6!`bG#MN4*kF3tTsc{v75dLcQ8Jusa@ zC90qCt`;Nt*jTYjMhDG?wt=h~AL2BI_Eo#djszgk7GfQW5mAE>L`+YyL5b-xoF3lU zF#9ckMmt%~QHaNHFgDSnu9L3r5(yvNzw>I~ps0bD`w|}+S;!o;tJQL=UpPzcSVkVx zlt0dHJurWRkV@p~R>y+5rMv_0?y_?NmiaMpP*m6YrNQIV2m~_>^h}F^f8bixvZop2 z{OpxveiSK43(PF!otFJ_ao|qK;`(;oY%4FV8o?*;-87`L#2N)7xCJIZ=TB{W_mJZ8 z(AERXHz#pzMr+cGu~z1*-udp@iPy78>ZOOjYyvr@an2?Pq$0j_?dk~(`aHE%VVs4v z-q#ELd((j!yzHQV?aDu4zu=}Hu-jX?g)V~x{uzf&# zR??^+%vAzMxgw{E(W|GtHGTP=fc<(N_Z0frB>k|TZVt4-|FaQG>5TO=55S$RTo9Y8 zV_E`pP#cb}5iqTEy?{4v08aE(ajZp$h%P2HkW1q^E1MuG4;bFdn2u~46AGBY(fLVO zO${RnS%l@wClG-g^xRVK+jX@Nj7-xJ+#-A*HHr$LYlzBKyL4bhDeFI1=|w9c+RuUY z%bKFh2v!0wV~|etZSC+D8t>0yCk))Ez4Zb0DBikbQz$#~%7a9@CmB zesx~7He)}BZA8bHq_ARajDM8fwuv3U<4zXJ$SSHeIYxQtY|Y8Kj7a;tnhuRFqECtz3zlgYltT84^B32rtf$$CT;MdZ(NNJPDPWr zu;^{Vguw-t0IIrdZBE>9GFggWd(kqdoe%u?8ENB8#utLfxfpCFzbG^- zIYp<-AN=nx0~fNnH9wo&9{2ng_SKtmM>d?M;m>QBJGsn##CE8-=w(Jdva~ENV>`ai zp;^Sspsi;sPdkwmmvag~Q+YX;%iaJt*L^-MQk~b^52z?+=X+|KQ+4ru1xZJ3sJ5!p z@O!K{<;sqPeKShTiP!&CDj^w73|j^_UjO7fxO9f#1vv84Qg!3%x|qYgUb}a-#r56T zuRNX0^S=LX#tBhF_2AD#p_UcQD(^OwjOn0cwIQ`JGO)G>atCNc+8`3E!ayvwjeuwX zzHZK$DI<`sH!oWx--IwX`>fhGxGG+Pdj=NhP+*$fIh#{PO}mR%YxtMdYN!dJ=~E@K!~(n@KIypk$ILJAUpX>T zm)QIBNV>w=!+m$N|87P)TPrVn5cp%r zSnKq2aT-uC5m;+E*I)eNO}os{=$71tjKLeW7&MizO;%~-@F>w*fkBUDbY*OQrDhcGq)hUJHFEX^tjDmnGg+D^S1LfmDpm_ zx{Ul^U;6;wm}RNAIE^~_TO!gX8B_CINd<$NpnC_Hzj)FgxpPlhJ4cd<>!bLML~`QDejU+=g^Q_579Eeg`H2F_(R2CQ^6@mvCAivD(5rq8hV&GY#mrD zVr&YG5Nj+XBm4YhDI|ym<(NmuIX>PBKOU~E^EULo`!ylW-6gcT&F(VpQ&0%Zl8d+3 zed(iQLPtuC-nZLac|})y#CxR=;O&9gbf zAIsxotyx%uj-h7nIkoBxsbX!g5+4Q!E*!b`R#FF?ZlwD+?EkAU=fIJwL>SLX017*o zetA!joH8mga;`tw2|c#G?eH)L_fUMM*2>b*-0NTJhK=ldxuNxYS7G0I3>R z4IjOO$8$YyZdGQrJGQEok63@k>e=9#KmHDVZHhcjBj^xW|X<;2swE- zsHas2(f6osX(FW=2`98Hsmsiy}JmmI;5WefCex3zb5f}W+*Z4 z#0_QI_s(%#S)KV*A#ABC?`?m%41T$(^MQBikC69N6%KCW#MI^fGRWs8c$sd;o#{WE zA3ma!T%RdwoQ2EtsPwN@Ks?`8sRB&EpZ9GdX=$Di;diY9A6*mb|Cj%J*igZg%<@@E z+KAChr^nUAZ8`jXoOba?GzhdCwNavgXs5qy-%sXXTnMnS(KcQw7}R)2b$5I|v@Txs z&I}@?Wk66fM1035dJ^AVe|fFxFwy26#a^NNX#M`EVR$iR8*&wF&4+C@i}kO}%Mkx^ zz|&R$`6?vF{`yso4+fW|K9Aybx8Xm^#NE*m0_~qPV=>5I`@z|vBXlg{|2mE!i5Hi~)TEt6eP zNZV6lx8K{Lbl+z|f&Qt5{r5?n-qPA+5-m?b@&=HmsBMjWJOFF!)5xo0#wAgt$=9!M z=q`gzj%wGN8iZ_;Otpi&$2O5xJXv5A!_lh}_tow{DlQ@$P0jNSiE5{6jp*%m&L_PD zBAP=qX!QS3nHsz_qo2g1K{__0yPsOHVMBCNkz28PTkDJA6lxR$O4Uu0aED>aCoR!jXM43pS$Y-Jn<4oF_ z%!G@KKLpzma1w3qcU6kH>!8l|PZF8%^nH^d7y-3xtQaPmX#mOOHiphZO!MK4{rv*A zdnQh>YG>8=f6+B`05E^L#JM8=;u4?u(Wx(b|LKZ2jn9-?tW7kr-eefR8!ST?Wi0~YB+bhpUYnxxc9 zK{N2!VCT^KJZF+5j9LkzR{!RHBM5r#ptLooIY#a-C~zAD=kdiPz+aF4uVSrWSfZJt z$`Cx3H^iazKUEsPm0B;y`|Yetd5_}^r=PoUz2v%kAQ?ulpW6r`e)oCjNRobvd)JGu zb@jB(#+Uo^mOJe`)W_#d_XF1{>UN_EhL7r=r@`HLGl!n)0+>_uw;xCu_XYvQj3)-k z{rO~H{E;--U)V4QIk%I9$I80Q`n5aQ7dr#6s}UxE;ZbuYl3+xuF$7HI6j+7HR74@Jz5hEd@xRkrg;bclP3LB($0zr*Nc0hl zdk$)-Li02i&(QC;)9TBo@o#Sa&pqO^&ZcfB69S89j-tTDLxkSc0T zjhFc$m;r*WQ{MoeUt0M^$MR(<*B1~z!A|o6RsMM9PQ@T2zd|-Ok-TF*#Bcc0?L^D) zPW9>~rhUAbV=yHDuL`zY+5abkZA0n7#@t*cF3VMZj@;b&bEWzcHUw?&UfRa{;LXhW z-B!)!>$s+e?XK)b;N6vxkokM26?li^1NY6F!BYzb3sb3s#9LAgVTicv$!iD!y4~83 zC-w$_;cKktf5ExFb2!&_uncx44q$Bbxa17%s0JvtPP)`_lpCEeZnHjc?Ayi$2643I za7Sn+K3VY>5Bu_dtZdeF#K${S%raf(!;?nshkN@Y$pRTC$l6WxUG?rI6dQwFfV@#M zm%~>DBiIaYR!u0Tbc6}_DWMNS+X6nCu8HL=?#5c>{MydzQW*J#+2-iiKa=5(}Qd z^o>i+;UKrji;Mz7{%?B?iyOs47k4&K67ShBi8odcw_w2m+PaXj?Hoe<4%N^#_FQ?Z zzhB!v2)*`oT^w^U!9EZ zoeoYtv&>P}1AtiuLe;3CW&So^#I0GUD5#fiT}JM7;uwY1g7$spd)_LS4?Y16L+I0a z{0~{v&Pws>4eHrAOuTA^c4W5984F+PgKH)SXN_}fZ^y)`H~!--z0(3Mhwtr>uxWaO zS8UCVM08{Gz>P-QP61P+ce)_T^_k(Eesu_fp4-5}$*u3P{vriguu09H#NA50qc5kCkkpD z6F^6}+B_oSxjz-83xMhQZDz;t)fw^po8h&Ndk$lA8ZtyuEc? zl-<`Zj;Nr3APgamfP=KOG)lKhGn9mMcPk+dDcv9?(#_CFH%Qk|Lw6(1xy47H`o8D$ zzUOz&?@xw1_Pt~6wXSttYXj7Q&^P+J=7lopnR6Wt8J%xR5Uc^>Sfb>)O|G$Kc&lF` zZUBv=-3ro2AVu6_y@mYl<1Yv~+dB3R@=O6MK`i8mON&oUT{Q+c-B2c;PRqSjOAs^m zLEY)Q+T*2;y+q&SGiyD%R!95Piv7ZKDev{U*8t8DY|GLph<@isbiP3n63-ObxvLL; z5L|J`j~^wc^|6Z15p@JK(ntK7&<^lS=crR|M9)w~bs-bO5i+p3Nl^|7aEGz#TPlSV z%VY*n7zvTu>3CCEkkR1Di+{KE0e~|^n*L1cMnr!b{@z9d3d+MfLhMVwtSfRr`rlB) z&wBoEQN#baN?Q$dcbQ-(XZz{1wz#v+Lj@YE&GR3j6b?a*0AKFhU;ez`;!Y0}yvC(2 z4l@>Y%Z!X3;7-Q2l$#86Et;2hGR?W=?hckdON>%Oz|^<(k9Z>KpUn2MDe3vkbx41n zxu0MRfit>Yb6J6uc;F2}zxZuKgiIT0$CrMRY_{xDJbNsYjGI=O%n;dSdXLwrg7})B zP-v7TcTAA(8O~I8;k`yjeDuFX|8M>zQ8e@~d~oXc|B4S@8u~Xr_~DlRjdFc#DOe2` z8vW7mK)O*@U))=?+&J8A+?#2F<6OKVTJLVu#v4btagrAW0H?tu5s(Ft%u0!YgDt`W z-?g-*@8MD+aM((>*gxXE+5c|WXu3I?RHWB!zmxOkCL&J2MLxpVM*&)0O-tJ}VJj?_ zANBFetv7=IUR%QzGJKI0mvJRC|H$LkxGe*t@bSLNc>Ldk{V8txNwmxm z4|8vn5u>;2DbNbEGwr+92XaCtTHhFWZsh)6A@7&x0kw$nYQG{=n)I4Pw4)a$FA26tDmPQwrDNzfR%C&B&9? zib+Qxrl&{jDy8s<*kq5y{n0=O--Xwk@(o9WJ39va1RI@O*RkE-t$EeCQRIlj{-|ZF zuavcFti(?Q0QL!j0u7pVbZsK=N?i4=kVlzafGH!h^r@j(ysG z1j&AQzMiBLc$+UyBkD1qJpJ$j49WUDkKMN8yLCwka`1c-+P6@AW5D2J>BIh~JA4WK z77yLzV57Qak0q7JFc{w-0J*NkvI#SuTBie}K!-4VaHY5l{!TlRcZ-pu8iN$g=jJ3{ z^@;AuM_ph46=?YON8&sDn+48-`<0}le73H{=C(s45?lu=&r17DZc!coM=Dbjoce>( zBl0u%@C1MaXCC}lH1HPVpKw-D67vazBRb&_wVK}_=aU9^)=csBF_i3?5^ zo~hyxRro0DAHlX$qhD?a-lr~4*!i(x+!+C-e{`I<*eQ-1dyk{q?nhl0=GP~>2MgNB z2#H^c^6^iSo+n8^h~F;vXpl+Sd*-C-6wxaq$QIxH`Rbo45CB`{n+vlLI5zw^s z4^2gliQXw_m~*dE0j)VKrdSK$gO+F-T*@jG5Zn!S$}T*-Jvc3duR0a2;-RbRs@|>+ zGIt@W{8-`Gi1dqU^-D+rl<#;5yrbuE=f^whS{y2#v+h#A)C9-HQ05P(ix);1LEq4- zmgU4?LV~Q82}UX@D4|3Q{>t=X)SKeaCmSOi@zk%clIkjED!Yw#wri!W&bq!|8;>*RH{G@|ZKIUCk^ild-CtR1zh z`StP%!Hs`u(_QecV%LEJ4})UIcbHcx?s&spF@LDj^Y!GqWMecjEx*a028N;b+dko` zkt>*)vm*)=+np0!k)i;-n>KM6I7;u4<0TM`b{sVV-_@w38{{17jeqcU(~L{igV`rv zzTD3p(5C0zuw}r~7VV+p0s;GAvR7V?&P%up=ck=X0H^$$It3U&0F)4Tae4GSV1XF~RM-rNY_X4paE>yaKFU0nE%IzXn>i_T0#BP) z^ztKfRhn>(Qs+smb`&sP?n%jkkHX!*a-Mx4b(!InN46}*m{y@}e> z=0y`LI?I`i~{Kw74#Z#MkW!hwLt>eYr_!(~B(rS-~(~!tjlic2wk+n2b*fzh0 zM_E%jY=-x^hIP{Pb;ogX-OMhKI^X&MaR4BMzmc=HO5nq*JyWEuWH@l%(Mml(Bu8P@j3w66hVY?ci+N~OT%d@5sZI81 ze5p0%%;T52+3|9xx7Hn~64S?3e7Nu_SuacsZd3&DDy-mPhT<)`%MEPr-!jV)<f0s;+f%*Ewe*ZS{D% z?%D|myqiv}IuDeEOuKUstS|@-B<~KfD!u^{05c4p{*y&~Tx;KkZJX1*$QHe1ie1~0-VKCCZP5-}aicr94(HwaOJ z*FtVt-K_3W_s6aYNI<5~bQ_R;{b|27<`K;7g~r$0F)h-%nkvJ&+B7bHc~Gx0Cw)M4 z{NC!lT06$LfmjBTG;S2Y)X+!f?0+cDx#%0|awtZxlD)h>cuzT9E=ev7@%^=`>#-et ziCOrjuYvWy_ppr{7(uRp#JyqPm7w$P0EJrmsuveoq4e8rizw0L!6%-LYo%jGBvS@t zNirIyciDt)kkwZ7V&+{nwcVRLJlnvT{Zr#kf9AozZm@YcMCBl0X@M(}HF)5L7%c}J zVoct?{?uQ-@SHY#R7D_cC$F?c17bf6`y5x5?PA8$XX4JA@c9d=W-nH|>IqxOQj z@x@Y@)#jexHGT5xolW6*w#%`0^83=i!5TotDL~%z7kY>HWiFcLxK0Z`O}2oC)A?+@ zM-1KB2BP-K9wp6N<%qi!Nv&1PBl;Cr=eEk=x(k8!d!YoJRf7+{o@)4)VQF}DX`L(v zN}t+wbrbRO*u*~F;1fsxZ_(CQ6VWyS@W6%Xz0S>vWv^mWCrY0DiB~E}Fx2dw{^H48 zPiuf_%_ugOUxg*jg~F4WJbuG+$mXcGU+fVQKm3s&f^{+cjk7eNnY{jk#JE=n^>_aR zn@VWAN8A0VF8t1bf#veW6mS{u(%sCieT@IV@v2~}l97&V@o&TRy@~IEr68|VXaRx!Juk)zxQWEw7 zHi;{b>hFa3Ri{a{b*$^5JfW01MHLUZui=oxtG~b@6OPMlal;~Qn07pFas9jj=Iyzi+9GDvPNFn=5l zZR)jMK!P_>cL46&ms*K(2lkFfVYU?kJ3@2%yx0d1e9i3{SUzV5>)viP=UHxQGUMs0 z2ZjY z7uD?{lh9#R_{Rj9TScb1S5wO>ZiqfbVIzmRrQ!WyyLNa_;1*hSPe#oXQKScGS8iB- z&8$VyJo|I6WM-3VDtaf#=|Fyo%k4M*F3=}83`+idZ>_W&r+(jsrerirFX7Hj5{FK=rBp*Qt=v~J#v?;29=V(hbLJ!{U%n>%Qp5vm?+}4cYH{l@d0f{a z6oFntG`&EX!of0)%u7l+hwMH#=dy2GYt*0i@jWMWmP?qUp!jPyU^#Us$2K2cmOi3BHg&<3hQbQiJ6?v7JK@evV`3&Y|oXd&jCI(^-5( zu;;pjz+OM8D`a8A-|q6otN`TdE1xDc=*E@>oM1&_kE==(FVbw7kCrQtpm`!9MqU4yh{gIqkrV%L!3g6tge z5}c#@aWX1kFb>W9SH7(>;TNH)jXq9^PO4`Lg%|96ZfbqEtBYNq{2~kd;xxxaK>-lN z*qqDrB1-KGu3se7XY%{PIFCE}<_n%qKV=V*OF!Zq@^QRpQS#f`8iEkJBU;)_nyeFT zE*K92BY&aR#i>rh-w}Rl#ITgI#~S(v>0|*~KXnZ_6`#IUu8Qi;XgR#d-BoyNF2L%PPLENLcRe zlHm^2M><`p|NQ?(WB}AQ{L3N&`sJS>6)tTdIM|zd{zMVH^~g-hM%}*m#bY&@3|%Iz zWhgf5>+h(b6F_J{p@|}Sg@s)@R(1^9)nLH~_cSJqdwh+Sxm9B!Ua-9r`oJWK2IH?f z1SyX^@06C0(`&_*HOld_nFJwZLH%+Ajnv;I`jE*8bqXJBG6jgPHb;!vic7~kS0n2A z|4C_-?P^vCe5K)0dfKK^aptDKGHFbM#zBd^+k?~{YKFeWORu6sgQ0O1{3o0R(7AoD z3+LVbLHb|+0nm{Us{6$1DW>tqqtj)JJMAGUJQhYD7whHeo?yFr#Qhvfj@5f zp+iSNP*(Wo_VkMqitnX0$)UVmXAD&@5)6)CMtU;&c(|B$5|ztup~H|l=b z-T{AJ4XObl-DV=9~-b-(b60B@63){#YBmJ3hFx-K-qSh9%E(>~Q=4tpWUN zp#dIb7Nptsui)*?ahcf<0QW*;T7)y<{wa-!qKs4?09XmBeUzL>J?f-w$uvLa(@!p`>G6l=_Fz|2VJY{sd}A zGYIJ)qWyH4TU+}f-|IGjdV%AR_=Uq;2(jI-C(GR{m)p{enL6!p300LxlWhfN-Z{U) z7Xh!``42K$)g@JBQ>)L)sxRgmM;vI5LVU}5!!B81nXk6jd8Epee|tNidW3Yu-8z}8Z_+SYN;s=rF+xZ&a<+QZ z&>%&#T1tuiVsNxtQOQ?y={dw>LjVJsB++abq--17Hn*pWp6A?=lFXrs)-D0jw50|s z^K_^~@xsNH;?Xy@C>^0wTKZ4?zdz#}Q#G;|nF&pv*T1I>8n=lvyk%Bt-H*K(o9N)^ zYz@t%2#3f&$yVlT7C~xf3CtE%I9pIu5!Fkbc0Sf(Uz^&Z$7g0F^!S=tS~f`<)ohrV zwRE-~P~S>^Nl2gtsSXi(iqupFb;Oy&z4^Xr; zavq}f)uR}hD4S&F7^h+*M@N;)k|&oR*+!jqhQip&YmPjyuE&)$8UG4Gyb z4tiOJcnC%o3VyA~7&k$aSw%+(x@)>(DA1I5#cm{fSz%8ezpOB^XW+?qUKCtMT#$Oh z!u;f<7Q)q9ATQ5sA+ir|T@y{_ue-f>W5&vZyUJ*PbHCCxx{an+v(nWww(B!IzBfea z4mcLU!ctxq%FCI%5tXUBf)B2-$x-GL~s=3bo+YJH+k^kiHO%}FrM%$$&& z)u)t>(Xr{tabDaz4z8V$)tJYg^F>r>Lqn(?N7debHJg`9NBH94QTV?G&{vPr^sbh6 zh|H|H%=a-La#)7=8>)+V(`9v;B01BpjA4o8_%@ZZE?tGd+?0yf`VO%n@$zC_h>ilY zg$9)R(4a~2?EQJQ!3mFD!kMcz8TYlAilYT}!>r?6_QzE2G9(*Y{6jCcK4?#b8PaBL zB9=C*+=s0s}8XqZsbOj?9xZoMUG`l8NWCNF2N!~`d{H=w0{o_Y zcMQ9X%juOz^-D~#VSm4vJ4oE`UzP!k$%M6RD;eqo^XO>GIkU|pp>xov^8z;cJXvzS zbl}0vY~KsPr)s9`5K%gL{za7&=XTk8X~kzRUmBYyZttvgg9V*Vjf~xlDZv)-)y@Ta z-H)29y1EqXs>`2Ii0Myql%#HJ>&Oy=0wyci8WW*vwat{Z4bx+Ni{(UyrEQy=VDIX9 z23nN(gdX^8dQ41zYnu2FIacuG*Dvb3_dz!(+MZ>%xS&fL3mY9Y_Kc$jyuR!-NLeL+)!IzUd?<umZ<;tH@1rA0#*c8d%2YR5Q8M~wHpQGX@pPZK)>_PgZPlpv( z6|K8mGXx4xETuYOaDz>*k;OpaGAwS)AJ6Zqf3uD5bHMV;Sq=I|C&$0sR`2FiHymlV zzv(~7d>_OS5d6X}M8^t+B~(xWKBW=2$5$-j5u1$eWgbbJOlXw9h1b#?$jM|avd8kb z-Jo1Wb00%2ZJds62imUP#ll`)cLH(RA6;*gp9#?Dt>GD`uW7m4FcR3aPm@NTwD%#Y zHib(WL#q~;wuXAX+zyA(?=}b2hl-X6o27Q0wz=dqn4E~r5CzZketxe8!e){3ilAz` zmSjXWF44MCu!iuaqk`k`>-_+_sxS13z{EKH53}Nw=ccWE(#6HhWjKZ4$7r`Jc|pOC zgvUM$Z6f7Hvz(qK@jY2>YbybudWRhe}ekly(dy`t|z~ex0Ha36P@fE2_ff->0=HjH#?b#dTZ#v zCXc4(auOd^)>d=-m%{KG>O_6)6K)UV0Fq$czKe0^;;lU1!GnPaRfQe(7(weAyJGbk zKu)_C0(Yq+iC3l`QNhm-^jVSD;H{tflWZ9DJy{O z!DV3?u%yl1arQpHxr<`rAKsLlQ`9jtL)sDQwzs~q6IHp9MgBq8hNo+to_I38Cei+0 z5Sih_6E2K(Ic(6Pr3T`|f}UcY(+4QhN4*D10iTZ~Re)0yV$4KuO?2(NrwVJ#X$GVUiv*bPCMN)ek@^Q?cj z3F$fOQ7kVB&hk@8>gz7ffF9dpqs(Dmi^CBAj59OM8x}Kn^98o!-h@^JtM0^FWi_1x zhl>L(a%Tfz-b%?pl7|mDJ}6RF@pVKSKfH;=sCVtIX==jwR%?hW#0xQGwfG!&+aP_% z%;5Jb7N@z{?pw&sMJK+!tz@2G3MxBktL$|FI}^k^$Ume=S4XBT8JLYHKgbe#t9s`0 z2#e>)T>ed_D3ValuYO}>em#CKx9;+wq*(={DSn*`GsDA&>20H``@1r5`xF`r`_TAY zUhWq)2}7x zz?7e=YCB0$tC5&&zv>7QU2I|UTX}z{Fh^C`S`G54EU)fK&uGh-TSo=9d8b8nzoixraXAd z5BF@8brJcSH1XSZqZ}$D!((Ar=4})46I3ikSqxmdx>Ywj9_D7HLVap<;`yEFLWkow z?Hi1QFz%gryB8&+PR4iof+VPo)YqS<*Jm_}S!xrdne-0{a1Y}l+1$RiyYRZHE@9fu zqsgM6=wnofF&Fr=t6S!@(PKJ#2fPe7t7?=C-j5`@*;^0i3QDFQB}h>V5=5L)!4ml4 zs!AqhRxm%EAm5|xV2NOIqdW#FB1_ZR)0;gb7*~Ejr)_2xvQWOx^+H|6!{z3)u)Q%% z9{!Asb=*9OHM5CnzsnY$7h{$bmOX(J!X|JdykW9Kzj%^A<7h0M2lAcj>MMO#%;R~X zg>9O6OBP<~#Ng+roVRE<-`TZv9o~GspQtpYfuCzby?p3Zd`dAo^Fo(ED^ch&sVDNr z7BQkh*>!+Q;RMzEaG0mX@*xlbUAvrUNR?jKo|J#l=ddNJQ4cLuPr{Q%d#CxsfXd0X z^I`B@n^wk{4Ghs~}+(3w-Qo*&zvtX>oeA1-D0w;AiE zcHa!GPtGm7+-Zpw&w*2c+6$xUyV$}FYabbJKmAI?aNAe(&5!6+Q;8>_d%++jNIoZb zT7N;iRqid=<@m)b9TjHWw^j<;$Prwq!|MVHp5XH&K>dJGQgBz69XCx4H$ zq^jw9Y#X#~pv{-dGge?&<9_m30KcdZpP6|v2g`|yt&$(#_&1xbm1+Yr_)el zIAMdHj2?^iIxHO8jBGe6ItLNqDm&@wK1@zZ_lNFbi7a`+Rk(%Vxb3J%`w?3qP!)U6zn z_ut@8`TSl=+D5gzlLd`am%)k)b_>UEdaQT;28GIXEZXeTK7V86q`mlZuO%-hTD%Pm_He1gNhF3;&jyK6 zj(~`&J@z|?<_*tNclI>*!YW)!Dff)q*7EKxr-dY7S=PA=IBxG9H&@a-ZZnIMb5{un zDnH~q!w-P=D{*q-ll5G%^Ish|7(IeQA+?%-X6TI`EJGEd7FTDlr)%P1!A(nuuBR)8 zN@*ylCO#9SQbeli;jujuw7Why7(iTfQ@eJhB;b2&t^sX<#nEuttxCz<7s;?;6>%+2 zE^Zk}bF+VT{?<1kS8+p41y=T#I5^=)*Z;=qq`)j)JKMVe{#usyCjHx2`W})oSxn6mj8d zwd3=PoWsgW5pZqwwkf}n?O=^);rDoBnxahduTwY-MgsE{Jol1* z&FG0W+^}_jHN=A^tQxs>3SZL6eYiuryo-4i=;J#mbOGj2=E+$8$T|V0j8| zh*Pm@-jlBbGVf_Ad@so;EXw^b=gb36$j}QaYfzwiW|_#yxd_^f?i3bF z%Nf6FI$kW9O3isn+*`0~ydn1G35$TofU~VZDa)z?Hw*Y;vZGl!$r*R5@m|5>PcakB z44EIGu|Q`^onGkkx1B&X^7|4QLCMb#F=T8FQ=8(u8ZXmXRtJ>gVkD5ITx;o9n~gjq zHT9Vab1G$=)a({~Xh&x>n2yO?X0wAezPwzX*zRhN~gvun*H7g62)Ah8F&s-qnw{4F*}FVLL&{=q9)Ig7e!MR?b{ z;L~*GB_jHG%KA;5QcjLoYc>n-1#?;E`lCGgY*|4=&|%e675j9tA-S( z8f71Y6S0GD>+bfJMtdxm9&r6e2K2gv`GB4LEriXCbgJJ_bBba>S|Y9wOV-pMUJuonj?gb=Rg*hh1DsaNDOfw9D-*l zE^!jGQhSbmHKKBk5KYLZ6`%~z1&n@bIJ~bMx`HVoJwZPgHJF}rz{1iGTJNKHjyGa! zYdL_t$pIyX#KG~Vo2GWV5?s$FC*30#Gv3fW$l$$i5jt&VJ*o^t;ias6vMY9O&q%9_ z2o7e^90_C$k~=KBljPN|otua_s7i~hmlAvWw1|C1vn%oQc1ZH)5L--BOteFN?zA2f=*P&5wzEdR)s&)H@ad33v zwpn&4yBMh?=Qq{rDQgAO)s;99Z5kU`5$)+Q@Nzv>HGxzrAtMq)dRgDoZDw&T2D`Bp zbDStXl}u$yuXVSgH?rX5s~(p z0H5SFU40G_BsIl$=L-Eo7Bqb<_5j4je?M`-1OGt8adytCtWf*&!KxHV%u14~Ckl3_ zDmDfGR8Pjiwp1`*+LZFZx7iSluXC2=Xxp9u4%45$up_zT<`J&E zh>@sGlrh^JL$3E->`?Aknrtm6*A_9n=gYz}cykUvW2W!;0yg>sAxq}f&3#bgvU||q z+luzub0CI&)gM#FPCi#K{Eia5)jhFyMt^+7lGndpR^|&#<9_x4>4&nT`{Ssd;ZI|V zU4&mQbZ;=VhzyKtK^Uqkd>|%^G??Mculu8iY^<$5l|OZUa@XseqiZOG4gN}4jo%SZ zI{Em-!^IHKQ#c`Ph~PN$dbt6h`tK_te z;mknyq#v+KGL#VwnoW;lF2QS@QPen?dlC?!3W)J2tJ+>HVf^T{u;DxQGlnlPFi0i2Z=n!=RC59 z>~3zcrI8B`)=G3IIzw6LS|wkZ3O0|e-*IRkoy8Wo75j7Ac;Cqgn9-`HQH88Yr0aVR zYk_7@C67x)#h374Hjei;RTjakTJ7TcCe0SJiFLTqLjAF z>fib@&ow-wC??B}Z%a@&``Uf{(eHRTE*M%cbIy+g3UD9;k#6A>qm5J4J`NrxCT$>= z&+1BW?i!?#&XQIRvNt4u51MaU=W-A2z)`l$Yd zwu=0Dr4{0<$oJ+`whu2tca_E6pWs-dT)a!dw-gsPg>mhnD*=Rw2An@WCs7o^VC=5o@{FZTPe=6b)S!tddb34&pCQR^~)hF zMX=P;hOR{1Ez9j4uJYTHC;V84upuX((G?M32~3yw{W5V}9* zI4N@??h@^LK4cx@w^V1lYDr5leb-I;R}vPf9q%WqwL6k%9Jbk;RIM*3=O5cDB3`t7 zxxuIAYxYr#u6a#1cw~M#Q^nU2)$LGs3;q%Iq4PuNu9)j!5!7$JAJUQAdoQBJR@i!T zHZnG{xolvaIawCdQIR}$UfY5SJYYGhJ@Xd5Q5x3yi#!nwUjP#|adiWBNQsg52+Lze{)bI_-Q&5oS zdJ$t#Dw^S?^$(9NEGJo$EMy)$_f908W{uW7_@c`>qpY}T8syV{+9fxKn8|p-%h(KEc%hbWp`gx1rNC~9Q`c%_mjJ#~b@QDGY!=(M5!UV~np8-T%^+1a zv_WUSVX+OpB&(s*axNd(s~Y(nwN#9g$#NoT zJwORdD#wfIfn3UmGs25hf8(qDMa(R$Gx~)*xtNYAJz#6U&6Qb2)JF4~uWziK{Qal! za|~2MUPf?Goe5(O8Za`*e6J_!!>N2GFP@FA?R5S*S5z+G(dNTK-$VEz|2yUQh52Bk ze@&a01d{%+Et#v+DBiOgbA9__>{vn;m>Dk^dF4yYWAY!!-dr!QVcZU)LTz(mTFB^2 zq>IEUV z!sa?45VpTPCjB$T@b$7RJmw4Kb((=SCudrHYsFcK^?at&W|xi0q^+mDD#ql^gdez zPGTxJ!l$-q%OEo6(&bxiKvY_|OabnEl=<-n(zomQr6VgJtxbee(8+$jhp0$EQm}mb z1rDFP>73|O8)cXM(Z$T~ZJ5LHIb!5g;O9|=F5yLm?HWd1nOkdL*LwOzi%ee>bHqSQ z7)p8gFr(YljTSSBffPuX0&rsZuX#PX(c0X(Ry8+hxO({%2UH-=s_mpF^#If%o?Ehx z=$76Ei8sa9cWYd&-qoelhc@%;s_7Z9!M;rD`P0-hV7xiRcePg$-@bp>w@Bdccy6hb_% zUP>*#Rb%9CNf|Z0g7;TQMPwp;ne`ESA@AS6FIT$8p}8u~SawH@N3YIcJlF%0AqyG7 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 diff --git a/docs/srcs/c-jpa/task-er-diagram.png b/docs/srcs/c-jpa/task-er-diagram.png deleted file mode 100644 index aa3dbcc7175ea4c3b483b7a362ef140a6743621d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120020 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%0AK7cxP-d>U!X!OKN#Mv(4BU@`7Ldg6hkzd-qy< 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 Date: Tue, 14 May 2024 03:27:09 +0300 Subject: [PATCH 04/40] [Transactions] Added Plan Practice --- .../lab-work.md} | 0 .../practice/configuration.md} | 0 .../practice/isolation.md} | 0 docs/en/transactions/practice/isolation/read-committed.md | 0 docs/en/transactions/practice/isolation/read-uncommitted.md | 0 docs/en/transactions/practice/isolation/repeatable-read.md | 0 docs/en/transactions/practice/isolation/serializable.md | 0 docs/en/transactions/practice/propagation.md | 0 docs/en/transactions/practice/propagation/mandatory.md | 0 docs/en/transactions/practice/propagation/never.md | 0 docs/en/transactions/practice/propagation/not-supported.md | 0 docs/en/transactions/practice/propagation/required.md | 0 docs/en/transactions/practice/propagation/requires_new.md | 0 docs/en/transactions/practice/propagation/supports.md | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename docs/en/{b-springsecurity/practice/authorize-client-authenticated.md => transactions/lab-work.md} (100%) rename docs/en/{b-springsecurity/practice/authorize-client-authority.md => transactions/practice/configuration.md} (100%) rename docs/en/{b-springsecurity/practice/authorize-client-role.md => transactions/practice/isolation.md} (100%) create mode 100644 docs/en/transactions/practice/isolation/read-committed.md create mode 100644 docs/en/transactions/practice/isolation/read-uncommitted.md create mode 100644 docs/en/transactions/practice/isolation/repeatable-read.md create mode 100644 docs/en/transactions/practice/isolation/serializable.md create mode 100644 docs/en/transactions/practice/propagation.md create mode 100644 docs/en/transactions/practice/propagation/mandatory.md create mode 100644 docs/en/transactions/practice/propagation/never.md create mode 100644 docs/en/transactions/practice/propagation/not-supported.md create mode 100644 docs/en/transactions/practice/propagation/required.md create mode 100644 docs/en/transactions/practice/propagation/requires_new.md create mode 100644 docs/en/transactions/practice/propagation/supports.md diff --git a/docs/en/b-springsecurity/practice/authorize-client-authenticated.md b/docs/en/transactions/lab-work.md similarity index 100% rename from docs/en/b-springsecurity/practice/authorize-client-authenticated.md rename to docs/en/transactions/lab-work.md diff --git a/docs/en/b-springsecurity/practice/authorize-client-authority.md b/docs/en/transactions/practice/configuration.md similarity index 100% rename from docs/en/b-springsecurity/practice/authorize-client-authority.md rename to docs/en/transactions/practice/configuration.md diff --git a/docs/en/b-springsecurity/practice/authorize-client-role.md b/docs/en/transactions/practice/isolation.md similarity index 100% rename from docs/en/b-springsecurity/practice/authorize-client-role.md rename to docs/en/transactions/practice/isolation.md diff --git a/docs/en/transactions/practice/isolation/read-committed.md b/docs/en/transactions/practice/isolation/read-committed.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/isolation/read-uncommitted.md b/docs/en/transactions/practice/isolation/read-uncommitted.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/isolation/repeatable-read.md b/docs/en/transactions/practice/isolation/repeatable-read.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/isolation/serializable.md b/docs/en/transactions/practice/isolation/serializable.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation.md b/docs/en/transactions/practice/propagation.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation/mandatory.md b/docs/en/transactions/practice/propagation/mandatory.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation/never.md b/docs/en/transactions/practice/propagation/never.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation/not-supported.md b/docs/en/transactions/practice/propagation/not-supported.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation/required.md b/docs/en/transactions/practice/propagation/required.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation/requires_new.md b/docs/en/transactions/practice/propagation/requires_new.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/transactions/practice/propagation/supports.md b/docs/en/transactions/practice/propagation/supports.md new file mode 100644 index 0000000..e69de29 From 39448a5397223ee1b9ae5959f7d70c2b04749ea0 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:28:19 +0300 Subject: [PATCH 05/40] [Transactions] Removed wrong files --- docs/en/c-jpa/lab-work.md | 55 --------- .../practice/creation/characteristics.md | 114 ------------------ .../c-jpa/practice/creation/create-entity.md | 62 ---------- docs/en/c-jpa/practice/creation/fetching.md | 51 -------- .../c-jpa/practice/creation/relationships.md | 46 ------- docs/en/c-jpa/practice/dependencies/driver.md | 102 ---------------- docs/en/c-jpa/practice/dependencies/jpa.md | 59 --------- .../practice/interacting/jpa-repository.md | 56 --------- .../interacting/jpa-repository/create.md | 40 ------ .../interacting/jpa-repository/delete.md | 43 ------- .../interacting/jpa-repository/query.md | 44 ------- .../interacting/jpa-repository/read.md | 44 ------- .../c-jpa/practice/interacting/repository.md | 53 -------- .../practice/interacting/repository/create.md | 48 -------- .../practice/interacting/repository/delete.md | 49 -------- .../practice/interacting/repository/query.md | 51 -------- .../practice/interacting/repository/read.md | 48 -------- .../practice/interacting/repository/update.md | 48 -------- 18 files changed, 1013 deletions(-) delete mode 100644 docs/en/c-jpa/lab-work.md delete mode 100644 docs/en/c-jpa/practice/creation/characteristics.md delete mode 100644 docs/en/c-jpa/practice/creation/create-entity.md delete mode 100644 docs/en/c-jpa/practice/creation/fetching.md delete mode 100644 docs/en/c-jpa/practice/creation/relationships.md delete mode 100644 docs/en/c-jpa/practice/dependencies/driver.md delete mode 100644 docs/en/c-jpa/practice/dependencies/jpa.md delete mode 100644 docs/en/c-jpa/practice/interacting/jpa-repository.md delete mode 100644 docs/en/c-jpa/practice/interacting/jpa-repository/create.md delete mode 100644 docs/en/c-jpa/practice/interacting/jpa-repository/delete.md delete mode 100644 docs/en/c-jpa/practice/interacting/jpa-repository/query.md delete mode 100644 docs/en/c-jpa/practice/interacting/jpa-repository/read.md delete mode 100644 docs/en/c-jpa/practice/interacting/repository.md delete mode 100644 docs/en/c-jpa/practice/interacting/repository/create.md delete mode 100644 docs/en/c-jpa/practice/interacting/repository/delete.md delete mode 100644 docs/en/c-jpa/practice/interacting/repository/query.md delete mode 100644 docs/en/c-jpa/practice/interacting/repository/read.md delete mode 100644 docs/en/c-jpa/practice/interacting/repository/update.md diff --git a/docs/en/c-jpa/lab-work.md b/docs/en/c-jpa/lab-work.md deleted file mode 100644 index c489ba3..0000000 --- a/docs/en/c-jpa/lab-work.md +++ /dev/null @@ -1,55 +0,0 @@ -# Lab Work: JPA (Java Persistence API) - -Welcome to the Spring Boot with JPA Lab Work! In this lab work, you will practice various tasks related to setting up a Spring Boot project with JPA (Java Persistence API). - -## Goal of the Lab Work - -The goal of this lab work is to provide hands-on experience with key concepts and tasks involved in working with Spring Boot and JPA. By completing the practice tasks, you will gain proficiency in setting up dependencies, defining entity characteristics, managing relationships between entities, and interacting with the database using JpaRepository. - -## Practice Tasks - -1. **Database Dependencies Setup** - - [Database Driver Setup](practice/dependencies/driver.md) - - [Spring Boot and JPA Dependencies](practice/dependencies/jpa.md) - -2. **Entity Creation, Characteristics, Relationships and Fetching Strategies** - - [Entity Creation](practice/creation/create-entity.md) - - [Entity Characteristics Definition](practice/creation/characteristics.md) - - [Managing Relationships](practice/creation/relationships.md) - - [Fetching Strategies](practice/creation/fetching.md) - -3. **Interacting with Custom Repository** - - [Create Record](practice/interacting/repository/create.md) - - [Read Record](practice/interacting/repository/read.md) - - [Update Record](practice/interacting/repository/update.md) - - [Delete Record](practice/interacting/repository/delete.md) - - [Custom Queries](practice/interacting/repository/query.md) - -4. **Interacting with JPA Repository** - - [Create Record](practice/interacting/jpa-repository/create.md) - - [Read Record](practice/interacting/jpa-repository/read.md) - - [Delete Record](practice/interacting/jpa-repository/delete.md) - - [Custom Queries](practice/interacting/jpa-repository/query.md) - - -## Lab Work Tasks - -1. Set up database dependencies for PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. - -2. Implement the next Entity-Relationships Diagram: -![img.png](../../srcs/c-jpa/task-er-diagram.png) - - 1. Define entity characteristics for Student, Enrollment, and Course entities based on the Entity Relationships diagram. - - 2. Create entity classes for Student, Enrollment, and Course according to the defined characteristics. - - 3. Implement fetching strategies for efficient data retrieval to optimize database interactions. - - 4. Manage relationships between entities such as Student, Enrollment, and Course by establishing appropriate associations and mappings. - - 5. Interact with the database by creating methods for CRUD operations using the Repository layer and EntityManager in at least two repositories. - - 6. Interact with the database by creating methods for CRUD operations using JpaRepository in at least two repositories. - - 7. Implement custom queries to perform advanced data retrieval and manipulation operations as required by the application's business logic. - diff --git a/docs/en/c-jpa/practice/creation/characteristics.md b/docs/en/c-jpa/practice/creation/characteristics.md deleted file mode 100644 index e2bd498..0000000 --- a/docs/en/c-jpa/practice/creation/characteristics.md +++ /dev/null @@ -1,114 +0,0 @@ -# Defining Entity Characteristics - -## Introduction - -This guide focuses on defining entity columns or characteristics in a Spring Boot project using JPA (Java Persistence API). - -## Goal -The goal of this guide is to provide clear instructions for defining the characteristics of entities in a Spring Boot project with JPA, utilizing annotations to enforce constraints and behaviors for each attribute. - - -## Entity Characteristics - -### Student Entity Characteristics: -- `id` (UUID): Primary key for the entity. -- `name` (String): Name of the student (must not be blank). -- `email` (String): Email address of the student (must be a valid email address). -- `major` (String): Major or field of study of the student (must not be blank). -- `year` (int): Year of study for the student (must not be null). -- `international` (boolean): Indicates if the student is international (must not be null). - -### Define `id` Attribute - -Add the `id` attribute to the `Student` class. This attribute will serve as the primary key for the entity. - -```java -@Id -@GeneratedValue(strategy = GenerationType.AUTO) -private UUID id; -``` - -- `@Id`: Indicates that this field is the primary key for the entity. -- `@GeneratedValue`: Specifies the strategy for generating primary key values automatically. - -### Define `name` Attribute - -Add the `name` attribute to the `Student` class. This attribute represents the name of the student and must not be blank. - -```java -@NotBlank -private String name; -``` - -- `@NotBlank`: Ensures that the value of `name` is not null and contains at least one non-whitespace character. - -### Define `email` Attribute - -Add the `email` attribute to the `Student` class. This attribute represents the email address of the student and must be a valid email address. - -```java -@NotBlank -@Email -private String email; -``` - -- `@Email`: Validates that the value of `email` is a valid email address. - -### Define `major` Attribute - -Add the `major` attribute to the `Student` class. This attribute represents the major or field of study of the student and must not be blank. - -```java -@NotBlank -private String major; -``` - -- `@NotBlank`: Ensures that the value of `major` is not null and contains at least one non-whitespace character. - -### Define `year` Attribute - -Add the `year` attribute to the `Student` class. This attribute represents the year of study for the student and must not be null. - -```java -@NotNull -private int year; -``` - -- `@NotNull`: Ensures that the value of `year` is not null. - -### Define `international` Attribute - -Add the `international` attribute to the `Student` class. This attribute indicates whether the student is international and must not be null. - -```java -@NotNull -private boolean international; -``` - -- `@NotNull`: Ensures that the value of `international` is not null. - - -You can repeat the previous steps to create entity characteristics for the `Course` and `Enrollment` entities, ensuring appropriate annotations are applied to each attribute. - -### Enrollment Entity Characteristics: - -- `id` (UUID): Primary key for the entity. -- `enrollmentDate` (Date): Date of enrollment. -- `grade` (int): Grade achieved in the course. - -### Course Entity Characteristics: - -- `id` (UUID): Primary key for the entity. -- `name` (String): Name of the course. -- `instructor` (String): Name of the course instructor. -- `schedule` (String): Schedule details of the course. -- `capacity` (int): Maximum capacity of the course. -- `online` (boolean): Indicates if the course is online. -- `startDate` (Date): Start date of the course. - - -## Conclusion - -This guide has outlined the process of defining entity characteristics in a Spring Boot project with JPA. By establishing attributes for tables such as Student, Course, and Enrollment, data integrity and consistency have been ensured. Annotations have been utilized to enforce constraints and behaviors for each attribute, providing a solid foundation for the application's data model. With these entity characteristics defined. - -# [Next: Managing Relationships](relationships.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/creation/create-entity.md b/docs/en/c-jpa/practice/creation/create-entity.md deleted file mode 100644 index d51fb36..0000000 --- a/docs/en/c-jpa/practice/creation/create-entity.md +++ /dev/null @@ -1,62 +0,0 @@ -# Creating Entities - -## Introduction - -This guide focuses on creating entities in a Spring Boot project using JPA (Java Persistence API). It provides step-by-step instructions for setting up the folder structure and creating entity classes. - -## Goal - -The goal of this guide is to demonstrate how to create entity classes in a Spring Boot project, following best practices and utilizing JPA for data persistence. - -## Folder Structure - -To ensure a well-organized project, it's essential to establish a proper folder structure. Follow these guidelines: - -``` -src/ -└── main/ - └── java/ - └── com/ - └── example/ - └── demo/ - └── entity/ - ├── Student.java - ├── Enrollment.java - └── Course.java - -``` - -In this structure: -- The `src/main/java` directory contains your Java source files. -- The `com/example/demo/entity` directory is where you'll create your entity classes. - -## Creating Entity Classes - -To create entity classes, follow these steps: - -1. Navigate to the `com/example/demo/entity` directory in your project. -2. Create a new Java class file for each entity. You can repeat the following steps for each entity (e.g., Student, Enrollment, Course). -3. Define your entity class with the `@Entity` annotation. - -### Example: - -```java -package com.example.demo.entity; - -import javax.persistence.Entity; - -@Entity -public class Student { - -} -``` - -The `@Entity` annotation indicates that this class is a JPA entity. - -Repeat the above steps to create `Enrollment` and `Course` entity classes. - -## Conclusion - -You have now created the folder structure for your entities and created your entity classes in your application. - -# [Next: Entity Characteristics Definition](characteristics.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/creation/fetching.md b/docs/en/c-jpa/practice/creation/fetching.md deleted file mode 100644 index f8e44cd..0000000 --- a/docs/en/c-jpa/practice/creation/fetching.md +++ /dev/null @@ -1,51 +0,0 @@ -Understood. Here's the revised document with the code combined with the scenario: - ---- - -# Fetching Strategies in Spring Boot with JPA: Understanding Lazy and Eager Loading - -## Introduction - -This guide explores the fetching strategies in a Spring Boot project with JPA (Java Persistence API). Specifically, we will delve into the concepts of Lazy and Eager loading and how they are applied in entity relationships. - -## Goal - -The goal of this guide is to provide a comprehensive understanding of fetching strategies in JPA. By the end of this guide, you will comprehend when to use Lazy and Eager loading and how to implement them in your application. - -## Fetching Strategies - -### Scenario - -In our entity relationships, we have a One-to-Many relationship between the `Student` entity and the `Enrollment` entity. Similarly, there is a One-to-Many relationship between the `Course` entity and the `Enrollment` entity. - -#### Student Entity - -In the `Student` entity, we have a One-to-Many relationship with the `Enrollment` entity. Each student can have multiple enrollments. - -To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "student"` in the `Student` entity. Here, we have a choice between Lazy and Eager loading strategies for fetching the associated enrollments. - -```java -@OneToMany(mappedBy = "student", fetch = FetchType.EAGER, cascade = CascadeType.ALL) -private List enrollments; -``` - -We opt for Eager loading (`FetchType.EAGER`) in this scenario. Since we typically expect to access all enrollments of a student together, Eager loading ensures that all enrollments are fetched immediately when loading the student. - -#### Course Entity - -Similarly, in the `Course` entity, we also have a One-to-Many relationship with the `Enrollment` entity. Each course can have multiple enrollments. - -To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "course"` in the `Course` entity. Here, we have another choice between Lazy and Eager loading strategies for fetching the associated enrollments. - -```java -@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL) -private List enrollments; -``` - -We opt for Lazy loading (`FetchType.LAZY`) in this scenario. Since we may not always need to access all enrollments of a course, Lazy loading ensures that enrollments are fetched only when explicitly requested. - -## Conclusion - -This guide has provided insights into the concepts of Lazy and Eager loading. By understanding the scenarios where each fetching strategy is appropriate and how to implement them in your entities, you are now equipped to optimize data fetching and improve the performance of your application. - -# [Next: Create Repository](../interacting/repository.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/creation/relationships.md b/docs/en/c-jpa/practice/creation/relationships.md deleted file mode 100644 index 89b792f..0000000 --- a/docs/en/c-jpa/practice/creation/relationships.md +++ /dev/null @@ -1,46 +0,0 @@ -# Defining Entity Relationships - -## Introduction - -This guide delves into understanding and implementing relationships between entities in a Spring Boot project using JPA (Java Persistence API). Specifically, we will explore the relationship between the `Enrollment` entity and its associated entities `Student` and `Course`. - -## Goal - -The goal of this guide is to provide clear instructions for defining and understanding entity relationships in a Spring Boot project with JPA. By the end of this guide, you will comprehend how to establish associations between entities and implement them in your application. - -## Entity Associations - -![img.png](../../../../srcs/c-jpa/er-diagram.png) -### Enrollment Entity Characteristics: - -- `id` (UUID): Primary key for the entity. -- `student` (Student): Student associated with the enrollment. -- `course` (Course): Course associated with the enrollment. -- `enrollmentDate` (Date): Date of enrollment. -- `grade` (int): Grade achieved in the course. - -#### Student Relationship - -The relationship between the `Enrollment` entity and the `Student` entity represents a scenario where a student enrolls in a course. This is a Many-to-One relationship, where many enrollments can be associated with one student. To establish this relationship, annotate the `student` attribute in the `Enrollment` entity with `@ManyToOne`. - -```java -@ManyToOne -@JoinColumn(name = "student_id") -private Student student; -``` - -#### Course Relationship - -Similarly, the relationship between the `Enrollment` entity and the `Course` entity signifies a scenario where a course is enrolled by multiple students. This is also a Many-to-One relationship, where many enrollments can be associated with one course. Annotate the `course` attribute in the `Enrollment` entity with `@ManyToOne`. - -```java -@ManyToOne -@JoinColumn(name = "course_id") -private Course course; -``` - -## Conclusion - -This guide has elucidated the process of defining relationships between entities. By establishing associations between the `Enrollment` entity and its associated entities `Student` and `Course`, you are now equipped to implement and manage entity relationships effectively within your application. - -# [Next: Fetching Strategies](fetching.md) diff --git a/docs/en/c-jpa/practice/dependencies/driver.md b/docs/en/c-jpa/practice/dependencies/driver.md deleted file mode 100644 index 187bcc8..0000000 --- a/docs/en/c-jpa/practice/dependencies/driver.md +++ /dev/null @@ -1,102 +0,0 @@ -# JPA: Setup Dependencies - -## Introduction - -This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include database drivers for various databases such as PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. By following this guide, you will configure all the required dependencies to establish connections with these databases in your Spring Boot application. - -## Goal -The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on database drivers for different databases. - -## Setup Dependencies - -### Database Drivers - -To connect to different databases in your Spring Boot application, include the appropriate database drivers. - -#### PostgreSQL - -**For Gradle:** -```groovy -implementation "org.postgresql:postgresql" -``` - -**For Maven:** -```xml - - org.postgresql - postgresql - INSERT_VERSION_HERE - -``` - -#### MySQL - -**For Gradle:** -```groovy -implementation "mysql:mysql-connector-java" -``` - -**For Maven:** -```xml - - mysql - mysql-connector-java - INSERT_VERSION_HERE - -``` - -#### Oracle Database Driver - -**For Gradle:** -```groovy -implementation 'com.oracle.database.jdbc:ojdbc8' -``` - -**For Maven:** -```xml - - com.oracle.database.jdbc - ojdbc8 - -``` - -#### MongoDB Driver (MongoDB Java Driver) - -**For Gradle:** -```groovy -implementation 'org.mongodb:mongodb-driver-sync:4.4.3' -``` - -**For Maven:** -```xml - - org.mongodb - mongodb-driver-sync - 4.4.3 - -``` - -#### Microsoft SQL Server JDBC Driver - -**For Gradle:** -```groovy -implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' -``` - -**For Maven:** -```xml - - com.microsoft.sqlserver - mssql-jdbc - 9.4.0.jre11 - -``` - -These dependencies facilitate database connectivity. - -## Conclusion - -By configuring the appropriate database drivers for various databases, you will be equipped to initiate development on your Spring Boot application with JPA. - -# [Next: Spring Boot and JPA Dependencies](jpa.md) - diff --git a/docs/en/c-jpa/practice/dependencies/jpa.md b/docs/en/c-jpa/practice/dependencies/jpa.md deleted file mode 100644 index fa1ac9c..0000000 --- a/docs/en/c-jpa/practice/dependencies/jpa.md +++ /dev/null @@ -1,59 +0,0 @@ -# JPA: Setup Dependencies - -## Introduction - -This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. - -## Goal - -The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. - -## Setup Dependencies - -### Spring Boot Starter JDBC - -To enable JDBC support in your Spring Boot application: - -#### Gradle - -```groovy -implementation "org.springframework.boot:spring-boot-starter-jdbc" -``` - -#### Maven - -```xml - - org.springframework.boot - spring-boot-starter-jdbc - -``` - -This dependency provides auto-configuration for JDBC-based data access. - -### Spring Boot Starter Data JPA - -To include support for JPA (Java Persistence API) in your Spring Boot application: - -#### Gradle - -```groovy -implementation "org.springframework.boot:spring-boot-starter-data-jpa" -``` - -#### Maven - -```xml - - org.springframework.boot - spring-boot-starter-data-jpa - -``` - -This dependency simplifies the setup of JPA-based repositories and provides default configurations for Hibernate. - -## Conclusion - -By configuring the appropriate Spring Boot dependencies for JDBC and JPA, you will be equipped to initiate development on your Spring Boot application with JPA support. - -# [Next: Entity Creation](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/interacting/jpa-repository.md b/docs/en/c-jpa/practice/interacting/jpa-repository.md deleted file mode 100644 index f2d5b49..0000000 --- a/docs/en/c-jpa/practice/interacting/jpa-repository.md +++ /dev/null @@ -1,56 +0,0 @@ -# Creating JpaRepository - -## Introduction - -This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API) using JpaRepository. - -## Goal - -The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository and service classes for the `Course` entity. - -## Folder Structure - -``` -src/ -└── main/ - └── java/ - └── com/ - └── example/ - └── demo/ - ├── data/ - │ └── entities/ - │ ├── Student.java - │ ├── Enrollment.java - │ └── Course.java - └── repository/ - ├── StudentRepository.java - └── CourseRepository.java - -``` -## Repository Class - -### CourseRepository.java - -```java -package com.yourcompany.yourproject.repository; - -import com.yourcompany.yourproject.model.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CourseRepository extends JpaRepository { - // Add repository methods for course entity -} -``` - - -The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. - - -## Conclusion - -You have now created a repository class for managing the `Course` entity in your application. - -# [Next: Create Record](jpa-repository/create.md) - diff --git a/docs/en/c-jpa/practice/interacting/jpa-repository/create.md b/docs/en/c-jpa/practice/interacting/jpa-repository/create.md deleted file mode 100644 index c9fb4aa..0000000 --- a/docs/en/c-jpa/practice/interacting/jpa-repository/create.md +++ /dev/null @@ -1,40 +0,0 @@ -# Creating Records in a Table Using JpaRepository - -## Introduction - -This guide demonstrates how to create records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. - -## Goal - -The goal of this guide is to illustrate the process of creating records in a table by implementing a method within the `CourseRepository` interface using JpaRepository. - -## Repository Method - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.UUID; - -@Repository -public interface CourseRepository extends JpaRepository { - - Course save(Course course); -} -``` - -### Explanation - -The `save(Course course)` method provided by JpaRepository allows us to persist a new record in the `Course` table. - -By invoking this method and passing a `Course` object as a parameter, JpaRepository automatically handles the process of persisting the entity to the database. - -## Conclusion - -You have now implemented a method within the `CourseRepository` interface using JpaRepository to create records in the `Course` table. This method provides a convenient way to persist data to the database using JpaRepository in your Spring Boot application. - -# [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/interacting/jpa-repository/delete.md b/docs/en/c-jpa/practice/interacting/jpa-repository/delete.md deleted file mode 100644 index 4ff5d38..0000000 --- a/docs/en/c-jpa/practice/interacting/jpa-repository/delete.md +++ /dev/null @@ -1,43 +0,0 @@ -# Deleting Records from a Table Using JpaRepository - -## Introduction - -This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. - -## Goal - -The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `CourseRepository` interface using JpaRepository. - -## Repository Method - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.UUID; - -@Repository -public interface CourseRepository extends JpaRepository { - - void deleteById(UUID id); -} -``` - -## Explanation - -The `deleteById(UUID id)` method signature follows a convention recognized by JpaRepository for deleting records based on their unique identifier. - -- The `delete` keyword indicates that this method is used for deleting data. -- `ById` specifies the criteria for identifying the record to be deleted. In this case, we are targeting a record with a specific ID. - -By adhering to this naming convention, JpaRepository automatically generates the appropriate SQL query behind the scenes to delete the desired record from the database. This simplifies the development process by eliminating the need to write explicit SQL delete statements, allowing developers to focus on defining method signatures that reflect the intended data deletion operations. - -## Conclusion - -You have now implemented a method within the `CourseRepository` interface using JpaRepository to delete records from the `Course` table. This method provides a convenient way to delete data from the database using JpaRepository in your Spring Boot application. - -# [Next: Custom Query](query.md) diff --git a/docs/en/c-jpa/practice/interacting/jpa-repository/query.md b/docs/en/c-jpa/practice/interacting/jpa-repository/query.md deleted file mode 100644 index 73bef4b..0000000 --- a/docs/en/c-jpa/practice/interacting/jpa-repository/query.md +++ /dev/null @@ -1,44 +0,0 @@ -# Custom Query Using JpaRepository - -## Introduction - -This guide demonstrates how to implement custom query methods using the `@Query` annotation in the repository layer of a Spring Boot application with JPA (Java Persistence API) and JpaRepository. - -## Goal - -The goal of this guide is to illustrate the process of creating custom query methods in the repository interface to perform specific database operations tailored to application requirements. - -## Repository Method - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; -import java.util.List; - -@Repository -public interface CourseRepository extends JpaRepository { - - @Query("SELECT c FROM Course c WHERE c.instructor = :instructor") - List findCoursesByInstructor(@Param("instructor") String instructor); -} -``` - -### Explanation - -The `@Query` annotation allows us to define custom JPQL (Java Persistence Query Language) queries directly within the repository interface. - -- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` is a JPQL query that selects all courses where the instructor matches the provided value. -- `@Param("instructor")` annotation binds the method parameter `instructor` to the named parameter `:instructor` in the JPQL query. - -By using `@Query`, we can create complex queries tailored to specific data retrieval needs, providing flexibility and control over the database operations. - -## Conclusion - -You have now implemented a custom query method within the `CourseRepository` interface using JpaRepository and the `@Query` annotation to retrieve records from the `Course` table based on a specific condition. This method offers a powerful way to execute custom queries in your Spring Boot application, enabling precise data retrieval operations. - diff --git a/docs/en/c-jpa/practice/interacting/jpa-repository/read.md b/docs/en/c-jpa/practice/interacting/jpa-repository/read.md deleted file mode 100644 index 01d2ade..0000000 --- a/docs/en/c-jpa/practice/interacting/jpa-repository/read.md +++ /dev/null @@ -1,44 +0,0 @@ -# Reading Records from a Table Using JpaRepository - -## Introduction - -This guide demonstrates how to retrieve data from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. - -## Goal - -The goal of this guide is to illustrate the process of reading data from a table by implementing a method within the `CourseRepository` interface using JpaRepository. - -## Repository Method - -### CourseRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Course; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.List; - -@Repository -public interface CourseRepository extends JpaRepository { - - List findCoursesByInstructor(String instructor); -} -``` - -### Explanation - -The `findCoursesByInstructor(String instructor)` method signature follows a specific naming convention recognized by Spring Data JPA. - -- The `find` keyword indicates that this method is used for retrieving data. -- `Courses` represents the entity type we want to retrieve. -- `ByInstructor` specifies the criteria for filtering the results. In this case, we are querying for courses based on the `instructor` attribute. - -By adhering to this naming convention, Spring Data JPA automatically generates the appropriate SQL query behind the scenes to fetch the required data from the database. This simplifies the development process by eliminating the need to write explicit SQL queries, allowing developers to focus on defining method signatures that reflect the desired data retrieval operations. - -## Conclusion - -You have now implemented a method within the `CourseRepository` interface using JpaRepository to retrieve data from the `Course` table. This method allows you to read data efficiently from the database using JpaRepository in your Spring Boot application. - -# [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/interacting/repository.md b/docs/en/c-jpa/practice/interacting/repository.md deleted file mode 100644 index 2391645..0000000 --- a/docs/en/c-jpa/practice/interacting/repository.md +++ /dev/null @@ -1,53 +0,0 @@ -# Creating Repository - -## Introduction - -This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API). - -## Goal - -The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository for the `Student` entity. - -## Folder Structure - -``` -src/ -└── main/ - └── java/ - └── com/ - └── example/ - └── demo/ - ├── data/ - │ └── entites/ - │ ├── Student.java - │ ├── Enrollment.java - │ └── Course.java - └── repository/ - └── StudentRepository.java - -``` -## Repository Class - -### StudentRepository.java - -```java -package com.yourcompany.yourproject.repository; - -import com.yourcompany.yourproject.model.Student; -import org.springframework.stereotype.Repository; - -@Repository -public class StudentRepository { - // Add repository methods for student entity -} -``` - - -The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. - - -## Conclusion - -You have now created a repository for managing the `Student` entity in your application. - -# [Next: Create Record](repository/create.md) diff --git a/docs/en/c-jpa/practice/interacting/repository/create.md b/docs/en/c-jpa/practice/interacting/repository/create.md deleted file mode 100644 index a75067b..0000000 --- a/docs/en/c-jpa/practice/interacting/repository/create.md +++ /dev/null @@ -1,48 +0,0 @@ -# Creating New Records in a Table Using Repository Layer - -## Introduction - -This guide illustrates how to create new records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). - -## Goal - -The goal of this guide is to demonstrate the process of creating new records in a table by utilizing the repository layer. We will achieve this by implementing a method within the `StudentRepository` interface using the `EntityManager` instead of `JpaRepository`. - -## Repository Method - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public void saveStudent(Student student) { - entityManager.persist(student); - } -} -``` - -### Explanation - -- `@Repository`: This annotation marks the class as a repository component in the data access layer. - -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. - -- `entityManager.persist(student)`: This line of code persists the new `Student` entity to the database. - -## Conclusion - -You have now implemented a method within the `StudentRepository` class to create new records in the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional functionalities as needed. - -# [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/interacting/repository/delete.md b/docs/en/c-jpa/practice/interacting/repository/delete.md deleted file mode 100644 index c24dc48..0000000 --- a/docs/en/c-jpa/practice/interacting/repository/delete.md +++ /dev/null @@ -1,49 +0,0 @@ -# Deleting Records from a Table Using Repository Layer - -## Introduction - -This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). - -## Goal - -The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. - -## Repository Method - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public void deleteStudent(UUID id) { - Student studentToDelete = entityManager.find(Student.class, id); - entityManager.remove(studentToDelete); - } -} -``` - -### Explanation - -- `@Repository`: This annotation marks the class as a repository component in the data access layer. - -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. - -- `entityManager.remove(studentToDelete)`: This line of code deletes the `Student` entity from the database. - -## Conclusion - -You have now implemented a method within the `StudentRepository` class to delete records from the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional delete operations as needed. - -# [Next: Custom Query](query.md) diff --git a/docs/en/c-jpa/practice/interacting/repository/query.md b/docs/en/c-jpa/practice/interacting/repository/query.md deleted file mode 100644 index 5b5515c..0000000 --- a/docs/en/c-jpa/practice/interacting/repository/query.md +++ /dev/null @@ -1,51 +0,0 @@ -# Creating Custom Queries in a Table Using Repository Layer - -## Introduction - -This guide demonstrates how to create custom queries to fetch records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). - -## Goal - -The goal of this guide is to illustrate the process of creating custom queries to fetch records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. - -## Repository Method - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; -import java.util.List; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public List findStudentsByMajor(String major) { - return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class) - .setParameter("major", major) - .getResultList(); - } -} -``` - -### Explanation - -- `@Repository`: This annotation marks the class as a repository component in the data access layer. - -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. - -- `entityManager.createQuery(...)`: This line of code creates a custom JPQL (Java Persistence Query Language) query to fetch records based on the provided criteria (`major` in this example). - -## Conclusion - -You have now implemented a method within the `StudentRepository` class to create custom queries and fetch records from the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional custom query operations as needed. - -# [Next: Create JpaRepository](../jpa-repository.md) \ No newline at end of file diff --git a/docs/en/c-jpa/practice/interacting/repository/read.md b/docs/en/c-jpa/practice/interacting/repository/read.md deleted file mode 100644 index b644506..0000000 --- a/docs/en/c-jpa/practice/interacting/repository/read.md +++ /dev/null @@ -1,48 +0,0 @@ -# Reading Records from a Table Using Repository Layer - -## Introduction - -This guide demonstrates how to read records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). - -## Goal - -The goal of this guide is to illustrate the process of reading records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. - -## Repository Method - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public Student findStudentById(UUID id) { - return entityManager.find(Student.class, id); - } -} -``` - -### Explanation - -- `@Repository`: This annotation marks the class as a repository component in the data access layer. - -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. - -- `entityManager.find(Student.class, id)`: This line of code retrieves the `Student` entity from the database based on the provided `id`. - -## Conclusion - -You have now implemented a method within the `StudentRepository` class to read records from the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional read operations as needed. - -# [Next: Update Record](update.md) diff --git a/docs/en/c-jpa/practice/interacting/repository/update.md b/docs/en/c-jpa/practice/interacting/repository/update.md deleted file mode 100644 index 9fe82cd..0000000 --- a/docs/en/c-jpa/practice/interacting/repository/update.md +++ /dev/null @@ -1,48 +0,0 @@ -# Updating Records in a Table Using Repository Layer - -## Introduction - -This guide illustrates how to update records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). - -## Goal - -The goal of this guide is to demonstrate the process of updating records in a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. - -## Repository Method - -### StudentRepository.java - -```java -package com.example.demo.repository; - -import com.example.demo.data.entities.Student; -import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -@Repository -public class StudentRepository { - - @PersistenceContext - private EntityManager entityManager; - - public Student updateStudent(Student student) { - return entityManager.merge(student); - } -} -``` - -### Explanation - -- `@Repository`: This annotation marks the class as a repository component in the data access layer. - -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. - -- `entityManager.merge(student)`: This line of code updates the `Student` entity in the database. - -## Conclusion - -You have now implemented a method within the `StudentRepository` class to update records in the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional update operations as needed. - -# [Next: Delete Record](delete.md) \ No newline at end of file From 7c90d7a5ffcbad2340749ba4a118f39727887e91 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:34:02 +0300 Subject: [PATCH 06/40] [SpringSecurity] few updates in text. --- docs/en/springsecurity/practice/add-dummy-users.md | 4 ---- .../springsecurity/practice/authorize-server-authenticated.md | 4 ---- docs/en/springsecurity/practice/authorize-server-authority.md | 4 ---- docs/en/springsecurity/practice/authorize-server-role.md | 4 ---- docs/en/springsecurity/practice/base-implementation-user.md | 4 ---- docs/en/springsecurity/practice/configure-spring-security.md | 4 ---- .../springsecurity/practice/configure-thymeleaf-security.md | 3 --- docs/en/springsecurity/practice/create-identity-to-users.md | 4 ---- docs/en/springsecurity/practice/custom-login-form.md | 4 ---- docs/en/springsecurity/practice/password-encryption.md | 4 ---- docs/en/springsecurity/practice/setup-server-authorization.md | 4 ---- 11 files changed, 43 deletions(-) diff --git a/docs/en/springsecurity/practice/add-dummy-users.md b/docs/en/springsecurity/practice/add-dummy-users.md index 194caf0..5d8d81b 100644 --- a/docs/en/springsecurity/practice/add-dummy-users.md +++ b/docs/en/springsecurity/practice/add-dummy-users.md @@ -59,10 +59,6 @@ Update the `CustomUserDetailsService` class to include a method for adding dummy - The `addDummyUsers` method creates dummy users with hardcoded usernames and passwords. - Finally, the dummy users are saved to the repository using the `save` method. -## Conclusion - -Congratulations! You have successfully added dummy users to simulate a database in your Spring Security-enabled application. By initializing a list of dummy users in the UserRepositoryImpl class and populating it during application startup, you can now authenticate and authorize users within your application. - --- # [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-server-authenticated.md b/docs/en/springsecurity/practice/authorize-server-authenticated.md index 11b7182..ef1e7a4 100644 --- a/docs/en/springsecurity/practice/authorize-server-authenticated.md +++ b/docs/en/springsecurity/practice/authorize-server-authenticated.md @@ -33,10 +33,6 @@ Authorize access to the `/second` path only for authenticated users while allowi - We use `.authorizeHttpRequests()` to define authorization rules. - The `.requestMatchers("/second").authenticated()` statement specifies that access to the `/second` path should be restricted to authenticated users. -## Conclusion - -You have successfully configured authorization to allow access to the `/second` path only for authenticated users. By requiring authentication for this path. - --- # [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-server-authority.md b/docs/en/springsecurity/practice/authorize-server-authority.md index 2851857..d0abdeb 100644 --- a/docs/en/springsecurity/practice/authorize-server-authority.md +++ b/docs/en/springsecurity/practice/authorize-server-authority.md @@ -34,10 +34,6 @@ Authorize access to the `/addStudent` path for users with the `WRITE` authority - The `.requestMatchers("/addStudent").hasAuthority("WRITE")` statement specifies that access to the `/addStudent` path should be restricted to users with the `WRITE` authority. - Similarly, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` restricts access to the `/removeStudent` path to users with the `DELETE` authority. -## Conclusion - -You have successfully configured authority-based access control for the `/addStudent` and `/removeStudent` paths in your application. By assigning specific authorities to users, you can control access to different functionalities or actions based on their permissions. - --- # [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-server-role.md b/docs/en/springsecurity/practice/authorize-server-role.md index e9eff58..3b1ab77 100644 --- a/docs/en/springsecurity/practice/authorize-server-role.md +++ b/docs/en/springsecurity/practice/authorize-server-role.md @@ -34,10 +34,6 @@ Authorize access to the `/third` path for users with the `ROLE_MODERATOR` role a - The `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` statement specifies that access to the `/third` path should be restricted to users with the `ROLE_MODERATOR` authority. - Similarly, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` restricts access to the `/fourth` path to users with the `ROLE_ADMIN` authority. -## Conclusion - -You have successfully configured role-based access control for the `/third` and `/fourth` paths in your application. By assigning specific roles to users, you can control access to different parts of your application based on their permissions. - --- # [NEXT TASK: Authorize by Authority](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/base-implementation-user.md b/docs/en/springsecurity/practice/base-implementation-user.md index 302d063..c77596f 100644 --- a/docs/en/springsecurity/practice/base-implementation-user.md +++ b/docs/en/springsecurity/practice/base-implementation-user.md @@ -179,10 +179,6 @@ src This folder structure indicates where to create the `CustomUserDetailsService` class and the `UsersRepository` interface within your project. Organizing your classes in this manner helps maintain a clear and structured codebase. -## Conclusion - -Congratulations! You have successfully created a base implementation for managing users in your application. With UserDetails, UsersRepository, and UserDetailsService in place, you can now authenticate users, manage their details, and perform user-related operations efficiently. - --- # [NEXT TASK: Password Encryption](password-encryption.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/configure-spring-security.md b/docs/en/springsecurity/practice/configure-spring-security.md index b4d8035..c6bcf19 100644 --- a/docs/en/springsecurity/practice/configure-spring-security.md +++ b/docs/en/springsecurity/practice/configure-spring-security.md @@ -75,10 +75,6 @@ The goal of this task is to integrate Spring Security into your existing project } ``` -## Conclusion - -Congratulations! You have successfully configured Spring Security in your project. Your application is now equipped with robust security features to protect against unauthorized access and ensure the confidentiality and integrity of user data. - --- # [Next Task: Create a Base Implementation for User](base-implementation-user.md) diff --git a/docs/en/springsecurity/practice/configure-thymeleaf-security.md b/docs/en/springsecurity/practice/configure-thymeleaf-security.md index f96301f..2f87ae3 100644 --- a/docs/en/springsecurity/practice/configure-thymeleaf-security.md +++ b/docs/en/springsecurity/practice/configure-thymeleaf-security.md @@ -25,9 +25,6 @@ The goal of this task is to integrate Thymeleaf with Spring Security, enabling t ``` -## Conclusion -After adding the dependency, Thymeleaf will be configured to work seamlessly with Spring Security, providing additional features and utilities for integrating security-related functionality into your web application. Remember to sync your project to download the dependency and make it available for use. - --- [NEXT TASK:]() diff --git a/docs/en/springsecurity/practice/create-identity-to-users.md b/docs/en/springsecurity/practice/create-identity-to-users.md index 10a5955..c839716 100644 --- a/docs/en/springsecurity/practice/create-identity-to-users.md +++ b/docs/en/springsecurity/practice/create-identity-to-users.md @@ -56,10 +56,6 @@ Enhance the user profiles created in the previous step by assigning roles and au - Authorities are represented as `SimpleGrantedAuthority` objects and added to the user profiles accordingly. - Additionally, we set the role for each user to enable role-based access control in subsequent steps. -## Conclusion - -You have successfully enhanced the user profiles in your application by assigning roles and authorities to the dummy users. By defining their identities and access permissions, you can now control the actions and functionalities available to each user within the application. - --- # [NEXT TASK: Create a Base for Authorization in Server](setup-server-authorization.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/custom-login-form.md b/docs/en/springsecurity/practice/custom-login-form.md index d05342f..720cec9 100644 --- a/docs/en/springsecurity/practice/custom-login-form.md +++ b/docs/en/springsecurity/practice/custom-login-form.md @@ -35,10 +35,6 @@ Activate the custom login form page that has already been created in specific pa - The `.loginPage("/custom-login-page")` statement specifies the URL of the custom login page. - You can add additional configurations to customize the form login behavior, such as setting login success or failure URLs, defining form field names, etc. -## Conclusion - -You have successfully enabled the custom login form page for authentication in your application. Users can now access the custom login page to securely log in and authenticate into the system. - --- # [TASKS](../lab-work.md) diff --git a/docs/en/springsecurity/practice/password-encryption.md b/docs/en/springsecurity/practice/password-encryption.md index 4c9c18d..2cd1a21 100644 --- a/docs/en/springsecurity/practice/password-encryption.md +++ b/docs/en/springsecurity/practice/password-encryption.md @@ -77,9 +77,5 @@ The goal of this setup is to configure password encryption using the BCryptPassw This method takes a CustomUserDetails object representing the user to be registered. It encrypts the user's password using the BCryptPasswordEncoder bean and then saves the user to the database. -## Conclusion - -Congratulations! You have successfully set up password encryption using BCryptPasswordEncoder in your Spring Security-enabled application. By encrypting passwords, you enhance the security of user authentication and protect sensitive user data. - --- # [NEXT TASK: Add a Dummy Users](add-dummy-users.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/setup-server-authorization.md b/docs/en/springsecurity/practice/setup-server-authorization.md index d14dfe9..68cd220 100644 --- a/docs/en/springsecurity/practice/setup-server-authorization.md +++ b/docs/en/springsecurity/practice/setup-server-authorization.md @@ -36,10 +36,6 @@ Configure authorization rules to restrict or allow access to various paths and e - We use `.authorizeHttpRequests()` to define authorization rules. - Inside the lambda expression, we specify which requests should be permitted. -## Conclusion - -You have successfully set up authorization rules in your application to control access to different paths and endpoints. By defining specific permissions for each path, you can ensure that users can only access the resources they are authorized to use. - --- # [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file From 2e0f0db857fd15861c656a0cfb69eee720e79bc9 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:34:17 +0300 Subject: [PATCH 07/40] [SpringSecurity] updated tasks plan --- docs/en/springsecurity/tasks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/springsecurity/tasks.md b/docs/en/springsecurity/tasks.md index 6314970..52f7231 100644 --- a/docs/en/springsecurity/tasks.md +++ b/docs/en/springsecurity/tasks.md @@ -10,3 +10,4 @@ - create authenticated paths ( form-based ) - create admin page ( role based ) - hide and show content in depends on authorities and role. +- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file From 19ae286eac86ec52d3b6a8b73f74a01f69a61934 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:39:37 +0300 Subject: [PATCH 08/40] [JPA] Enhance Text. --- docs/en/jpa/practice/creation/characteristics.md | 5 +---- docs/en/jpa/practice/creation/create-entity.md | 4 +--- docs/en/jpa/practice/creation/fetching.md | 4 +--- docs/en/jpa/practice/creation/relationships.md | 4 +--- docs/en/jpa/practice/dependencies/driver.md | 4 +--- docs/en/jpa/practice/dependencies/jpa.md | 4 +--- docs/en/jpa/practice/interacting/jpa-repository.md | 4 +--- docs/en/jpa/practice/interacting/jpa-repository/create.md | 4 +--- docs/en/jpa/practice/interacting/jpa-repository/delete.md | 4 +--- docs/en/jpa/practice/interacting/jpa-repository/query.md | 5 ++--- docs/en/jpa/practice/interacting/jpa-repository/read.md | 4 +--- docs/en/jpa/practice/interacting/repository.md | 4 +--- docs/en/jpa/practice/interacting/repository/create.md | 4 +--- docs/en/jpa/practice/interacting/repository/delete.md | 4 +--- docs/en/jpa/practice/interacting/repository/query.md | 4 +--- docs/en/jpa/practice/interacting/repository/read.md | 4 +--- docs/en/jpa/practice/interacting/repository/update.md | 4 +--- docs/ru/jpa/practice/creation/characteristics.md | 4 +--- docs/ru/jpa/practice/creation/create-entity.md | 4 +--- docs/ru/jpa/practice/creation/fetching.md | 4 +--- docs/ru/jpa/practice/creation/relationships.md | 4 +--- docs/ru/jpa/practice/dependencies/driver.md | 4 +--- docs/ru/jpa/practice/dependencies/jpa.md | 4 +--- docs/ru/jpa/practice/interacting/jpa-repository.md | 4 +--- docs/ru/jpa/practice/interacting/jpa-repository/create.md | 4 +--- docs/ru/jpa/practice/interacting/jpa-repository/delete.md | 4 +--- docs/ru/jpa/practice/interacting/jpa-repository/query.md | 4 ++-- docs/ru/jpa/practice/interacting/jpa-repository/read.md | 4 +--- docs/ru/jpa/practice/interacting/repository.md | 4 +--- docs/ru/jpa/practice/interacting/repository/create.md | 4 +--- docs/ru/jpa/practice/interacting/repository/delete.md | 4 +--- docs/ru/jpa/practice/interacting/repository/query.md | 4 +--- docs/ru/jpa/practice/interacting/repository/read.md | 4 +--- docs/ru/jpa/practice/interacting/repository/update.md | 4 +--- 34 files changed, 36 insertions(+), 102 deletions(-) diff --git a/docs/en/jpa/practice/creation/characteristics.md b/docs/en/jpa/practice/creation/characteristics.md index e2bd498..0297f7a 100644 --- a/docs/en/jpa/practice/creation/characteristics.md +++ b/docs/en/jpa/practice/creation/characteristics.md @@ -106,9 +106,6 @@ You can repeat the previous steps to create entity characteristics for the `Cour - `online` (boolean): Indicates if the course is online. - `startDate` (Date): Start date of the course. - -## Conclusion - -This guide has outlined the process of defining entity characteristics in a Spring Boot project with JPA. By establishing attributes for tables such as Student, Course, and Enrollment, data integrity and consistency have been ensured. Annotations have been utilized to enforce constraints and behaviors for each attribute, providing a solid foundation for the application's data model. With these entity characteristics defined. +--- # [Next: Managing Relationships](relationships.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/creation/create-entity.md b/docs/en/jpa/practice/creation/create-entity.md index d51fb36..851531f 100644 --- a/docs/en/jpa/practice/creation/create-entity.md +++ b/docs/en/jpa/practice/creation/create-entity.md @@ -55,8 +55,6 @@ The `@Entity` annotation indicates that this class is a JPA entity. Repeat the above steps to create `Enrollment` and `Course` entity classes. -## Conclusion - -You have now created the folder structure for your entities and created your entity classes in your application. +--- # [Next: Entity Characteristics Definition](characteristics.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/creation/fetching.md b/docs/en/jpa/practice/creation/fetching.md index f8e44cd..de11305 100644 --- a/docs/en/jpa/practice/creation/fetching.md +++ b/docs/en/jpa/practice/creation/fetching.md @@ -44,8 +44,6 @@ private List enrollments; We opt for Lazy loading (`FetchType.LAZY`) in this scenario. Since we may not always need to access all enrollments of a course, Lazy loading ensures that enrollments are fetched only when explicitly requested. -## Conclusion - -This guide has provided insights into the concepts of Lazy and Eager loading. By understanding the scenarios where each fetching strategy is appropriate and how to implement them in your entities, you are now equipped to optimize data fetching and improve the performance of your application. +--- # [Next: Create Repository](../interacting/repository.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/creation/relationships.md b/docs/en/jpa/practice/creation/relationships.md index f98b076..e7cdd1b 100644 --- a/docs/en/jpa/practice/creation/relationships.md +++ b/docs/en/jpa/practice/creation/relationships.md @@ -39,8 +39,6 @@ Similarly, the relationship between the `Enrollment` entity and the `Course` ent private Course course; ``` -## Conclusion - -This guide has elucidated the process of defining relationships between entities. By establishing associations between the `Enrollment` entity and its associated entities `Student` and `Course`, you are now equipped to implement and manage entity relationships effectively within your application. +--- # [Next: Fetching Strategies](fetching.md) diff --git a/docs/en/jpa/practice/dependencies/driver.md b/docs/en/jpa/practice/dependencies/driver.md index 187bcc8..928b2ab 100644 --- a/docs/en/jpa/practice/dependencies/driver.md +++ b/docs/en/jpa/practice/dependencies/driver.md @@ -94,9 +94,7 @@ implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' These dependencies facilitate database connectivity. -## Conclusion - -By configuring the appropriate database drivers for various databases, you will be equipped to initiate development on your Spring Boot application with JPA. +--- # [Next: Spring Boot and JPA Dependencies](jpa.md) diff --git a/docs/en/jpa/practice/dependencies/jpa.md b/docs/en/jpa/practice/dependencies/jpa.md index fa1ac9c..ec67ad5 100644 --- a/docs/en/jpa/practice/dependencies/jpa.md +++ b/docs/en/jpa/practice/dependencies/jpa.md @@ -52,8 +52,6 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" This dependency simplifies the setup of JPA-based repositories and provides default configurations for Hibernate. -## Conclusion - -By configuring the appropriate Spring Boot dependencies for JDBC and JPA, you will be equipped to initiate development on your Spring Boot application with JPA support. +--- # [Next: Entity Creation](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/jpa-repository.md b/docs/en/jpa/practice/interacting/jpa-repository.md index f2d5b49..e81961e 100644 --- a/docs/en/jpa/practice/interacting/jpa-repository.md +++ b/docs/en/jpa/practice/interacting/jpa-repository.md @@ -48,9 +48,7 @@ public interface CourseRepository extends JpaRepository { The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. -## Conclusion - -You have now created a repository class for managing the `Course` entity in your application. +--- # [Next: Create Record](jpa-repository/create.md) diff --git a/docs/en/jpa/practice/interacting/jpa-repository/create.md b/docs/en/jpa/practice/interacting/jpa-repository/create.md index c9fb4aa..9bcf784 100644 --- a/docs/en/jpa/practice/interacting/jpa-repository/create.md +++ b/docs/en/jpa/practice/interacting/jpa-repository/create.md @@ -33,8 +33,6 @@ The `save(Course course)` method provided by JpaRepository allows us to persist By invoking this method and passing a `Course` object as a parameter, JpaRepository automatically handles the process of persisting the entity to the database. -## Conclusion - -You have now implemented a method within the `CourseRepository` interface using JpaRepository to create records in the `Course` table. This method provides a convenient way to persist data to the database using JpaRepository in your Spring Boot application. +--- # [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/jpa-repository/delete.md b/docs/en/jpa/practice/interacting/jpa-repository/delete.md index 4ff5d38..b24cfcf 100644 --- a/docs/en/jpa/practice/interacting/jpa-repository/delete.md +++ b/docs/en/jpa/practice/interacting/jpa-repository/delete.md @@ -36,8 +36,6 @@ The `deleteById(UUID id)` method signature follows a convention recognized by Jp By adhering to this naming convention, JpaRepository automatically generates the appropriate SQL query behind the scenes to delete the desired record from the database. This simplifies the development process by eliminating the need to write explicit SQL delete statements, allowing developers to focus on defining method signatures that reflect the intended data deletion operations. -## Conclusion - -You have now implemented a method within the `CourseRepository` interface using JpaRepository to delete records from the `Course` table. This method provides a convenient way to delete data from the database using JpaRepository in your Spring Boot application. +--- # [Next: Custom Query](query.md) diff --git a/docs/en/jpa/practice/interacting/jpa-repository/query.md b/docs/en/jpa/practice/interacting/jpa-repository/query.md index 73bef4b..0804429 100644 --- a/docs/en/jpa/practice/interacting/jpa-repository/query.md +++ b/docs/en/jpa/practice/interacting/jpa-repository/query.md @@ -38,7 +38,6 @@ The `@Query` annotation allows us to define custom JPQL (Java Persistence Query By using `@Query`, we can create complex queries tailored to specific data retrieval needs, providing flexibility and control over the database operations. -## Conclusion - -You have now implemented a custom query method within the `CourseRepository` interface using JpaRepository and the `@Query` annotation to retrieve records from the `Course` table based on a specific condition. This method offers a powerful way to execute custom queries in your Spring Boot application, enabling precise data retrieval operations. +--- +# [Next: Tasks](../../../lab-work.md) diff --git a/docs/en/jpa/practice/interacting/jpa-repository/read.md b/docs/en/jpa/practice/interacting/jpa-repository/read.md index 01d2ade..ce7a6b2 100644 --- a/docs/en/jpa/practice/interacting/jpa-repository/read.md +++ b/docs/en/jpa/practice/interacting/jpa-repository/read.md @@ -37,8 +37,6 @@ The `findCoursesByInstructor(String instructor)` method signature follows a spec By adhering to this naming convention, Spring Data JPA automatically generates the appropriate SQL query behind the scenes to fetch the required data from the database. This simplifies the development process by eliminating the need to write explicit SQL queries, allowing developers to focus on defining method signatures that reflect the desired data retrieval operations. -## Conclusion - -You have now implemented a method within the `CourseRepository` interface using JpaRepository to retrieve data from the `Course` table. This method allows you to read data efficiently from the database using JpaRepository in your Spring Boot application. +--- # [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/repository.md b/docs/en/jpa/practice/interacting/repository.md index 2391645..42cd863 100644 --- a/docs/en/jpa/practice/interacting/repository.md +++ b/docs/en/jpa/practice/interacting/repository.md @@ -46,8 +46,6 @@ public class StudentRepository { The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. -## Conclusion - -You have now created a repository for managing the `Student` entity in your application. +--- # [Next: Create Record](repository/create.md) diff --git a/docs/en/jpa/practice/interacting/repository/create.md b/docs/en/jpa/practice/interacting/repository/create.md index a75067b..34e92de 100644 --- a/docs/en/jpa/practice/interacting/repository/create.md +++ b/docs/en/jpa/practice/interacting/repository/create.md @@ -41,8 +41,6 @@ public class StudentRepository { - `entityManager.persist(student)`: This line of code persists the new `Student` entity to the database. -## Conclusion - -You have now implemented a method within the `StudentRepository` class to create new records in the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional functionalities as needed. +--- # [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/repository/delete.md b/docs/en/jpa/practice/interacting/repository/delete.md index c24dc48..25fa2de 100644 --- a/docs/en/jpa/practice/interacting/repository/delete.md +++ b/docs/en/jpa/practice/interacting/repository/delete.md @@ -42,8 +42,6 @@ public class StudentRepository { - `entityManager.remove(studentToDelete)`: This line of code deletes the `Student` entity from the database. -## Conclusion - -You have now implemented a method within the `StudentRepository` class to delete records from the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional delete operations as needed. +--- # [Next: Custom Query](query.md) diff --git a/docs/en/jpa/practice/interacting/repository/query.md b/docs/en/jpa/practice/interacting/repository/query.md index 5b5515c..d8c2129 100644 --- a/docs/en/jpa/practice/interacting/repository/query.md +++ b/docs/en/jpa/practice/interacting/repository/query.md @@ -44,8 +44,6 @@ public class StudentRepository { - `entityManager.createQuery(...)`: This line of code creates a custom JPQL (Java Persistence Query Language) query to fetch records based on the provided criteria (`major` in this example). -## Conclusion - -You have now implemented a method within the `StudentRepository` class to create custom queries and fetch records from the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional custom query operations as needed. +--- # [Next: Create JpaRepository](../jpa-repository.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/repository/read.md b/docs/en/jpa/practice/interacting/repository/read.md index b644506..cd32262 100644 --- a/docs/en/jpa/practice/interacting/repository/read.md +++ b/docs/en/jpa/practice/interacting/repository/read.md @@ -41,8 +41,6 @@ public class StudentRepository { - `entityManager.find(Student.class, id)`: This line of code retrieves the `Student` entity from the database based on the provided `id`. -## Conclusion - -You have now implemented a method within the `StudentRepository` class to read records from the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional read operations as needed. +--- # [Next: Update Record](update.md) diff --git a/docs/en/jpa/practice/interacting/repository/update.md b/docs/en/jpa/practice/interacting/repository/update.md index 9fe82cd..ba2b0bc 100644 --- a/docs/en/jpa/practice/interacting/repository/update.md +++ b/docs/en/jpa/practice/interacting/repository/update.md @@ -41,8 +41,6 @@ public class StudentRepository { - `entityManager.merge(student)`: This line of code updates the `Student` entity in the database. -## Conclusion - -You have now implemented a method within the `StudentRepository` class to update records in the `Student` table using the repository layer and `EntityManager`. This method can be further extended and customized to accommodate additional update operations as needed. +--- # [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/ru/jpa/practice/creation/characteristics.md b/docs/ru/jpa/practice/creation/characteristics.md index 4b5cb6f..0410195 100644 --- a/docs/ru/jpa/practice/creation/characteristics.md +++ b/docs/ru/jpa/practice/creation/characteristics.md @@ -106,6 +106,4 @@ private boolean international; - `online` (boolean): Указывает, является ли курс онлайн. - `startDate` (Date): Дата начала курса. -## Заключение - -Это руководство представило процесс определения характеристик сущностей в проекте Spring Boot с JPA. Установив атрибуты для таблиц, таких как Student, Course и Enrollment, была обеспечена целостность и последовательность данных. Аннотации были использованы для обеспечения ограничений и поведения для каждого атрибута, обеспечивая прочную основу для модели данных приложения. С определенными характеристиками сущностей. +--- diff --git a/docs/ru/jpa/practice/creation/create-entity.md b/docs/ru/jpa/practice/creation/create-entity.md index 7631765..5183fd3 100644 --- a/docs/ru/jpa/practice/creation/create-entity.md +++ b/docs/ru/jpa/practice/creation/create-entity.md @@ -55,8 +55,6 @@ public class Student { Повторите вышеуказанные шаги для создания классов сущностей `Enrollment` и `Course`. -## Заключение - -Теперь вы создали структуру каталогов для ваших сущностей и создали классы сущностей в вашем приложении. +--- # [Далее: Определение Характеристик Сущностей](characteristics.md) diff --git a/docs/ru/jpa/practice/creation/fetching.md b/docs/ru/jpa/practice/creation/fetching.md index c9f22ee..8c83af7 100644 --- a/docs/ru/jpa/practice/creation/fetching.md +++ b/docs/ru/jpa/practice/creation/fetching.md @@ -40,8 +40,6 @@ private List enrollments; В этом сценарии мы выбираем ленивую загрузку (`FetchType.LAZY`). Поскольку нам не всегда нужно получать доступ ко всем записям курса, ленивая загрузка гарантирует, что записи будут извлечены только при явном запросе. -## Заключение - -Это руководство предоставило понимание концепций ленивой и агрессивной загрузки. Понимая сценарии, когда каждая стратегия извлечения подходит, и умея их реализовывать в ваших сущностях, вы теперь готовы оптимизировать извлечение данных и улучшить производительность вашего приложения. +--- # [Далее: Создание Репозитория](../interacting/repository.md) diff --git a/docs/ru/jpa/practice/creation/relationships.md b/docs/ru/jpa/practice/creation/relationships.md index 67fa407..9040aab 100644 --- a/docs/ru/jpa/practice/creation/relationships.md +++ b/docs/ru/jpa/practice/creation/relationships.md @@ -39,8 +39,6 @@ private Student student; private Course course; ``` -## Заключение - -Это руководство прояснило процесс определения связей между сущностями. Установив ассоциации между сущностью `Enrollment` и ее связанными сущностями `Student` и `Course`, вы теперь готовы эффективно реализовывать и управлять связями сущностей в вашем приложении. +--- # [Далее: Стратегии Извлечения](fetching.md) diff --git a/docs/ru/jpa/practice/dependencies/driver.md b/docs/ru/jpa/practice/dependencies/driver.md index e3d7fc3..5867be1 100644 --- a/docs/ru/jpa/practice/dependencies/driver.md +++ b/docs/ru/jpa/practice/dependencies/driver.md @@ -95,8 +95,6 @@ implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' Эти зависимости облегчают подключение к базам данных. -## Заключение - -Настроив соответствующие драйверы баз данных для различных баз данных, вы будете готовы начать разработку вашего приложения Spring Boot с JPA. +--- # [Далее: JPA Настройка зависимостей](jpa.md) \ No newline at end of file diff --git a/docs/ru/jpa/practice/dependencies/jpa.md b/docs/ru/jpa/practice/dependencies/jpa.md index 0ad619f..0247303 100644 --- a/docs/ru/jpa/practice/dependencies/jpa.md +++ b/docs/ru/jpa/practice/dependencies/jpa.md @@ -52,8 +52,6 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" Эта зависимость упрощает настройку репозиториев на основе JPA и предоставляет конфигурации по умолчанию для Hibernate. -## Заключение - -Настроив соответствующие зависимости Spring Boot для JDBC и JPA, вы будете готовы начать разработку вашего приложения Spring Boot с поддержкой JPA. +--- [Далее: Создание сущностей](../creation/create-entity.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository.md b/docs/ru/jpa/practice/interacting/jpa-repository.md index 35dd77d..fd57f6f 100644 --- a/docs/ru/jpa/practice/interacting/jpa-repository.md +++ b/docs/ru/jpa/practice/interacting/jpa-repository.md @@ -47,8 +47,6 @@ public interface CourseRepository extends JpaRepository { Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring. -## Заключение - -Теперь вы создали класс репозитория для управления сущностью `Course` в вашем приложении. +--- # [Далее: Создание записи](jpa-repository/create.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/create.md b/docs/ru/jpa/practice/interacting/jpa-repository/create.md index 4dfb0da..eda726e 100644 --- a/docs/ru/jpa/practice/interacting/jpa-repository/create.md +++ b/docs/ru/jpa/practice/interacting/jpa-repository/create.md @@ -33,8 +33,6 @@ public interface CourseRepository extends JpaRepository { Вызывая этот метод и передавая объект `Course` в качестве параметра, JpaRepository автоматически обрабатывает процесс сохранения сущности в базе данных. -## Заключение - -Теперь вы реализовали метод в интерфейсе `CourseRepository` с использованием JpaRepository для создания записей в таблице `Course`. Этот метод предоставляет удобный способ сохранения данных в базе данных с использованием JpaRepository в вашем приложении Spring Boot. +--- # [Далее: Чтение записи](read.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/delete.md b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md index 2b2e0d9..adea12c 100644 --- a/docs/ru/jpa/practice/interacting/jpa-repository/delete.md +++ b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md @@ -36,8 +36,6 @@ public interface CourseRepository extends JpaRepository { Следуя этому соглашению по именованию, JpaRepository автоматически генерирует соответствующий SQL-запрос для удаления желаемой записи из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы на удаление, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих предполагаемые операции удаления данных. -## Заключение - -Теперь вы реализовали метод в интерфейсе `CourseRepository` с использованием JpaRepository для удаления записей из таблицы `Course`. Этот метод предоставляет удобный способ удаления данных из базы данных с использованием JpaRepository в вашем приложении Spring Boot. +--- # [Далее: Пользовательский запрос](query.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/query.md b/docs/ru/jpa/practice/interacting/jpa-repository/query.md index 7d36333..5d2c4b5 100644 --- a/docs/ru/jpa/practice/interacting/jpa-repository/query.md +++ b/docs/ru/jpa/practice/interacting/jpa-repository/query.md @@ -38,6 +38,6 @@ public interface CourseRepository extends JpaRepository { Используя `@Query`, мы можем создавать сложные запросы, адаптированные к конкретным потребностям извлечения данных, обеспечивая гибкость и контроль над операциями с базой данных. -## Заключение +--- -Теперь вы реализовали метод пользовательского запроса в интерфейсе `CourseRepository` с использованием JpaRepository и аннотации `@Query` для извлечения записей из таблицы `Course` на основе конкретного условия. Этот метод предоставляет мощный способ выполнения пользовательских запросов в вашем приложении Spring Boot, обеспечивая точные операции извлечения данных. +# [Next: Tasks](../../../lab-work.md) \ No newline at end of file diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/read.md b/docs/ru/jpa/practice/interacting/jpa-repository/read.md index fd765c7..7cd66e0 100644 --- a/docs/ru/jpa/practice/interacting/jpa-repository/read.md +++ b/docs/ru/jpa/practice/interacting/jpa-repository/read.md @@ -37,8 +37,6 @@ public interface CourseRepository extends JpaRepository { Следуя этому соглашению по именованию, Spring Data JPA автоматически генерирует соответствующий SQL-запрос за кулисами, чтобы извлечь необходимые данные из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих желаемые операции извлечения данных. -## Заключение - -Теперь вы реализовали метод в интерфейсе `CourseRepository` с использованием JpaRepository для извлечения данных из таблицы `Course`. Этот метод позволяет эффективно читать данные из базы данных с использованием JpaRepository в вашем приложении Spring Boot. +--- # [Далее: Удаление записи](delete.md) diff --git a/docs/ru/jpa/practice/interacting/repository.md b/docs/ru/jpa/practice/interacting/repository.md index 7793aba..16e82e1 100644 --- a/docs/ru/jpa/practice/interacting/repository.md +++ b/docs/ru/jpa/practice/interacting/repository.md @@ -45,8 +45,6 @@ public class StudentRepository { Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring. -## Заключение - -Теперь вы создали репозиторий для управления сущностью `Student` в вашем приложении. +--- # [Далее: Создание записи](repository/create.md) diff --git a/docs/ru/jpa/practice/interacting/repository/create.md b/docs/ru/jpa/practice/interacting/repository/create.md index 75da7d8..8fbbbf9 100644 --- a/docs/ru/jpa/practice/interacting/repository/create.md +++ b/docs/ru/jpa/practice/interacting/repository/create.md @@ -41,8 +41,6 @@ public class StudentRepository { - `entityManager.persist(student)`: Этот код сохраняет новую сущность `Student` в базе данных. -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для создания новых записей в таблице `Student`, используя слой репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для удовлетворения дополнительных функциональных возможностей по мере необходимости. +--- # [Далее: Чтение записи](read.md) diff --git a/docs/ru/jpa/practice/interacting/repository/delete.md b/docs/ru/jpa/practice/interacting/repository/delete.md index bc446d3..c6ade0d 100644 --- a/docs/ru/jpa/practice/interacting/repository/delete.md +++ b/docs/ru/jpa/practice/interacting/repository/delete.md @@ -42,8 +42,6 @@ public class StudentRepository { - `entityManager.remove(studentToDelete)`: Этот код удаляет сущность `Student` из базы данных. -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для удаления записей из таблицы `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций удаления по мере необходимости. +--- # [Далее: Пользовательский запрос](query.md) diff --git a/docs/ru/jpa/practice/interacting/repository/query.md b/docs/ru/jpa/practice/interacting/repository/query.md index 066fb66..b25f84d 100644 --- a/docs/ru/jpa/practice/interacting/repository/query.md +++ b/docs/ru/jpa/practice/interacting/repository/query.md @@ -43,8 +43,6 @@ public class StudentRepository { - `entityManager.createQuery(...)`: Этот код создает пользовательский запрос на JPQL (Java Persistence Query Language) для извлечения записей на основе предоставленного критерия (`major` в этом примере). -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для создания пользовательских запросов и извлечения записей из таблицы `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций пользовательских запросов по мере необходимости. +--- # [Далее: Создание JpaRepository](../jpa-repository.md) diff --git a/docs/ru/jpa/practice/interacting/repository/read.md b/docs/ru/jpa/practice/interacting/repository/read.md index c6de655..36e6af3 100644 --- a/docs/ru/jpa/practice/interacting/repository/read.md +++ b/docs/ru/jpa/practice/interacting/repository/read.md @@ -41,8 +41,6 @@ public class StudentRepository { - `entityManager.find(Student.class, id)`: Этот код извлекает сущность `Student` из базы данных на основе предоставленного `id`. -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для чтения записей из таблицы `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций чтения по мере необходимости. +--- # [Далее: Обновление записи](update.md) diff --git a/docs/ru/jpa/practice/interacting/repository/update.md b/docs/ru/jpa/practice/interacting/repository/update.md index 1324f92..2fe9b31 100644 --- a/docs/ru/jpa/practice/interacting/repository/update.md +++ b/docs/ru/jpa/practice/interacting/repository/update.md @@ -41,8 +41,6 @@ public class StudentRepository { - `entityManager.merge(student)`: Этот код обновляет сущность `Student` в базе данных. -## Заключение - -Теперь вы реализовали метод в классе `StudentRepository` для обновления записей в таблице `Student` с использованием слоя репозитория и `EntityManager`. Этот метод может быть дополнительно расширен и настроен для выполнения дополнительных операций обновления по мере необходимости. +--- # [Далее: Удаление записи](delete.md) From c962e99188e0f61c1066d8dc043d09a82b7ce75d Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:46:10 +0300 Subject: [PATCH 09/40] [JPA] Removed useless files. --- README-EN.md | 12 ------------ README.md | 10 ---------- 2 files changed, 22 deletions(-) delete mode 100644 README-EN.md delete mode 100644 README.md diff --git a/README-EN.md b/README-EN.md deleted file mode 100644 index 8881e33..0000000 --- a/README-EN.md +++ /dev/null @@ -1,12 +0,0 @@ -# Java Web Development with Spring - Lab Works - -Welcome to the Java Web Development with Spring Lab Works! This series of tasks is designed to guide you through various aspects of Java web development using the Spring framework. Each lab work task focuses on specific concepts and practices to help you build a strong foundation in web development. - -## Lab Work Tasks - -1. [**Task 1: Thymeleaf Lab Work**](docs/en/a-thymeleaf/lab-work.md) - - The Thymeleaf Lab Work provides hands-on tasks for configuring Thymeleaf in a Spring application, creating views, handling variables, and more. - - - diff --git a/README.md b/README.md deleted file mode 100644 index ae52517..0000000 --- a/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Java Web Development with Spring - Лабораторные работы - -Добро пожаловать в лабораторные работы по разработке веб-приложений на Java с использованием фреймворка Spring! Этот ряд задач разработан для того, чтобы научить вас различным аспектам веб-разработки на Java с использованием фреймворка Spring. Каждая лабораторная работа фокусируется на конкретных концепциях и практиках, чтобы помочь вам построить прочный фундамент в веб-разработке. - -## Лабораторные работы - -1. [**Лабораторная работа 1: Thymeleaf**](docs/ru/a-thymeleaf/lab-work.md) - - Лабораторная работа по Thymeleaf предоставляет практические задачи по настройке Thymeleaf в приложении Spring, созданию представлений, обработке переменных и многому другому. - From e0c33c35d9387c9f6d9df6e30b1e000e7be07b2b Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:47:23 +0300 Subject: [PATCH 10/40] [SpringSecurity] Removed useless files. --- README-EN.md | 12 ------------ README.md | 10 ---------- 2 files changed, 22 deletions(-) delete mode 100644 README-EN.md delete mode 100644 README.md diff --git a/README-EN.md b/README-EN.md deleted file mode 100644 index 8881e33..0000000 --- a/README-EN.md +++ /dev/null @@ -1,12 +0,0 @@ -# Java Web Development with Spring - Lab Works - -Welcome to the Java Web Development with Spring Lab Works! This series of tasks is designed to guide you through various aspects of Java web development using the Spring framework. Each lab work task focuses on specific concepts and practices to help you build a strong foundation in web development. - -## Lab Work Tasks - -1. [**Task 1: Thymeleaf Lab Work**](docs/en/a-thymeleaf/lab-work.md) - - The Thymeleaf Lab Work provides hands-on tasks for configuring Thymeleaf in a Spring application, creating views, handling variables, and more. - - - diff --git a/README.md b/README.md deleted file mode 100644 index ae52517..0000000 --- a/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Java Web Development with Spring - Лабораторные работы - -Добро пожаловать в лабораторные работы по разработке веб-приложений на Java с использованием фреймворка Spring! Этот ряд задач разработан для того, чтобы научить вас различным аспектам веб-разработки на Java с использованием фреймворка Spring. Каждая лабораторная работа фокусируется на конкретных концепциях и практиках, чтобы помочь вам построить прочный фундамент в веб-разработке. - -## Лабораторные работы - -1. [**Лабораторная работа 1: Thymeleaf**](docs/ru/a-thymeleaf/lab-work.md) - - Лабораторная работа по Thymeleaf предоставляет практические задачи по настройке Thymeleaf в приложении Spring, созданию представлений, обработке переменных и многому другому. - From 0021d0cb7d6136a66ae48ed71c49ac0dbc0b925f Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:49:38 +0300 Subject: [PATCH 11/40] [Thymeleaf] Removed code from old branch --- code/thymeleaf/build.gradle | 36 --- code/thymeleaf/gradlew | 234 ------------------ code/thymeleaf/gradlew.bat | 89 ------- code/thymeleaf/settings.gradle | 1 - .../labs/thymeleaf/ThymeleafApplication.java | 32 --- .../labs/thymeleaf/config/WebMvcConfig.java | 69 ------ .../controllers/PracticeController.java | 68 ----- .../labs/thymeleaf/models/StudentModel.java | 65 ----- .../src/main/resources/application.properties | 9 - .../main/resources/local/practice.properties | 4 - .../resources/local/shared/navbar.properties | 3 - .../resources/templates/account/login.html | 19 -- .../resources/templates/practice/first.html | 16 -- .../resources/templates/practice/fourth.html | 17 -- .../resources/templates/practice/second.html | 46 ---- .../resources/templates/practice/third.html | 67 ----- .../resources/templates/shared/footer.html | 3 - .../main/resources/templates/shared/head.html | 4 - .../resources/templates/shared/header.html | 3 - .../resources/templates/shared/navbar.html | 15 -- 20 files changed, 800 deletions(-) delete mode 100644 code/thymeleaf/build.gradle delete mode 100644 code/thymeleaf/gradlew delete mode 100644 code/thymeleaf/gradlew.bat delete mode 100644 code/thymeleaf/settings.gradle delete mode 100644 code/thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java delete mode 100644 code/thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java delete mode 100644 code/thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java delete mode 100644 code/thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java delete mode 100644 code/thymeleaf/src/main/resources/application.properties delete mode 100644 code/thymeleaf/src/main/resources/local/practice.properties delete mode 100644 code/thymeleaf/src/main/resources/local/shared/navbar.properties delete mode 100644 code/thymeleaf/src/main/resources/templates/account/login.html delete mode 100644 code/thymeleaf/src/main/resources/templates/practice/first.html delete mode 100644 code/thymeleaf/src/main/resources/templates/practice/fourth.html delete mode 100644 code/thymeleaf/src/main/resources/templates/practice/second.html delete mode 100644 code/thymeleaf/src/main/resources/templates/practice/third.html delete mode 100644 code/thymeleaf/src/main/resources/templates/shared/footer.html delete mode 100644 code/thymeleaf/src/main/resources/templates/shared/head.html delete mode 100644 code/thymeleaf/src/main/resources/templates/shared/header.html delete mode 100644 code/thymeleaf/src/main/resources/templates/shared/navbar.html diff --git a/code/thymeleaf/build.gradle b/code/thymeleaf/build.gradle deleted file mode 100644 index 2ed8e23..0000000 --- a/code/thymeleaf/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - // Java - id 'java' - - // Spring - id "org.springframework.boot" version "3.2.2" - id "io.spring.dependency-management" version "1.1.4" -} - -repositories { - mavenCentral() -} - -group = 'edu.labs.thymeleaf' -version = '1.0-SNAPSHOT' - -java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - - -dependencies { - // Spring - def springVersion = '3.2.2' - implementation "org.springframework.boot:spring-boot-starter-web" - testImplementation 'org.springframework.boot:spring-boot-starter-test' - - // Thymeleaf - def thymeleafVersion = "3.1.2.RELEASE" - implementation "org.thymeleaf:thymeleaf-spring6:$thymeleafVersion" -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/code/thymeleaf/gradlew b/code/thymeleaf/gradlew deleted file mode 100644 index 1b6c787..0000000 --- a/code/thymeleaf/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/code/thymeleaf/gradlew.bat b/code/thymeleaf/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/code/thymeleaf/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/code/thymeleaf/settings.gradle b/code/thymeleaf/settings.gradle deleted file mode 100644 index 8304350..0000000 --- a/code/thymeleaf/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'a-thymeleaf' diff --git a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java b/code/thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java deleted file mode 100644 index add1971..0000000 --- a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/ThymeleafApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package edu.labs.thymeleaf; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; - -@SpringBootApplication -public class ThymeleafApplication { - - private static final Logger logger = LoggerFactory.getLogger(ThymeleafApplication.class); - - public static void main(String[] args) { - SpringApplication app = new SpringApplication(ThymeleafApplication.class); - ConfigurableApplicationContext context = app.run(args); - - logServerInfo(context); - } - - private static void logServerInfo(ConfigurableApplicationContext context) { - var env = context.getEnvironment(); - String port = env.getProperty("server.port"); - String contextPath = env.getProperty("server.servlet.context-path"); - - log("Server running at: http://localhost:" + port + contextPath); - } - - private static void log(String message){ - logger.info(message); - } -} \ No newline at end of file diff --git a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java b/code/thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java deleted file mode 100644 index 2d8570b..0000000 --- a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/config/WebMvcConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -package edu.labs.thymeleaf.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ReloadableResourceBundleMessageSource; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.thymeleaf.spring6.SpringTemplateEngine; -import org.thymeleaf.spring6.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; -import org.springframework.context.MessageSource; -import java.time.LocalDateTime; - -@Configuration -public class WebMvcConfig implements WebMvcConfigurer { - - - @Bean - public ClassLoaderTemplateResolver templateResolver() { - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - templateResolver.setPrefix("/templates/"); - templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode(TemplateMode.HTML); - templateResolver.setCharacterEncoding("UTF-8"); - - return templateResolver; - } - - @Bean - public MessageSource messageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.addBasenames( - "classpath:local/practice", - "classpath:local/shared/navbar" - ); - - messageSource.setDefaultEncoding("UTF-8"); - - return messageSource; - } - - @Bean - public ViewResolver thymeleafViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); - resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); - resolver.setTemplateEngine(templateEngine()); - - return resolver; - } - - @Bean - public SpringTemplateEngine templateEngine() { - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(templateResolver()); - templateEngine.setTemplateEngineMessageSource(messageSource()); - - return templateEngine; - } - - - - public void addViewControllers(ViewControllerRegistry registry) { - // First View - registry.addViewController("/first").setViewName("practice/first"); - } -} \ No newline at end of file diff --git a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java b/code/thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java deleted file mode 100644 index 2ba0eeb..0000000 --- a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/controllers/PracticeController.java +++ /dev/null @@ -1,68 +0,0 @@ -package edu.labs.thymeleaf.controllers; - -import edu.labs.thymeleaf.models.StudentModel; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; - -import java.util.ArrayList; -import java.util.List; - -@Controller -public class PracticeController { - - private final List students = new ArrayList<>(); - - public PracticeController(){ - // Populate the list with users - this.students.add(new StudentModel(1,"First", "User", true, 4)); - this.students.add(new StudentModel(2, "Second", "User", false, 2)); - this.students.add(new StudentModel(3, "Third", "User", true, 5)); - this.students.add(new StudentModel(3, "Fourth", "User", false, 3)); - } - - @GetMapping("/second") - public String secondPracticeView(Model model){ - model.addAttribute("title", "second task"); - model.addAttribute("students", this.students); - return "practice/second"; - } - - @GetMapping("/third") - public String thirdPracticeView(Model model){ - model.addAttribute("title", "third task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - - @PostMapping("/removeStudent") - public String removeStudent(){ - - return "redirect:/third?removedStudent"; - } - - @GetMapping("/fourth") - public String fourthPracticeView(Model model){ - model.addAttribute("title", "fourth task"); - model.addAttribute("students", this.students); - model.addAttribute("model", new StudentModel()); - - return "practice/fourth"; - } -} diff --git a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java b/code/thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java deleted file mode 100644 index 20320e3..0000000 --- a/code/thymeleaf/src/main/java/edu/labs/thymeleaf/models/StudentModel.java +++ /dev/null @@ -1,65 +0,0 @@ -package edu.labs.thymeleaf.models; - -public class StudentModel { - private Integer id; - private String firstName; - private String sureName; - private Boolean isGraduated; - private Integer mark; - - public StudentModel() { - } - - public StudentModel(Integer id, String firstName, String sureName, Boolean isGraduated, Integer mark) { - this.id = id; - this.firstName = firstName; - this.sureName = sureName; - this.isGraduated = isGraduated; - this.mark = mark; - } - - // Getter and setter methods for id - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - // Getter and setter methods for firstName - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - // Getter and setter methods for sureName - public String getSureName() { - return sureName; - } - - public void setSureName(String sureName) { - this.sureName = sureName; - } - - // Getter and setter methods for isGraduated - public Boolean getIsGraduated() { - return isGraduated; - } - - public void setIsGraduated(Boolean isGraduated) { - this.isGraduated = isGraduated; - } - - // Getter and setter methods for mark - public Integer getMark() { - return mark; - } - - public void setMark(Integer mark) { - this.mark = mark; - } -} diff --git a/code/thymeleaf/src/main/resources/application.properties b/code/thymeleaf/src/main/resources/application.properties deleted file mode 100644 index 8e7f68f..0000000 --- a/code/thymeleaf/src/main/resources/application.properties +++ /dev/null @@ -1,9 +0,0 @@ -# Server Configurations -spring.application.name= FirstLabWork -server.port=8080 -server.servlet.context-path=/ - -# logger -logging.level.org.springframework.security=DEBUG -logging.level.org.hibernate.SQL=DEBUG -logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE \ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/local/practice.properties b/code/thymeleaf/src/main/resources/local/practice.properties deleted file mode 100644 index 8ca4c87..0000000 --- a/code/thymeleaf/src/main/resources/local/practice.properties +++ /dev/null @@ -1,4 +0,0 @@ -student.name= MyName -student.group= PRE-121 -message.welcome= Welcome, {0} -message.info= Your Group is: {0} diff --git a/code/thymeleaf/src/main/resources/local/shared/navbar.properties b/code/thymeleaf/src/main/resources/local/shared/navbar.properties deleted file mode 100644 index ebea752..0000000 --- a/code/thymeleaf/src/main/resources/local/shared/navbar.properties +++ /dev/null @@ -1,3 +0,0 @@ -nav.string.login=Login -nav.string.signup=Signup -nav.message.welcome= Welcome, {0} diff --git a/code/thymeleaf/src/main/resources/templates/account/login.html b/code/thymeleaf/src/main/resources/templates/account/login.html deleted file mode 100644 index 72f28f1..0000000 --- a/code/thymeleaf/src/main/resources/templates/account/login.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - -
-
- - -
- - - - - - \ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/practice/first.html b/code/thymeleaf/src/main/resources/templates/practice/first.html deleted file mode 100644 index 2b37a93..0000000 --- a/code/thymeleaf/src/main/resources/templates/practice/first.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Title - - - -

Project Name

-

Current Date and Time

-

-

-
- Next Task - - \ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/practice/fourth.html b/code/thymeleaf/src/main/resources/templates/practice/fourth.html deleted file mode 100644 index dcd0056..0000000 --- a/code/thymeleaf/src/main/resources/templates/practice/fourth.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -
- - -
- - -
- - - diff --git a/code/thymeleaf/src/main/resources/templates/practice/second.html b/code/thymeleaf/src/main/resources/templates/practice/second.html deleted file mode 100644 index 50350c2..0000000 --- a/code/thymeleaf/src/main/resources/templates/practice/second.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Page Title - - - -

Default

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
GoodVery GoodExcellentNot PassedBlueBlueRedNo Diploma
- - Next Task - - \ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/practice/third.html b/code/thymeleaf/src/main/resources/templates/practice/third.html deleted file mode 100644 index 73ca371..0000000 --- a/code/thymeleaf/src/main/resources/templates/practice/third.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Page Title - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
-

Error:

-
- -
-

- - -

-

- - -

-

- - -

-

- - -

-

- - -

- -
-
- -
- Remove Student - -
-

Student Removed Successfully!

-
- -
-

- - -

- -
- -
- - \ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/shared/footer.html b/code/thymeleaf/src/main/resources/templates/shared/footer.html deleted file mode 100644 index 0de5f36..0000000 --- a/code/thymeleaf/src/main/resources/templates/shared/footer.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

Copyrights of lab is for student

-
\ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/shared/head.html b/code/thymeleaf/src/main/resources/templates/shared/head.html deleted file mode 100644 index 452c561..0000000 --- a/code/thymeleaf/src/main/resources/templates/shared/head.html +++ /dev/null @@ -1,4 +0,0 @@ - - - Page Title - \ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/shared/header.html b/code/thymeleaf/src/main/resources/templates/shared/header.html deleted file mode 100644 index 67fc23d..0000000 --- a/code/thymeleaf/src/main/resources/templates/shared/header.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/code/thymeleaf/src/main/resources/templates/shared/navbar.html b/code/thymeleaf/src/main/resources/templates/shared/navbar.html deleted file mode 100644 index 5b48dbb..0000000 --- a/code/thymeleaf/src/main/resources/templates/shared/navbar.html +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file From 8a86b67617a29879203025d77b8c0777e3d12fb3 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 14 May 2024 03:51:01 +0300 Subject: [PATCH 12/40] [Transactions] Removed useless files. --- README-EN.md | 13 ------------- README.md | 13 ------------- 2 files changed, 26 deletions(-) delete mode 100644 README-EN.md delete mode 100644 README.md diff --git a/README-EN.md b/README-EN.md deleted file mode 100644 index ce459c3..0000000 --- a/README-EN.md +++ /dev/null @@ -1,13 +0,0 @@ -# Java Web Development with Spring - Lab Works - -Welcome to the lab works on Java web development using the Spring framework! This series of tasks is designed to teach you various aspects of Java web development using the Spring framework. Each lab work focuses on specific concepts and practices to help you build a strong foundation in web development. - -## Lab Works - -1. [**Lab Work 1: Thymeleaf**](docs/en/a-thymeleaf/lab-work.md) - - The Thymeleaf lab work provides practical tasks for configuring Thymeleaf in a Spring application, creating views, processing variables, and much more. - -2. [**Lab Work 2: Spring Security**](docs/en/b-springsecurity/lab-work.md) - - In this lab work, you will learn about various aspects of security in Spring applications using Spring Security. By completing practical tasks, you will learn to configure authentication, authorization, protect paths and resources, use custom login forms, and much more. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index e72552f..0000000 --- a/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Java Веб-разработка с использованием Spring - Лабораторные работы - -Добро пожаловать в лабораторные работы по разработке веб-приложений на Java с использованием фреймворка Spring! Этот ряд задач разработан для того, чтобы научить вас различным аспектам веб-разработки на Java с использованием фреймворка Spring. Каждая лабораторная работа фокусируется на конкретных концепциях и практиках, чтобы помочь вам построить прочный фундамент в веб-разработке. - -## Лабораторные работы - -1. [**Лабораторная работа 1: Thymeleaf**](docs/ru/a-thymeleaf/lab-work.md) - - Лабораторная работа по Thymeleaf предоставляет практические задачи по настройке Thymeleaf в приложении Spring, созданию представлений, обработке переменных и многому другому. - -2. [**Лабораторная работа 2: Spring Security**](docs/ru/b-springsecurity/lab-work.md) - - В этой лабораторной работе вы изучите различные аспекты безопасности приложений Spring с использованием Spring Security. Выполняя практические задания, вы научитесь настраивать аутентификацию, авторизацию, защищать пути и ресурсы, использовать пользовательские формы входа и многое другое. From 31edb9df03b9c076c25ffe6148152f2217cb2c80 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 20 May 2024 07:06:21 +0300 Subject: [PATCH 13/40] [Master] Last Decision for practice --- docs/en/transactions/img.png | Bin 0 -> 104306 bytes .../en/transactions/practice/configuration.md | 40 +++++++ docs/en/transactions/practice/isolation.md | 0 .../practice/isolation/read-committed.md | 0 .../practice/isolation/read-uncommitted.md | 0 .../practice/isolation/repeatable-read.md | 0 .../practice/isolation/serializable.md | 0 .../en/transactions/practice/lessons/first.md | 38 +++++++ .../transactions/practice/lessons/fourth.md | 66 +++++++++++ .../transactions/practice/lessons/second.md | 50 +++++++++ .../en/transactions/practice/lessons/third.md | 105 ++++++++++++++++++ docs/en/transactions/practice/propagation.md | 0 .../practice/propagation/mandatory.md | 0 .../practice/propagation/never.md | 0 .../practice/propagation/not-supported.md | 0 .../practice/propagation/required.md | 0 .../practice/propagation/requires_new.md | 0 .../practice/propagation/supports.md | 0 docs/srcs/transactions/er-diagram.png | Bin 0 -> 131421 bytes 19 files changed, 299 insertions(+) create mode 100644 docs/en/transactions/img.png delete mode 100644 docs/en/transactions/practice/isolation.md delete mode 100644 docs/en/transactions/practice/isolation/read-committed.md delete mode 100644 docs/en/transactions/practice/isolation/read-uncommitted.md delete mode 100644 docs/en/transactions/practice/isolation/repeatable-read.md delete mode 100644 docs/en/transactions/practice/isolation/serializable.md create mode 100644 docs/en/transactions/practice/lessons/first.md create mode 100644 docs/en/transactions/practice/lessons/fourth.md create mode 100644 docs/en/transactions/practice/lessons/second.md create mode 100644 docs/en/transactions/practice/lessons/third.md delete mode 100644 docs/en/transactions/practice/propagation.md delete mode 100644 docs/en/transactions/practice/propagation/mandatory.md delete mode 100644 docs/en/transactions/practice/propagation/never.md delete mode 100644 docs/en/transactions/practice/propagation/not-supported.md delete mode 100644 docs/en/transactions/practice/propagation/required.md delete mode 100644 docs/en/transactions/practice/propagation/requires_new.md delete mode 100644 docs/en/transactions/practice/propagation/supports.md create mode 100644 docs/srcs/transactions/er-diagram.png diff --git a/docs/en/transactions/img.png b/docs/en/transactions/img.png new file mode 100644 index 0000000000000000000000000000000000000000..844084fc454346d65cfccd006179610e87af67a6 GIT binary patch literal 104306 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%0Doz_3otVV+-_8v@y#DPhY-^dbE4;q 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/en/transactions/practice/configuration.md b/docs/en/transactions/practice/configuration.md index e69de29..e014ddb 100644 --- a/docs/en/transactions/practice/configuration.md +++ b/docs/en/transactions/practice/configuration.md @@ -0,0 +1,40 @@ +# Transaction Setup + +## Introduction + +This guide focuses on setting up transaction management in a Spring Boot project. It provides step-by-step instructions for enabling transaction management and configuring transaction attributes. + +## Goal + +The goal of this guide is to demonstrate how to configure transaction management in a Spring Boot application, allowing for the management of database transactions. + +## Transaction Management Setup + +To enable transaction management in your Spring Boot project, follow these steps: + +1. Add the necessary dependencies to your `pom.xml` or `build.gradle` file. Ensure that you have dependencies for Spring Boot, Spring Data JPA, and any database driver you are using (e.g., H2, MySQL, PostgreSQL). + +2. Configure transaction management in your Spring Boot application. You can do this by annotating your main application class with `@EnableTransactionManagement`. + +### Example (Java Config): + +```java +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} +``` +--- + +# [Next: Create the Entities and Repositories](lessons/first.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/isolation.md b/docs/en/transactions/practice/isolation.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/isolation/read-committed.md b/docs/en/transactions/practice/isolation/read-committed.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/isolation/read-uncommitted.md b/docs/en/transactions/practice/isolation/read-uncommitted.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/isolation/repeatable-read.md b/docs/en/transactions/practice/isolation/repeatable-read.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/isolation/serializable.md b/docs/en/transactions/practice/isolation/serializable.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/lessons/first.md b/docs/en/transactions/practice/lessons/first.md new file mode 100644 index 0000000..24b825c --- /dev/null +++ b/docs/en/transactions/practice/lessons/first.md @@ -0,0 +1,38 @@ +# Lesson 1: Create the Entities and Repositories + +## Goal + +The goal of this task is to define the core entities (Student, Course, Enrollment, Log) and set up the corresponding repositories in a Spring Boot project using Spring Data JPA. + +## Steps + +1. **Refer to the provided ER diagram to define the entity classes.** + ![er-diagram.png](../../../../srcs/transactions/er-diagram.png) + If you already have the entity classes based on the provided ER diagram, proceed to step 2. Otherwise, analyze the ER diagram and create the following entity classes: + + - Student + - Course + - Enrollment + - Log + + Ensure that each entity class includes the necessary attributes as depicted in the ER diagram. + +2. **Create the repositories for the entities.** + + For example, let's create the repository for the `Student` entity: + + ```java + package com.example.demo.repository; + + import com.example.demo.entity.Student; + import org.springframework.data.jpa.repository.JpaRepository; + + public interface StudentRepository extends JpaRepository { + } + ``` + + If you already have the entity repositories, proceed to next step. Else, repeat the above step for the repositories of the remaining entities (Course, Enrollment, Log). + +--- + +# [NEXT: Implementing Basic Transactional Operations](second.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/fourth.md b/docs/en/transactions/practice/lessons/fourth.md new file mode 100644 index 0000000..5ec8ec5 --- /dev/null +++ b/docs/en/transactions/practice/lessons/fourth.md @@ -0,0 +1,66 @@ +# Lesson 4: Implementing Nested Transactions and Non-Transactional Operations + +## Goal + +This part aims to explore the use of nested transactions and non-transactional operations within the service layer, providing students with insights into managing complex transactional scenarios. + +## Steps + +1. **Updating Course Details and Enrollments** + + **Scenario**: As a university administrator, you often need to update both the course details and the enrollments associated with that course. This operation should ensure data consistency and integrity, even if multiple updates are performed simultaneously. + + **Implement `updateCourseAndEnrollments` Method**: Define a method to update the course details and enrollments with the required transactional behavior. We use `Propagation.REQUIRED` to ensure that this method participates in any existing transaction or creates a new one if none exists. Setting `Isolation.REPEATABLE_READ` ensures that the data read by this method remains consistent throughout the transaction. Inside this method, we perform a nested transaction by calling the `updateEnrollments` method to update enrollments, ensuring that this operation is atomic and isolated from the outer transaction. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ) + public void updateCourseAndEnrollments(UUID courseId, String newTitle) { + // Log the start of the update process + logAction("Update Course and Enrollments", "Start"); + + try { + // Implementation to update course details + // ... + + // Nested transaction to update enrollments + updateEnrollments(courseId); + + // Log successful update + logAction("Update Course and Enrollments", "Success"); + } catch (Exception e) { + // Log failure + logAction("Update Course and Enrollments", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +2. **Updating Enrollments Independently** + + **Scenario**: Certain administrative tasks may require updating enrollments independently of course updates. This operation should maintain data consistency while allowing for separate transactional control. + + **Implement `updateEnrollments` Method**: Define a method to update enrollments for a course with nested transactional behavior. We use `Propagation.NESTED` to indicate that this method is executed within the scope of the outer transaction but can be rolled back independently if needed. Setting `Isolation.REPEATABLE_READ` ensures that the data read by this method remains consistent throughout the transaction. + + ```java + @Transactional(propagation = Propagation.NESTED, isolation = Isolation.REPEATABLE_READ) + public void updateEnrollments(UUID courseId) { + // Log the start of the enrollment update process + logAction("Update Enrollments", "Start"); + + try { + // Implementation to update enrollments + // ... + + // Log successful update + logAction("Update Enrollments", "Success"); + } catch (Exception e) { + // Log failure + logAction("Update Enrollments", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +--- + +# [NEXT: Tasks](../../lab-work.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/second.md b/docs/en/transactions/practice/lessons/second.md new file mode 100644 index 0000000..643c1c9 --- /dev/null +++ b/docs/en/transactions/practice/lessons/second.md @@ -0,0 +1,50 @@ +# Lesson 2: Implementing Basic Transactional Operations + +## Goal + +This part aims to introduce simple yet important transactional methods for enrolling students and managing courses in a Spring Boot application. + +## Steps + +1. **Enrolling a Student in a Course** + + **Scenario**: As a university administrator, you need to enroll a student in a course. This action should be smooth and ensure that even if multiple enrollments happen at the same time or if there are any database issues, data integrity remains intact. + + **Implement `enrollStudentInCourse` Method**: Create a method to enroll a student in a course. Ensure that this process is transactional, meaning it's like a single package deal that guarantees everything happens correctly together. We use `Propagation.REQUIRED` to ensure that this method participates in any existing transaction or creates a new one if none exists. Additionally, we set `Isolation.SERIALIZABLE` to ensure that even if there are concurrent transactions, they don't interfere with each other, maintaining the integrity of the data. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) + public void enrollStudentInCourse(UUID studentId, UUID courseId) { + // Your implementation here + } + ``` + +2. **Fetching Students for a Course** + + **Scenario**: To create a class roster for a course, you need to fetch a list of students who have enrolled. This operation should make sure that you always get an accurate view of the database, even if other activities are happening simultaneously. + + **Implement `getStudentsForCourse` Method**: Develop a method to retrieve students for a particular course. It should ensure that the data you fetch is consistent, regardless of any ongoing transactions. We use `Propagation.REQUIRED` to make sure this method participates in any existing transaction or creates a new one if none exists. We set `Isolation.READ_COMMITTED` to ensure that the data we fetch is committed and visible to other transactions, maintaining consistency. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) + public List getStudentsForCourse(UUID courseId) { + // Your implementation here + } + ``` + +3. **Adding a New Course** + + **Scenario**: A new course is about to be introduced to the curriculum. When adding it to the system, you want to make sure this operation doesn't interfere with anything else going on, maintaining its independence. + + **Implement `addNewCourse` Method**: Create a method to add a new course to the system. Make sure this process doesn't get tangled up with any other ongoing transactions. We use `Propagation.NOT_SUPPORTED` to ensure that this method doesn't participate in any existing transaction, giving it autonomy and avoiding any potential conflicts with other operations. + + ```java + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Course addNewCourse(String title) { + // Your implementation here + } + ``` + +--- + +# [NEXT: Enhancing Transactional Methods with Detailed Logging](third.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/third.md b/docs/en/transactions/practice/lessons/third.md new file mode 100644 index 0000000..ea91ce8 --- /dev/null +++ b/docs/en/transactions/practice/lessons/third.md @@ -0,0 +1,105 @@ +# Lesson 3: Enhancing Transactional Methods with Detailed Logging + +## Goal + +This part aims to integrate detailed logging for each transactional operation, ensuring actions are logged with their outcomes. + +## Steps + +1. **Implementing the Logging Method** + + **Scenario**: Before enhancing transactional methods with logging, we need to implement a method to handle logging independently of the main transaction. This ensures that logging occurs reliably, regardless of the outcome of the main transaction. + + **Implement `logAction` Method**: Create a method to log actions independently, ensuring accurate tracking of transaction outcomes. We use `Propagation.REQUIRES_NEW` to execute the logging operation in a separate transaction, making it independent of any ongoing transactions and guaranteeing its completion even if the main transaction fails. + + ```java + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void logAction(String action, String outcome) { + Log log = new Log(action, outcome, LocalDateTime.now()); + logRepository.save(log); + } + ``` + +2. **Logging Enrollment of a Student in a Course** + + **Scenario**: As a university administrator, you need to log the enrollment of a student in a course to keep track of successful enrollments and any potential failures. + + **Enhance `enrollStudentInCourse` Method**: Modify the method to log the action's success or failure. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) + public void enrollStudentInCourse(UUID studentId, UUID courseId) { + // Log the start of the enrollment process + logAction("Enroll Student", "Start"); + + try { + // Implementation to enroll the student in the course + // ... + + // Log successful enrollment + logAction("Enroll Student", "Success"); + } catch (Exception e) { + // Log failure + logAction("Enroll Student", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +3. **Logging Retrieval of Students for a Course** + + **Scenario**: To maintain an audit trail of course-related activities, you need to log the retrieval of students for a course and ensure that the logging occurs even in case of exceptions. + + **Enhance `getStudentsForCourse` Method**: Modify the method to log the action's success or failure. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) + public List getStudentsForCourse(UUID courseId) { + // Log the start of retrieving students for the course + logAction("Retrieve Students for Course", "Start"); + + try { + // Implementation to retrieve students for the course + // ... + + // Log successful retrieval + logAction("Retrieve Students for Course", "Success"); + return students; + } catch (Exception e) { + // Log failure + logAction("Retrieve Students for Course", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +4. **Logging Addition of a New Course** + + **Scenario**: When adding a new course, it's essential to log the outcome of the operation to track the success or failure of the addition. + + **Enhance `addNewCourse` Method**: Modify the method to log the action's success or failure. + + ```java + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Course addNewCourse(String title) { + // Log the start of adding a new course + logAction("Add New Course", "Start"); + + try { + // Implementation to add a new course + // ... + + // Log successful addition + logAction("Add New Course", "Success"); + return savedCourse; + } catch (Exception e) { + // Log failure + logAction("Add New Course", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +--- + +# [NEXT: Implementing Nested Transactions and Non-Transactional Operations](fourth.md) diff --git a/docs/en/transactions/practice/propagation.md b/docs/en/transactions/practice/propagation.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/propagation/mandatory.md b/docs/en/transactions/practice/propagation/mandatory.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/propagation/never.md b/docs/en/transactions/practice/propagation/never.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/propagation/not-supported.md b/docs/en/transactions/practice/propagation/not-supported.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/propagation/required.md b/docs/en/transactions/practice/propagation/required.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/propagation/requires_new.md b/docs/en/transactions/practice/propagation/requires_new.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/en/transactions/practice/propagation/supports.md b/docs/en/transactions/practice/propagation/supports.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/srcs/transactions/er-diagram.png b/docs/srcs/transactions/er-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..92809d00310859d2470d4037cca5555c3ba73863 GIT binary patch literal 131421 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 (r*#}%z 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�x<>W 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 literal 0 HcmV?d00001 From 2b748f579fb1ff487bfc5d4c882e0e896e9d6fe2 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 20 May 2024 07:06:40 +0300 Subject: [PATCH 14/40] [Master] Deleted useless file --- docs/en/transactions/img.png | Bin 104306 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/en/transactions/img.png diff --git a/docs/en/transactions/img.png b/docs/en/transactions/img.png deleted file mode 100644 index 844084fc454346d65cfccd006179610e87af67a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104306 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%0Doz_3otVV+-_8v@y#DPhY-^dbE4;q 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 z zOyo2%(JpWuz^}RQ@m%0>7O-d_Z^B;(p@==K0yg=r;$D1ERP|Deb1akXd4#Nws-|}0 zEvUnN^P8fDULi_|C;wUp>DT-ODQln2$>mkUirODbm~REr4e%2X0#NSqkx>knM{sd2 zpq{EJl|(nz^Fg~kRL$kD z6e_1liIHE~%h2Ejxwa&N@KnS=u=3{1zs`&q>XYhR4k{z5vHOQN>K0!LPh;xhkT0XB zB7Bik$8MT7X-)0wS}CW6L&36sd6H|}OBP$hOB*b}U(&WDYaQ3@;uub^G(sPYx-%<^ znUF{}X1aO{vAVyYd6)gGhZxL}-L`wu6)5J>VK~Ymz}KSPv1p3EhME7&6Ft8_Xt6i) z$k#{md9j#lLbBH(T1Sc}bfg{Xh{%_qis75vc1}Gc%@|s(I*NX6Gw(zV&@rZ>Fa?n344Dq^;kHpW`G8Jw#mGc4pu)SjmOJ6` zawl1(JbpKt>K|mULC*MZLocp519~x_ilUvGDu3X?oxapUsN~-?Jv)2tB`uRb6~8MS zDwR1gtil%S`$epTX{VpLSei8E#J(`IIeffK0d-`EOc_3NnC#3bT-f4A`7{)=kDw0l2s@wqv0;QIdK{A z6E-|7dzsoB71$Fb`EsCHyCL3?XU{Pq7*SE8#31sJqk%;z1trhqsKTCrxwE6{de;f8 zp)~~jd8u<#A?KHW9(3sBVgMctG{5>3COv8+i|EMQ~ ze!BBqMw-Xv8t70Q%xnEk2I$Pk{CJ}{z{LdXah3(c9=i(;i}C_lvhd@@6e0mq9T*@4 zM1jC_U^q;V7pWKB#KVcemqN(m{2uAwU+_2vpY15%Gv4sW%NPVbY!wK&2?)i&zs3iV z2=zD!;HDwIvH!ks}+ZSHAOa+zt-BOL9 zAuL^c9n9c8mqiboTi%xOzXm(neSDx7E-+EqHh}wB#N-p*JCRZ@Yw+Dtd8FR(_X-M% z?n%>L;p0Pyi+kr&7}N?AGw_j_4}DY(LKdp?ZJ1%FLPEK2;MafOivoI*fgcpT@Ym+5 z+rH6AZ!Hhkbmsx7uwboJ;|p$YI-!k_EE^aJl{RxPm~a>($7^}8UVfIq&5egvH@Z@) z0|mpv0Ud4Q1ATZVQG7_2NQ^~%1nKC!c3?$&ijJQ*SpcG76kqMfme|YVuo+ZrY#I1d zGx1$@q^HFh^frOG{40h}VQA~s%%%eb*$aIb!D%vd8zu6XuzrgZXpTEAH^Y}7a>}2! z6&?MwW!>^;8i9=n z{|pYrF0)UMNxZOWS9f(^8#{Om!7-Mp$ona{IvO7L1P_|Y1S|bGO?8E$uV262r_Vn| zAoLD()(CANVOr3|sx~8@o6T2RF3$;5BxiBGeUX`W$on&s?0(2FD`$|nnPzTpn0%a3 zU9CJ{SyOw_?|>uMSAB$s;%R0?V|s{*#_|TFE5)X$k2y2wH}|M3d+?9NII|e(o935} z*mjNTyR{&8UOa{pWgr;E3dhXnD9dm07rpI<1D*fMi+S(IJffZqYHBEM2X!Qs%JSgF zw(2@#F;0t&ynSGaoDu|4S{W;x-1HI?F}RnF?;Xd7oLg;T3XjHr%a)tR{Qfy%iwd`< zS2X3G;0yOpf_*Xy8fyo{Z^u8l8F&iOo&s6)87L;q@S?b5>O`V+10y#eM1^P}@Iw8NWs|^9Z=~WG`pYi5pea|!-b3DPDb!|+THhX#)*Us3Va+AdPtJd2jkOqcXokI1vIZ^PC)iz2h&kSPm zks6=RnMb`!u{e@4fRDfukF8+US}394mPO+=c8n1tI86!VDcpGeX-t=q;*0pbKyY0F zVS?b2ux0x*p2#|Jtq~ay zOv3Z%Z6b8K=w`4|*=xvV2T13$-y~>}#(oFE$rMTP0kD})YS3Fa;zYt(~PFVC3 z+f4Z<&epO?d15yE41wRe%9g_`eTAHom3dAyfz=rNQ#O6Dop=0$Y^Du|Pa@-R=K9@gyOK65VfEm63a;*sj3Em12p`(h zbIX;apBaw6;emxrT*D(pd>N|~2ZMD!JprNmzU zDw7LN2F;{w{}k0T>G5K5rXfSyPQeBD6{EW_%UdBVzd3h*EwlyHc4psclD`+oUONJP zrA>twvetW$X0_uKu0XBnnBT3;bXg4yU;@eb{( z-*a7mxCZwGUL0U+-HIRf<7Q2EB`$zjOSuU=RHZsIGL}yvh7BkCVyCoyKOB8Et3P_Q*!Vx+~ zvW3}A4`4><$(xVokh2>aj>24fP6urmk;Bdt1c%;2K4v~UvLMWS+h520%tifNEnY{r zBP$z&o);Eh-;N*O=Gz>FON^D6*YnoUvT&TuS65=RfX`ODEH>3#>V{M{mzJP&{HJ@8 zrUtd^Z0}lc`D^aeK%L1QXDUc!bU4rl6;1hdx4WS|J1Rq3^&DIZtDS`eG3d3G(oxXQ z6>NFlU&)KSPW#S=I@C>-PDWSKDyc&@Ix)65pB7O`-k1xi!dbWiF_Hw2^di{7nsyGS zSE$^fzpdUh710-0=50rXAfZ3pjewXP5xRekmAf3CuGYK!n!uxgyVMNi4~Du~>${Z^ zHOo{YVRxzEk&C&KaiH2Qb2>}$kb}99Ceo?+_;^GmQX$G16i_Wni*)O+ovvQBI@im5QMF^*j(cJS!)k}vMAf(*$e@guUG@+BMR3(^6x;JDM>MgA%>rnHe)(KBCb^8iP$|qs)D+5HTVX* zdvGwC_r&Aaq?ArY`$K4oJKwF%zFCe<$uGzpf04KhCr9e}O`dbwofyPOwz@MF6tZa8 ztWte%4Nb3;)oWbm{p6lJc4!*(&a-hX5T&It&Id+rC)PE5=XN;hxPte0tl!%0P={#Y zz%>5i5nb1wSJd2JNSIE~R}lI?lm>&Z;EWwH=_XnUTE*~}% ziFdN=o~z2H8PC1G9647ODZQLdAKJ$N-Ed5*;NONN>EU^PTTWa$Te-2y2^*!t;Qx`@ z-=~(-y-MY>|7Fp$Yy*^zSeNfTNz2vqA=Yy_0fZncQhV40gH>f3j#8h+#3p=7gZ#NB zR$m17fh(B3ZA?LOqWSv5TK*5`>X2P*5t7QvuKPh5TuyG^KfisW{h zIosbSWBSv0ZtAk{PT31X(MNa^N4+0h6h8t{$&u2O=}Td3Sht_ZtH4Nx8tVxWF<>fP zqqw%)ZmBa`BgaDZ4ifQ1UF&GWpGe0SZ008@#q_|9*I<9*}6&E%Rejw;^yUgZFQZoJaCD;1%IVaonP!jH&>Mm!GuU|^RkLkrVp?&Ak z@MpoJVU#Hdu7xZ#_6KSQahX&0WAZg%wiDoy@}nYBBSnBiMu8!mqZfC*NB0UMc8A&< zL@>8VoWBmDR5mc_jNF8Ur**hk!lox>etyg8(%XER{=M4=hk+jRUNI%KCpO@kAE^3) z+pjx|=aQ(VV-k5W0X= zz2VEo(nxBCmPs;KLT2v&#ok-SRn>Lg!5;xv8qsrOn=@-b@ zZj-Q$eUbR<`U=x6lmQCtSOjUyoH9m$C4Mm+F(kWv)*q>Ye_ZzvSC{zIyJ?Ma?Dm{$5o`gK^y)%k5F>&DwLC7%KG%who|UK|_)-{h|5M4Sin;*6(oHxmw_=p0 z5@~Zpo%N5OOllj`IUtw28-r}MHxdNsxCN%Ts^R`3jqCY02Ok`T*oj#zqEge~33=Wg zFW*&8QL6eW{#k>&FhkXX&epM>m?an*lKwDOBH2old%n*)J7vC@!go1fy2ijb5H>P& z4ceTet2Q{iAB)wsERgdJg2`IfE=wUY1TNU>kIZ6{V4jxR{c3iF?{km%6^ZV9H{ANH z?w%(xz>*LM3l!ZZO3zySo^#mNGjQUp!uE?kGY&eK1-yQq5u5;J&?|IRp{#K4+Ihhv@|m4n-<05SEC6 zDy-OXAD*Mc#JW=~lM;c&80Ykl>3Zp0IvlK*x`45p$WI&d+o3Mw;LopR`b2V@*LvIc zs6_R<`bqmc%5w{0KjKTS_MKuyxIo^v3tGAYoEY6Ex&Gk!w98`%Sw}Mg12n#>;`WvJ zxyO}BG^8NIK7aqFT2({0jO-EP=cLE_?l%t)((=sro_Aa? z-i|0}N%fdekcVKIm@_OYxTumAbWA22ndd7AIA7~=aefecXd^nTXx;kU#+usMvb>x8pm0Ds7g-qB_H7)!Y?7FG$ zX@`Wd0He-e^&?^#3xqaJP%S5BV6mIUe8e_NaG0{v@)L~TA z+0f1bWgmN~1}hYfWr9Ov>5JUqb{)e9EBcn|5*(v56(R=kfs=zzxQ=~`I#q>yK0OVm za(>c%E?CsPSQ+pP$Y5h-39||IJ{#4Bb87j2v49l;L(G4h2NkA9uuttbaxr;d32lU; zgE^ns|8{zibZ^kk^AIYE1o&7`ABhwIiw};pdPEI znU(#{`|aL>u63NJhsVeINtA#Mf!kh{_64|MF7K}-^GH2p#I&V$`9$E8Kx%EXGmV;HSYJ)Fqt`gBoT9! z4%CGaDsN@yzUEK2RvK{;HcUE_NI;**>X+Wl;j+aqe{X8Br*LSo{eZ;u{Cue$mKere z!HZw3!P1QidI2lqQF(l9x9a%WJ%B)Z=nh*jy9Hkvghg=Iz&EI&-fZmW>c388T0ZPL zP9e=aQBL7@V5{po4r}>b>+YsAucS`>=+`{0#o3hCE?HPe0j2+7I!E}&-V_$3tXaEu0f>b-$&6|Z3a=K6?`uF@2=&sr4LBdSOdMaE}tA~oT! zyFJ|*)>9gJX1d3!b0$Kqx^p`;=e>qcr!fQOO)KNF#xQZz7nczf2zvQS1tcizG1sUe zZM*fu-<)2Ijka61a$GE{e#UNmW&Bw@sUDYWUs*=7ATM2L9`hNJ_WeTlx6$(d(L<+= z+JT>HxjJ_ERqqd&H6CopDbt{7A8rYVGze{WDdedy37@}?JRfUIyzo*3JpL<0lZ0`I ziKiN;a|@lA+avjnN!5OVOpdUEH*7Sg)YPu4e^y}KtdUsxHI&aUQU43-L{%0jL1EHVOVx@r-HlI(7m9wc_U&r zF>|=`=a+9UtP{ZXUoh?9gKEHxVAVEH;Vn`jmOt@;-)eBfB_|;v%zAE5&3Z>$6%^&; z^g&XQ9nc&KDld8cZUh_UJT${wJV**?Ty_`^#}@FwPML{yUcnAj4bbF;*QZ0HwId9t zJEES)i$6PS&FR)a&FsBXOQHvS7@zw)f~c>)nItCH{%dk7MPS zcKIcZ1c!||SkHQCo!ZdA?%t6DZ<%M`L|b9&Go_@FZVwV;R+9&+YLcP9xlzhju=~1h zlUgDs5JQR~J-HGe#t=hn=mDd{2NG|CpNb@4Cai`^(MIV#c4_mqj_&hKLqCIY((7+N zVnbe$MFoel<^~dUQO-BIU!FHfFbvFndU_PW!QPkhfEYx`Mv#PRivLnIBaSKOCqu<> zJ)kiyj0O>Oo>4V>n|d}``07MLXw}Pl29DA$9L+2bcSo0`%16T3pBt z4ku5+blRg|t-T-6#PY&u8Md;EiK4?Oe;+(Q>SqnOpYu@w7w4I8_Z0vV@wav-(CWf%@>hd5K z%s6Y0RCDhDThZ}f^|%#SFNk~S=_=_T`SSqZcl3gabJ9^m56!7iQXYh;! zPv0p0n*a)?Po%rJGB^IR)B+?jj~G(dG0QtNLh>{Brn=A`6h&@is`wT0f=L(%N*4K5 zYv&>GKOM%EfEW3uK%^v-%h8;7W)z$g+c=vq^xxw0hI4+%{F>g|i|0Zf$i9p`LlZQ7 zmBt>ZcmE}RUykAdbG$5mw&G!tf&{l$Q4E&zAhInKB5pWq~q|FW@^pigMykz7* zJ3jPJI%5$s+Q#o%uKP3Re|-lj-ylmBjMX<~;qKO-how4~@kW!-ya;3Cd>j>|uNk;M z`hdBjHoLxpm+V33jc}uD1%|5Cpz!@Ja7jP~H*UTM6 z#nJPui92g;4Rlz890lS{3I=&*=`Fo-HEb~(HI zk+x(XmF_!dgby#S_mNS1iBQR`ISF1qi{YPSKIU0gkk_S7YTHdLwC5Y0$>lK6&qhph zi*1+B)ui)4-OgnETw$pp)brLa+`;f&r2@{Y>w^VxG05J-`!}9Me)$@4<~eA`8aZG( z-@?!6pcx=?249B^Z#*lPA9H+Lqd!_*C7@;ix;vS_^%u_@Qv0Tf3y=Y-n&g7R@se*2 zt`Do{A)11X97c{&OB{2e*7=LriuH3-3%K_$1K5MLTOvO)-p}Stn)QFpI=6L1!fc3# zVWBrklyV|p`Ke0M`G9^T$r+S9_gejn`mtKq3Y;BVyboRMbD1L-V#OLl0+Vz=m!cA& z*9blr`>^+v^a+mPXNF%DFz4g9!O~{V_4Td7!un>ZI`%?J5g&2mY-(;?lYzW6DH&3+&B}-{BCf&mGXU?{T`F!r+v)9TmtNqq@H&`?rXADK8p6-cy zM@}ED!?zdc7)0jhG%bm3)Y_+x63qHuc&Tfo|Qs*H~&aTZ~S#mAgTO>+mZ$& zy64VGXyu=6`)?&&jxbP#KC2b#&Wvq>H28$mQrR9a%9&{It<}R_g){6j0y5He86%7? z6DAYKlU@ZOZjvZLH!7Q{%gmgj*!W>e0sTVWAuo)eH_mdE(owz9TKKgIaO-?Gn)pI9 zgT;-8L+U$q#^zrM3oXSaQtrtgMKJ|}ln4!H1Tq^SC49Xu&&2Xk_Rd#E7?k{+ZkRk? zJ35@|NX{1NA$|SA2~MqbB6 zk5}otG~N1n7MU;z>N72WS@x6~np@*Y#Bp7>_kC!fs=B#i;iuxB?K6_1>b-@KFP+V^ z$s8aHzJL(t%lhPM5s&A=YLQO_Pd3a2=RCcZB3;{Sv9t_&+4tpbefI)8l@FL3>(8Fd z_J6aR{idDG^@Pva+u;J6`T8~;YeLwhHAL4}GA~&p4qnxa?37LF zndMh!^O72;myv#Sk8hsW*ZoUYe+P)Ex`Npf3l>o&_`15}Bn5g)qz`a&8a4g3J-Vp@ zmu#OEGEiA)WRsf5!6%P%zgwvA4$WA2027w?d6#t?O^iQ7PNPyq^v%0=-oWl%O#{O0_nVw zX(1ft(){{?r4zvv3eSki+9gfg|6mnz*AGwdyl7_q&b{aTv!4fF6<6~*hGCFJzNSsR zU7k`nKKR+E>(P!_^J^VWg?ZQ-y9=dj|Jqqp-m_lRJP#JV4bd`cqUV(o`rBdv8itHy z@c@yPKp+yo@ri^Mvppb81oJ`C>PMn#h2Q_N!2m~-G}YbtxM0H@yT%)w(&Zn+HX#Htbr%B*T%rZl$_wQ=~Um ztPO&v2qe!h-Jx51y0Mhf!#d*yhm@F5XXuiY@;?UG7oTS{0#mZC*MGAi+KZ;Rq(J%U$gF+RG$<#o93X%wQMwPG-+bA(o3Y*fr2 z%Hx$0Uwu&KZfJ^kt0TK%};%x6O`tTl~M$ht2Ev^ z`+1s=bf$YpLJn67sXPR}87-|+0dERsG9NIU9s>Do?L?&e&bc0+zg^6ljrF_Trz;;^ z3<{fAcEtWd0NYG!41Sz2*UQng+W%9hyJp?FB_Zs+Zu0+w#WCrvkGBOCw!f9g?i{u^ zHNFovU8M<8s|{s+2{U)NAhy%uEtdGa3^jLZh^5$Nugig34{R|4uOV-?4;vy+kS7Kv zjDLn)fFSyx9%DLrygQzmnhm^hmM%oQv- zHUy?aKDUL?x!1t_HLJqesNT~qHUT)Naom1-{9Ew2|97(_b0D9JPJcsf zM_Zz|OU+-QoNKoU-n%Gt3R4ASUT5Uj8i?Eu0r2H4Tug~hr4&`G zaOMaaTnuIB3$-NH(-}9aECl?@9-VvkJ$|d2(-8eady5><%Si-THK7ntzLUR3K#Z>5 zO@WGEwG#VvB{#TIulOzTrLs|uql-B!A*p?`hVyRd@27sx0Ig)q1y+5a4ZdSQMJQ4S zVPx5^TRxeaql8NTDgpo}CPZKbmgTp{WKp&n03JjH4&j`7VnLuzldAD7e0EB(h9yGw z{_(Izluu!!Ajs9j_aZTu>Q3M{EM#6eBiBk2Sk~*#%>8(KaJcq6FgFu1D+|Pv?wye& zE#8?fpEB!4iPmw)kOFiL_!-ZW2&tdXeFRIB{)GpDKwae_&J! zq*a{yH+)oRb<0_}b%v0P&#_pE_bfiYp4DC|6Lu_WuyoL8=<>E#C5 zgPET^=q{X4lHT2IH(&ZD(MLcMG`n8@Dq^^9*YCG7?KSy+??uJQr9lC&oN>3~rMAk))T;ZC>YfVCVJm$CsmWnFhQs0FN#> zPUAHW`&IuHMcC3|=n(?W_y?iH&-@h>|H94fAr(Y*@X^Hqep{RoNN`tu(;XFuhUR8tPpP#gp zHr?C~{g}nKl2i~CPH!q>SkQ3bh^&tkdF3hGd~D|b3c#H1Umu)Y7b^HjO$?$93?4W^ zE1ayk+J4N2S>>Mw7YM!#XZ4901+@AJZqGM|D=cb9BQFgK^p;i%YbM6Uf%t!!5@dfBXE) zkW6YC9~+$pQ&;C~bdNZuDsk=$D~F^a&4@aSI$~*HcSZpM$l{?mVjbx`O)_ig3S+Q!l5aZDW%VOYFsndt(KMEuf+5lx9Jn0Vn zmc+?0<(b4BcUfqp31+SgP)<2=+0~AfB9cM>GK;m+?SWLUQDUxk zmT>ELQmuab@_F)lMWrdc&T3+Xc=;`kZwr3dy}9Nc#tR04pPCJ;m~*>_h~=Xk zP6hEdPb>=9t<=@t9=LS|zpTy60~;T>x4mVSb-X~K`L-okPdhbbRem3h+doZ7u}p1z zg@iwzF|O*h;TQWPc#Cu52;;hY8xr)!)|Q=aY?98npw}WwU(rqtvjZO_oFI@%5ibr5 z(7}cZBLc^Ej;8Z~83wpdrZaesXmx2pH3$+*TpR~bBUo-4#O%QZ+~T>wXv|Ps7aU1p zbs5^3xg_eS#Y`PH;nm*JNlkFp4*&|Wl8k3Uz-mk1SMJk3$8s7dH5BqYKCg9}7f$Xw zt>{a~G;a?nGmkW^b6x1Z$)~q+FuUg?sW-a=T0<_VT3d#U$0W=PB{#X;Zr2hJgKP(W zHSy`)wJzE2x;Ljl%y_kRJdazC-JrO8^Ze5xCXTs3HN-kw>aC+#aGEMOK&6JlZY#UT zkQh;?Ku0Nb+Pu{8x96LMdMIZ9K$&V${5%9`Id|@5Z|tMd-8S*;;`RIsKT1+xo?&N# z+75_;xyd5hZ~QG@zb5fgFk{`WAg$wOdfr&iJ4*n^b5c;zw+vS|-)tFyzh-+Pdy1;E zz%x{#?)g2B%`#_}41_z`xrB0?mXXhZPeNj}!~WAqC6piUeJ_4!xz0z_at^|c&5gZX z<<6-%|F6L_4Rue9oAC36KeF<|=BB73F9SnvM<3`8SolRj^UoONr(0{j_(qlS{oJ6E zOs2QqE)xHoH2nIR&W=E;=AdkaZb5^OyUbhjr&h?ooJ{_SO;=PbD@m6Ayrb14SB>cu z4v)R-^E+Qk7r8ti;rMo0!tO^4vwU>AJ2P;X$L!${@3>=HKC&fhe@>E`mT#}+vVo}u zDnyJQ4KYIqVL4&y_PeYcVdCN~wWJu!hbhS|e8aes+h|0;2N!^MfPJ{G_U}fOtk_k* zIPQ3fU9K1?hC6kh#C!1#y6oeSKCN$XUScU_EmfOd-^i!G8H=%1(s%+(@!Pl2TlbG~ ztS3OHdzN2nY$Ks_{u{;d7nUC5cP|(`dqo(>B7~QsQI{&Kc-7xvQtjz;xA>7|4L5vt z*lC{~CT+CPqPh!`N=|eijTTW@Q|pM8kZ79CB9ygrZsKt$HbKiZPakU=08d_O<32fk zEQ-qL)VA*o-cZk%GIW2S0+2`#myWzg4cChjbQ+kf4SfupZeb6c8&-d@>w(pZ>~nD> zjm{S2JB)9dyhZ8h;uWwPZzOU&j#Vd|!&BrtmSSx6ZC$mGD<+)VjNS9=>sZ^D%yLiJ zuU{{J9?+R}FBT2|LiUh6mpMMWl;hba+(>v!W}1@jZRblp@{73+uWjx5$ALi3HS^+E zAZ`q!@5z{!_ryYj3OjS4{A%^3{Y>Y9`%?mE+3@mHa4l`F zN%?Sc25<=AxLuM);Tu&bM{gITf1e%y>r#liGW9SyMQCQpD z$Y8;Awg;F?A!{*I<l3vX*oyNX4x=acawHOf*2#i3uSUTpYm<@&j`CB5fYRn$VV6CyJK=JOiVTFuv>|m zF;U+&U{!B5aI%deGZeLLeHY}WCtq0Hnmh6(%#4f8gPJ+0pmk+$_;6xIB`MGy$ug&> zO|GbuYn53pw{?`33e$#|vj0=43$ZX~(fY%$^Hufd8!{b)Z9j`cM3Ncew|W%s|0s|p z(|tPJ?mn5Hw`%hyN5GtrHzVu5I3QJEV{gD9xoX}$3k@~GP+*O(l#6C=Zth_ktwviW z=^5g8goZBPALg!Y@ZS5;^m#rrqr@ky zJFyCc94DPUvKF;1AW#W;Grw$Wp7}-mVIw~^&kQE}%c0%((EyWE;EDBqVS({s?& z7YIWoFvT0$$l^WGs`{)61*;Nex{MEtTrb z9^^?8B){nx&JTO&71mK?=AcgZ3=H@4ACq^K_%LMfErryX}&#ZWfhPt+I*^ zzlH8~=cTZeLg3e0W?fNRqzR}NAm2|7Mw^3N1b&7NKx`-XZS(WDZg0@(Z@OZ#_4RLo zI29#wdyMOMO`z{I@)D?06ZRy6zQ`Y9AZmTn?00k|7UC=y0EnHw1cXRm0-KT;O+t<& z4uYI2(xXoK&WW)ZyFYX-u~S3)u=pK@HnuWfp_EaYs(o>!@|1LDAx|@Cs&UzwX{^t3 zZTwEs03MH%TH1y`5q8x>nGdhKL zN67^U=O#T_se2VxNUPvRcwy=4&;?1EN4E-#h6Sr_d<>c2VbzMweSx-=Fe^JPl!w%W zLcYiJ%~A?*=m;EGpNqG5ik;AQSnukWA&U}&dTF&m@?3d|i4jY62IxfSv)HfGU|7g{ zjKJ;Q#O;w+uNjo=w-#5XewXu_x@Z7cv*IE9aH)3TF9Z`2_0Rb!o^E_Lz`BmMr}7d; z22V9a6A-61QHDOl16B%;!e<`~c%OOfZiEYk9Ssab5n`XV1}W$gi2w9j9#`-c)*Ckf zwXXTm*EdD~GB-jiiH`2W>L#L))tz!ZP49W0AtY72IR3|$>hkQ3z`NdEmV6rybF%b< zg2XhQ^In}xJh!r-CyQ`)$=VZ2lJmCi9)4Nyb`I@F{;_4K)t zpSswuZksaX5RnX8VaD+L)&ybIf|GIQ-&4SGANCt#{&M(=LJeh;@=cXnjtJO-FvoX? zgkZ!u0wGsPS#!eZIX4Zk>Cp%Y*KIp8oqVYmcsr2&K}<%ke78SLxuX4|mH``KV_pwdXfW z`B+o@3J%V?26dm9>gL#t6~nCtmc2E<@BcSJWatHRrt(#CWfNi4@}zc$4)1IWT?ben zE}xz_5tqgVOnepZd-^0?L}7%f_83z#>>;M&!@nS-Sr1bZnEYGE`nv2EfBlO}VYLF} z{7iS89x-tG%1i+J zhsM+-!*hxDK)aYy9it>Gt8&w=t2TxRX=5;Kw!$3uG7+&h_qaUXn3|eWw~RKRE{lJ} z0iBSyqBp8EJ@mVt3~Cs%WEVKgM4TfWTAA6$P^ZSzbVCf~4E0y-+O*eSvwkdN(rpsd zkhM-`pF7A$!xMs2Zq|=CKik=C`Ma<{^+NzpmDDFxObb)^J zL_t^%De>HOm5FjIgQ!y{OG`ct3*ry$fWK<**)O} z5cr;0&whi2yR9_Z&NW|9~9LnVCP%WXHo18c;7O=qpp-hKx{LU&V< zn}(h5Elapm%}Ivd5w}16_9p=;Y%QLK0lCgsAT`IkW@jmxz|EjZN5tduo}7%!?wr#; zpo)yf5?5d`^8S&?41#8E0amdQT`rJH7$y~Q=j}ya8ZNtD<#V{E6E?}OWK^GJ7;*Be9q%n*M*hwZI*M#@d_%2eb0P8A3@#YqPM# zG;_HXZzs;C=K42HW2aMPN#+k^az4O%Xy$sqh2GkwnR`*!zNj5WY0=J|fjd+9b(yiv z3Yu{ELf*wN&l(deQ_WHA5m6!q^~Bk8Ua~6YFAuXkVp9<}b?X)KuSioCD?6b4zE$$sovgq{5~HM*T(A7B?*BeF#l9E@_pObj$F z7pYQM++3FU-9HGohm~@wRRptQFXE-Oy#f$y6Yhil4~n`~zWZyq)tP=nSB+k0G<4#3 z!%zJW!5)e!()ev%IaPb1v!m4#d6P66zH@ogrx(P@BH)lXcsfWg_d{(KYn_ldC!VGQ z!tLpZHSbeicPR?XTmdVF0;7^loR**@jkHy&)y>U)+NX4W%^oFs$?iZB`vMFKTUuec zJyNZ3>JbQp=@QB1yS>PV#yJs}MDxl-rizDvYdu#@U2C1#-F8K$%PYSM#p`6Jd(?KZ z1giI$RE^XdJSz9N&DONbn!&?tcW+VOo;le3{U6)QVjnu`hLg-x4b}Go}-255kKr3ov0onV=YI>@K$EgUgoo zaQ^1l%-+W$Cl>4zoVF?@$6}My@>S57X)u91&Sd*adS0Xqc1rLrp+35;X|-qj&m0RU z4|IO=qpP;h6+Ef23Z;_YmaEve`RR}?r82<&3j& z0(iw#JthswqEj^4&aR0m@A9jRd*LR`6g_v8j@rx;xa{fSmo-OItBE8VXZs98(fms_ z=Fcd&i9|u&vhh0e)RYwx1AW=Yr)5o>!FOt1#c5JY#< zW8?Rni2@J`{8eemD5?-+7<&}n!@q{->l^@(Z?)7qXjGG|XZyka0DjUMiun?GraMwH zOLOH7meuwG$dGJ#fXbKW2;UILw{q>fp~&TSD)yeGOWwwnvP!qun~!lGcY!uJy+9hj zntMkUJk-1{EbnpphH_=qijD!wu!r2R+ias*$47 zWTajf8*OXH>lH>v^Q^-2+3Pv!S zcO`-ce)_hF@O;FlqQoU)TkqUR)lEu;cAX@MeTe@oqCdnTb1pUwe~G_=;Gu+T5Ij`* zOXT8M2#{leXC6ov4Sep;w>q9Op55Rg(g+wl2iI`zg1(jSK zQ$zdD>>q?Oma8Js{?DioWK?L>FZF z`6^v^fQmS0FCx0Wp^pW+(Xx=M*ZG<<=n%_W(c?)u-EFXF6O>xTRdQ z3sr1n%2{Xm1HL_M`{OfvdX2ZjJ`Vx_jT}uJk;}i-(ga0R_T<1<#ga2HH;RP9)s5s0 zeISY}@=37Sy_~!i_4BBox~y@AdNq%Y=qLo>=K!Zgrc?F(H>Z{D$Q%!pa3sJ5V-K98 z`h>rV-xKj}sminf09D-gDnQ~!-9|CBUbwR~djIftDkEmzOv#u~-Yo!P4JCU*NdlRi zynEzd!4nTe3bAjKhdM9aJ`rV>Nm_p8c(R4@wDs+2q>&llj;8BG~{Ldj2FU#4Uy7tS=5L=IYFoOUw`e5SF4%D(semw315z$nIhF_3;VOZkkAa$y>H~fPaaJa&w zl2{b$)B4u0jzuDX_VbjAn%=bj|z?A<*OfCO3Z%V9*?4(MX9pab3O=81% zv)Y#GjmeKO_-qjHhLM3#%C2T7Vh-J4y`G%|znUH6I!d{cv%~Bt(WP9wc^avW&jrVz zm4&LE;rQhBMoqiL__AreW10tQ^V4Jx0Fmj|&3<3te<|*XBunm5k&KKZMHFJ+uM;NUq;`f{_A-MJEYI-YCXZ8_vc6t`kT4ZJa{LwN$lKD z*|qNnUbuFpZ4sq6v+_LtD2bHpD<}txKf-!|6S3dn`EihPo5EjW@|E0omB5=f+gi2; z%=nb*Ij`1#v^*RLvmhyuUW+s#)^E#Ju=n_Db%0kq3&ISl*+Dm>QA zr3TC8A2AX=U};2T76Q}lA}gznW-U89F{kr+0@l5ryx2GL&2%0|*k%}!f za_xNKS;LTUg`2)7Xg|7Y@0330eflO%_XD~mv)u%X_;dQbbRn;hx#oJZCteAR^m;Jb88TV&m%};;s%9gVa%?+5g{5> z5HGyl%ZF0J_MuUPy<1}XPM(l*6NYO1XC9^IQjXcN4HaVLC(N=$=xVE0K)O4X;#MVt zW8E={X!IotaQ;yqCS9stsC8XhKz#m+2b2oW<0Xk_CSnT?iUr5(Sq*=(7HBjm`L%Y4 zg+=k8 znRD_V+ptFg`8lRq`vqF?(~5R!bL98Rz`EKsf<7)0zJac+Iy&pN&&d18M>2#Ft1&V8 za=lnyH5;;6glQLWPi%~nIhlngjyg=xyyMM~Z~Y5JTNFSq{fM=P0T>Ya9h{>HfPS3r>7%47<>OhOMgmLrL*l;o z0GD#4ACtqC`%2GOVnUnJR$;J=HC|-cyA1qSl&&fh@%UY+V&8q@%Zub}dC5;E#;TRT z83f%8q-t73{e(6;eU_8&Lg$Nvyzj-$yNp>)b8-QZ`8gHiVWT@&#n-Q2bI)6dUdJ zk0tjqSL)dF4TkchKw@j93%6jiQe&YsO;0t0olQO(7=mX?sL-m`U+>qXef-!otF;?T9G@ku~GVOv~AL3-mo? z;hu1SQwRVaP{}*09y#8UEj50v!>u~;eHx5M`-wt(6jQ8iD>iu;TIsF@bYxdDKkkQh zyVr|h1(8@^h2)=7iA6ZJ3QYiI)0m$~av^R-IQ8ptd|V6=>%Z?Qje$d|? zI7XOL3q_ymT;RHfB6fq`$H%DA5K2D#=>B_}frsGQMb3%PUrOtkZ!nNt@)t}TfqA+7 zQzLq$J;6+_`@J#Um!i>8xn@o`r}zoECYI(R2M7-5J{-Tg>VV^H7LHnl#3MGYjN~qpt`#8e_oX6#S_?akCy1~hmTH-?NfZ*xq3F|XWm*b%gW*Hh5eLL#4#Z5MLpdXk3o&Q zBKt%}BemPlinGBV!^s!z6EkkI9xf#hs-FT$+uMbfm&XU&7Yc&Y%j>eDz#e%0U_>%@ z18oE`Ebal!hOZk*fs&QeCu>)YmBz4UIzUZaT{_(nlm!8})H>_yXMnfcm?okX5aP)K zf-RX6=#l>IoRnohZjPm0qyD;b#jDgd{@UIKz14_?xNZ%T;x3`jW&rK8qvVWv4@M(= z)sHV&%%Y_|q;wR}-9B={(SX_h-3mhh72Ik=>HGj-feg4jC0Zm8DxV4bt2R$Le6oBc zFeoU9n8R!xWBr}R8!4Ez@fAbvV3Q5H2_|1zB$N|4_#>cu50SnYk$?S_Wp zI~?oEAQ1F*<7csipbUfEyiDCku?YA!+06CaRl^&L31I2{B9_1T{IY%f2Y^~0qhaYM zldLBo@&cvY zONVa3LXnJUp1K*9|AK`~pvd6bQ@~RZWsolFB@~RA)@}U10AKi1_(&10Yk3;wf4S>F zE(@RrA0g}yeZuFEkdQvg0K?S;IAI_R^x9u#o$P*hU=T1#z>#2je}j3@`PYcDQV9CV z8VuB}_+Kcu=cLq7E8PDssFeIL8eaLo;Di5%&-=eNAA{#{y7%P;)$KWhKqHVN{Zr8C zKP&`%#OrJ)J?VUI*M97C+~1CgXxB%e+SK3^z?Rskv2dwVjcheQ?fqSU3JyY;%L6*~ z;WiYgdxbM-$O9aFVFc>RN#~;e!_+{CMMC=aKnT$2nd9*Pb`!*XkdUI>o?B0sp9G5f z)nMO*&5hiDhbE;0f)~;vt|33f{!(^Dd%8dm2@%HuvjN`_ON&T;Za3fG6=ukIKX)X^ z|3h{-BsNhtmyijnW)u8&KYr=EpPSFoo%{8Y=&b_%UlcZUOlbnQh-G>OlXP#ECK1>m z0T7MOV_?$;cnbz_UA!u5pLD%D(ufWdaIN_O<#DM}K3xc7;vA|4t7e?sp^hq3dlx-e zt~2va%E}}cEO)+Q*Ic{}B@3>u?#zif8u1^KVb&Tn#|>-|!_WN%6$1)qA+D`0DJCbAt{e|1RwL3 z%sVJ&sOBiKcz74vk86zvEcfr)P=|ca8(Ro&>h4&+m%g9D3sTY0W$9hsp0@OG<&|3<40i)Xw($_}PqC4M;l(LJN709t+fox|26wQQc_(r~!bO z_GcGsZDSwcxC^*BdK21zzm2X3Mt?Wa+VoMm8_=kc|5-gM*N8Rqm8BNz;!FAV?)*Ok zsfaGZ>k-B%7GNaoOLBMfRuI3SNW@IxcK}a_kPhtr?k$9^NCZ5NP%a@IRFcdCq@4<( z?Ru>xAdI^->tltSys-EiA#!0O5D-NHYvXDPc|{+T9Dn%k8OVj2RRlrPTQnJdEQdhG z2D8y%*4kpAE!jW=$$KuSz9?dWw`c$=hNQoltHwtg=P5<|h~L+-d|B#yo?ErG`Se4y zih=ovADCZpYCVnwZ||(0mNuxBNWdf+Q-+TBWe1ryX-QgsS8~$k-q|h^Tp6HbB#v^{ zuZ)3;HNMWltQ|5fBgMv zoY2L&A;R@qSjBi?d3$@iWFe+_&#wl@3pinaxj4M#(e`77(?y@${hK$4JyM`@-&`xDS8!| zU%W^>>vm$j+)zXBgZs=CI~-K$LLQ;?X(B!yYkSX0dS_r&z{!Bj!u#Xo8lv2=30bv) z=^m5(3BOW3cpFKZIeu_^Iu+uv_%F#GHzI!+<+(DUN%>uL*2o{VL{q(hu)tTc72nZNgmf?*sBp*&ub{wEI zac1$9YoXr?%{VlzXuHTf{}DbsmMYDZEsXQb&nbeV4aXbs<+q6G3+bH@Ij@bal@;BD z-$kNyHY_Pg3{<S$vQLqIA29chBRzDIp_YU6Sgz#Ww?m?G$#WndPijSiYmX2< zFQEGginOms^Kg-|Ozmkp=YXD#$H(MS9NNHYzCjBVyMi zm1xI80|f--5O!Z)%RJtpaEL!-Jk_--F?LXC<(`YbW|R0Inde99k2(@(F7dk0+mJv= z)$fHOk{D^%Z1K9G0G0(Gs%bgxpF2cR)kpK{^iAET!2ps5lG@G}Rrp|1kvqDfb}S5E zkKXS@!*&>8V0!;|d$5IDWr?#z{AajGya+{=Fu+sYz|;=3CwJey{_#|;u2Dzo>N^Ig zhQ)8euDLHUPVTQq-)$YpG{?6Pu~=a-3E2m7+*|c!kdAAqR@B39f^P=7r#AmwDS+Dl zJ#vYnv;nAaTsD9NHhQWblYHsgMJSllJuss_BXaj zFBCkb=l|h-j85bB!$SSXzM6mM?~hE&`^c0s;+!X`*S3Jt36rf~d1U`}&vLgt5khM3 zTU*3E!$ArWWO8_PKxJOb%a#$tyIW;MIxp7wrI~{i3_#q>FGT&=bcj)bM8R)xL7pNT zD!SCRGJ(r()*Gr<_ggH%8Hb^g5lDY=k=+0Ea7 z&N2q73;N+u`q)&w6zO!Aj9&GW%-N1 zliRNLyQtas^y#O&*S!O7E5B}ouNbECLcb&}bK)B46Zg0^+ZL7nY$|uRby(>SV{_P` z_$X&jxFDIzZGcC~+z(nZs*h(W({3nB8#1oFF2h)9?f5{((oP>->=ioioySLVqLClw z=6(gexR^b5Xu^DRsEhUnABYIdg@uKB@6Pv%LW=Iq^Ig7iw5A=9>%6;4zuT+D!kT+c zjD99MD_SdlaFJua%w8M+I4g<1hsYvCZhU(q+3(maA4DO=XH$D?eM6_|bYF&GoNP0F zF&z^#>ap^2UeHD!chGKs%^Stk4`hX*a^s7*5rjuSB)asBK=Ek+&bIW-#8(JUPFWn{ zyCjAfO)4u(ol(H^7~W3YMf`c9!}dbA6k8!LqZc||H&DP_HFwo$(p|;hG6G zE*al92*MQZRSwS;{OS6f?;h7hF$xzjF5bN#iPm%ebxf~)|6Nnkb@koBUW)Cp+lQPW zgcVA<>3f}@GPJ~gBp+u2oxOi1s5jL1T{f?ockvsG6*6De*T=zqE0xpd8$~8;ipKck zn~vvo4gMLe8}x}XB?M@1%KP3Wp#lr>!+C82VhT+yEjTk0V>>-M6NOw`!qrnCNK3!- zPqOBwMuh9=^P3m!0<$#^(4u<)R=CUGS4oqDRVV)Hp8cp1HE8DHM_^NkM2`{zeCqn7 z)Ev0har<%_);*>9^-!;*R(hB8%>XbO=AiJ_pM%7HwXsQ>wq7tTlm z+e{$EA4hQF(z%DoHdSO6;F2KQMlx=hVKKPp#O+7&l;RO>7R{N@?`Kyu-D2z?%vAV zvjB4awI0BN{(rIeo?%UPOWQCu5D^d%P-)VeH0d=eDAJYQdy(Ed1Qn2?6bZe>Lhrpx z=ok=?-a8?52tAO%cd7TiZ{5$cf4$%L9q*6*FGpbITG!01nRCsYYnDLgyrJlC&)w;9 zsR^SIshjJ%(BoXAMfArLsU1x5BDsM_x&GhysQ+`B0&;uddzZ!fVIA=4<>h`rR}UtC z7b)=d1Z}9CZZtRW=`OI&fOge~zX|rgQ}}wj_{esmAi*twQ?Btg} z{{9fn7*91$`?B?sw|f^bv%|~%A0Pi3OPn64viv~&)jHmHr=8JX{`w_R7hNgvqBztP zKgHu)!Wv4%^=oXv4z=HXya{}L(91W0Fz_$m45UNZ`pY8TR&dCAaNtA(T!Fp}iv?@$TC7%LR668oXn#{#F$@1s8U0(&!IuZCSs1Fn1Pc zbas3a6>uJPZg zA_?&;qb@0~X->iVAzl7{tyz%q74=H!_%)Cg(P1A|k`QR@v&Fj$s+pQNeBL{jK`(Zd z&>CYGZkgc_;{!OYjp@T>Q`K4U`QB_zBF*a7EPvCsPPcmtxeE=)5sENH+48g6Fc_E5 zTHEY;G)LvdPCczUy7RU2A|}1kwAO`gwq(^@NK9kX>IUSEU$o=cfNtg3d0M{s26I$_^8qvQFmh`7mW z2jE&K7HDLxVzTHfPp88+4Erm)v9_`T!LRmU2UJK(H;CI%LgyP{a9Wo=N7mFxi@nd* zz;GPGmsm@)$Q;WdZXupJKX2{e1)9>XbzkpjX)hmSoaQcy_Ka{aiXQ>`*kwC^4jEqRq#<$jh+iP5M- zDAq~w$?%)5vZ|tH{rTf@0uaV+uOo`GQCu)BqF!8Gw`C>bZ}XVhU%aSOWHhNS(2vSj zwH<dCZunWEc&$m8HE$+)9$J)gm z1IW}autN<&VhQ*jB^)Hx@nUw<%BP(?ATImuGo?CvYvf?y-uTPMo|7uVou|sPr#n{m z`P0?2k1bN1S_vWy8uEo23XfEH5cQiUt&I0m>hh`_qGXZrGiTh>G})a}MTWEA2_2D|eDsf2ozSrRADOsA1vdH5kR=O}Yz03+dAGfU8M?sUiYddFX9>=({yspl; z*9wl4qkU5F%=h|=Wd*Kt8-s*j=COxve2dKK8-OvoYuFcnCZEl&W)H(;AfTe{oY8ox zX{Z|~o|)Lr-c(MaTg1$e7(*krx6}4EooW&GAG2jNyCB)+zhNN;9+sJhqwRYPf}uiB z*|le!kb9qpkK&YL(|ax>JZMv_fs;@3xoD9=RqC~4&{`B_^b zdy0891E!~_!DttdI7FNlZ9mwyLQ0pdi>Z z#$S(trS_PX?TmqHW{Zw))Tpo#vnwamFiQvB(v%n(gxjs<=9OVB_Qu!tklP+r9Ib4d zTXud6#3dD{2ZJ4**|vS7Bh^xJxah+tZyMUcO~@n*S#Ipf3A(u0s9`p@YTTqW5 z#C7B#0jY7+Ej&5yzqej&yFO`j)mtuHPNe#??Vm1eka+2*6PSk{^iJhoo=~+mL)7=b z%v7~ny;EOvQboF|0PxKa+n=63R<=H>MhZtA)pcnUaK!_xW>@9`$Ko{n7i^Lyle0#J zsR|*f`b5o@W!{$@Y#%G0Skl>PFi$!56)l-LZYB>|FOQfvnz03~y z=<~=!izjO;?m`KR%EHuOkNo-i+d%VlJlly|monrFaZGpTltA3kh?B~m$7D1x`9-*n zC%E>$Z)QdP!Oq5uCc~n#nuT_#RF@kIJs}vN# z?bgw&p=E`3@f}bQ;5|wW;8NyZxc_nzB4k~tzT~Ha!UCeQd%u%*fQy~YH`0^Xdg-mU+ zfb+g=?wwg`iqUQbFza-mu**rgg(An*LlVt(tWYM*T9bxwHgn!}C>9a5xv64%&FabvU|J4M@ z=Ajm++>Km#6NOOZl+DN3%H{Z~ZhI+1D#YIFa5>eGVi2MrCZbEIq(sMhXFcp?fh)WU zW4MRgipbC#tJ}4@-sPqHt5xdq))qqUT3B%4Ep09Pq>$onZv?#_ z0dXFlJC_jxKxEPPVU^PTqRh|L>|)k|Bds8D*lD3fSE( z%2gYkUA2cv4)jkdPmI;re`vAfKWS0O%chbv5Nbe8bUD!Gx{;4g*dQ#OIQMO86w*h1 zp>+FrP(HA*TUs~S9?N6EF`0ZkpQZySZZYEB2sM+O78T`*dPw%?Tkd&=(D**!dI8?^ z2G#mKX;qzWOK_fYjc$6LvYF&J;8mm*T}Iqb;>O;X`MP44gBO#$vT5EfSC9S2SFzj2 zyj>&fZZ|{?jim&XG_U0d(5E7Z55?9oU{CWnN0r7J~* z%JplHtVLw9AbX7rb^WX8>(gLo(p`C|MzR9@|0uljOK%-HCmZW-CD=dXi{BK(7EC=+ zPz=XKdQ`moGk~7FO1(E)Y|nrx->QXjLWMD2?lL-G609?cGzLjTeI2@QuP6IIyFHU# z&!4wmzM2{~TR$C4ZO z{JjC7ZCLHR@&kB=y)Yd(R2N83tz1svJhM6-B_LTCl=Y*UoodaC8X$+L2Dh$h^t%F;?&(y|La0d#VO$x{AG>N~S+-}a?)36o(Ii3hy6L6Ti8*Y%*Y&iE1&+P4=ibkzTlJt6hAoaf!M*Tc z?spyk?x%i4PnE}uaQn~I`NjCLRWk;hZFa-O&peLRD52m2iNl*h32%Qu3cEk!$tkuk zVDX|yM!k_>G~|L|cKmt}=aQKEmKl#(p>)Emx?>M`+RNj#O(sux$yH3EIlX_JE?r~R zoqe+a8u_(qSdK>Kr$KSvv8BO)zeq?#_E3U)C_5JEi^XrLAkNBabn`UhX3k^dS=q$u zUleu8(6bP)OSpEND4(frViq9^tWo5a%Y8TT>??iGWAL);VUl0K_irCe7Fwoo-nh+e z=u@L(P-eP5?<{QjdK3B&h$8tE7McACwRCU2Z+1FQXpW{oJ0cqngG^ zCGFjOO7-V%Z3}c9{C2$0upz8%!57ynP50;aGgAmYJ0XYcFziLv!}am zLn#Je#@hN~`PIQSyIZs7lPdq19HR`Gzshh0EApK?GmqpX{bWM*1h(uXqs|r~{=Yb8 zimR8;4v)^+-?;kJ6x9&Lo#yoE2U617vpJ$hE^cl)+7ht43}40$HD_@CFf*IpwqPTn z%8(-qfBH>f!TSxs6y1O+-a^*ey-KR5Ds#)LI9*oE7>TjynID%O&i>3a2_4~Kv4tAE z+I;)FY~ktYd7>)ZcWl>_8c#5i^aKjf*{OSn*Y*93#w%47TWV=L9>xSwvzCR(60jH&JlL7-6YQvx zRTKx+i!mMeA3G24rFVj&7bOGXiViNOb|pM(p1KuVWOU)BmYz8v(U>0BR;oLp-UYaK z^rStskx7E$7yBF2UnERs6_7?y1rL+I+b7Is&FYA`^!~$SUKIt%&gk#-hRMlD5UW)W zZ8gTAE3dTR=yPW)yE_^1GKTmH32`2<##-0=S=t{uX}M<5 z`f0T%^J`z5zwN%HdHIJ^HsQUc*!`DhA+3s9rmk(|_8xUU9h|HeE;f)joi=LJtMS7k zkul`{z{Vi^Q&*44zd;Eg>zDO+&IEr_)=bB?4<+ju=B`g3>ruVc+b*`FT^8|2u)+^) zHrDO9byvgY$_+>fR#2JV2ST~s_#Dhr&A5b}06OS^K2>61w^vCuG`U)2rO7T&Yni-6E{E-s)Z_4pkdNq{&%8?O}%f0qf>vPc8 zNF&-4$0d5;cGxuDe|B1D_&*BrcX)qfVVgnpKt+7$_rJ0$yH<_?zrtqxGtt$*cfNft zi|73nAQ7iSvN?kF^4n zU4K3FM*&{)zYqJrUW^&ae79Gw&7ON7L=~SOADtifWz7pA#pdf6PJtTvrIw$Lz&%{f z3k*~t{?TWQPa9LhWz6RGIg?t@@?6~`%?mgpq(2Svp`__<${wcZsh=0yTp36Ag&&6c zuOz`53FIii5TW|2TdPRi036b-^;nVQD{$SHSgT5Up=*j0O-!Ziosk$R*K-t2x~sFR zDCKjm%YtwE2w0J*G=6rAxaTH49x1T;a!%vYIbt8Dl9ArA7gCa9E2Vi*kCBB6F#{T# zfSV(B?uV9xW)R7Tcslif(F4KgSyUn>O9Dj2Hsy1K>~%b^JJ?bd`rtx;;Xzm*2cJuhmd@_iKHn zM9QA}6=1fzt$k%*uFaKpBHmk3 zV}hx1JbVxYu}s`5Ez~9dWKtN(di$U3{z0f5pZl{VvYyPF!!uuZ86)x>)VU-cmGq8_ zFC2rW@7OdSkM9>o_>(}mZn4_pzahj3VEEVs<&dCu1Tb-}NQR||a(S%f>}FUijhh)el4akkmHj0Aazx%5xN_F?oHuEHpSWy#{WAp3Vgq$pelC6Hr&qGDX zOUEq_I>qWS%l;G3^ZUi38G{(5dJvLifd&JU=&AF`dRGYMV-L~M<7sX@t(FOi#>RpV zhbkGq*s{YJ`bG(;i|}#C-$8yrYwXivaP4C5N`H;YVw3$=3*yMFKthoy+#LXD*|IlSGC)C=6CI{M85Nf+M&>@XMH z&&@Ao`P`N8M%J7?ANzBQ>pX6OUwSJ{y-F1t6gZH5yAqcooBsx3uvi+AMO;QiIG{WA zW|FHiE!^VI9ga>Ok;J(O>N>~olNDP!9s8L$L?N{9kF^my9^QlyL4~OaaQ(!#*+xLU zCw;0^FL>X72H!1U9_wV4F8ALZ9no+u}b2PMR>?MS-*g)bGanqDEN>7S`G(RdmN7TTVYAVF;?2MFN zlG5dj+vRqnTp|i~=PjI#s8M@oOubQcyFKh))QjuVbha5zt7q%P3$&i+V_tjasId>_ zj`Nvs63u%W88I}xYUzS(99`H|A|y>#hLSncl>d@X2SHMrwIH|Jx|3-Jw!0+4@8AhT=lNlAbUkx$Vu{@)Z{K>=`{W)q4Ji1AqW2``o4!xZq-ALtMRma4gu({=R=E#$ zmSafuEv=QVtkm@+~#v;GHMd*4Af-V-@G zo@;v_B)bHzn!4nSGWSUwB5pCKjct4!dfMobs5TgUmSZI7Ny49!+fQrFW$O{#sl5D_ z^-YVi3mMl~@4Mr+fzMTpzrbBnqG{RLESOyOoc+M)s27>J`t*QyD!uX1u)!Wesq?j% zguU0;Qk%^9`U^v+fM>l7?k`XD^Zk76uePbzXwS+d0K zbkki?(662*={C>UBuG8Sk3O@a!^@rToSJ!IBr>w7=`B2PM-jzHy$LD2(te`$nvJH= zHMjQ3NA8t#(5()<@y}1ivs0|qg(e%_*vQb3$^&r2%_J(ItBB{6UaE9l~MS5j)Bul=c z2aDb|q)=8SWUlSF@;n_u0HLq8iykR@SCg~R)@E+XHY_Xk`vRBgMua+^hHV2qloQmz7h`i84K(Yp;0^H95Phs=)1o>%QHox z{Yf52(!?)X?n6-FQQDdM()}IO~y820h3tYt4obt84JQx+QNKPqCHS zR}Xpcs>bN_Xu`a{DR%<$4(ouL*_G#~J%n#8`f!fiqu0QScq7#JVC%PHv>unWc+)QR zx`s@zUz5Q!znsqUD;f7Y?Z7hqv)^fZX&R%z{-h{?^z{~$Cn2(vgEpelgUG;(rRcmC zYeTQ8aWiJ_3wCYfsTCqlLa(M|H&Y+%IP!@FS!IY7czCb6sXhB!VV`Lr(EB7T&#vS$ zgn&o5oqC~FRdts%*@oeh(O1+e98n`X^|>dhR^y9v(K1+8G~?~WVR)Kf+gbdD ztQ+PBVxxN3D{>^EFwjv(C}=1+L;+#VwzS0Mpv#;q!|QwSa7b6}aZv+?mJ$Y5d7=LO zm8&zln?L?(ypeKN^!DcdNS1(j>lZVOf*=~D8{d&EzUXb}AJG;#?EbQbkub{=9dG7> zpY49PY6oW)?&sn5!RK?Dpk7bo{PQ!ui^3ASIk}O~2jG~tu@Bkt)}s2;WIEvNa%^08 znJW1f(ui7&?>jSHgZTUTy5!#D9wJ$DbEZBXP5S$SlKewdF@_y6Gi`f9D#{##uYQ8! z>ufAk*v&oI7L|o8*2LXp%!s`@xJ(!nZo0iU{Yiah1$|A!Q;CGYW9_iQ9%uc|jVv`~ z1y-pYgryad?L3G}Psb|@zmGBW%lLd_bX+369ZB5Uz9Pd~ajlZ9R-Z_KtG&DnD1RYf z84yv3ub6E)cC&elZ(ez7=;?vZ)ESX#chsse7w1le>8h5j(W}|#LW3zBJmy>*M@upu z0!tcbDf7>pN|+Z^d%r_F#&GzK(P&Vt>1jJ6(M3w`xQzoeol{Zo+z7if$|={hbvXPE zb0u)Bozir8yYyDcIR;kMiymK)KFht69Z3rfAL-H{Bf+*z z_iTsQ^d<`u8*;EJ8YK|Kz{4#&m#&=`lvSLb9u$}}aY-ro)p{&wu-a`O!Qy>uQl5w2 z?mUi)(`npgg$U_sad<9w6n3kHUqQSnatPbpra(AKTSvL}l{0a@AGWdPCFFxYUO_c; zkKbfbV4|P83sr2-P=H-i6F~2(S1(!DR&sLR>x*7d?VU8I0gyJseM(}@!<9R?5S_f^ zxgrd{S~=p&&f*sNi8i#MtrRPf%qP=b!{>Gj`+22jFEgA#k)_ElWi1c;ZFii?Uo9T*SYN_dpSqgot394mfd2jXceEvrAHP&a~~Bb{otT7iR;uNb-&{@ zLQ!8TtZ4+YG(1{5lQ-npyLUYpE{9jZJj5f>sNl{S&|jd2_9~nhmf^^Iwp$=h@1<_N z=ugEo`=B+-y18xvBP$c$3E_)cK&Uu3(>8afeN$43dWRSg1;4p!bl=sE_mc#1L>2OA z=EEP*<(Xo#t7p5Frb-{-SgOO7FO;*PI_*4r^rc^zyo!6+Vw7!7avR?DVC~%7V|531 z_A(~)R+n>q7YsIug;~DxJkT!ZTyTY{D5zCZx~P-Am%K)YU~-f%SzcL1EZ6kwZN zor~KoM4gsbicGJSwgw39dRn_cnG`qh_kbiMn1tOGoqcT@QD` zX85L-%BZSvBj={`mUn#YY2IOOZu3w(6Xo%#I60SpDLy?D*)~bo1*w#kJi#q$#N+o9 zOnlr)JA`|}y`87s<*VAh(2^|WQc#Y1I+HHmr$E+b(EK+-S(~(tZaz&_?#FdHMec2~ z#~Eru)p-mlae-F#LDfE4Do(8S_r)hxb0si*;?vV+W`49DE)^<=);B(mklaDw-Br4L z6!iC+*Z7Xz)S@{!wOs^GcN*=tZ+d!*_zkc=7W)BH)Y@OyN!t4whbiyanj*}3-s_q| z{N^)udsH>tBvcMGlWz*K)%5sHNT(`pU0f*<=Mu7#b$3v@_*5s)r^7J&)Ol-O@+0U%NamUtZ zJdf{>jm(F{cd7nd%Y-KdJlDfEndO=cR_nR_;=C6+;%|-8A@T;-hGKBXaeCw8#y*FW zLJn?=)w4L9Vf)WQq+Ruu!?TNMZ zj&20dS!HGK#wH5ZKWe!iT;WHaG{Ms2Lran}C$z^no!57XT)mDX#-P-)c%@UF)kBpi z#__{^=Tq&sAdYXfX~3~JA(!A1O)${8XR2jMzKZE&lWO;O4-EK-{uBg)Y#;4quWwhJ zd^t9M=ykQSZ##~IN^UTPuk+(6%$}+$^Q$pw;XI061YtN_6UyAEFOJHCd@Jlq`o^B` z#j+jhi6u835XE54<^`W~tx-aJ)0xM;GW=~`@Y?g`V*GTZA9eF}LY*6<@o#G|b;$wlEy< zaR<>S^*JDl*n9y1us4MjJy1=Q=6jYT{XE?vnzezg5J`f%Hb~b&mS#>KrmUp_Vj+i| z3O;Ro^@dJOh~KyFNzl>E-uQ|miSD5nY8_b_TsO)G!mJbZ`cR61k zpy4X&J$$=KMK~k2`PhfMkrHpmSQ+7cXVUwmv<98O-CBn)gAMlc4m2$rwhH4JRc=_z zKn~zJM<0Na%*|#CuLY94soOhghs0%Ob|-MBvr*hnNDo6CyoF2l#h5;=loAxUl_VU^ z9Jh-bq=_CJhCsrW5?N58`xY|Cy$2Zt=Z2QtGx}W8$OPLM z|K|15%RryJ@G#;;?w<-v*oF2C|C9H(U{Gijq>?ED*D>vop{gqd>`0*&E{qisd*T4T zVNI(EL7kQKpKYoPf$5G|e>6wuN!IHOPxQw3n(5zEJ zBGNNCChjQyEmn#IcV}j`TsH6cwU4dKdr#iHacSA*uZ`6^iAn5ul_?=HinPo9Xjb6na=)M1RwtKme`%RKicCkZ_}C-ISN#nuj_kwRH$T`+l2o6c;f>!vI9F4!r+1| zp-Y#|kmwPdp8P7H6<73>uQn=hiR#5MpByn!-^-m>kkv=kMi$STe2l-e?DZv;`m|>} zIeqeP$i3{ueRUH_*(xt=wJuugwmGmGHcxBi-n@kySgm~O64=;X+=ffVX^mcAO@*du za|dv5jMpYhJ>M)pd-M_6(Pp0C2OK+BYLGftPiq^#vC*_(TgY!sg`K}-RLMvQ8BQwo zw7e;Qm-kcw?dqCr8gmPoZY8J7kU#w0*nH+eym}WEiEi3wj4im9X?XNoJF(?Wt2$=( zwP_C#Z*Qq0aUx%j}4JzLL?@_j;XacEDtMp~n|}QDXTk4$mEx>uz0C zt}f5@9iz36Ly9XqaM7OC%O^{8MkYPYQqJ(xr6(PreiIymi&7Dj3N zTB4M!7uBrI_8uzlmR^%I`nXJg#7Utp^!%v8{?buBMS{gL_!yyKmDL%zTbp*e;N4Z3 zhH*RcqhDmrigMYS-q;^YO*T?IzuN|I^t#35pjS>g(KIl#44)ud9!#ZElt+DYMKK6uF^- zcyc1$CDX}0a~}UCHpl($)@3M{(sd52(9*+|56joc+&Z;MAm~S$?~Q;YpJS*aNKoqT zDTgtFjPbL7*W)#=eti0Yrfm}vhr6Q}Z$euJf2I9@?QmQp>rQS@ z9>kHo4%axo~eO&kMN&2dJe_q~O zOL{PDCUmR8ePT2;jSOboQHoj~-#y?&QpCrP3UwLf0%vMbxwN^nT0hoSW5Yu}_+VE# zQ|u`1Rl9&0Z3BOl8#+j9{hhTjZG$e@r{vV#%zyJRuHE%5r>CJ^7^G9ioM4BksDVAo z^%TB4%%2StcSlV`$kKu2COF$O&P3e%NJZ!5p$iM2_ROT`Cy<3`7mHs@@P;nS{Q4y1 zF*teffxxrwj6w&afOH-t)2HgGGHE|PYag+h)glC;rlXarA0q2;)xJ@G@qt*&;-kf| z=2(#>4g=B8;ee=NR6E)qF19tZ8!KaJFYOi#^D4mHIZBvU=HMpGGOi*OOAWh~2Jo zFF&UK&6`r8EtRWIoj#q*#}| zX-Q5qK&Pk#6)Qvhe7qSo&=>E|)-=x*4jPty{LJaOm^*eldVHN(4@7_t)IXTxkp1t=XFuE3yeLj97Yx1=0ir2TTSKW@8s^tS` zeF??g+u9st^3%?1P-d5=xI#M*lQk0P1;sukWn^0j>0kc!hVCO@PveriOix%{(W~zj zJ=i4U*mr!wfGbYFJcKLgr1!pO0C81$F{Gp^GVuqlP9=K5{47~$qc@fJ9vlm<1fzA^ zYx}=>F^I-fL(>zNT|)H(< zW_^~rWO1$bUA?CWPdXH>Z(`}TppE8z%X+_cI=ohox>w}9OwA!91!MdHsHpy`OiCE{ z&9*s0U5CUYh1*&Jf$B7;sSqrAs5Sg}F=G%^MH{K%O z3+xBDkjlVD$a;lPSfHMr<7X6F=gn@0IwcXQ#4MDRCEe`bG?k4Zl8tk76}`;Sqhs z@QRgt8hLh&OP<0|#{}3sYPB6T18+yJs~j#gCk0iIY3*WmPm~3f{^?jC8!Bg#lXi*K zvDiMI?(UB4K6<(fZHE~mKtVGSnL520Sj2A>mS?QU&SZBF@@t;uX`_OUvC{V)?<#O0 z2(K1)u?XpnI^FkdIP8g9fQQ+!j3Cs&km-ek&d!0?Lj_gTbV}}MeU4(rJesRU4!{jQ z346RBZPF*T5>G8U*A0qFKAOdPm=dzIAzsU5?V`P&iasxFhato;l=m~(qlb>eJK zd8hGFr*v|T*+Yxb|EACfTE~t7 z=h=x5zPGx!yFcA}{FcbELj1jQWQOVc4@!yI&Q03>l3%26JK#w6zqIi%y{zjKU$fu6 z5aH&I?y3S{sCN3K>TndR3emGH{#75${f?bC_y51bjyfNCfTX>!T|YywpGa zDme}@vJiLg38N;FCC9!#xct)6*oRSS2OUANl0XGgmVtsA|8RQGNx5l_$mcbEFI2mr zYhrn9_TkoQ=bhln+6_a=>`|Fhmfv?Y8MJ)Xq-Ej25;#M}K@Wxmrk3?t-IvLl5(T(e znuV1mkG3^T()@F+!Edy&=!lDFAz5{pZnoKS%YJ`6?2d+f$D=nw}o3Hco z(wmN`%H*uy!SH3E-H8*<_fWX>ukiDO{PXW*AUqt~!y4)S2W%U>GX~zjP&*DV?!WY( zA4I4BvZ#LNTl`0U*#9S7Bhqv_oDaW|(14ZeeU8-NCimL)lce5st?|=nyZOql`0)pR z%+k16HU22Qj&JNOsQ~1eSvtTcBFB-vFk)AYt{1PrNbxqV;EKl2weo?MkKO0&7fA_N z$808rX{G&sK5pO5G*EQ~<0B?V+IAcoz_O?k^DSR3g{OZAEEsjjoz>#W9 z6bZ{@N*On)|At9ok4nbl3a4S4n8RW{1@AHnoW<4?webbNMz8zBn=G~u$$#?hfIc$e z>9h1&F|yNp6N#I}({OIGFR+|W~}vz1g$w|(;6c67fKU4G4u z{`)O;aDkJl{0^L~w#8V&bhM@isqoDled)PHU1#=G-q~S6Igg+u6iV%3y`c*{>~9jM zoTRC$BF#;-j4S)&O5rlh)#fZm`v;1zKVM&0h$IM8xIdDSXwKFAjA1xs5aJr0U?XBk82gT+atQBI+x z{2YoY&EQJC4NV8gP6WsZ*1dN8`Eya1TE(W1)Eu@RZ#udNpYFET))-aENpFhQt}EZH zHF>x1MSeQ`ieAE8^2{pWN9zFKd_2%2=JLkQ!O;!K99t`Z(*p|1yB!^bpq4-QJuaG| zA}Jg5Pn&M!#-MUplL8Zi00x+d8{cZEitCBJX^Fz2_5isGdCha0zUxPIn;3mHzz}dx zNFl5>9grlc6bz|F&#M{sGnP5yHZ#|l8ZMX22`As}8vzhLsLLpJ(D*8`PSp9h5zuDf z$Juy*`Leo$Zg~#Pf8~wQ|73@H!{~qMz0>!+H8L70M-hta$7}v3ic+{jsMeG(ZNPPv zqJjO!O@kkS#uSkv!0F=5bo1V0)0j$;v{x_KhF0C!@?Yc_DGIH%rcjqK-Utmc@c1;f zbr8(Jfv^z}8*+?pC5QZ==)A2PZ+vOD-S|;dSz!5T|H_8aE<^bkC$y?7`E%IqBEP!& z#?LPrzQC+vY(c^|)HSV}Z_t*}o|nUbeh@$U0{|?WiYEjKTQGDD*C)6q=Bg$EBlSA_oxXDsOCyJ6jwKQt}yi9hvDbeAX#1cC+}VscfaV{FMm?Q*KqbM@7;V4q}?pAw=pvGo{}0B3jVec?CYB-tt{5vm@fBXSF#ru7WLq!ZY>kJrY}$jIM-e0k`QKk=q4 zo+5jiau;ADL1%5$A|H;AEj#0N`QC&klxbE6u8$*BmEIq1=sU~M^nTzOn!b%cIjjl$ z{+eEuc~MQ}zLhy2+{cDH_UMy%CMB_B?|#1GmwfND&A4|AG)JjkcQwD9J3nYhJ)ty2 zF#|lG6=1)qXSZYFEmK=)hx0G`%MyK{sk_|A<)1F8qRn6|y}o*o}3zV??jP zZF}=cEvCADnh4WC_)A&gXX^5x0MEM6_MbQI_Y2~l6` z?tM3ArFFuT&963H24Y^{P}!5^8_yIXjd?QZDzeDm(5Td|{)HP~+Uu(irtj?HuM_ia ziKa1o8NjAPMJj>WC~jbDyKlSr3ri3+<;R3}%-lh~AY4 z3ZD56TH4r@iLc~ll@~aAHRSjahp5Hz!Mi95#(yzfq|~jQelT1#eFs{SryISv#nsmN zg+*ymqP5rUVyFg|0EW)`=&1K*XlilB8Tdkf_JW8@RKNX=bz`(V2 zAF00`*6ZbdEYCNJMP#N$bTf8cWxhUqWBy610vua2@P)%CrLz4E!1(JV`#7=x=?C9t ztTeSPVk!GA{G(w4rdp>@MSBO=I#~E?1}Qk9l%W{35ejNom z1$rF(Y@c8jE~mDgY1QJd6Iu8dujF(C-LXC3mCM1x`Oy=3P|QPHR0Q*@`_7p~VtMp^ zIKpLfYxIbRcDBxWuWM6QMX2j2rh1gp_hz3)9S>Wl6LOqjlW)ft|J!uo(gi)LZMs>Q zubH>|!KSi>INAVH#-cTJ8y33Bw(aNZCcl0MQJ#)pRPIDfE9r2Krb8!s_(&&w}S zj8Ay^dwL^Au%p}EWKNA>b}W1Rte#!eRL^zdQV@MUE3=uqo=z?*TS6f0RaMjLcSH*my|_wL>G zOc&oU)VjMsjJqL(2<%y&bglOQYNoC1GR#&gcyD&1500VOE5ACo03`w@+pW|yZ>@I) zj$6>xqK5bFVm{XtDrMj5n!2nHtB^fkU~vGrATAX@xF8O>SwveX+wHbpo>^k~R_PKa zXjIqKt(hO}5urCTs}>P_iPMauAp8^z+GW+NU?Eh;7WqBcYGJK-vY5iOP5l855v@I+ zw~Nj4*fY-$b-XGeocDR*vy9L?Z@X35Ha%Im-rwW7NPwPEcHESUKT~vR zx$C-KzM?BU!p)kemBpN>?^Ua#`9?twelQZ9crU>g#t%Q;p+a2n(>AzusMTfvaib^d zlN83Unyt1enU1$Jn>AsPwv;Y~-!=ba$ZZ{M+Tf#-v3ESJVjAS*&%v?UX*~bNo$%@) zdv@j^*|AG`xohkZ?RZxUe*u?7G*Y+MN)|6K>bQoZ+|esG;H4-f@l)a1Mb>}OM7%En zG?8QH8H#byz-cqTMa*A3kr=^{Q#9pWAaBo}Ur`cI?xkD0 z&xzzh(^&9-VK;n4*`;EtqHHcJZ5Zdye8=8#L3Z*sWn@~aU;ed!^V^}O_rW^X^D}$m zo_nWvO>`D%X5r?B!w0sOTS~&;E`6#jOJj&!x>yc0zGlmbl1rug7;%p{FzM4 zN_#nF1*C4WAWMevr8DF^vH^?(Ox>l(uiNpoKi2Qd4en+xsU@r6SPz(#6nSCXb}>*Y zC-?WVUUxPu-3fDDtJ;Y!sW>qHvZ+30mUuYEeMG`5*H3S6-R0w9=sQ7i7Oi8e zIG}D&Y{iVFx;N#tAauXuZHJ=%;Z8*50h9NEdqH*Hw;m$B590AFo}8mJm0@J!ohO%K z9({rG+TtG&L~W~1ca5s)WbdMMdtjNLhU?)74o_3{aj#iixNyk<%N481MU7l$69eZn zMuzr9c%m$7H@n6-itVba+90D@t(${`{62)g6PK}T@B0g1@V2FjTdLzTB;KQ2Ez%>4 z0f&@-HPFGm38`9@6@RVn3l!su#BLa|^=WEQLc~ETBj`u5)7w!*OdXb#BgfevsPnUJ z>1TD1bsC7Vhih!;m~TxBETXusTSdohyQ{SqQU(h@94$~eLyVTCyWZnC%>j)^xsgxV zSTynB(KREHZVQmC#0_f1c5c3s*CHw7EbsXZ;|7?-Q4}HmHd2wufL~JySY2gc5wu! z`UP0{yUFccr{lb+^c7qT8>_ckq@b({h_ZbNsSsFJgj*a-2cCfzt_oawL#5#M8Y&wN z0T@c=mJrMZLdp{&@)b2mL9z?us?wAr8m&xjpS6!s3YEiNh+e67e9=V8SL@A3Po=RC!n0tQVLI?~ z{!OJjLHTt{9}dIU08zrM;htQ#*85z0(<(iEuqQ9|yTeY>@ps23rmDMlwT@Wr$QmAk zGxQF;KU_38Uye}Psn<*!lM@AM{>P|}1sSBFXPwSJ{E1x~VOsbHcI87`SVWPQ^J&lSLE|k&po7h!vprF~Y2SIjBJt9a~mu<`_Mf0ReoHkp#+%Y(=khZ)SbeNSNPr!DsuAHV6Pj0cY7&G) z$76E!S&S@=5EF3b{#^1`MV5B{V43fuG2caufyR`O$02cPWL`D*Nnu1Tg-*}*TP}4p z!1Etd&4zMmxF{1`C@oeO0W@|-A#q2u0TTr1R&pnOoz+f1XcR|Wv(-?f;h(yYD&zrD zh34ykRKb_;!62KrOr${Vg;Zkn;D1OZCVPD)(|nSaDQr34lDV9g{8z*P9EvCVF!$}H zj^U+th&B5?j?SS6`P}hKg7CYs4daD=uRPDlVx0%||7#|ISlEr_I&34GKZk15zpCxr z+N+!H74W;{+LYg8N2M>z-EH4S$8GkaN%M{`?8=G>T$_#Cu@U{0KMwo}smT*gaG zg(oGhTysXlw=C}7c?11@AxXRnJ@DYLMR@+(waV)2#53AE!y)+G@ zGjHZIU+HMKuBNVjpoGZEi0+-9ioSeg?Nin)QNq5hlx5vNvR=a*~x2^0u`GQP* z=bUXyXT$l>uCHC$PRP`3?2~Q9mR`dRc&QgMs(?jeO?JsuUye2UyA7LzTFzMTg8bLC zJ7Pf*9WSTV)%~Onajtcpc$bV3*8jD2mCw$XL{1Kb`N(ULK)K)*Kyo#)S31NwU8Yyd z>!^>p{!xBy0ApsMXck2fB9pe_mQz9TLs7-8d1Xh6kkPMHUqC;Z>1pl2zJ9PdFYlD* zTOTZoCC;!}&I#r0U)BiE9Tuqvi72*c&XkUOWGt_7+g{D=I`tOnJe0NN{H^Fs0Ca_u30ov*Uk@nH#+(t);&>Dt_JN7;V# z@cQ_`G`DMM3jw31ZcDm|q^)*ncMH6l);yHbEa~nRq1<89pvPy8AFdsZB=^>D9`#4B zInmH6?;iI4xSrj@;(I-`(+cX|S%s5R`rFcIiur;m``MC_;<}IAF4Z)pUas`E#0m|l zOv{^Z46f0m&itKojou50{Mgj?m3I~*x7k;)3P|wR^ZTyZs@ry*lchP`5D%6DOW+w7 z`>a=UepI`C{_Hd3kD_KYcSD_eJ>Z1{1A@@36EBCFp^7X*xQW=kD^=aJcB_v?cRwcX z=%+kX1Uiej^Ihyp)4YiNE2_T*tV4Fewm+KFSq&2mPPfS#6?TPhEN1SI{1M7+0nKesQ{5WHt&bS{9@8#-0QXC=Ne+#K9t28GZ zrMkPBZhI&{GZEQit*6Jn$my!CohLcoI~!P-*TmJZ{jqhn$-9TD`>wo5`0r)*Gza~XGuoAMqbP4yH51M<{fDsmnONeOpvcs=3psJZRS8*BTQr{P(Ppy5)A4{mr{^vW9(=7)~%UI6L# zxL)36()A(U2pn$6>3ZXfIRVTir;H?&V#K!h>&a2tea2+*b4+(uuY8HUGz|z}VG=Q4 zHI!(l6+^`ZPZAXr@O+EP;3*8A!BuX-pQ|+fzUCJYy3)(=SWrZy{;1ela36zhZwjf! zEv{N6zFq%J1ECgIZf`~`r&3t;xY7mJK3QN!Qu}A1bp_~y-t6?4_*o2H6(Dxop3L=P z>KkqkYHK=6es&MF8|2;JW@09xN4>eWv|Y_vU-a%cTubEMJ~f$hblB@=9;6%tnJrv4 zUtIqy!v0`vaj&bn!?NU|kN0}ZO`V|0aY=9(Xo+Ug3{1EiN=PyqFlmanXr#tZ^L7){ zfyE9a#Xo`|r0TPYe5-}Meb!cyPViY>3e$7LS#6QTNM*%bhoESQ-10!VPY)$+t82;8 zX?j7`9MEbJmLhwmk#@*k;oJMR-L6i5(c7(ZPLsY=PzG1t4Dj3BPj$4i|BJ$IYo&+L zluv1?)=FcXoE`*)vf)Fm-s|Pn8Xl}w1lD?DBsI*u-;tM4$W|JM@7W{EcqWo^p*up) zm|ck7qQdKg5cEB7zeB(qDH2(34MLlmhx11Nq()5=Sp78-^v-#NBzCui4A!9P&m{R7 zf|Q!WE(WWs@9An@Pje{U$`hLHf6g28Nfvt5iT|lVWv8cQE@IA=oyA7*<;g`)Z$HRq8lB@833Y#|B&YDw1~XHVMj% zlNjpMaI``%F(veQ`z}p4e&h0P_)|=UMOE6oKtA*S!~_qGf4Pl7U4$5`A#F7uaaCPWwQqeVcH4@1*$m8lEy7i%Shz5wGxI zYeI%gABTWNT$A@h0*@Sx<$yk1#IuRD8wRX#BQdiyy-5v-Qe8_aL0XfzMRBlH$(0I7N5-4qRWDX zTjX1kfwcYs*yfjgOsF;|zC*b$(ODPJDD{KgZb&s>RDty4#|FbHI9*IU^C&shPTNU7|Pr)Q)Fu z7ne?%%^SM07E*OHHS^=`)v0Rv%Qa7x3?wJ5lweguG<&y#(>J(#wr?z%S;<`bUiO#y z@6|=rACTr_+_cUG{+_2t^O3SoP`APa`uh4}EbQ#?-3^AhP07rs=M46Gyr=B9Uj_Bj zhedArPcCF85*NsVO?Lh3QnTCFD<&2*#L8;LP|I1MZ$&Ss9*u0d9!c3&P0*{WH@YFM zxHi=fLAiV~guy&HRLv}_>3oVK(S`mm7xpK&mu{*Q+YgCl|#fYDuGbABYDTY; z+5ad6hFeSwhV}fYJI47P&Uy%UZf$=UUP@#Oq&YkaA;;mtgDN?CXUd2sf}uGkbM`f5 z!|Dmlm9H*G^^ON0=lGADRY?SM!D24*R^tiqH6Tn=pHtME^jMVDU7C1d2j{h2m8?vO zWNO+j{#r|qgsV7Vf9cjIo2%F5q~#RU=7>{wMoX-^j(xrSS)e8JA;V>fsv1z2c;6e(1-Oj!g-1h6ZYD~e z(OJw|84re&!YEzw*^|UbjoV)?TWY2|Qo>&pxQruDotwvECznA|LodkYFNf0?k*fQn zKIk$cHJG=TWf`UDfy+1m&7v7ql|FzwO`J&9%!0GpuFAPMBYo+%+|N*_bdpqJ;PSgW zfotqYJvEe{ZBRG9(H)#U<7`UDZRX3Zi{_77k%1spT;TE(d}){HMb4bPr&TS>{+G7Y zAVeJAzE}YK*%znjP}13cz~vPG)EaqojK*=wq>&S_HsG96=LSr9UKVmv6lmK|d(1;m zfy=7Rss^m?3hdr}o5do`idWzH+!~hJdh9P(e;bra;4UO{e0vRu3_vIF|J;0i7vp+@ z|1XY8xvCQ(_|IRNLW=`>c^i&IpcNq}IA1Lo!#>4-; z0Yw|}QU`ZW$N8Qf)JmQWHf~VsBw71ghs;Reyu*KVnStKMJ?kXF(d7AOX&>^J8^Aw0 zAd&1d@K0h+lqza|u;u0?oyxg|w)NVcevBhx{M^L?UQ+)4}#9TaFz4 zi_RyV{#;iLAaXo(we{7Cub64m6`ryQ#x?F8b+-vM`eKgceN_#7^A?Vx5qe)EY8Rj5 zWVY+l9X#rD;@74HWIo7Pl&>nG3zzzc)XlP2F^s8d&)7BFnhbbJEyW2#c zZ{!cZbwZG69IF^{3Theq)D`su;;28u!}uhA>Kc% z6y=~0)ui}sLZvuzU7sv|IhqM{S>?0#U#a4e>w9wN5w3j=@iNg16K3TNtWPCJ-arMH zoC1QAL6Tr^mq_dFu*$4sVpBpgj349T3*y85LxE@BxF*B;N(L=th$doaM!63CKmL~k zo>D_xdiK4ihJ2}@zY{RzPJe*_*WJQKeHx|gW7*e(v9E4}=8{^E#ZHcrt<2Okd!xe- z93SU4xyG&$Kfas_L;lEmJB-d~D%dNu{A@$5Hoq~i-kUFiy?y`Fn}SsH+`LD_^G>qo ziTn+$R?4U+GtBvAsjz2FUJ(!v-KdIcY>wBX7nGnMH4#+lE6%DQaJBPaLW0(4w>O1q{W8%zx=9BGQqbx zJWf2uluO3g-jZEAnLsQdxFXulh5wtAQ(%}D7Au!psbJMUFl}6_e?^Uc(=&b=SCOUX zwEQ>^EcYN!sT1oNRzH#AJ)ZHn-%?=&hj$p-Z&1aBWuMGy_!G6s=iR193 zYDs7BdCkM%G-y-QvJ%k-<|umRlvrorS2S1s)d#|Hm*7}H->I55NWa~?P=tQYzawh~ z_paivLPk8G3?_02E|K$KezY!IxrA8Sbns2uV@c0@B=n3}1bz^DmZqbSV)S`Pa*8HO z^0~_&If*YwZe-GR72B-UJ3}yvtn+H{I9W6C9Z(p}*Y@=`_C|$<-shwUv?(6J?zJVx zexI;@aopeI(OyXS9O65o%RZ6o>syMj*x109QAzdw+%fB(H=VeGOR3SWm330ds&^>uBDHSDaEB)ky1jN?Pf5HZ6TIPO*fw#WE|L7&7tF$7k{DFRbGYKY_|&jO{qS)*P5; zRAUomLd$~Go;n=rmeT4@mt1-KkdrMmIZxztV%^NCxzh+zAl@NXUBTD!XEq-VAox!~4KnclaJ@G2W7 zc~(w3dByB61>HO7u%?vy0r*?3PcJJ;N7h`Aj#_TrWUsVqt&p0&=EeKPAk?aeu_JQH zo743;*t%r-%**uk0~CxLksu?x8@DMxaPsQLKU3XeyT!!VY3(S7Z_n|rS!WPmgdri^ z=FK{7Z&uI(y7zhL^t7wVfkVdeI(U!_-Ebd6mqaQtAylYpoS>5=n z?#QV3l$`*U&*ptRlSd#{jOoTAxjdRl%sO$SNq#L2#+QtAu!-lXi9SG+QqYKV&upSU zadvq*FdE&t)utP@sSmYbK}9#_>UiFth0%tHC~T)qXLspNoh>(=k#1dOZu(gO=m;l$4;_Sl+whw%sxHW6s&Le%jKwAo+<^rEhh49Zx?T^{aNVx6`g;E)1HryYOv= zUJ1(Yo?TXyo_YVPC9UvR@TO%Uj|5L&BA%@`x9aJW>$qOwob|2aRv{FDgh`v>wifAA z(Z=L9-?u)xx~xRj!HFd_+r=2p;v_+34wBr!uqS zmcV50z5Ug;VK1xJsMeUSts$UD34Lw6(4?gR>EfQP;CK4@Bne6KIV92YPi>Id4hgQ2n*h+}uzI%iDss&$yMfn=2*evyZAgleFm>8Ys;Bq9f9-xcjGx+O zZNbA44+gpgD`_6;s_4|(dQ3@EvLBtesP*PJ?Iwj$=}?SBwJ4vb#a7d3vmBzkihBf8 z8=Nm*4K%+Rna<@6KrO8fd-;DTKe4cY4GSGjGRC$J`q*Y1aU|L`8rHa=c0JwyUB+_D=6A#I$kfdhJ zIrCafDCyQ=0|TAqHcRxbl=#BT1Orle;@({&wek1wn>0MN)IIH1em;P2q4&?;NEP}p z`3rpAS}lvL!NI+og_w zs+EaE9#lRfNrX2%4m*1t^ByZd`tUwu;WS*5N}?;dOU3oNeCKBWS*S{Y*AdpzXgv=S zD&&--?fZ64F&BH+l*mPS2JBNK8NWqtK>D%-qQ)`7rPxq+UVFvzCf-OSoU4bw+MY*E z;^;Wwnl8_38I-JoRf6r^xgWLap!Y4CGe$ zODol9w^1hI31S1P$M=hS+UDX5wwp;oO~TISj(M^M5!_V@uD6{5v3-vl?UqbC^hM0P90rd34Y!I-I|9tf`w*A>ONNl5}3H}pfzmIlFdor z*GPmExUZJCogh#qXhd7Fot1eMcx22o&Qtv`GJ^wY@mdDT(oLenDt z=7;njACGj{n0#x@s_Bv2+(jJ}Fz{Geh-oUmu`@$|iwvh+ z`N;vDxAoo~4)E!36R1Qc(0JLpM=z9)ZAKPuw8J5yd@PBwWv5dLsoo8`V+jvmj}q&U zgBX)HBa@09mx?486j}*e$@!>HV-{mS9~waPp7D|o(x~jLP~g@^&F4Tc%n4KILXZBJ zllQu@{Cqih`wgyw&h~bgmhRL6z8XExYH#XWoo8VBNOSLjbq6`qN1EcdvmR^16)W5p z4=0O*YO1%>J@h_&3#fGn%LrdY-(3SSx~dQgeH9p;1tIQ@&Ws_?D`?ZTBuksPww$dh z#U{RhlRCRyOdadpxiq7yg+E)kyqtYiMrrpgV)BZT5Z)gk_+5HX(*6RAD5wW3X*U|S zRORpi`^1NpFuF%YH?R;ti?LB+maXy4%$q8YtG3*8RnZB}j;CyJlD@&n$z!vC?P$0X zNpxdR{@8_2Nno@>H^GL!c8oO~UN7qr?uY3928}7@ilMhL8=7;I>tgM?n_Ll!3&@~m zTx=}aOOI)Gc7`vUzS2hv;-aI{5c3Jq3U+Y--l7iLg4j~z{0K^5FC#rGg{Rtb@84YH zV%S;^s$o{#YUDvU@PW^od!mk33;UQPC5J)d%9G>sJTVAqz5CZHE}dA|fOgRQiFf@@ zLC%acj4-izx5rmwCsEZPh=U+QB|-oR4X!v$f-K3u?W|&dV9K+`siV(3aVKVYj}7-| zb>IP9qj$C^$$CTOc_n+0XSFJSvCHwxa{9zZKTpVE1v$5=5xtU^^hChrJey|*u$z>z zSq)XOv{%Gt23ZgSc#yTQ1A8&19^~Yke>U%chgythVN!r%sab-U&UaqRlm zXA2=lYNO1d&5H%%(P`QW*7L+#?0OBFPnrGtfx; z4PQ_%Tylf_G;5>nQH&t(h^}ZW`}7z4bz(U~&KbH=9wtd#+D!^mhK?oAw`FL@LpZrD z5wG}duJCkDLRUvN1KbI)bH|X4Hxua(E0XlQ{cQMW@t_HUY&1HRX8OcDjBF&o}rN$FOhv;(8OAYdtQvE z9GV(a$gYe5MmBI!@7=n4dqKDVUZ$P{%aqPhLt{}zvliP|ZAPdFYcs$i^XqJ;D7~8f z=@cCu5o+)9wV@R8Oh8* zsjt3x=;}v?cxC65Mr=DDWHpz%+`yeb)#tu#1mIE$`K}|NJnLVG1kF!icayWXkK`P8 z{kf-;laeKz))uvy;UX0eID`ZhZGGbNKBs*nt5PBd1#kzK`uXMb7(VZI*s0^qA4cH` zvP>S=+$4$K-i+)d0$~S4tjS5flWkCw&YRmV+S}Pdtn|#hjnyBl9^%Jx(@=m2O9`0( z!v*WrMtviEGhJX|8~xR5CDe?AFnmCVts^l6t!15=;b$jj82&nL{RF@Qoq0tS1Brd} z_`9OX`}grres#~Uh`Pi>o*xXneNU2AvwDnM!!0qV0O=u)E&9s@_)bKqkaG;=8nROP z@t8&27wh(|2-h&Wdc(R04yXM(bD(?vY0mGU5kiCDE$!AM=P+{k`kaQ)X}d)-hq7D* z4}Mz?I@}YLz$nUSnX5?Tq%^Aa^~&tHzfs|HJlMQRMx#>Uz)z=)j&{v6UZ5S<3H5O? zMr*0)DiJXZ0u=6z^x9U-Q(O?f9I!e5_IhgJ_0xx$ZC7e%sqE}}(SyAvwc_)7=?~~+ z4TM_^GDOs5hh^vnPPA+Ej$T&02te*=Sopj~Wqu$U#~(+1A2_r^W03&kH+3Thm!dhH zOb%PZ=K;1#K`hVwpc1?8#*&hbgCqA_Wt!Etb1qIaZ5$uzt2{90uF~MiMLK?o^e~z(g?L|fFvC$mq z%TvB6i=`Y5g%>3>n{2?|TsJ^SFp%#*|7rlI^4nQ(QqmKnBK@?p&C4F-9s$q*Qnfyhki6?^rsu&-g5%c9T+-63nYrwLladyuug^xL& zah68*fKYunbT>7#11&*k6|oz8EgULzv`EhjktyOaCo&o+HyRMNPaVVI3YX_z&7Eq{ z)cwIZnvl=`yYf5fXs5s|HWcT0!sx#x-mAG#-^5OsrL`;`cP^=;R7C`I$bvE%@ekv@ zSZ6*_Tjf#Bc%Yr$?CC}6s_7Q8nvZ|u)b9bbHFjw0ooAwDHa0n`7CmZu*%b)z=3@W^9PXYfuz?*9RElZH(enET@+`+Sin3=R4j`_l zjAFUmu|;Nc&$P#Dd;cla$VBK}2sL&T*4QHOq4@V-F>v+h3wv5SdYBr$)y!@LHt<12 zXgk9bvw*oG+Noz=f6G9|=Kx3QHnY&4{WRTa8wB)@2*=4bAWL{SF$_DB%-z-fRYGJR)wOwo?f!}|Fi5^*CzH>Q zSbb*a*~QKvAYadlV$E2h`9NtDen=9vd22K^&YPFJacLW6{;?tFN0}&RU zj+pYJ?J~|ka%ch%X002VPIg;GaD77!&nU`J*_gA({-AktKqg`Acv)z-eWC+a8NDu3 z3ZKo<_ccBn{JP;O;S>Fs9^B|H?1>@pE%;c;V^M;;s})d|QXY*l#>Z6o70PbC zX}!jhJbh9JX7UZOdAP}f5w}XHmfNNsUC`0@=_vZZgC97r%yG*hiM?=Eow}2Fw?#s9||Iy(vh2ug&ht$;ss_5NQvNTf<(Km z#}5n#ZO!BK8-3S1S_;PfIt(Rh49&lx+eQY*>4|iV-Xu=_nroWN=K+26Q5aB=?-aPs z+0ei?7PI2l_lE?>Ye5yDtf}vG2md63QXO%pw;iA0swc%)I#+55CkgWo(0vh4nt!i- zE!fcL!S}gjMM!R070_GqI?klPT7e2a8%6-TPZWG`OX!wMd6DE~KWv-qppIu^`VLty zj|TbjWcgPXW-50YF~{avvk&F|kFVi|2I)|DIuA|e92c5y>GoMeAA2`${mDjKHZM+v zyAP05dqYKH%m)TDR2e}x0C>DB7MzzsV!ic!;&h$yEel^|u+9QvP$*-cu?xPcqVY8( z?bAs)UIinfp&A|j>uE#f@lSL~Q%asQn3VIPgmt(%2>+Vs3u;gp3uRLn-JJgNFK~b;hjfjt((73GV5ncC#3v4uhEeimbAB+z&}B z4EGhAlV2zGn|QE*yK*7a+uQ5G7=yj*1qtln!#Vw#wg$t7w1;~cH$4W8BK(M4?kf@i zgkS2Cq|?C%g#@;WN^Fz;#=$(VPJs1iu4v})=*Hb2t+iIIwUm$bXcQdJbtopQLI^S8 z<_fRgPF5nnW%Z5x1k+P#nGjWdf*5K~%R5{3GWIfT+nw3V9SsA8vzz#xyTTqe>-ww5 zZO7B`Y2DGw@N_dYHx6WF%wlLEsvcGmBztC2 zq>UTu$rZ;}yX#SEgiJ#l>!^^UX>|WK0d6xV)PI3q-)q|P#WCL_G_kp$v!Isk{Yq8& zI4)V9FP#E1-V|(%Zwew!ZE@^VAF1XHQOG&p+TWRN#}E2U-y!(I+d1oF#SyYF>PJF| zdG+hk9=gBb7C=XOH|%@EX$y%I?i(}zO>-jHRjZWLRL;SfnLFqjcELK^keT$qSl84oN?VX_Ke&g67~$ z(*F>6a;Kb))Z^siOs5L4SEnR*wfeTEN>r-TsHv0Qk%N1y2e<76xftdhvMkU2$Ym0P=8rD-aMg zgj_P-mdz$fTQQI)uh?i`!dZ++tOJm^>O=%rt{p@Tpt@~J3Ns6hY}4~b=(O9y4J_%A z6rcg6D;dvn0lxfi{yd#maf<-yUx*jO{uy-kuI24?j8elroDHDH1#~Cbw_wE(n*bym zT)?V}-5OOKX>q8fXV-v7AIK_Pb@r~5n1AJI4 zx5~v2u@}OOly{dlkm>|>U^pKC!4{5DD!wI^l?QvM4hZ(7FfSq>f7NhI-Dr=1GZ~fE*TcB3j#2)bo&;&|~3!nv{=)xW~(YxFspW;{nhT*LB}1*HU^+cDz&<^R7G zS}vGQ#?!?t$&*%J>^daM7uhQ;f-iQVu01;3Wb{dCnd|wi#H=#%PHbkXpTT)@vGdB4 zyZ=kyvq*e;#OAvX^=+R>kGMwJ8BQx?Sm(A=<$Fl$LGdmGP(J|j6qf5V4YhO%{36q5 zyv%e1`_b21N+v@)O(;sA*6h*uIbb`cID6U+(D$5-{V)mwO50~3zQgnLQ|_FZlyY3S)jK;!LRw1FQhY} zu3;6dqJbn!!TMRfZ#3XhuTRV%wmzNDO97pVCEY3Rs<>O|M&-}7r;-NmU*-ATP>mpR z-lqaN2J94ikQm4tx1i3ZQqN{y1+5+acQJ`#SztS-qQ74eDEB`1(L?GdSAHq~#;Gk2 z7U0%y8dRXP`U@${%}ImYS((2jpnfgfvgWtwum@%_m5irZs`0l$sAGAJPjXE-1n;Kz zlf$N;#0@D@Ps>M{h`b14%n(P_d2A*W`(uCF*Pu3W@NR>Kjm5aU3_`ssz_{irdrKq{ zuB;mSh;>V7G0s{EWi99DTQXNEUA77Rk-#u`+ahdFG4EX+qNbk4<*N&UZd`kS<2vfe z>w3*dEwK^XuOj;jyJ_bOmSB76^LeS+ZItnJ_1wzZ5&_+AD8}xgkTEesc8?n%r^j~o zg?GNsyyrpTT{nIi>!)j23f9Tv&6;IYIGR?T(-PcAwQP!VPm=(r1m=~VY5km0?$ML7dlZ>I=~C{qm6NH{I%tw(q_w~Xt_HGKmBmM zwW%qeUrL?PDrl*E)Vo=R8OduGIL(Zhoj zT`*ug+v>!%>J>WLYHiD7Qy7gfNlf}C_{k=|u5o91sclk#88}_hV8O>5_!PaO5G1@} zIV*tGs_d@C!jHezCGr)Ce@jD}O(8|%b&p+&yNCJRRS*l!9uve#kfXJ6JtLLmqC$?Y zWaRg0wB?e4uEgN&trPR(nbGDl>pGufbJUc1tpY#Y+sSJhIUTd9wlcVcDGXK)6ZKbO zN6jjb5YPNpO%C?@4QL*(mgS+xhmzMU%R3(a>apAAfJzQvrCoriEzX;PmC)kBCb08V zzDghFgBX1t5C+ZTK4f)~?MCbRo_0b=ZkfnAvs{V#E{h>>tDB9mEBdtM5NBa~{kn;Tcl29;Bh)5^Ko{GJUvZ~R&*w^HPbJ%r1 zzxqdwyY!pvcbmQ%IeG$PeH{lazYycT5ax^TTv~kpWbZaSK7V!gwAJ@$xafSjiUFda z5F(*+V>_{4k`KW-a)0hwCelDU@Rz$%Md%iK0H5;h=somnbj-%ht&@m(Xx$# z1fwEoTxme-YbqS*6)6O9$J!tUkw;a;!Brp|Rgk~Xe3Jy?{ZjYs(z>3LmLxnL?pw~x zp)>2|+5lZYhNHPC6d?Kb`&o7~?4z?@4qOYIuV%JzG}W+T=91bt1z+wlYNd-Z<`#A7 z`UQ8TGW*z%J`o(98K3MI;^pCu>?C=Scs$bz=xY_JL66>Dol((zp>0m{DK&>zs|Ioz z_4oDpQ2QQL^`=on=~}oco81Dip5vWgV~4@WbES)(FXtrQ3x?ZJqzquVb5i?ZF zx^50mQeHt}?6KtRfe);fc#yhM7!j_a0=ouperS4=rtX$CU9vm7cr7qOUGZtE0Y5i`+*zGK(Kif#OS zeZ@89%_5jGrxSoD#b}&FO6`Sb$qz=N4L5P8_H#D0ZB4KS8|-(Dwp$h}jn&u%)u$Y9 zrM&Ylcq8_TLv3``qM)w#a-5*9Wzk2En0q6!(sA9xmKFWrs~P~rG!TnXTlM-F8Q`pR zB~iHKf%8KK<>21Nl7kT}k_@BRp=J3Xv@^OaMs3?4oJ$S5;A^Lbh7}*`Q-pr?h8Jl3 z(6Ziu-8fsExuAFrMhx5AmJuaI>xtlYJ$aRvGa20#PIr+M(bnk2DAm2!>Nt2Cogs4U05d3CP;11DOSkzbi%Tj%C{x!~x4J&7{O3n0d z{e!yh=iwI_I^PQ}7ex!6F&nV0f{E^h;86UgK+`89g?G>E4ESPZ+wjrXfX)LAQAy-P z5Er2tNJwbgP+}rBWHN8&UXJ{T+D4K#I7m+KERbioJI(3wk`qnqF{S7F5c{-4iAfOw z+s+o9RYk2hZ#WwxL7tZgY4rBMa`Q)(WAaL@vqNPn!lysw3p;MMT5DqqF)`(9Ty|IU zkmqY2l560y$XlawG;0TH;Wwcl@;vu0-DB5mk~(_0Db;fBH7x%-tV%<=$#1Iu)gV)4 ztoNLq=5ayv;p`ZZKQieE)$7Bxhs>aXaJscn4EvO1n*2!am>59o62OpT5dmh{ zHyqC-BR!qpZ&iPfka)0dM$rk|Y+ae2$jCz*l-}|>Q~MDwRQ9Rh+rJNOlGah*EE|k` z<&h;!v%CG~!cn(DE6UH$wi(rUO_&YTRZHTVaR|l^S6!|1WS^&H<)9nrYTxr9q$SUg z5c~y$)`*&Gxc16-$^i-mq zG3mcu%GWG`s&V9!gZN?_NRw9`Uo|LvZ30Vur-15v{Csdj5C?~fLhjj94K7NpoGlcl zVSe}3ct$-DOiWn&9es)zKVV@G$prS3NfKC(D#R*aTSmAJi3lCk`tnt5NX=`8y|%o{$PpKpu=tvDkSSo!Z5j2q5LznG ziMr8v&4+6{XV8+%w_mIxBw`UV6u*awVERoiL$dl5jex1+`S;Y(aEE*Xrq1>3N5E^Y z{;HA-Fe(5rL)3P)2qAIl4`v(Z~C>t3YZ5lcPAy{1~UmYiJT7%knm?Rdru0lFtj( z8F~{UI0^H_AJ5z~w2ffYqda~PHLl-@@AOuX(}SS!$ILE@tWb8u!ALJN2BSH$l^iD5 z9{$&r=`Tzpb z3tzZv<#0tIqgXLv@R}kTD~ER8?Zv%2FL*>1&thXkjG`{4CV9fci+o%pCH9I-Es{h) zb0*eU2-u%lcCGTrxeaQ;)X&-XBttUKqB+v72;RWSjb}RccTyfCi_}U`y_q})c$IH4 zpDKv;-Iz^^Gx|UClj}?YqzrQ@xJsGdty-;=C!xOl$1FBMPr(t6bVHdk*lnp$N$KJ9 zBw#k0oX*DI(o>Dx;hdUU)N;RMWs=UztLPdvr%I^Qr&~j(!LD)giE4PTj*DEzHr)gy zXB?}Y@16*E`kSI;%>^Z)odxer&Z$SCk$XP;nlaF5ZO^*s&Tk9TL=qTbE{KfXT+&y= zW<1O0^sJK*&aqS4yi*}c;NyEDzL=`UQ)JNx_LjxGM7fOL@%DFIid`(iXbDCjHvnD+ zk_f)cyy|M7RVtyB4^!iSOUKwRT%mxHoW%b{Ogw#LUT=^rA3FJT+eeQIA4B5d zkQzR|Ww56GL9fKam2ZEyx^|LvIMI>^$TbhR7Er05aSX&-+3@9KsN=rW} zv;>P~AU?ceZm8=%_hUwG^9~-P{(2%nn=|Z z%br~}3KAE=b~?e*@3#A_v>wE!PPn*>^^8io6sxg<5?iZ1E^axa2UXI=Tp%DQ-W&`Ue68+(@Cqp1-e}#en*I+Qk>WR zve+G(1>`b)klgzOE?N4~Z{vQLJd&Io{Ttxj_B-EFSc|iIrZ|%<7HjCOMm;)L#yRFv z^P-%;YmRxH*dL&yH5(%C5yA3XC;1&1Nv&9qxHZE!~VhSP-2_l zBfHibPjscah~kLm<0k@NlASLTPd?`a@Ao8%MHS9ZZ-X#gow5xQQyjFh899ytg?A1u zNuJdbikz{S2ucn_Gi)%3ckP!r0`R}bZKJ4*ArddfY)PJNok)@{;-d44#kIAy2BTCM ziO%7(3R{4uSqV`IAO5opW;qB40(>8((!KfcNKjd zZO_IDU*dV~n4mVEfu69+H8f1mx-ZU8SInE->WyiOntvfUp8`CZU5A3?u0Wx;eZ^-IY`3k$Z`M-;9d)khdGE-w zFrC#XmsY&yr8&^cnFMP-yISyHNSN3?C+b?mGjI0k@#*NWpp7A(J4xShwUeW>YGmM< zsLeiC*J2#ql2=*Nn`Pq&E>eTsEZ*=6MAF$uZfeIG{kXf?^L{}z>JLwXvWCdRn0%&=4VzM=zRO7ndPFk$?~~yDn-lU8SU?x4xqC1aJH2T z7^gEFI(^0HzHSSPMoBHu?ZgfUrZjn__IVJ_=Z`F^B9i0C|D%<{S`)esT0QK)3n=A) zWO}N+WPb~w4+G_VFby=n?+YZE!rRU1)CRa3_v-Vm5y!gd31UKUQW!2l9iYGXvL$tj z8c(K`5LpCxA$LKhW&lDn;7_3$h_ty}D-!~Z&2tqeg?`VzTmSTYIR_$Z1~_Ji@dcn@ zpwn#pHxziq(t5jvrJfGwudkQzlj>tdTd^)pvYiXS80Q3N7X!Mj?xeK+1I7Win{vI% zpafj`50u05Bz*HN(7)wYb=koQ{2)Ki!|HayZKgkd@ejDxTxnGLNm3Fp&<=F=JeWyx zEqb|7cvhIuzHJ!E}BV=iRMKH~3sM!cG4MfN=ys&JS0)$Z>EkM?QxOJg_hP z61oN!1gY2$woEuUzX8~Pde{EX5Bg)=0Lc4yAKp6}>3?gE10L|NEqMQ5SV^i=g&P;A zFMSzcgZ`(vEiki`K61oFz>(bpQGJ|Uh5)krAG>!+5COhB0dVEN9dr>yihvJO+B5>? zLbD`O(?*I_(f9Jd*k4cz4_<&03Y`UF4qKfU>lu?qdo~i z%W~q4WF!_IVbG7kMrd|9NrK~6~6_PEp z>{DS>E9|cfQ9BtFik9*g!fs;G6f<5MicSJuxuar#i2;%XsaNdX zY0kDM@s+fuxq?G;#rGwm+DBPmlgj#F|)AwsUpSxWu&Kxy40&09LHW}`Dg2PSwN zD6>1})Gto&_+@4;H|*`dWT?&-DF+Q1B0-rORO}R*l0xT11k`l_MvouIn-o0HNI`lm zv(7c@y;;oxa$aprXlFq2*yu!anU+;kFEqMh7LIDBh5Nh5X6|WCcO*T^k2Ly2&c|iVO4=G&MlUtcbEga3P*L*{z&3j-*N(|NJ`Wg1Uxt%8DJ~WHA0(;xU?p( zV4}9`YDsKxY=kWp-`*UKcQbUAn2;`_5@L!2=fGr}Tf4$o2F#BgS7`Ionb#5T$DppW zEHvpsQ-Rjh_%%12zN~un_LYBhfj-)Wm;#bLml1lxmSHvLm3Dc?#+945GQ`y(X(jWHT2BqT-;T#c8P%55L93(?DRVJT0~vs;XKj*q z%XvT(YF4356SveVj0i^tdjxc6G&tnd4=Fc%s`E5Yyc%YpznT9RJ^Ef1{%bb8O8KXw z4F$<#Z8S$pRI#tStb=Ko6@bkV$@*;8PbZ=fBmgexb3J{Lj&UoIL%fw zcp(Z>ru9nPwijqh?d;lMj;hLu8&5wq-A-~*rzk(Ks6KUxQrj)tQv~I%L2dQ1o)D!% zDQw$YD&u)Y$r~{{9WO@;yDuKO+u7B~!$78HzS_6~PlTF4UonR~s5!lvBtqWYu=H$8 z7m^LWB?q0sM{Z4*cI&dHDqS`Lg|SZN7V zx*T(IFULiTRHw|lrU3KP+ny6Q7NX7}nQ~l*E{9;9zvp*#-*2LfCX&rk?6s^gx}#dG z3zhadA*X17@G$Y|_6%*yqtRwGr$7;{5N{Vx_ZCW_UREY13)oL|kidaTFIzR34cWkHg#8a{xS$KI!WiVDkAQ$k;~ zG}w?e&aYpEjq*_ZpZoK(-Xt>(?xz%<5e=9*L~jO9vF1&g2GxI16!zzT%3kaa$^uUZ zoJY`iga1vkdI#EL_=YBa;6cjwwrShVEOHg=iNH0v+~LJn~`Es|bY zF*5B^ys>Lj!X*i{Y(qbC{4R8U*{Xqz>mDCU4ov+gc~8dU*`37+QeU8?$0sclc0hiv ztm0~%jk<=qUd2z@m`g=_y4oT3DSck^Kdt>3O6PUsn3DUe` zF9r(_Vuw7;Tw^3fzOOp~?jEoCM$Y8+kvwHCp{bl4XlM57W4h|O*GOt_VqsA<1zI+) zjM*@@448x;kkD$52F#R`f;^Tr2R}VIKYAoiLAdA6qC`ZEa(TmU6YJy74E81uuP4%X z-;9uqo!EWX5?2MeeL>_s_k8Xqzufnx-)}~_#J+0KyTO8xCGh7S6sL_0|BeEq%VY0blTFcW3!B3V?O-J>j`NU3L`? zE3(-FE*g^tAcbt_tYRS5dyx0;W68XhbRPyQ}8ATSER7+IRVx95EJ<)K7v74 z@p!ZiDgY}8q`hGt71+cjqO=V$#EQ4D(rZ`tw#qV^b=!5-}h^ab({O3;t7Pj!La;~?k&n5C3} zI5Xh(JF?SR7Bi_s!p)J~*Z-i@bA+%`Z4kaD4sm%rIY_u)Wp}GlP!fh!qF?4U#4!T5 zyBqO7#0yFS=nf1ZLBWW;Lr}3LNm!5F|enYOV From d87f2d62b9c34248b5fd1a00d866ac45693fd5e5 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 20 May 2024 10:53:06 +0300 Subject: [PATCH 15/40] [Transactions] Full-Lab --- docs/en/jmeter/lessons/first.md | 0 docs/en/jmeter/lessons/second.md | 0 docs/en/jmeter/lessons/third.md | 1 + docs/en/transactions/lab-work.md | 55 ++++++++++++++++++ ...d.md => basic-transactional-operations.md} | 0 ...{first.md => entities-and-repositories.md} | 0 ...ested-and-non-transactional-operations.md} | 0 .../{third.md => transactional-logging.md} | 0 docs/srcs/transactions/task-chart.png | Bin 0 -> 51144 bytes 9 files changed, 56 insertions(+) create mode 100644 docs/en/jmeter/lessons/first.md create mode 100644 docs/en/jmeter/lessons/second.md create mode 100644 docs/en/jmeter/lessons/third.md rename docs/en/transactions/practice/lessons/{second.md => basic-transactional-operations.md} (100%) rename docs/en/transactions/practice/lessons/{first.md => entities-and-repositories.md} (100%) rename docs/en/transactions/practice/lessons/{fourth.md => nested-and-non-transactional-operations.md} (100%) rename docs/en/transactions/practice/lessons/{third.md => transactional-logging.md} (100%) create mode 100644 docs/srcs/transactions/task-chart.png diff --git a/docs/en/jmeter/lessons/first.md b/docs/en/jmeter/lessons/first.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/jmeter/lessons/second.md b/docs/en/jmeter/lessons/second.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/jmeter/lessons/third.md b/docs/en/jmeter/lessons/third.md new file mode 100644 index 0000000..945c9b4 --- /dev/null +++ b/docs/en/jmeter/lessons/third.md @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/docs/en/transactions/lab-work.md b/docs/en/transactions/lab-work.md index e69de29..081cbda 100644 --- a/docs/en/transactions/lab-work.md +++ b/docs/en/transactions/lab-work.md @@ -0,0 +1,55 @@ +# Transactions Lab Work + +Welcome to the Transactions Lab Work! The goal of this series of tasks is to help you practice and master transaction management in a Spring application. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of transaction management, including propagation, isolation levels, nested transactions, and more. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in managing transactions within a Spring environment. Through these tasks, you will gain valuable insights into configuring transactions, handling different propagation behaviors, implementing nested transactions, and ensuring data integrity in your applications. + +## Practice Tasks + +1. [Transaction Setup](practice/configuration.md) +2. [Part 1: Create the Entities and Repositories](practice/lessons/entities-and-repositories.md) +3. [Part 2: Implementing Basic Transactional Operations](practice/lessons/basic-transactional-operations.md) +4. [Part 3: Enhancing Transactional Methods with Detailed Logging](practice/lessons/transactional-logging.md) +5. [Part 4: Implementing Nested Transactions and Non-Transactional Operations](practice/lessons/nested-and-non-transactional-operations.md) + +## Lab Work Tasks + +![img.png](../../srcs/transactions/task-chart.png) + +- **Registering a User for an Event** + - **Task:** Implement a method to register a user for an event. Ensure the operation is completely isolated to maintain data consistency. Log this operation separately, regardless of whether the main transaction succeeds or fails. + - **Propagation:** REQUIRED + - **Isolation:** SERIALIZABLE + - **Logging Propagation:** REQUIRES_NEW + +- **Removing a User's Registration from an Event** + - **Task:** Implement a method to remove a user's registration from an event. Ensure this method is always executed within an existing transaction. + - **Propagation:** MANDATORY + +- **Fetching Registered Users for an Event** + - **Task:** Implement a method to fetch all users registered for a specific event. Ensure the method either joins an existing transaction or creates a new one, reading only committed data. + - **Propagation:** REQUIRED + - **Isolation:** READ_COMMITTED + +- **Adding a New Event** + - **Task:** Implement a method to add a new event. This operation should run without transactional guarantees to avoid unnecessary transactional overhead. + - **Propagation:** NOT_SUPPORTED + +- **Updating Event Details and Registrations with Nested Transactions** + - **Task:** Implement a method to update event details along with related registrations. Ensure consistency within nested transactions. + - **Propagation:** REQUIRED + - **Isolation:** REPEATABLE_READ + - **Nested Task:** Update registrations within a nested transaction. + +- **Updating Registrations** + - **Task:** Implement a method to update registration records. Ensure these operations are part of a nested transaction. + - **Propagation:** NESTED + - **Isolation:** REPEATABLE_READ + +- **Performing Non-Transactional Operation** + - **Task:** Implement a method for operations that do not require a transactional context, such as non-critical tasks or logging. + - **Propagation:** None + +--- \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/second.md b/docs/en/transactions/practice/lessons/basic-transactional-operations.md similarity index 100% rename from docs/en/transactions/practice/lessons/second.md rename to docs/en/transactions/practice/lessons/basic-transactional-operations.md diff --git a/docs/en/transactions/practice/lessons/first.md b/docs/en/transactions/practice/lessons/entities-and-repositories.md similarity index 100% rename from docs/en/transactions/practice/lessons/first.md rename to docs/en/transactions/practice/lessons/entities-and-repositories.md diff --git a/docs/en/transactions/practice/lessons/fourth.md b/docs/en/transactions/practice/lessons/nested-and-non-transactional-operations.md similarity index 100% rename from docs/en/transactions/practice/lessons/fourth.md rename to docs/en/transactions/practice/lessons/nested-and-non-transactional-operations.md diff --git a/docs/en/transactions/practice/lessons/third.md b/docs/en/transactions/practice/lessons/transactional-logging.md similarity index 100% rename from docs/en/transactions/practice/lessons/third.md rename to docs/en/transactions/practice/lessons/transactional-logging.md diff --git a/docs/srcs/transactions/task-chart.png b/docs/srcs/transactions/task-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..a92af237998e2a58458b75789cf33d53dd83d924 GIT binary patch literal 51144 zcmcG$cTiJ%`#pL*>On;XMFgZt?;xE}kMtU(ix7|w(tC$vp*QIS0w|r(qy-2~=^g1c zAiacu)DS}8ZuGqG_j~95acAz_-;Cn~lD&66?RnO-)_RC|0am(q=gFNv{`ljbin6@+ zAAejg{Ns;5DQ^7*{O0v%_R2s0_~#E5`RBSmCOerVP02bfm)N}psKm(wIWQ&t7!g>~UWm#0@KP;UNKclpc<{v0s463lH zK+U3kPjFKpo4qkylWD~;8b&yW3|DLJU@yvRvy%ANNfd7}d?1wt{$r$9P;Z@QrSl|y~Y2&41dQ2BEPyJ@UxZ+bK$=) z8ScdX&&|L6f4_OPqnqE1RVs8$QwE~-Na6Rt;+2M@Q8hWM(pz)9g+%lLUqHv>I^_Sp zsg)$2E_WZ4C-y(jM=AWD8HG9ZOp|Z5-FQ*FVWqi3y=u}oCHg>1u-MWKL5r?vmt<1e zaPiQquhAj0UnoQ9t$8!im#1AUa5%1`8PYf<-g17RR_%qEg;|As9E+2=n7&IZKEBh8 zU9e7tc=0#;9Sg9quvin$j!&eDd4A2l*slpj+?KcP2!EiTLc^pKThq49yyYB>&uG9P z<_5?#CF4;Ah^hdbn_%$8xr=MeyYIDjV_kRYrRM|oJ1N#pFV9lR$KGBiTA%j@7A;4F z;cEFRHJ;}4H6LjYRlNW&C2C6Z_owh2BH)2d*ad(6J2t~vwB>NE6mCQFR|p5_VaOjp zS^mJ9Tuo|@2;9SoVBl*A+!)qjOJMC?WfAEhhU)fOz#DLRHL_OBLJ75o}qMXhf6iilYDhAig)rTlX%{H)JrWfAYMl`Qo^~@Pe>ra!m$wA9HIewJrv>(t_Wu#=G4u_v}mJ@MPi^V2e-t7C%x zcy-u{+!9ug8uwbNE1aA56}kAM`HkzGGL!Gz2+7_F^Y{Wu<%N{K3?dv)>2GHF?}Ena zT`k;46etY$eX%I-L6rBR}4Ohg^lR4)MaHcraz%+2;4w;4A1GCs}epLyg?+}DV zcdYf+Xuj8_MurG9^d5D36kp49z~P|i%zkaq+M~BC=eLUZ3UAT>dD2GAH*FzxI3S21 zz~T@A7q|`UwZ3EoAy+X*pxSy+V6XMErCB6}VF&j*IQD%FgC*EUjVEf$P>)F?S|s)l zVqo5ye;ox~kc!*(-?AU0MHd4E8>3wlmDk!rh^za>6w#AqWkPSsyY)=0#q$=(OU9G?9Un3AI^`MY!^Nn& z1;2hFyU~uj)FJ~xpI>B&Fh=SYqXND0r&C{>6~#~@v3dUDp4+iTK@F`TGMBhv>)rW=84M6=$EAOrb~vnRRcKLs>gKo}_8gPI92z+T+JITq z5gBOZWw4`MGV4!QC5YU{S_1KDK4;9e*JMHYuaJvD_)a8F+cPh{uS227sh)mSLP=Ws z^v8Alr8Zk}kLZNjr<{yElXk9(Ci5pkwxk()P#4pNR&u-C#e379{$4JvDE`1U3x>S# zVt-BAZ~^+4q&7Fw@4Oi+&?x(K*!doaZL@J#u}wZ%hYFOBUjN7-=OAhST!^UCU_D1sP6N)dJO;R;%O9)~w4v`)_iN(4>l7!>qe^nD}FoX{ot^=yURK z^wHG?$KREAJK7wX;jLZbmyLMK4Dx)TKr7)@nykwSwaRSQ1LLw8^~C8}_stMXc_M$a zyF_QNO2V8EG2&C$LL5 zXH_W-h!U5d#$Pbm9rSV}u8IMx#KpI~e!5*!p+1}?g#q=86Je}jEQyDw0%5CF!3te4 zah1E>FWm;CGc5mP2$pGWOW&iBhK2P;wDsjQny?ibb4|5h+7o7iiyZ`fKCt_wzNi%?@Lm+0e^lT&O8Z(n#x3H&My1^zxx z9Jj9Pap&2#hu#CBKT^=Ky!ZKjZ@f1-ksbMg@$HV%akOC|RO9hho?oxL>ct0zf$4q` z3KO5tWq&cU4j}r~t6@=w{u#pd)>dC6H~#JuBQo#2A*X&cR_DCvpzvMq*!KEppE?2- zrc~jgF+hnfkFXFZNaifg&`P0l24$7d9ZXZ79J2YEA27l*=h@i&8G4E{il=U;XH=#H zqL{4fHFYDm%mWsDH)fQ+e<6vham9Xwvq9e4abe>x`3{RHtOr7>W>4dS&)e@XVdItB zUow+IjzCk(Nx15D(!dYPmOgCNR>K1R(_Cl3+05i(kF{_>4o{Vjq?8 zJy+mx6 zo4e)bCdXBnFlab-kT=O~j^5O(3#+#_z;B_q-VmTpIoxUpXM046 z-Vu0+#l_iFYiJ4apN>F0jcE?M0?ofL!Sr98jD^AYxy1nh&)D7<`|-yd3LzJE-x|0H zqHXJkH#`EsCE=b_iqdrsGt0F6?^d$hhd>2EgtPVhRFgXfHc)X-xYW>cXH?nO(e-jj zWBOH!E;VVMrSTls`h_do!$^i7yhK>hPgVyvdSM2-VyH1lnT!261hwnNP^N~8N(9xj z*Z+Wie!V_eJuGd{)eppc!Fx}HzTkzO=BMY~how%QEc&e6bKj}#UN@%4CfNG|aLX}Y zw5br5=-<`6LI+NJ#xOVJB7?}!G#<`VNqiUrxhgqCm|E>0vAv=E8m>A6jAk@8x# zG{SF^$T>`y-U5lB&i8!3yL!%*hWXKR!iLPHU2xUl7qj*O??sl@x{B5dBr!LBTlc$lC~Y{OPThC}1b zUen=_Ab^8}gHPM(cPI@$P`hUGTZ9?{plfTgEF;;;vfdLtxefrUTDNfKQSdDB&K!`f zV0|1LFRLsg$X{G$xy7Z6Iy-T7%u^sanHtLnmVL zHN^`QM2{pA#_rNztl3xl^b3c=43SNThK zAnt?01%ddJ_2J+PcQ5J>wKecfM4ugdm@Y3$xa?IeXCbQy;de+EWJ?DZM*Bk8M#(> zZk%*_wM?=!v(x$j6v4$^5ht-LCg{C84XH{4!wzUa9!UyF|F5tK#?(6R;N& zbQFpS@vuort6mO)GvFi{G8}b&f9t}ZH99EX7)0=s_#7wm-r4uH3@iAFq|cYKm!Sct zOJQE~@Jn`RfSYQDxYv$t;|gPb4@crt94hjGjwx7f-#VIe!vbNVWVM!L!OuHIpFs?Z zb8U*=IL01wm0mr)NJX`&bimS&m8r?&&`n<)GPVU9f^N}3NmIOg9X9sV=J^Z#4WTM3 ztg?^j|JT>#R(`s|`+zt2A>C_5L(7QBEw=1{gv>IE5sL!DNgb&Cc0gtGE)rd8ndLcY zXnh5~xFN`z@r^{r>H+nGR+SJ8%$M&80A!iL{Buc$}yjEo`0g`_R77U^R*$BsFSgN zk~HB+hf7!aF~qCUd(TP4aW=`_IE&n`kE1Yc5de;r7HcJuXHVZvnFco}zdl)#l%!7T z?)ZQg2jz42)$1cRaPXebrVR=%Td$&FZju+RowfD59YNHDJ1o@)B5%ffcDq+>DXIJS z<2_C`Xbv}q>#(^>adZew`9sVyE5zLBM)F2l6%3sr>FcJi-cGQcDyv&~Vx&L&K}$BA zSyi3c_7*h`B7SMH{4VS+V`|US1j_P?d(R!>S2M{b3EtxV>1D|?TZ+q^@aw&HfAtpU zj9(~&?M0oM?8Kas)`HJh=p84X!8~k@dZx+@ZfQ|)@EftzG(_~z#Es7MCRIFakP5?- z_LcCJk7;<&hZNELul?j?;jA;@bXC0As^Yh3?KpD_Ozz$W8*ssoed^%@%Gwp!N+ z6|bS%UPX`hY#Dt$`!{*j^BXeaYa$OAL4!|0JVWY6gm<7kL*g;#qYu;K3b&a+WvJ4Z zm2I(5%K>)C>*9omL9HjV_JbuAEl+lP1V8fOWA*Tzh%Z)>H!1~6?0+!#$+;j zu!34txZ7*Td|mpo!0@OKzkZ@O47C7DjP3l)r5*eS?OfU4Mz|CIK=5(eH&OKno{C79 znD=b*iP1G%u36B!t+G=QJ1wOGBQLS`NVj^E;+89*pTnzd&e*VYy)2Oqxp4+jPhP&a zmyB=Dir_5aiYdzYH4|zivXN=xAkTg_nUk8CiY12iAGxt2V^b}U<|+!_KcipBN#2q< zS)WG2`!q6rVHsuS?GDwSPuXkvoCfyFw_w&e ze01`V=T}kxmES>cF?w6oKp$Cih95A-R)H*jupsbzu@aZlFu$RjUQnaf*M}0;Kk9q+ zo!ZN*XxwMFHS`bC>o6Y|oV2}U;PJF)cWb)mEwTe0LlWMs=ULfnv=`?6v4fJv*^*J#6YmmO)+DbG3~ z+}$-H(+t#E05(#U$8mf7(tNHwgWk|F$a|Dy{cC$h8V6TaL}p$2FIIF;kcIW3Hrzho zJa1Wl%4Qg~u+rKZ@PHo`j-kFfId)q>R$58r7WLn4%m(F5L|9Lr@yx8bi(GuGL3_3| z_?<{uFRgoHyp%V4QNx2?AqwhPXP=^mr3-Qdm%}ALnIpxLv_V`odZYCeK`YU>A2=e% z>~AbGN@sIYU6DR^c7LecyK2Wd?gvAijcHJ=BYwcfguhHY(<;bUnaN%4mF-Mn_xF<0 z`cYc%qjy9DBN*}YN^hBmjU;&jZm(Wts5KgR=TB+)Z~Nl?6IZ}hvi+2%vuvQ4--DwD z1~=NS&deT7O)y#a&UfmJp|XCLuM;EhiT{_k zR9S-eYv)*)N^QX}kpljb%!7_{o|T3fC+qcsNT@Gg(zKOIRqqWAn#JZ8%>F&=&9dqP zC(S8~t}e!WCn~*>>>Z@P{)ZVl21}zljTWH5R%eIU&Kr&z|HW2~U582q`ctfw#H`MRh%Nx;Nq6F`he5a0iZlSI>~Gys3in zGa5M_c2(UALcHs#VxE!z5IpkZsgd1rNj(msl+!L!|1{8{{bZ;6;$lBRn+h~IwSF+q zg~-h`n|Kug1bV@rr2vQz9KT{lm*6=o0D&iHVB(v zCU^OG9rGN{tzFiKB)5yTv+DWb9@s1=d5q%kGtkz@QKisX<2jXuFnTkJASfjV4uts0(v z94c?zefN@AYXah7`ZBi`PWM*^ujpv{<~F96ZG3t?*NA9d`4tS*D{noa{?SO>GhhOuvE zCM0!5NNiadPf6M8Z=c|R{6f1TyY)()TFhkh#9*GEud<&PlLznHOODqu@YJ}oK_eu6 zA(ruF@K7W<32mYR?x*OrJAOC*v;aL-F>Kgk*8Z1HYfzw|+p01?eVb-^0_kbbWqn2E z4xM<0@U@(_Mbk=5?$nHdefO?o-*iP&odkF2=9Q4G`T*!*y}WTZGNOt!p87bDnXW=HTar!+!~0AklG?=+?;Qy-B^aergv)45a&PSX$wu50 z=lrNCIVY&oRM^HrB6CLc#F4`NZyx5*nr8p`djLusrnQnW1w*f4PuOx0$&cxv?YZu0 z!c*Bd`a;loCFL@6&UTKx!_Bf_s<@Jkf)qMnfCm6NPXp-l4(4sm;Il-#3AmmTl z1&_BUswec|rJfIVHNx)G4g}#bHcv#I987|6Yc6C)Jo%%q$N~;}+17y}3-ST*t6nwy zNgi{iBJ0EO%d6pS- zaNuB+*Prw$^poe5__U+~Hkd<6nJ&qLS~79$mpDDMVCGbhW}h@F-;JEo9@ObqPNRH} zWUZ9_m*fbGNh3sV6nFL1=wr)x==-^o9Sc+U(wlrOjz|*^-|=Rr%d_=ycYH=7GTUN! zSfnO(#)C>ujl!bUErV|$y`RZ+_DF14+9)~Dc9AEpymH01;qlZ$)vR%rf2VIf$;zG) zoqbf5aKhO3d)`VE(o-#|D8OwSSymP6c*PLWjVZ$Z3Dk{gkAnX|H4S)G#j-iS+3wyE#Nzvh2`)@Fh0b zdbuOQ3$H0d7>|A;+=qxj>|e5{TtgdFm^j9YZ?hZSTcZp-JBom0kf6mb0lDLK+)RN6 z^&HDAn+o_4MUU`={L?@*PaK;)E|)>yNN?5LqurrpG~`DHTY#COA-k8;z zGarD{FJtC+;%Cl=Y1=6*|8<|nwgsTrcHCC)8qNbc78LpNRM9LE3{PBq}7|(j}aV} zv`~zuG%HYtnqM5Gwx%)2g-%Djx22d+SoQh&pDy(a$PRq(kzdtp9`-h}T}P0zv%H^!fY0pa2zM zm3nRC&1hbPFS@MGErnPs5XdVX@(G`I8&w(Ft6iZ>-X9)xMqCw*HP-Ka_9-dgu@`Re zG+p{)x;Fv&+9S%~k~pZKjWw4i!)F+yNjTYD7{oAs*mb3A=Jq?9aIQb+s;txwugVrc zni`<-->E$D?#{kEx49zgX|Anfzx2EKrZn`GEdKRF*zvI2LZB;UzXlNE5>OTX*j@d! zw;0k+poX3kTp+8IZ$Wj)x4=?1E&_0CsrvPVZMJ?x8PDzUognU9MjCx($gw97DM0-p zMRXtkV7vL5on4jTz!{o7uq)9PzAXDI<5W}e2fnqNYIH7bQ{GJX@6DrH+cqg-4`MEy zAbK~^ToM&Ao+YN30Fouv!Xt zFHB2q}7{ItrSXfA~diy)fsIPEZQYw^GYsarrkutlkp!dq=yX;ypD-xA-x0 z!1g?0?PR9dgZw^LE2#<~C!|SB^D1+H7=R(3E_Eoc>J_>6?v#4RLp?ww5n4QWA>QA} ztpY~v7n7!jQWMX8dVZbj9kr;_UC~~KB%QzAs5Dg#P;33E8$EW0*zW!H4Ch&RjlcXa zWv$VK9?)hG#5Mk_nxiZ3%!N5;RAxCOgxwLkNbLcfmiVQkt^&{fUl~G}8o6fza{o-5 z+bgCf&A!i0#d_^db_Se%?dsV4{pG&Y(ThWXhzTn(NBI%9pQ2O)pL;^I+jpz~7EaiQ zDVwvWP4E=z+TpU7Zc-SNX2hiJR+@QR=f&}tD8I22Tx9L#sORK<=LamhjY4H9zP;Yy zQ?m!!Dgi!a;y)O~@HNn@fAfjPn$Ydu;v#9)Q9JV-l5=>9Qygx$F{$C8FKKInEBRvY zWk4Y2-pUIcXg<8{S1qNNG)oU88?AW$!XK-|&-01lWV)gSqk8u;|EVOb_9kNT@uIvvgDKF89#bw$;n{wk6kHOac!$1L}EW1&Wd^-Xfn zmDF54*T`F+uVNw%y2&bSeqv(!2-p!pEJ?hLL^Lk{G!N@)6RZG%W`L?1oy%XC*RM?u$K5zHm0_Ya)0B z;LUrwVv3J~yAdr5L2Ki~S&FCt;;{cAdM1b5)BP>LWT+s2{$O6WANyX5OkTbW)BSu%So=`sqayd>3P-!O^H`FG>M;|VWGHoYNDX&kdn4l6w0qjRt zpm?7LM;wk?0o+`}44iLNIpd@CNj_>obq8L`P%|Nuy68pEnKp2S)|n)@&iig;>Zb&L zw6mrFzq5D&opc8)Oz@-R={LQH&bhOm>Xp4BZ!tf^)N#0XlE<^Rp1TD|$@G}|6bZyx^-M^QqNW#qTpu)*r3Rpyk?1&fT7v&xtW zRikF(lE*=va!3xGnoL~tbAUZOd7oC>x-c_Gb^XKb{qmCRpmYJbFegk(2L7h*d79+} zJgL}#&nom@6tXiE-AhEDr{15!F;))I)gY|U>j01-X=|F_N>w!{(0e9?uT$F^Gdmx+ z=*wnxhK-vX51p6yx~1}BYK}X| za=kuabH%E>#Tzq_d?%#dD;&g7U@hwdoS!d$26jC|kp@4fmu#?20V;+Znkh5GWG(v>U zwhVe~)5lfVqg&?`e~#;?qK@Pic$_q4gph~07k@xHek>)Ns6l-Xm%CXmR@HU++mC~a zxT|QjH%*vQ_F5V}GuHZZIk{JKiuLi#RCt$FgeOtg5r^H?0@rk+9&=PXL7XJw z2P#@)Q$pOf>&99OwT;P9X_t3 z2&86?*Awd5Dm^w*4?859aR)pBcJ1>UivumZk3nnD!uGv1=WO@B=2?Ky0$3##eeLqh z;8s*9A`C0U(KFZ)mL()}xmID0?zy-}BAiJCc}(`{!ooS$(cht)7liE}PE#O(5|=k} zAYfle@F`fI{7nD8NSlFcMD&l1_BH@^V=Yi*r%A&ZT229RDv)mAN5m$1nR=rvG{;s? z6ETOjzHyxHj)kT!S`Ks1@N}ot?)|y;J153UQ&C|v*k_XZzS^7og`fXOc=1p!o_Q{c zovqi+hrryV1o#Q$DabB=n7{zth%x5e`+G(BLnP)5^6~*c=SSV^#gYO}hm%IRQ_&N5 zEU}ph8T9U=LS!H_{h{K%5mv@%vbw zx+xdi!xVi1;7}c8Qme>KTFc&gQrF9=mlhd(}_z?`xpjj6G?pDDl*9X!|z<0B5BT5~?mb85EO)AZH01@W-T zUSs~u9LlI7J9F1cNF_zC_+DpS&h0oht;abpU)n9xPezHZCF^kd>z=kbHG{!aGF!+F z0j-fw&$YabIAbLD5^qPeS)93&F*0Q1Smn*D7_7VQHGT_SUbp;c5qRM{-twiN*LNjG z`O{%9hlM^M^CmT*%WX|f{kRwl%c=Rvty_)wo`a$PY$Y2k;~N|gGIPb+qsOCV$R~gr zM9ymUQKh)|>dP_59v6IL>yX}FKm#0p<$Q?~B!Z;ZA@zD*+?ED-#)8F7Y72CEx~I3k z2*fy;g4bJjSaJpSa0zy-+~XDNfD5?}nG!XEKiIpKwf997w1j(VFv=>ii2{K>`8 zseh?tSmB{5>&540F`X0`qm}x!+|7p^N1Y#^8b#+@sP zd-*aa$u3~dYA0Ea6XGjTOsna$zq0`ooTS$-w6BLluR2sCqf`2OA~Q&VvmEN54Uoqc z)$MU!H51H8%QO1v3V=ekbDLN3BGBP??EQ>I1SYKnlXT$5x=%p7m#(j6;GqFul z+zXzTePr$IgF-a=&fP~4mj$0g(IyCOxlYIK%wUJL4!uxNK`Z@4?PB)m$ekDX!@pK* zj@Om+=OQ=1x+c2E?%AA#PN`RmV8|K^s)jt#p1o{ZDk=#&my|uP>opUeo-LgXQ$Fj6 zPOJPXB)#sF5wH@?#pse(>fZRYyT|2d3qq^Lc$az4=#=Z4B4AY z5ub|wVGpv)PbTv-H5^a;slaV=qy=_k+JIASQ&>BERg1-ncDZw>+QZlLp`vgC)Gb3e zijGat&m+mmDWc0ebV5x=*9@wcdLnuBeR9UGxWnykR}-W61^-775(mzFa=Sd^=2Z6c zv^(sM=8fRY9FaP^YCSh-aw;dEwlej6<%3<6mm0Kj4-5@HXG$toJnh39F{roF0sk+sKCp@>-=-l`Sx3khZQ=#F8iW2Sq`tyc% z^2Y#E`~q;TMHR`I3~4677Labu7$j(asj&0~qY0o8jPDS6!CwbFRpNXZd_}X=4ZfI{ z1Y_b z(Q|#PlWO^9Ea{q#>n(4b^IwkjTp8_lZ1f{(71>z$u!MZD)Sgan(X~KOF1>?c%a(V= zgg3VWg{z}5KNC902-5dZ-ZFyosBLiX)y#?*F0X>|Po+L_(MpJ=QB5R4v zVXFv_7JMJ!&0KX{pmR5OkXU0A<5Y?!7-vN5H@DM)_UyLd_O36lQ3fkGG9~@}FcL`g zmPQJ`Mpht6{RAM_RLM7daS2BGp8{T)#fvL}WZvIHIl2C7A4v_{@FHTTdMP(m z3Eujr;?mC}eZfVow5Ukm6pnY1n+=?BYBlt-0sDi#e!jRH$$<|v=>*+>yp5NvmeJGe z$m*VYTInIRPPyyjG|CdIltF4S+f(bR-a_*_vt;4Su>reqT2;jw%~>A(EXVI7khY3o zj4uk0X=(6Z0ScgyJGXE1##;+xk1>o_u>8uV7j4-NuDii}*4Rkl_$GUjj%5;OsYJPi zD7j#rCVOGW?SB>(yI8e*^WJQwpjx&;hv+U14K%OK9B-SGOx{=o^M>^~gY0TutK<@; zGKX7VFs!JLu}vjmo0*g2^GlrDwzYV{Y!6|8%{%{g4qrf%*QipygvuEwa6D_=$wVh> zOI-^(Qf*BRvF)BD4OV^*M!=UeCKHsaHhr02)>8`t-CN{K*z-e4^GLwV)+H|$9Rja3 zyCTWYHxgbv0x&_yW2=XBd@3pJULjR9CKR_TvOi#pM7{|Veh|roqh#uKt{6*8v4!?Pe$!1oP687$g7GwNvBmqHwU(g+W<;fBrn3u+u%mnZGgp2>2+=+%r}67 z>YWwdog2G$H#uNe7qk74A$1((|T;Dza#;kq*HO(WS5n$ z(*wtd)tc$*(QvquTl(iJxAeVs-vrphyzt6&|2@;izIW)zZTU!*f6g(P&(1b(uZ>GZ zhRj$Dx17I`;CSJ)d(cztuc07T`bv9bEzQ`Vp1$}F$a9H~!8|(iUP*$Ao9bo|jdV~) z1q{jemzcFr9ATAAo-JVM@++js&pGOAvX@hv@b_a->1)>f8l|nLqaN2uuqwz3^=Art z7ZmsISM4`O7_82!l4)>$U8<@&;ot#0Wb%4s{|;8WH0PZDa-Y5ulW@>ZfARg|Jo^%t z?SUszHO1a%y;y46?TD#$7-vt94p-`a8gsttsjc8?)J8c*%vV~r!jD!hpw>DDWL;f- z@K#^?c)nmZ4Ea<*lJSO0{+m7@>8|6DE3e8~8)Y8{*?s=~kLYcv$JLNCK%&J@)EhsV zGC!M-11_E+sl1;`W{`Z8&#sbl(3z@Z(zu^KpJBhg2Ci96&?Idr?9QH%()aYRc$xSs zMjd1}Hm#`Nei-wWRnHA2ud2cbnGK|E{&5Xox3y;wZ(kB^t8Yzzr58I4e@HOa(sBZ5 z_ZhP=T64y9zD4{3c4zqVVvjyAjx0tkI{5DjiRUkKaCGF}1trCS4 ztG!~nONntUBlTn30CV^`$L-Z*nvONKf@I*^T&}%)*ovMOYi?SL?P=DT8!=$fc_MBuc_xa`+3nhbvcUshnT=aFp z4?I{Mma#9uD8DX;hr#dY6ZWLm(s7IorkxY0y#TDJ@osh;FY=aYi+eS_w(+c(jO6)0}a_8Z0k|PEni<7DwLOTk60R6rrR_lt(@p%uB3DL_2-`C zBLS|-6Y~)XJ_w7`C1b5^zoBP2+gG@}2==fGge)(=aFcczqfNN1uS26m@k^PQ^emSu zs_IP!u7rVE|JS)pRm)q}WeVE!VSXL=K(5^`$>Kv%rB7*;nO20L!fAbUE2pHS*5V2~ zo2>nN4(++79|h$9A%J2pB~=Xaa~U1FJFSs-1$UE`+P~bBiD$8P^~CdA@O3+ntu*cU zfRWrx!uf-fXyy;DRRiFG{rX_ody&%#+1RLaH`5AO!?O*snneD>GVtD;wX7*!|Ctp0 zQb%SzUY%m`!h+R0Za8S5K;3hsMQO{c9<5Z`X5)&iCy?5S_Vf2cpQqvRjfvo1)lA|I z$>8zR9Sg6A!;mg9ok>AM@?eYTo9mQU5_g4YF}mW?yVrkUXM}sBf zx2rQEf}a^AA+r{r{5~y;VBaAQ2!z0yRKgx|`E5f^rcJ@>5r;XIK=+|ardY$9#EkE^ zuI)&fd+4iY_OQ^V29okh59m1N+w*S7zM7`sSG+$z{oFv$W1s8wEeCYD6h;sXVol_) zjP_g#GUgKe8rok^vIab3!!nxt-TMx=L6s@GEK$??i#-0+i_}}-Gg98Vi<(2C&e%>V z&}BNcTS^G3CUIz@ia=GMAilKU<`R=g?=Nmtd(_^bH1N`PFSwrfF1beR$|Z_Lk0Wy$ zzeE?-f4*~AVmi0IR_{+=jpf;Le#Wson=nMh8lWE2SaC%8-TlfDvi&z0VgN~%!p@J~ z;edQNBnx6Uc+{D8qNpncn0EjvR=PA>!mV^`{BjuvkIP}7d)!5hCnp>zUNr#Wo`WBZ zHlNIv(8z9&eeaM-<5GphA&>QmeqSm}p(rii$XgMa<6yLzzEHXM<0Zw91NmQ9MtD#0 z@P$E7iQE;6`^{wYxT1^vfa;!;tMCKK2%yIfxs;oGnM#AO8bNj5sE zvWSrmhJ688NC2b~puRR|in;VVrY4eqhG+R6=Gb(Fq9Y|(eh++(voJE}k@S_Jx9GmA z`uTfbS3uO)w%%V(!cDd2*t`!-{28C=r3!t_lVg*@sJO)cMgZvJ`U!$Vkjzm_J@E}# z49s17-8neQ*?@d0kWxa#3gHk@!L<;+{r7*3k5_l+y|1|;qj7%SZ+~?ymFe>tezA^s z1*^uV0krJYMUpUj%sIyAoowm&Jm-b#@bxXn;fT_{XD9gu?NvPw0HcqvUnDTltpSfp-r8|krXP=DG7X3qu*uF8Ku>l~ z4Q6F>72dFG{_#%vMe&zV{CKj9bGlH(4bP*^B)|YLf2^zeAP8Qz)H3m4)_ulm-|La7 zYIG6Zf0)PLvz)`6DK(0VhzNec7eMFFeMMeFHKije)Dm=-0daQ0G?sEi__QcD=NL1a z57>?y=8}@~)GJIl0Iimz8oMx3d3F*rwB#M;x!ezGvkG5)Pf{=t!KT>189Cruf#kIM z>#j0%%0vx%#e=O6=DOCD2A}WS`p3%QQ~2Ui+?)7X)uCqXIU=+!fA<~jKm~{&ckG4H z&mRA5*IIj|)ru}J>vnepEIx|_Gb7{$5^X87ON5o)d9uTY-Mi$fke|W>Bq!prQc%iJ zyrS;^azfr=koT+_?T{&@kX{TR^CVLE(sCi*BCP^0uJOX83mk9f4^$63L1NPep@{;b zs7ET}Hre?Dz8m@KV+HYIRrgR~nqmx37FDs+B+|-ICzRXpehj!opsNOjrV)y4k;lqQ*GX0p zg3*aOK{ll}86q4&7aQ{rZsN5XK*vHW(Q80~rmvFh(iJJ$Rg?g{#w=u9&$Rd~=vZ$T zx!iM$2@d!@t_WQR`l}XFc~5OX+uAx7kRhgL^U*2jn0nBvR!01;!CHg4zww!<@%ywb)QU0IbY!ojX-{B3}<9dwZ}>QsuV>X&CpDMe3lF1Y+OltqHxv zw-!Y?8zwyI<9PlzRkf-&WH*(s&^>IBS-{?Du_i=NhEXkfhSVP%5 z!@PU(#N7!A+bKGnwGOF50MGO~xRl4OC)c#TrOLWRBSA-&JY~NyQ=)L-({rOMg>l7X z43etKN2aI6qmYiO%2&&U7cUA==bx?~bwjfOn;_texoTM;&3PEDY?JEY^=zNySU5E@ z8n6t)0{FE^EJRUmdBnJ!H?Z!w=kxqW#ncQ(vxE5ScVK30`k z&y+LX36z7eUbPA+USu88Nm*S>)VYz$|2e!qIJ#;#&L2ZJ;Xd!m;f}|Q?9U67V}~SG zHkdnw*T)Cdn@7Xb<^FB%IT2R!l_j*o_8xEPzPy z3d0VdsO8fPgW4H56HaG3PO7gY~p`?w&&6tLOABCvUT5LdxKm}CIQg&IM^sa8GD5~!UtZQDnbx^4E$ zW`0`r?<$gywLJxL>ecGc^{A2se&JK6FolQc-cCdoP0GuH^f)P)TS{H4CbFfXJ8E2h z^_Brmg5)m}hA#7}6C;9uR9w7(Hk}{%Of95`uX@b2Q`}`zbifoCSGx}Hu7O%|KK}O_ zt%M;LvcT^ZIHkd7h(xDq6$|zfE|0oQAr7mPIXwWvCndT z{`X?QcV{Cvc`mP_F5+=Xz;z4jTg~rOU5JeY3>)bsv|G5)1=a7^)awUc2p%4~kP(_A z&Hw&)C&Aw)c$7bj|KrhxZ&75GFj!rQQp@;1Hx>qB(DoyGDq=x8J*}L2K9x{PJ+&x+ zP5adlUvv$yG<3+j{cIo5R49(9SGBWX;@|-kxZmgHFF=RfFVfW_KHQ|rFYg#^E9q{( zGMfEw|CJT3C)hIRz&1BoaU96Bzd!O%Qr=jXyujy(MBweeb9WnS z|MO(_KULL*wC>UKY{lXT1ACF$ujWtJQ0hm~5Uq^=>@LQf4tYqBux~;FUy!Ja^}8&m zj+3`nEl^ht3LGq3chw5tM#y)>u;^}kZBt3*dH`0>-~In@uCZ(xnBZ$UaWMq_1Zn=c)}Cxl9>~{Z=IvW2w8E3+~;jyF5?LVfT~-rf*w- zg*8EMR5(*=K;Le81|AO3Kgq-s-(Q>-M|ue+Xla>jC&8R>W2OVkJoN05+Dg^9M85V* zZeV(f4wKT9VFek=d6b8n#E(ZKJw|ASA5|eKZ(MYL6JX_??U#S3s{e$6Q!X=c%-P5SrVr#+ zQvgS=hHk!s2h=mIvQouNYK|aMZ93)=tGdCR$OQ!p^{Vo*D2AKM0u4Hb zs2k>00Il99sXX=s{m<=Q5xbw=q=4#jlJ}SU@7Sf&1Xne$>Q1Myyv#t{1VTeF+qbi3+am?H#t>7LlaUnQ=GR%%px*)Bo}3#9-UmuXMl(^~ z!1;x!CGUaZJDiR`<^f_2mE{lULJp^ycyY5WRsXxOVKvpIm(v-Ts+r-IH?L~;EX!Na zCjS?A?;X|D_I3;ZJockV6X~EJz4s1BrAQ0Xr36HZ6bU8tdQ_wrk9UW3#q z9>VYPk}oIu-7+{vzd#;^E*r=-f<@WX>V0A;?j=JQFNHg@&^)NS*-%`!uW0nlXL@mBiDYQKtrcK5Xc5em zM@RlaZBr+J84UauRBt;acPZK_`)INIqq4iwv?O4Om$yHGjr(S15E$rjvQv^x=C_pVsqx zbwX~7kd-8T;U4{b@s?trk(o)T{k?%NRORtw_+*Pz8de+Om+6{50ZKvp&uH_~d2P5M z(5&E&fq6!j?E3X4+>nIb?8RVf!Blbf#%$_dK70zTTzP^%?>mwN9c+c<_v4ndc6V@J zi=_;;eggIczYAQ|@@owjD!>O`2$qY5V1{brBL%8{JzjpuMET{D zGrX%jWB5vJ15qc~4p4A6&~)cHpBCHGg~V!b8mcI>MksnO(j8Bh^KwOSh^k9jA=aph z+wm{s{xoQxbk~JW`(1Zu@S@Ilj8wK1+gEIyVbzS}A0oqS-O;oUb`V|d{8j;3cm!IqGK5&;ps~{S~)O}nfn!siel-4;8*m=sLIGM zJPU?^^~QcL{H%}fKc5nOWi33JpubW?>{du?%8Wri>_6o?7g*2j-r2&4tv7y z+aID2Xk7&=oWg zN;Q$%DBcKD%W-XDH>>MUtw+|}cwn3VoYNtvx%&EbJDFowq45E2wl0ZJS@aPO7u$8- zIb1?t7oZlnmu^rTZ+R)!Ujq)qptJlG15YF;dNS(EquXrx`8RE9EtA{^;~!dnDH29Y z9L`6e`(7u{)Ux$^Rns=$#-k%}%?)RGwbIA>Z%a76UR%ki$1gF*e>>@Eg~+WX1Px`?~) z9;ccuu5&Uk{#Xel!Y~rcj?-QQBUOZI2P>@WhT$bg|t!%em z5#%gwf9*zbU65Jml&C^&U-`jU_djr^DCg3HqZI-JD8KVSyVG@>%#4*QcLWe-{DpUl za(vtdtw}ZFaoLA8J4gOWT}gahtpDs9hPQ?NOg6|7QKMu?`HvElVG;8`m_}da z`tuif=AhC{iinCNNc55f5kENK@o|Jyz9i*E|J%s$e+4Q{+xY!(fyW?Uq@}^s zP9aNLx$eF9*z9q8NWe400l*E%vpFY|*NCquAUPoI2-Z5t+8r^!wu?(#jrgp<*`v5- znOZWyW+{N)&FSqQ;gaee+qpRc$kDPCQ~~|QrkHNWW_xR5(&nJB!0`2RFY`UX-6w;O zhAc(OElm)^kT=Bah8``wUWcGeB=--c`YV_lJ7Y6%pHIgB#*+TSlObf%ic~yK19VQ3 zb!Fz3Yn~0CEE5)VB#j5mQxZ|S(4@}Vg&8;U=^cAO5ZQ8b&9h4a`#sv^pSdgjO?ANZ zWp;2x9>P}NNZxvlb!`0PYy{m8cv&aN=L6oU#y;kD#XhP(0}3;y6W1^_vQ=X)A|zB4 zsU6p=y3}MGMA0$^9;n4KPasND5BvBkoXsheY)S@47oM+Q+mgYGzntu2Aun1qDVp;F zln(a-%OveKrsHgqcaBNgAP%Zj8~R^VJTV4ue7)N>(!!s*%cW=WP9DQ|E-2fVR8kU?6>DHptcI?FOgq}0AUDX3y`HY2C~ zhsa|4pZRnbAkoj5>yUg-X|!POiAuiFe$_|u_w12U@4bs>d+$lWyQ`572iyMxa8mwo zP+GDKbGz&^TzJ?{AzK_g=SRD^LUJ-?1|Nx`SN4%wEiNyd??lDd4siYLK3Fm?i)5GI$c}W zarkEAC{M`nT{~1QwkBtQR^seT{rt*7UHfd$U-?2~2I>e9(WO30uM;P2nqIL1R49?c zZue#@Eb1pMKnnW;FACG%vbLzVkS~$Y_k{oXk=G%x0L(~;ZzP~j&L3ryjOG^^P`JsjS~6SI81{r>MTcT35is znXv!JwD8+d5U=-HjT;kh#QgyBlTY}mcx%#zXWO{JrvG8_t`(rgw8O^GC2+NAAZ_zlpBH8_q< z?`7@m*SHcJD|SOr{13OXxn^50csr{vKY|=G-h?yqfHJxpP*Omh^nZGtJ z2bp<9WR}dz@HirXwU3@}g}1;vU#U~yS(#I3b$ZY|5YxPO(Fghc>Sluw>}kYYhvGDQ zQ4&}Z2Rd%cT*IEw&Q`J#;#Kxs0A)_Yb~mukYJ`wq@SG3-O+O~*n41+ZbCssXj0K$F z%;%0NMw`^$5S{ZzBm(Z)VaOZqC!WeV@4y4vb$a)oTOdkbzOlc{ROTKjewX)4ty1Va z>xxX^A$%C8{ap!MY(5>l;6;2H^l4NotaC??~5w<|c z`Z^6Ou4^U3p!_4~k~s^i<2J{$*7-EgD3tIKjrhD@tyOR^X_2Lww>g_-Z)*{bfhNCX z-j51d_@orvI44W%cVSy9hQCpWoN&tc+r}Z5Fsnve_NLXJcNjE(=>9sG^$;)QHtKMu z+U{xlv-KhgJ@--?U)D|&Mg|HO@S?7|D%#A}e|M8RqmXg?W%+&{_T8M!>p5QC7K(a& zfIe6=rE0;#1*#Nt$ovUHL1f2Kt!!u|ZWtS^US!db0< zp?p?Hwyf%xDIVg!)_%H!gK1mpD19rBfd8AWb+``ah$*CmZqBq8Kl-1kZM8=c)`djP)rrn9_t3d(rI^bmS3`Ukw zvEY}H+OHSS6hho1KNF;u&d3g4+60DO+U*=pT#daS($+CWa{>+eNbz9^P{C%}9L6l>>VCunm`@UimF=D1z%D#lXuoUc`s$yT2RcQYczV zQYeIMy;m2j#L5ocERXR*zfB>!JD)Z5vKNF?8-Dua98xT#r(n0!QE@sY$t1Vh0;2&c zGc@Db+~EtlMJmx63Fs#$;R#BMvPFLDy*v-9-|63{F)4MFA;YCgzp@j}-ImUi#f^9p zIh$HNq;9>~CtJARQZ0Gxw$FCrZSXIk0DKP=DYydd$xBq{{E`FQQBK8`1}{!=28`tL zP3lG&?-#}8rKVlu^=zWEAGu^Eq9OM~QKjn-`}V?_%1=d z(#O;$F%NvACLUlL1P3AKYwz{_%c{5Q*LX0qr^9?z)N3%#0z5M>Hxg_oNw86uD63F5AJRRI4`TGXtqtJ${PqXij zMprG;e>5;m-41ul0K~+SjVvN6MyC^Y9nfSo(Db-+S=-i_X1$T+mlAytSn9dmByJ*8 zz67l;o~Q$&6fRRLdcWMQ%h_WIh>f_Mz9{auu(_|zShq$=&9w*zNq_t{Iq`O|;SYmX z1KyU?A&*ZKaOtk$^w8A6y6WrkQ$Bi=znQfk-~OxM^P9VAEbK*}gJOfL8`Z;Pqu>Vr zsVjq1-?Ic^l{%Xrq1?#9qtDl*P3|s@d9_i#>ToX;H0$cIgya6nAT!!-iKH(q;5y?SC z8|&Z4RnYSB?Uoggcq(axUay#%z3S|mp!Rl|4S%XG%ek*O8|XQxsgmbA0;0Ifl1C1=8N0CT370h_ymQ1+n#xxVPEg$0aEp0p*)!2Azay%dD>vi}QYlpNu;{clW-HVcsMJnVbN6Kw3 z2kqFtX%*W4T}Zt>_#*yv*+RG3&S-Ue#d)))ooR)mdHh2|I=z;2`{wKov z-nEy=o%&n6;d4+BxTa6xb*NzLHD*Fc^y$YL7KfqKXBg`4GCc(w`L*Z*%Sv|~>tGMp zGEP^NDcf4KWar=*Xw*U@6|96<4DBs^Te^Y*v^_)Fs{DKDS5S9Th3IdE*iuS7Zo#ex1gO_fwguC1BzGJI-HzC{cv8 zW#==jnHYOnk}+(@3-ZXkiJ>e`#mrXm*P81_a%knLBqBbRwI2S90H?Xe8o3IQBMhh{ zp8al~T3_*cE~OhXU-w%4A;X#DF#-@x>&nt)`b z!gG{TD!oKWP{=`boN(!ZtvnAkn;VnV6qd%J_{wPxYA8#7{|7suz+~BqUsgBhDAAcNFnux|Io<^B8 z;V!D^!W{egf{!#0vRO%`wQIU$BaSl7%cJCIR+d@g+bTs#+p~Z1a{Zr}zc@4ve*g+j zG(RV2go!k-F!}#qe&k5HoIWd(yTmU7z$D?!BTFVT%a09is|!njHdPeJH0jKYqZ_Pu zInmH@ZYW^Hv73LS(>=!b_D6jR&;TsG%eZ4jk(hl>Fy>6uz>%%|V)#UuN#Pe~+st@%Xl&wa@8R*wTEmpbA7!^GX32z_TM^V)*fq4k1OCuOS&C#EDz zN}t!EvUFzjJq404$4LCIGLNtrruil2(A{qx^`ierrvG9GC?9!jWYDuS;V$ut+lVxrUU-nvYuG$ot@}0;oW=AftFwGF8 zp;PqJeaudhiGG&S#w00YL%o!OAfrRvR`DH=}&e@35|IuZ%V zt}CUB99#Bf&YvMcA-^(l8em&rsz+9ut@z}!|o4v}x zz9<2`NClGgFOiqAcU@WnC=p|l3UfBl37DKSjoV3JZ|VJ-%?YGehv&nPjUnx1d=9Nn zhFxRwu!_`6CzDOp(07(eVaM$G%mb`8*a3;VFRzUPzQ2jx$KnK!r9U)FJxI;~tU`(- z8#rSk^i*1KczM8o9kpA_x6v7vU5WA8JUK3PZ8(0n)speGA*@u3ecvP5^R*uaTAog# z6W-!sGpBu{-qTK(KUvSV+2L<+*tU>IFDL+H^IjHo11L+SpE9uM3Am$VKx;vi7YR9t50WM<0bB|G>E!txH_e3nI90^bKZ#xz~o-porSalK#)$sBB zEAfH?9xQ1Pq5a^!=wU^Hv&s-_)Z@1|A~vAA(#NteVNBN@N)-l^&`#HkC!lz8<2H|8 z)SBX2FV8Uu=nRGS-G0IsYan=v;@ezmG7mG8wCxgG`uz=g6^-ou*o7w_npWGmDzU;w z2@Cf!AgSr^dU|-ui`)_ZkIV!St9woEYxo;9D&AW7F2H;6LPgr2d>DI}I9)k&RjNU^ zo^{@m*&S7LxSUoKq-pw?3p?BESb}AB+nc3*$ar$xk$eZpBWRok_o#k`wElZC0`vC` z@5W!?qF5|8@kTC6z{a1nQzWvRWGE|d4Q}@PQ0bhk6zAfA!b{a^NqJ!%=ViH zUzBbY`*CdmUEh}RRjtcFrRz{cv1wj|=ZLOX0~&d~`zAVOFH$Xw)%I6i6T!Nsv#Js8 zn!c;QUZl5uk_0YTcip+DW58+a5|04+%ekczUhGUu)SRrimw(8xAf=#D~6s|Y0>Z?s`UaEmrX+?4*Kxo2o0#3Yjt z5ca?(;JHKJbF-ZHn~EZDu0Nk*2kS)a#dCr~>VPh4x>t(C3$BT2(Hh-!mAO)F*f4?< z8!6t91&1M==zEW?K)MY2P1PBS+jBIkFfvD zJUm>BDGiN#T6$AkFelz~T4?naBWH;?1Eq}Z)O{@OSj1{@ckukv7{#bSiGHd}x0|Ty zZECMQ=hm&zsPKTw47V6t*_Zy<{aN*MWPo$a`b>`vm5MD}fw0*JStvvMSA5`9k;8d- zZ4$2CMu`zLTT!$wz(zpPjTr%5k37Rgd63w>=OFg?=4EOb`VOE+DeB!bR1Y{KCwaa41h7Tng5z0h~(9_$P}idBg=_QDR~;(V{a=id@p)A zFWq5A;Lb&4?O_UfN4OvylD|len}$Y&Pz`l9i4N(u1or*XD;a(Kk`}B2m+5*U`bzg> z9Hh~Tzt=rN1nBt~Q2Pvp`+Wk6Zq>aKP17GYy(-%&J?Y@TDOKzQm0A+-E)jj8JMFF2 z!$r-4>rS>_vesBt)DB5o@IdjM7rabqT1_jM&2;7MJQ$Wge>pqQd8<*pfDQOZ9k%2l zLsQi&D#pth7i^}IFP!Gj>aQ^wTX>gJ#m>RDdm_c>8oK?U?*=|dI`uZ2gVh}o)v&BU z-L&aMNG1OZ*1p?z_D3yOrTVUQ7n&PI23SwA&7Lr?)0Kzs~4{F)Fcjp~GimGoxdsb!ma8 z?~`y37gOBtDJe6i%Fr!n%@Ez&7MHrq(4KddJYI23ul%ZcJAvM#hscAOGM_#e#%kl} z+dK6jixKkfir0vbOljb!f5zTjnJXbfU{I(TA*gu6)@hY|5#YeR> zcg(mtU~$OkFE7HsjPE2{Dmj{fY0;p=rFu0B*TcfCD0luOYyJiQyyzE;X1Vc#NUO1D zW685JF*-HRx(T?Hr&>(QUA|S(r#j}J3awJi5;X%b5-lnWx+4hp9`?}8vPUf}>>#Nr z^qrYBMNEg3X)l4l%lA3kLckZ+&`gmUT#IsMM8JFU+FVT`oNjWmd^sh&e^6|zJ-R4n zy)y{A0ezAd)6lnW6aV+}EXG+VLq+s((odpCKD_96!fu)r+5Y>osRu2``{cpO^!2{< z)(P>7IK2gqzlX%Iw`Rpp6Jv;I5k0&$ZBNzRX-bKeV4wxXQSC;e>9~yNCV0XtU6IQdr+cY@!Nmi!UH#b{J(h#2@@}*I+Tq37xY&GsyAfytF51GDba_M%R^bIdHyeMQ@Xx5KtJCo(Kt z2iaHs0T!6>4785oRotwcNx~Yu;78;lh^4dQwb|#JFN&3p7YovAg=&yPT$0Ruolzmp zaSCw6UMePS>>jE{OK1>d$`}lvT<#PrF3Iv~aG15|^vw*!o{nKbTOu7N>ad zq1%@w2oGNknmGNkfNriGuro7?vN+O32Q|cI25%Nt%C5EZrIpbH4>s-(t?@N(j2hH> z%FdtkPFlp7XHP%N{XU;>Zc&iC+-z36N!ZzuXnEpXaUA{Ke<7=9Fj0q67r&FfrIMyk zNl6(WVXcvh=5RUVrAHI-CwqlBV|hYA&05;}eemIdruMNwRQn&h&p{&DbVE}afXIDsI2uZ$*t^PQN` zOH5`G4^`v(l#F$i7J{SscHEgo0#fPueN?{aYIj! zGOW9dbCV}k1%+KC*Fh>c&y_kfej#6uR2Lw=ZUcK0%k!b*`*|_~#GVEa)~U66`U<+1 z+4fCAVy{rb#8-Zs zi9O{`&J{F&cT)z#JG{u!9lj(K;4}1zXjS#z!DhBORtCO0c`r7&okr^Z0&DL;>+y#* zcD{1a;wE+LnZP(hGkk@P>^@n+R?6@Idj9ffud7UB#3<&!mL$B7M|G~m^4L$`h9gJR z_lnohzqOuyK35pXmS&WuAL1s5OG{5rV%I|6 zy2`BEyrrY~j_nVO!oDh6^4@TnnDjMb(;jC!*Bja8{KmAgI>7U|I>+$b6}1~4&J-HI zu9D>~`+X$|Yb{Hj1`X1;kRE8^3eG(ucr_YipPZPEzD8QSoTRlH6KTmd*^1Jp42snW zp;%}Dw!^yUtmo#whYwhKov1LpsGTHCuu-Nz@=b0nPd^Xad7eLjOrk|YJ(q5SUH3ai zZOIidkIP4EI;yi94zlur=CtHpE?3{6dPAnd_3$t<+ga2BM*ZiephXYWc$63#JVB>c zdJ_XDSDX$PE^WbI8C`0`D-=HfDU%UHhJ3b;XR>p`;6;UE1>z{FNw0#Da66@8_yZjb z7!gq^kKh}oKyJhflAV+S(mMl|juDC&YbCAgLmUj>xM$-|s1n&*qu-E0DOR7gKbcq= z94-FXE)L7TTq9PnDZVv>)Eg0GD_3Uhb$+;c^A_ORHGYbJWs&ous@(ED%Cmc?piV-9 zjvIA1whDbu4Zdyy2@7X>E=a`J!Eg_t1DdLtr|Vj`yS)czo#3#_TXtMZ-!drKvFEW5Z6Uisgn*+`Kxn8z!A1C9JJhV9`6SvT)42#pnlFykD?>!XOErNJ za_{QB8FZteEe@Jr;@Y6Y_Y=~_@>qjJ;!7DuJVT>Yh3&+%Gp=;d9*dO;(l;0f4?m4d z{cP~HOAK)y5?8*cG{~;Xo|;k+%zC{&`k971J2Hp_ zV07~-6W*9O+3uMZ@s|Wl*-jWr+zu@O!DW7ZOBuDou8a1v<}stsc(T|yEeUV`T8nVe z*maLiG3Omn>fpmHxfgmY>RH-J|^hz8+RY#s=hvdERt{ghVf!sr@WR1H8mgU&i!bo z&wV7Ew@&pjGbiJ~nvyn}_>WrOi3a9LP8TkyLc7G;Ll5%#AyX8-4#!{p0rAB_E7ahH zB$WM5FPon!Et&GEaDkN_LgINdQ*NeAjNpndtwF3#vIV{uxNWHd$`6B$B1EcJg*>*c zzRn6{h2>{RfxC34JYErU@=;$-_+*v*b{QRp79?=aD@SiKHqZParT~ zku`>yKz@G&fNFymuI?g`h^LttjO4fW93b|fDh(u+HiRjHft0;?@_ zJp|Xy)T>6*#;ovQi82{q9`SV~r=wGRcu-Lu4VJkj+XM)R5{&D$_OKRaZzfQyOmCR| zg;TV6pp&Q+SZIm44lUU3LRa21hWRR1+d7L78II>PVo6C$u!@p^1QEpsJ?{;pZV{xGPhJK$5a~Cn--RP3}6Hp;xA_be>8B}e2xyj--M4hK!3%Ll&?CIxX{!SDB zi4A|MsPE(eO8xj&q(G~%a~3{fZNj(kG)=49YPeA7MMc-$*9 zVe3GjNOlfd@|deCm*P~-Y0BU7eyq>HjX2iBr+f|o%e_em*2q8UcIMi7e}UQr7Ja~dfB0( zMA{AyR*jZm?#_m>A1b|nliQgOq2;!q+WH|&lrtF^hvy{6mT zWVa~sCbX7@fiHIl^K~{U6gI|Si)?Wza>LL1?3CqXq{Qc@^W zO*}+)%*`yg7kxkQH(Vu%#<6rYCaX(kxTD^^PwdXLh$Hi%RUc2bX(V)BOkH`f zH<_K-N_>eJ?4h-_+_V4fd)goSfJ+wx|JNE6>A6Wc65uNy4XwBd)p+9v*9nvr$W7k> zat}sZsxrU%#O@GP<@Oc3-pZ$}lpo~5go=eWHO@DPoxR5U3lWqDD@euo=$kQt(Lz=0 z&qIYPJT7v~Q?D-S^0k0b1vc|$C3!tu(obpQbL7dD7f`lz2;qv&7U*R0$LE1`dr#}m zjL`ZGiN~;;WTf zwBM?pMX<-nTVwGUqCjpg<%K~*@61V@MBK<2+_(V9EFh^C;bnxAvJ@Ns>?VF%Zp4)uv-T`Cn8T zc5rd(J?Hl>r$oQ|nH;9PUozlyJyoD5T2U|6rm39_8EreXnlD$eiv6mlwO7 z9S9}rIsS2UezrS{T2m(tLiei=q6OZ~r;Tf6tUU0M->a){{W-DU!#;==ct3vvyy3T> zzq#5E%*5{99}w_y@Q;}w{~x_n>^4+de%>T|xYji~nGVrq_MD^9ULVR-I&!Z0RzX`b z9V=aSMC`9EhWO0&=R3npXW%~;@hW+m{%9U{=0K%pzoNhZqewJGBa9H6$6E%=Q$fMI zb2P@qvC`+2`MWCvbwT<9eyeJu-vi0Z6dT)AYnEVvv&5|Z`+=@+;|!1kt&*ve0qKXc zLHS2jIzh!1%(ClA{^`SOVQaDA0)<$`3WwQ<;miB-dSeYzV2`gu%GP;n*AadI_BZJ-UsAvH|RP`7Z(3M7jZDR(FlLOX^@}0wzykw19 zJ1f@vco3xA71Xe_l#e^TlYbaaTr$o+o=?Umm74w}Xpi138N>`X`LmXIDG?4-ZQem@ zaFQRo%Fps9f#zj;9@Luw;~yPIB{1~1G*tsOfawF1D$&3d9SmGve||rJH6i7pk(^i zUJYl5YO*=vC<{m&c}~&gjSBSTpl+T%o~3B<@vsHAkK_5`1t}OHfvZC-zT#42zL9{O zMOyf2i@IJqv#Qh*sQi96!T0XG#kzSpBEOhGR?I>&D_M_43 z##3J(SEUzL|9f5}LU_6|p2r@f7xLKQ4|>a8Cht%iFc{~Q9fmyixSsFi$`Z)o+#TU1 z`lLaotBKjS4aXzoKOifkLN&oDRq#@5;Q+119EGnj8jr}ZB|r9;>&x+kxZ5BvfOWk8;FYkNz<6P?;} zh4SzfI}r?s?ksPNcd<@+Rgh?+uX5FtlyRnv3Z3>aUmcev&#Y!|JnaQ#y9IrP>BVM# zvpgB*=syGE=>ur-dlNQZ-^q5f^synsWWgfe5us?RY0zpA12*YOWH3FoNm>o$rUCHh zM8;@xkv6}%eO#&3+#e@27Lph)&rxcjf^%pY&?!DZ(0`@j_FE2K#$MsLL%IP{;%>&1 z)35x5N1v@eeh@;iND>&%xTX5fBlA@DD9gbqm4~Kj6X@fc>B!YDy?<=;(u{#yi|05o zzl8DPC=ks#$)E4dOfhxW_lFmE?+CxW+LtBAOQn%KNn>OxlREV!nBOe8#F>Gz-)qeV zM5}mwR2UIYF=R^EhdX=G8A7HP6;NJFQ<@CN4xp>-e@6?DTNi($hgeKRsJj&m1VBxj zPT>&BSMpl}E?ikp76xGL*!ov@uZ=GURp^IsG>D^=Q-j&d%wrb}R5`Tb8od_ZZu5+p)R&jMDo>J$I z3Grq6ioHT&_$4ecn9xQyJoS4{%3WS1NTL3W^=a)f>u@~?CYOy*ZP{vbFz4$HKXNBa znNF@~xxwOJ!E^37@%Ltr=J^=j-8DXp2sb+vcyfCd*Yqt*ZCLps9dAoxgcS!Ne5fnD zf^0}ZG3@mN9F#Ypfcg>gzGj~Oi|}6SBx|!r%I=5qS}pu77c{bjA-?xTF>}inX@qp4 z+$a~tdj^@4G5!69UcR@i9L=L!hJHyy(zq}3ZW7) zy4o+J)clp3_*DZ6L6rPJMzU^gIgUN)t#4@Qul?sgYH!q)9~fvn4<3m4ZY?)F;~p0{ z?3?9*i>cYC6QYoucG&+ue7EnO?zthxykOEN42R2cATp29RIf%D=_ zmduxfk5j9ocVV=v$eIOtZvb$t0R?B5ji{Z0{oH8oauVl#W+$_(*W&Y=c{%ef*&MeR zHddJR8PzN3H>Msr)f({}CTO`eNFBqc(@Ohi7ID;(Cshz-dFWQt6WeGAO%5n=08czs zy}=TAPvRYkc~7{h4d?^ldrbL)X!IC~AKq2&UZn7GKP9whd z_Nv@`(_xLO%S>~eA*tA{>X(uc#p?5XL=rBef>Ao}Q0=Tr5QdUM>ZEVcssQnG^V^-? z6Vo^@uLel9lHoXc$M``&Fft-Zr$5ms|?F3X#sYUQAelpWQGIrl?dfwc)Y4; z%z3V0Qx4?^_^Uv|XjF-W)a1vZ(v}NV55!Ns; zeaBO`sYiop$+47&9~jvW@4u#r@1a-@24JYcakigP&6yE4+VNoD9g=dfn?M4EJsV$} z#Rvlj!0;(>l$NZQrAM7)_-zXC92uz|&Zht|f6HU;goH(g+C-bB&p=^JhNnYUl?;ww z{{j%y7M&vD^H!m#vZ0T;OhjAHeQ*(^pJ$&NBWG!m928_(6<~rY6AZi!E;nmFv9GZ# z1Zct0fs7oNDGzVdadI8j*5JDoYMxZznJi%Zdwob2P!6?kOzoX|r;TAGlFEILYHSoE zgsoQYC?5OO^ebM4SAgPjkR)j5wGAS=M6CAUPmZtZgvS*S2x@ruWEjF%v2WS$M;2iE1uR8O2>733D(dr(c z#kOj3w(X5RvOfv){d_P)=H7S_Fs%$comriN1gvg44#arpcc0_cGT#v%O;{D1c+G%k z)g7!{y)u2ZL>r71b~MluUsPK3Mx2Y{zojMWmJes>DZ(z;Vj=JOP#I32NCm;tN4<_9 z%4tWDZ4WMvc~hxcF$3?}#I>;us?)_OSrriRIE|LCSI^6H75&I6*V&uFb5nD4Gr1&D z2KV;bAvc*57tnsZf9nDB z@>@F!hrV%4(#Cl0Aq%@wjouV)5>Lx@i{3HwM+-2l zqJ0V|gTFUMWU3m&gJ{{SGIJ@a&o>t<(+|L3_Jq#Xh!)@ipB6xdEt4vH(Q((L zmdEivxFDSD2mm?}zb5y}(rb062IHeFSw?G`v4Pk>snucD{16#uTMb!>q(`2B+GHLF zw$!DQwzI))c`d;<#}&I1RQE?^^|g)F**?=<(7J3boodg;W+$@qM3G0w7a+zf#0#dg zu*xa=o%Q-`zgte)g?$GPetDs_MvZ%l594O#tmfs~?U7(v`VMn~lu7t9C0H*{XUNgB zm*KM1vc*wPV(MhTNtJx0dj?0RihtB97!86?rlMs%d66j;5hfwTEQ;w3EadFaj>>@y zLIW8mGcWN@WRK+vg1#4JT_+j~m)YE#V#`kXeLR0u1fk0ZWuO+fLTOT~H+%}1O;{QU zx^;O$nZ+#TZM2haKDH#>qr3O5IY1RdKr(8Cz7RuC-z91;SfHZGpijEK_*i9$rjo^7 zSMu7UOVmQfs8e@O(SpT$*>puei0wyG>+TB2W4pIj{z@B!frsfEGsBE`d1%k>e;cW{ zeVBvj_HAK~akN9n;H*+o43kaVCvLrYypIkLg$suRiJ6*cuLx0ql8@nhr{Pw27!{9o z6ZgV;_`x%ul^|cV-o?hztmAxqDV<5*FO$dh`snBergVA;{eE3r_3Em$mSc4wrNj;zVylX5e}tPj*8O;u}5;U2ib(3W{TJZ30#8 zy5F?;r85ZU7kz!%JneBUNBQC#Lby7-ekLF*Y`wPQRao2+?6F|&?6b+*)ssP>DxSYP z9od9_yI=jbPLi$A{9>8^VFW#)yC6as)Z`l8RKb)xxQDBg5eb-LFHAgq1O#h)ep|Jp zlta9F zM?kKj1n;U><^01zVkpkktA-Jq;>0gTT@pb%d&Mq))m9|`@7saN7-|&RCjMZ<^OSzb zldk>*CII!u1NZxr{{HV@>iC+9Zk#>Sgu@uZe~y!NVc)9I`5r3_V1WO6gbyM=ba;R! z%6I68@DW&=pa1WBMb7{|+B&x|+&}-`$_F3$ZTI{X+nP9<5Pp;Ld@K7LzUo~H(3Ph<+va-fq=bTk3h_qDlr`>eXwu8@8lM8DWCH-+I;naa66W^$@f6`p9D9 zlE?eCaH3Gj3_z_%4;y<;lpuC@v!!Y$cDJpuWm`rDOHr1m>Y_rydp$b4HlT^E4D6PR z=}hStp+mvJn%nulLz+sClfi5r0Bukm_&E`C4?{}fcX69uK!zJ&C>n`tnO^y5hTmL8 zjHRMUVztTDuel|IkWac;sBSCfQ@VaMcq;51*Lsrdcy@BwvyD3`Ki_RF?w6Vk7*S~S z*_qeHMkfL%&7Amw`rbt%=-mJ^xwWAwS_eUWg+k4gNL=MWjR%lIp3OODIMF-k()izcI49n!edspH%9){)U&59%Mo~-wE_0; zBpKVL?|1dl-PzLz=%597MG6|UnQmc#VHwE)X*+LF;mbfS@zsFSno>yK zFYu|3Em@4Y90%ziN`>nvDi z_LT?nZEMM{7>}f^tH=Sey-lS9TTejQX7Gb4noNH=li<5ifN-AmDA{o&FP=+Y@}P=B zxi5Fv)s#LH5m3gPmTsvSyP2n>u(~i9B`#G8m}%tnu|id}2slvAra^rd zIAGYAxYW-_8y695W(uL37pNV7p4!jjtF-<3B2a(SS|txY=+Ffe^uL}HgU<$SK8K|S z9~A@_4*@9jk6iY!9e|ySm1CdKsTyA zG%D(doMm)w)HiJfb86IC9b|bpVkxa(`YKjvcSv=iE5uxTznh1He`X08UuL!{gs2gCd2qssyl5#yKRN1 z95_y+0)R8~43aFaR*bvWp*-7pLydygO@oZB+*-~f&A-*u>hBJg1sY#=`@$xuOl;Vi zj?mx`Wght)e6kogNmUtzS?kjJx)bF+XELDlYE@JR`?m!VyPGYr`K_^ z&L)cDLl|oqqeG7-l2<7Zr{_O?7ReReyee>w04rmaD71_@#^e8Pd%?76Yyg$wI(X@s zhh~h&wK7sh|GONBRp7baIWOuB`Fv=dZlkZ8FCR!N4&=QS{ro<>{rXbmNX#rZ>F%i9 zUSLu+q2H04K>1;@a&O+fXYI?l-6qGN=VU-mbpU3b=&Z&GZk7h3w-$yQtpnEJnFT#{ zi%M`OR_gFOk&`_!&NsPD%#f4;rid&(N}$WVl*h|6N~HnC^kU~{g)hJ$P<#?2C7YZHajXX4tA; zqa@fasZxa*vHvcsLIGfhi}rLO(v+xj9DS1suhJb#sBYiC}+lyg<_ z2QEV06VbT!gx|pY9c#j+*rw2Ufin9qEU2ngx@&Y?=nW~LGQ?M+B<+JG?2eU z6k)Lv1}1t~C_f`_oG4m$@D|0LGk$h9F6qS1!>eQ{WGJNHTl+i>H5tU8z)H3^Gf6~X z#VmJ9HX#zZ9bRC4ROhNb)vw5@BE?YqOx`)NEO4swLes(KBn%4llOT}&EplAe-f+;~ z@WRgILEsoGCOCG7A|7PER6XvB)E0;(&SnOwq%=y{MOuimTy4Adw3GcV@%k$cCRy$8 z-)b?%WkGw3f>*T~CEH{?5(jba(EY}lSNC3F>!(7viZ0stm#0d?)z^U&g-w8npSdrS(6ZUM+2FAcoEhNaNl7rxTUrKI^#$Nqj>q6^&VyG9 zpCx`bn~9>qIYMkC%6&)vm9qx+X2EJ}ciMx!CMKdouA|54!99#}VDn~twO6cRi;r+-n* z@rOKs0UP)+#dW-ox7AJV@R{)Rb)_;ob&TYD=KvVhaP0o-=M;Jvg;bg1Sko6sJ}Tc9 zB|vc)+OhLok}k`Y89{?pvh_%Z4{S@H7?W7JDi+6Q525gY3BK>UTi%m#O|f0vR&Qs; z7$!nB^p!wI?WJ2ip%{uU1;I8PLA!2aDNjgPyp=Kus5b_2Tq|$)=brIsi8DFU`%0&B zk910Ol5m-vIGOx7OCWe`aT(HbOKSAuzP}S`HBifCAOG5NUEX{5Ck8{{szmy&OcvA^ zS{6LA`{-wdsQlh{kvQJqPrE8~MkpR?XC_1xnmnFOeAM#He$09&%J=3apc&ionie#1 zJ8`zHc?qDii6bHIot-E28MATX2_dBkc**?LpAjg0H#~43tX>yI#?;O%w5qrm>arUz zhY~PTE4y3qs{0=^7g8gs=Oo0EKT8PRPwlT;#uwv%emYrUb zmn$RQ1JleXh%O%#x8HhS+O-B)T%+$LEdhMzb4eV86*yK{G5-S-3HN)c0|4`=CgkDM zcOnpKH?b2XU}0N2B5VrKE8I}lgL6e*2$9S1CPC#FyO7}YpaA4X2R-AxuI^I4#KUrw zJc^IVYj<~eZX^V9o3_C&l(~xQ2gm^6P}llPe)FYqdL)|PD};!PVsA#t^jK5=S0GV}-E%L-mR=j>m$GqjY*&U#Owvkym=R_fz6 zrjFj4xe@7`PyYdMo1#{T1mjdZBcyLu;Zj)|hSLkk(_#`^aMTdC)voYr!jHwIH|DDt zatLAeveV`_5gntNr7*=ijTp%Yv5<<$4_^KDpAWs73}bJVOcsfogNq3Fa$F1Ju;031 zg~r5L)dUnHYJHKc*%g)@K(^l*(=O0AFjs4`Z0a4UJDbnM-#veQ*e9ibOaDEp_^-?+ z3`XmQ)(y2`wtZzrQJSKO`YsG#l88m+YZiCOXWte}Y8fY{pMnTA+(3Nh{el;GmVyyS zD(aTHGFvjdg+1ZAf;B!EU$TL;@(|Q+WZp?_^E~m}>i27D(H1o}q}n$rF9G|P?T?|R zb50`NM#M+5`G4~&uhi3t?5cd?*>&jTehGny3!+XgHpi^=ILg`;x`7p2EXs{p>nyu^ z*qq~Kw=SYjREtPd3(j3E*&zD^pr1tt2oHKTBpW)K@_88N70Xx!+)XM^k4?f?E`XRd z|8qh`bV>~Tz_k~d+y~@-oO&37T%SqDfsJb%Y(-I7{+{#zN-0|x+t_?lvb2Kv_-i0? z&jhb#dTdheK#{b1dq;zO2k4Rlp5-i7w5?(YWm6+UoUc+2Be+LZ2zEZ@NTp9{QUXh& z`LCh26PJ8WRt(kD&3hJWHF=bZr4xKZ5g$kppl2_IDPq(4b_v1XS7x28H=C|~z3 zNXM&w`MFE))eDI%xE#+X5vf0F%pN8srF+(}k{qohhp+l<)@4vejikx5{Q^A{}*; zc!Ed693Q4T!qk#QYM9RURhnh5DwqSWEX^8Fw9C)=Q^wz|Ej#2IX*^4frndUx4XH}A8u~a zMVTxa=)oEEwdOxc{##JnqXyg6`FvT~sFC55MB}xn;SuT$UW|>wWLca;-x*i-$bZFG z2ML}FC#)#SUyr=^rSgn1;`Zf_Mv^(AOy^Y@&vA=YTBhN^Z_Sl1bJh0o1>{73^rABACn|H z^tsQ5tu~>w80hWve^}ZNedDEtH*5$B=EMV(rr>6@TrtnxL5{cTf0e{u~M)9ZVGI=0T4X zRQj+##HFw$_NLCn9g0u&o`la|lAo|0&SQNXC(nJot=mSy39EJu-ir6Psu#S$)3w|d ziH^TU(pL!TNfDEbOnbNi*~oHHxR_}B-8^I-;s52RHw@QhQOpsVA{!kpTQ(=?XRnuM znIg&oCy4lwsIe$^3)Mi)&|_mM@F@gHhCP;O+S#^ZKb-N@9jmAcBz9(OpFuPth& zw4!@^vCJlbB5Z@~n%nt&Qv3}f8LHxaM!(JEVXJ1^i?rlm`A~nURW_#Nl&6?yT}N&M zNsO~1x@+^t=zBwzBoT9i03bg>&Fp<3M?23vaYwi;NVZ*yyV|uxIAW-kA=a=)Ja^*; zTJ6PXCcSN>)$`*=_y7;E%*ZIYPbeo*eyEzC=B4bEBnR}&139uQ&QRO;PJBGQ*~4HW z^s<*(^N80!)A0=ISVl0^+edB{M;`s6CZAjet$6YI&?=OS?ZAY4u}}pw;Pnq3HY~@W z@5S&^OTE&OrIpZ?WVelar6$s9Er~9P2reP>r80qU#yI+WiBh< zPV|&60;s`g4Tv=@BL+l2n%RDH-wNSdmz$(qU+`WmsgcuWZe^kqHl^=gRK-jNY|3W8 zWf!&2KqzPOpXfg~+5cs$T#x&X=y2S=bT2fH`Ftw}{ejns9>HE&*ksso>LP9Vt(x5M z1LqQt3^gIf^De$Lmsi;Ye+`+*7)P>v6Qes1;a{3-obqKBDR8g)6JRFr@$jGqY`bsG zJWar~G1&L(tz)@M3xv=`wZ?W~tXMC^TH+lmQ^LiQB5lvlWJNpk#7^nX8eI(FK4*Dg z4McvMX$E#mo<|3Dc8ukl!|L?LfHNBDs~!SLZ=B>6#J6L@QJrqVmDi>%D1Fvbh8SqS zCV5CcaAKpj!;P)al$njJ-^}jit3DgrKH=!L&u-CkZAfGMwN=^+dULyNUgru< zs*ty}Vwt0tj-%)9eU{qbFJKFSpeHXWqiiupxrU5mLHovX~Qd~mxjHw`6Ouxj<7 zbm@=xvvOkvltA1#pdfU9;MErpQ=<%%RY2+v3IvY|*Leu#`u0DP$iEtQ^y-{i*b8^q z>X);Wg$FYE%_S9!b4KU&?Yf*9?l?JaD^$KOqky89YACCfYM9%q0aVQ?#{h{b1$Hod zfZMmS4L)zMx#*>Cj8XhX#5Im%qBkr#L{CW$(uJ-hK&+^I4`?WM7Rr}h;Q zt7(4R0S2kfPb(f;@}Jf0BbmaB5;c&3gxm?&a@``y+RNONK}izMO*~vuPpgZ|@F-^W z|9*JTm&@fPU#noyq?TarHlU|7(29DW+|%Upqo^-?wX9VS!6@q6jyYI`$%!ti2kmCT z244fxgdXfRdmekI^sEBn+3*N1IvTr)syf8fhK%-C&zuJHM` z9R?%;tX_MzTOY= z586Q=lt^AfE46mwtO3RKAfU0c20IXGLo5-=gPxz@;wE*M-7ME<(@+U28V0V?eHARZ z1GJn~7geOLv)WNv^7GNc*M)z>00>_PZP7-~=`nhHGBcn7EdTavyz(nC>rid%eJyN4 z`;3i81cQYpkBp0f^geyVq&AHTr59X{y8}9N4J&>@+abf{N!Es>jaG33JVl1)`QTsG zqdfX?u%cev+}luzWU$TJ48@zIFO&*0z?8QLWatE~2E-<{4>tiUUmnwKm&qdSc6f?c z{+en!;f85b85UcA8u1RG^eSC`R4M5ZRsnh$D8O$Ot#S2kl2-tr-_ueh>({6x1N9fv z5E%z(*L+IEN+DQ9_1vSwE)6D*Jl>A3iuzEoT;vxWc?WC|Y{CNG-3}>BIwTc zl|ZUk1{+#wP|=kn#TMxXW4|mH)v8X7QgN3`Sot zzkTk9ZYa0%0yXzf=u|it@lKZAslzhX(|iRxY}IGa)4&RUzslKMpz=|$-A*W$X%tpx zxaAnct_GAqZjz0{%51w#31UH}rZdNU7NYr+WJt=?j~L@~-61w}{A z-4&^ZT~|EqDme;*e3u}>b^Arq?Z2^1C-iAI8OJD-eq`+5)gwO+ODe>3>!@4yxdkG;oVLPB312T;U z!CS|IwkFn;9M`F3BrI(wBcS<}(R^7$2URCQ06Pv;^0`>&%Yo%W>YGReB==JjfJx>m zzO&TWqrK=Y8GXcbd%$WS7ttVVV&!o_?szl+06O9I!-IwC0}Buccj^MFz^hl$NTt6H zrFut&Ko0I{T-qNaX9ZSfwUS3+=D_5A6}l?W7FYumDpGvvnvWJ2e_RZNTH@ZL8_FJd zc6$==mLjzZ@!<*1Z0LPEY#on@l0IJ@57vKsO5Z%k%gS_NIZ9FAJWh;c z+`(_vKtSEE^Eb@u@6NH5&p5wmHn8H%J*{}wlPbDf*|2esrSxb_7}c9nAEF4 z1;sXq^f6t}-VR$Nuy{1nzJ@HUy%ioraS74%IdgOuG`O7VGxp+gS!9Qxk*1LBz-sV* zd@w87Mh@@!9LJ(1P~%Sf-WfUxya`)L)uUN%Y$uvAZW1@%&hmbWy6;616gJ^@ngJXn zR+cq3j|nLf(N(Ng7tHjMReG$VCgd8(O&hxRL)Xr*mL669u z;d(Vce!jz0ymYUeH&A<3?nUdNHYdb&eNuzIP~ew0m(c)Ps1I_`$HS!EVnIB6 zXIqZll9AZbuX}X#49m&oai1Ks;r>6W6niaq?b~@+i+6Qgajfv(&Hy}+3q1P30T^7A z=Jb%wg8=I$DHq-#xINY>J4Iqd~C>+!+D5~EGrr4Tuz ze5eR3s=%ZdZ_>NwI(|PkhKO?ydTh<8u-tQ0jT(L*Q~^9XsiCVvZTFkTfTf;SUqsyyYf6gPlP! zoj-M6PvqJgJ(&AM>iv!{fyZ!xx@0EGNd0>5(+>J%6oH2W@ySBFhgaLJR*yYFF@btR zh>iQ^Op?@h9X<-4!o4FyxE^SR@GThh?9sU%6dF5If=rK9^W0P~tgoP=OJNLU(6pqw zr1*4p=0U5{kFkN5x8Q|lol;0sv2<|!LHM2MIeYM}?pt%;P2rjn;WmTx39ZEQuHpcR z!YmJ$&96UV|JG{sD>I02B7cnVrNtES7Y4awv>rW6A~2+nAHLQ6$^klVyFfdByf+Ns z{v7U)3gq%~kiW8fef}9&U-FsmymQ!IZZL^duneiKugSu9H@_ag-|(*`Nk-q?D=V-n zD{*}kHad16-VFxPLg0c-{Fszk{DyH*!EYx9|jodam#1n?E?=H3h&JZbzjpyZT;uJ`!!MA8D0a^6~jS3LW^p zSEU-Yg}->oJWNT5TgD;)ixKf5W&Wg1Iinh^z-9zo&xosNkX|$>-7qc(oJA+XZ{7IP z)qJ9W2USq6veUW4sgo!-U`CS|au4l};Ypg29+jc~*}a^Hp+jH0R+n z@`|hp{yP$p3^#(-D;^e-gAZLxo*Pe!Zxh?Rg*eI)L_aNrR^(27(}7Lc$yzNi8%-ih zWrT>y`rpnS{643c^R(bd2fR^)Q2njisE+4Y)Dw5}iJ(SZ%AxK1#eO-KHhG~1@5rJi z1!9xm&O%QMsem@TIWU`W&V@oDOpepLG0+Vg*nQ9MX*Uuh-d8NLZY^#rc@A$ywMz}=k5%%g%%S; z1r(fPs3ExSM|p{ zqfJe9yM)IdW^JY2;t6-Yp9l#rg?T1$?nvIfUCSEIBR9+sbFK4_bHHOC?=x=FbY->6Z?C2OCfAov7r)@ zef&O&YWwxSr&aEM#fB!c7uui-0)eTe%2hNBUCX(&Ga5p~*-vY<#)R_dH{v2b9`bYj zwscD2?P{}K-FnSfo@DDYj#(26XOepGdGsx;=Hs|>p8o3D!#%ZA9OzqL5?P07hudU` zqM_!`%zG{3)?S)ztJ>L%OnA_Os%^*IxvzfvTZY;Zw2#V4c6qYapBx>#EEbs*#yU$A zXKe&2=5m`Z$HX9sG^r~*>Gr7+F(;%?+5|SMTW@7a-n)W+EMP&LJ$9GTs*$BSle8MD z9ijJN_cG5*>ZJR(n_@jr==KlxXk6OyFxII6UFfw02;wvAyFu?P1-V((2{@G;-}GbR zP2FY`iVR zu!`veWzK=k0IzcFB8#&1y8+6J$`5*Xg%1jRtst-DnoT}H8S=KRpJ zuzQB==ZZZ|O?()AB7=1RRe4R~YqA*ekv5+vKk|zMs-0hYlUAPsn5hX`X$wao#yAGr z*a&6w6R;1+UFs)EQ31SOr($nO3K7NuJF-lL00_7#D*0C(`C5*jc6~5 zPj!}=N=9#>Ov)HAJ*J{_XXP^fwHXnz7JIl)<)5&B+~>ZU7|fMMP-coZWRt8j*&V4p zQ7~dBp#lpzY~PEr+>%<7XnoVEvitXkclEhBCr`9Z^ENlSwCQxHJ|W0WY(J-kUX>?S zHf-w2pFz^TKH^v;?6tE>wIOrxfZ#PZTfn zOZofrR;8hbdH8Yb0{=QAZ_6HfYQ8lJi;f?zetX@5Qf`I44{?hDdAO+ZGoILDLyyTK zCHq2rsbvX}Dp*fsQY_{waBM;Jm%{xgB|DB$ZjE`0vz(@ARL=mX0wP1@Y4kb4 zug5oqbMq1%jh5X<-sY7`H2_9Hzcyrd)SzKT>hUP4@QVyUgH*Jr8EfF=?hFM#k5m7( z#}mPw5#e0E8lTR#u1JJ@{y#gpV#pnBqvu#>`D(P;9eIt`OHz3ymifR(a)QCAGC1tD z!F(e5NJ8pgPO_)6jYwu=w&&kNGk`5gPHULx@07v^R87>MEwg-7W15>6=AtTF23qg| zQ0%i``)!{T;I#n>sL+9BEAZFs`=`S6zkk7*2%ro>yGdGtvZwVyAUY&XBA>EiA((4) zAS2j4-@CuP@(<3;ET7y@`!~k>|2Nhg{nIq)KyOefh`y;+$UD5UKM6~Op#jk-8^@nO zHv3R_#dpVhkOVW)VkzEYasK6O5^}bC{Ur z5}e$D6%aJZ#5w9}0JTC{$Zy#*hc58W0GOV7={Gyh%n!tBnS3psQ^0Kjd_;b|KQJx$ zLVx4t%`d1PM}RVAoa%2)%#<2N@hR1)umgC4K>@`7m5=vupMP~Mydef}m8TX^L;~^K9c}rR&w-HY2~rV9iN42Cx!YP+r06 z5s#T}X?p(HbuLy4S{v6N?>g9!9?T4&8AdIARZBh}9n14R0rVIdWD&0)tvq;#TrGwb z_SEj}>vu9Cb80Jjh+XoMcOh6y`K5xc z+(q;MgbkzhT#HiQ9);4 z@b*71Pd0qMYJrX@DP}GEU{FQi%tVLt@p7)JJ?NzD5nEWHk_3;T6hn_sBv#WT9&zA;dw5GKUnoB z^H!|6^^Xe|IBU%=V8Z8>093?a?OcwLm-Acc{0M9RV$dapsFEDl?KP3};O9sL@-pA^ z06D;>aiQR3SpjGVHPAv22%^+K$^+(krgM(qvezw$nk&P=%smDT*ak6lRnC7VNlstb=%gGYIBw?XIttYwYL`Jo6lLn!g8*v1MMHo%K;NoGDFNHa)074(tb0Pk z+(wP-EdJx^2Bf2sEFOz3#~(JjA2v@lr zk)0q_x{(R=)jKYs>JE4d7oBky){T}Y2?9Ly7k3qDPdg23Hjo5j7x%DOWtBTVWU4kDOk)1gHn&BUP+s zKwzxnN?a)DL*d!qiIz{$05_liS~mgNQjTQw-S#@$L~8u%YniQ-cK*aZ<#nJ$ZUdT` zgb2RQ()%KY_p>|H_^vOn<4runG2etL^TnN6Ez(;pGQY)$8`CkEQ%&9~w@N;D6f*ULrz*S{FY#er*^dfSeDCxMG$vVxAj*81&6psz zA`}^$8zDhzWcZnv`C(mgdak;4qL__l9PLlO>KqY43_%5^F8?2KqZRlkdA`5k;kQ}} zi0r-Hf+6SN4>-?cTc~|j0krsrGX*^!Zp_SDwP=0--)i29U(7x!Fn)TK(5;bvSCAf+ za(zMlA_6}}wJ+?KlrT>&A^K2-VlE2NLvBr@6KBWS^dHqrw3fIwd9}6Iji@J0o3xen zSETk!p?aRct$~s(vZA*RcoD>l%OYr?@X71 zYU`OZg>VrE`L=?4#YV*_LVbA#8UBs7G*{he)+vzY-h_vLRbB_2GxYR7fn2j^IwI4$ z8|kq~@@@S?@Gr|!R$JPKYBotULKmXahVx#@nfE24>a~T3eXKVX0voMr5Z258gj+*a zAiR^2y83F&k_9r$%^%cc-u)PgkjQ7}?z)8xyN}c@3)&AwMm`ct9Hf++Vzjs=UST&M zRWCj=SfE|b)@C;iv*q<2nrGKH@q|mIybi^nJnN;Ak)CT_%Jh$4WD}Q2{vfad%q!fhA!EJ9RDuXTYM)A|bZOKt#M-N?%#~QKVkv(t`G1aU);k za$|FZ#WT5Itb=C{IQ6G{=`AW)daMgjoHYJBhsgn)ohO%&PDj zYkJR%yH9-PKb|~xwSb}0kZS0$OBv3en+MuT$nZDUm?h@p;mLqvd{Zy71<@rqpQkqv zITN?Xs_bkHxBrf4Sf86w?bhxqeKPXjAKFK*( z>vp1_a9tXCiK;2D&-}>0;#ttBcqVh$33#%CJ?K<_=gZhUfQh8HZrQ3O$I97gC<0a+ z-!1JRt$!G5));s7FuY;$*~ynO&0loLXNG-xG#e);*(uRBO}~P>NPRl$)uFn*qtt5x z;vuQ4)oE}wMr@O6Z=-;YdL>w@%}!*q%Ed{PsKr1|kqSGw;#OYDe_?-UKZv+3)RT51 zP;PR`d2pgFgBaH3rI>%?9{q(aUySxp^O4(toqp?myJgKCAhhpKTpCL5IgPzx^Fz-F z!gqQ4&XLUGsd~l{ZOD!^HU34Ggoorwu}!`BdulgFqb19`RJuIF+`e|YlWK=0lj7MJ z6kM&wi=R~SGk8G^t#Mc~{|zk{2Zs^uIW~37?bH7wr;KdDozW+>`BjH&p9zMCjQMj+ ziXkk8CSSc-6epiDZ^cXS@Mi0)jSvu6`F6!SZ)7LMW2V*BBy2ABNpvwWJ=wK&mk?xs z&Fb$H>;%fvQf95CoM6$v<*im8lVoI2<57Z?_Nly+hQxVxTLQ=Xc78nxKT5K3WEZH6 zMSNI2RmW!t7}_$z7H|8iog?qO@%M{sA}atSU(bo=Hc81hYI&0TGc072y#9s8_Ldn{ zHFyqA(=YC_cQKfosn1BC+dP)Z@%ckrjV9gw*1QG&UX&>1o=p65J8rSU(t9W;Y(H+6 z%X-VUKOixGxTtG!S&vX>X`p+h5wNxhulf+-}sN^QzqYu zT}|E|KWeATs3G|b75;N@z&|;4$SqPdCWG+b{=@%UdHVm_HsK>~Vvjs2m>XjG@2v*7 zg8}{=*7&uT`9Jr{p;j_q>BqZg23mr^rdO*_u!!;*w~Svb{rz{r+`JD=PX9Pbsn;K}lKImA@YVdmWZ-4yLx&DYoTi21Iwh73FZ^-n(91YO;F7!hUxyCe)YSzpw08&s z7a)+MhYnrg&j()4%$z%P=x-eE&;S0zuE(AoUoi1Ib^iwNGl%Zp(N!zG{qX630jRL; A1ONa4 literal 0 HcmV?d00001 From 0edb3d3f2001e7b9454612fc133f80882e51aee4 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 20 May 2024 11:02:26 +0300 Subject: [PATCH 16/40] [Transactions] Fixed Buttons --- docs/en/transactions/practice/configuration.md | 2 +- .../practice/lessons/basic-transactional-operations.md | 2 +- .../transactions/practice/lessons/entities-and-repositories.md | 2 +- docs/en/transactions/practice/lessons/transactional-logging.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/transactions/practice/configuration.md b/docs/en/transactions/practice/configuration.md index e014ddb..03ac8a4 100644 --- a/docs/en/transactions/practice/configuration.md +++ b/docs/en/transactions/practice/configuration.md @@ -37,4 +37,4 @@ public class DemoApplication { ``` --- -# [Next: Create the Entities and Repositories](lessons/first.md) \ No newline at end of file +# [Next: Create the Entities and Repositories](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/basic-transactional-operations.md b/docs/en/transactions/practice/lessons/basic-transactional-operations.md index 643c1c9..ab80146 100644 --- a/docs/en/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/en/transactions/practice/lessons/basic-transactional-operations.md @@ -47,4 +47,4 @@ This part aims to introduce simple yet important transactional methods for enrol --- -# [NEXT: Enhancing Transactional Methods with Detailed Logging](third.md) \ No newline at end of file +# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/entities-and-repositories.md b/docs/en/transactions/practice/lessons/entities-and-repositories.md index 24b825c..a8ef935 100644 --- a/docs/en/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/en/transactions/practice/lessons/entities-and-repositories.md @@ -35,4 +35,4 @@ The goal of this task is to define the core entities (Student, Course, Enrollmen --- -# [NEXT: Implementing Basic Transactional Operations](second.md) \ No newline at end of file +# [NEXT: Implementing Basic Transactional Operations](basic-transactional-operations.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/lessons/transactional-logging.md b/docs/en/transactions/practice/lessons/transactional-logging.md index ea91ce8..31c3719 100644 --- a/docs/en/transactions/practice/lessons/transactional-logging.md +++ b/docs/en/transactions/practice/lessons/transactional-logging.md @@ -102,4 +102,4 @@ This part aims to integrate detailed logging for each transactional operation, e --- -# [NEXT: Implementing Nested Transactions and Non-Transactional Operations](fourth.md) +# [NEXT: Implementing Nested Transactions and Non-Transactional Operations](nested-and-non-transactional-operations.md) From 1921737a30c9041bf2906564a69c2d67c77a077b Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 20 May 2024 11:02:37 +0300 Subject: [PATCH 17/40] [Transactions] Translated to Russian --- docs/ru/transactions/lab-work.md | 55 +++++++++ .../ru/transactions/practice/configuration.md | 40 +++++++ .../lessons/basic-transactional-operations.md | 50 +++++++++ .../lessons/entities-and-repositories.md | 35 ++++++ ...nested-and-non-transactional-operations.md | 68 ++++++++++++ .../practice/lessons/transactional-logging.md | 105 ++++++++++++++++++ 6 files changed, 353 insertions(+) create mode 100644 docs/ru/transactions/lab-work.md create mode 100644 docs/ru/transactions/practice/configuration.md create mode 100644 docs/ru/transactions/practice/lessons/basic-transactional-operations.md create mode 100644 docs/ru/transactions/practice/lessons/entities-and-repositories.md create mode 100644 docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md create mode 100644 docs/ru/transactions/practice/lessons/transactional-logging.md diff --git a/docs/ru/transactions/lab-work.md b/docs/ru/transactions/lab-work.md new file mode 100644 index 0000000..7bf0987 --- /dev/null +++ b/docs/ru/transactions/lab-work.md @@ -0,0 +1,55 @@ +# Transactions Lab Work + +Добро пожаловать в лабораторную работу по транзакциям! Цель этой серии задач - помочь вам практиковать и овладеть управлением транзакциями в приложении на Spring. Независимо от вашего уровня - будь то начинающий или опытный разработчик, эти практические задачи помогут вам освоить различные аспекты управления транзакциями, включая распространение, уровни изоляции, вложенные транзакции и многое другое. + +## Цель лабораторной работы + +Основная цель этой лабораторной работы - предоставить вам практический опыт и навыки в управлении транзакциями в среде Spring. Через эти задачи вы получите ценные знания о настройке транзакций, обработке различных типов распространения, реализации вложенных транзакций и обеспечении целостности данных в ваших приложениях. + +## Задачи практики + +1. [Настройка транзакции](practice/configuration.md) +2. [Часть 1: Создание сущностей и репозиториев](practice/lessons/entities-and-repositories.md) +3. [Часть 2: Реализация основных транзакционных операций](practice/lessons/basic-transactional-operations.md) +4. [Часть 3: Улучшение транзакционных методов с подробным журналированием](practice/lessons/transactional-logging.md) +5. [Часть 4: Реализация вложенных транзакций и операций без транзакции](practice/lessons/nested-and-non-transactional-operations.md) + +## Задачи лабораторной работы + +![img.png](../../srcs/transactions/task-chart.png) + +- **Регистрация пользователя на мероприятие** + - **Задача:** Реализуйте метод для регистрации пользователя на мероприятие. Обеспечьте полную изоляцию операции для поддержания целостности данных. Запишите эту операцию отдельно, независимо от успешного или неудачного выполнения основной транзакции. + - **Распространение:** REQUIRED + - **Изоляция:** SERIALIZABLE + - **Распространение журналирования:** REQUIRES_NEW + +- **Удаление регистрации пользователя с мероприятия** + - **Задача:** Реализуйте метод для удаления регистрации пользователя с мероприятия. Обеспечьте выполнение этого метода в рамках существующей транзакции. + - **Распространение:** MANDATORY + +- **Получение зарегистрированных пользователей на мероприятие** + - **Задача:** Реализуйте метод для получения всех пользователей, зарегистрированных на конкретное мероприятие. Обеспечьте, чтобы метод либо присоединялся к существующей транзакции, либо создавал новую, читая только подтвержденные данные. + - **Распространение:** REQUIRED + - **Изоляция:** READ_COMMITTED + +- **Добавление нового мероприятия** + - **Задача:** Реализуйте метод для добавления нового мероприятия. Эта операция должна выполняться без транзакционных гарантий, чтобы избежать ненужных накладных расходов на транзакции. + - **Распространение:** NOT_SUPPORTED + +- **Обновление деталей мероприятия и регистраций с вложенными транзакциями** + - **Задача:** Реализуйте метод для обновления деталей мероприятия вместе с соответствующими регистрациями. Обеспечьте согласованность в рамках вложенных транзакций. + - **Распространение:** REQUIRED + - **Изоляция:** REPEATABLE_READ + - **Вложенная задача:** Обновление регистраций в рамках вложенной транзакции. + +- **Обновление регистраций** + - **Задача:** Реализуйте метод для обновления записей регистрации. Обеспечьте, чтобы эти операции были частью вложенной транзакции. + - **Распространение:** NESTED + - **Изоляция:** REPEATABLE_READ + +- **Выполнение операции без транзакции** + - **Задача:** Реализуйте метод для операций, не требующих транзакционного контекста, таких как некритические задачи или журналирование. + - **Распространение:** Нет + +--- \ No newline at end of file diff --git a/docs/ru/transactions/practice/configuration.md b/docs/ru/transactions/practice/configuration.md new file mode 100644 index 0000000..8a07a1d --- /dev/null +++ b/docs/ru/transactions/practice/configuration.md @@ -0,0 +1,40 @@ +# Настройка транзакций + +## Введение + +Это руководство посвящено настройке управления транзакциями в проекте Spring Boot. В нем представлены пошаговые инструкции по включению управления транзакциями и конфигурации атрибутов транзакций. + +## Цель + +Цель данного руководства - продемонстрировать, как настроить управление транзакциями в приложении Spring Boot, что позволит управлять транзакциями базы данных. + +## Настройка управления транзакциями + +Для включения управления транзакциями в вашем проекте Spring Boot выполните следующие шаги: + +1. Добавьте необходимые зависимости в ваш файл `pom.xml` или `build.gradle`. Убедитесь, что у вас есть зависимости для Spring Boot, Spring Data JPA и любого используемого вами драйвера базы данных (например, H2, MySQL, PostgreSQL). + +2. Настройте управление транзакциями в вашем приложении Spring Boot. Это можно сделать, аннотируя ваш главный класс приложения с помощью `@EnableTransactionManagement`. + +### Пример (Java Config): + +```java +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} +``` +--- + +# [Далее: Создание сущностей и репозиториев](lessons/first.md) \ No newline at end of file diff --git a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md new file mode 100644 index 0000000..5bf0633 --- /dev/null +++ b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md @@ -0,0 +1,50 @@ +## Урок 2: Внедрение основных транзакционных операций + +## Цель + +Этот раздел направлен на введение простых, но важных транзакционных методов для зачисления студентов и управления курсами в приложении Spring Boot. + +## Шаги + +1. **Зачисление студента на курс** + + **Сценарий**: В качестве администратора университета вам необходимо зачислить студента на курс. Это действие должно быть гладким и гарантировать целостность данных, даже если происходит несколько зачислений одновременно или возникают проблемы с базой данных. + + **Реализация метода `enrollStudentInCourse`**: Создайте метод для зачисления студента на курс. Обеспечьте, чтобы этот процесс был транзакционным, что означает, что это как единый пакетный процесс, гарантирующий, что все происходит правильно вместе. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковой не существует. Кроме того, мы устанавливаем `Isolation.SERIALIZABLE`, чтобы гарантировать, что даже если есть параллельные транзакции, они не взаимодействуют друг с другом, сохраняя целостность данных. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) + public void enrollStudentInCourse(UUID studentId, UUID courseId) { + // Ваша реализация здесь + } + ``` + +2. **Получение списка студентов для курса** + + **Сценарий**: Чтобы создать список группы для курса, вам необходимо получить список студентов, которые зачислены на него. Эта операция должна гарантировать, что вы всегда получаете точное представление базы данных, даже если происходят другие действия одновременно. + + **Реализация метода `getStudentsForCourse`**: Разработайте метод для извлечения студентов для определенного курса. Он должен гарантировать, что данные, которые вы извлекаете, согласованы, независимо от любых текущих транзакций. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковая не существует. Мы устанавливаем `Isolation.READ_COMMITTED`, чтобы гарантировать, что данные, которые мы извлекаем, зафиксированы и видны другим транзакциям, поддерживая последовательность. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) + public List getStudentsForCourse(UUID courseId) { + // Ваша реализация здесь + } + ``` + +3. **Добавление нового курса** + + **Сценарий**: Новый курс готовится к введению в учебный план. При добавлении его в систему вы хотите убедиться, что это действие не мешает ничему другому, происходящему в системе, сохраняя свою независимость. + + **Реализация метода `addNewCourse`**: Создайте метод для добавления нового курса в систему. Убедитесь, что этот процесс не запутывается с другими текущими транзакциями. Мы используем `Propagation.NOT_SUPPORTED`, чтобы убедиться, что этот метод не участвует в какой-либо текущей транзакции, обеспечивая его автономность и избегая потенциальных конфликтов с другими операциями. + + ```java + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Course addNewCourse(String title) { + // Ваша реализация здесь + } + ``` + +--- + +# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file diff --git a/docs/ru/transactions/practice/lessons/entities-and-repositories.md b/docs/ru/transactions/practice/lessons/entities-and-repositories.md new file mode 100644 index 0000000..9656087 --- /dev/null +++ b/docs/ru/transactions/practice/lessons/entities-and-repositories.md @@ -0,0 +1,35 @@ +## Урок 1: Создание сущностей и репозиториев + +## Цель + +Цель этой задачи - определить основные сущности (Студент, Курс, Зачисление, Лог) и настроить соответствующие репозитории в проекте Spring Boot с использованием Spring Data JPA. + +## Шаги + +1. **Обратитесь к предоставленной ER-диаграмме, чтобы определить классы сущностей.** + ![er-diagram.png](../../../../srcs/transactions/er-diagram.png) + Если у вас уже есть классы сущностей на основе предоставленной ER-диаграммы, перейдите к шагу 2. В противном случае проанализируйте ER-диаграмму и создайте следующие классы сущностей: + + - Student (Студент) + - Course (Курс) + - Enrollment (Зачисление) + - Log (Лог) + + Обеспечьте наличие необходимых атрибутов в каждом классе сущности, как показано на ER-диаграмме. + +2. **Создайте репозитории для сущностей.** + + Например, давайте создадим репозиторий для сущности `Student`: + + ```java + package com.example.demo.repository; + + import com.example.demo.entity.Student; + import org.springframework.data.jpa.repository.JpaRepository; + + public interface StudentRepository extends JpaRepository { + } + ``` + + Если у вас уже есть репозитории для сущностей, перейдите к следующему шагу. В противном случае повторите описанный выше шаг для репозиториев оставшихся сущностей (Course, Enrollment, Log). + diff --git a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md new file mode 100644 index 0000000..4e93059 --- /dev/null +++ b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md @@ -0,0 +1,68 @@ +## Урок 4: Реализация вложенных транзакций и операций без транзакции + +## Цель + +Этот раздел направлен на изучение использования вложенных транзакций и операций без транзакции в слое сервиса, обеспечивая студентам понимание управления сложными транзакционными сценариями. + +## Шаги + +1. **Обновление деталей курса и зачислений** + + **Сценарий**: В качестве администратора университета вам часто приходится обновлять как детали курса, так и зачисления, связанные с этим курсом. Эта операция должна обеспечивать целостность и непрерывность данных, даже если происходит несколько обновлений одновременно. + + **Реализация метода `updateCourseAndEnrollments`**: Определите метод для обновления деталей курса и зачислений с необходимым транзакционным поведением. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковой не существует. Установка `Isolation.REPEATABLE_READ` гарантирует, что данные, считываемые этим методом, остаются согласованными на протяжении всей транзакции. Внутри этого метода мы выполняем вложенную транзакцию, вызывая метод `updateEnrollments` для обновления зачислений, обеспечивая атомарность и изоляцию этой операции от внешней транзакции. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ) + public void updateCourseAndEnrollments(UUID courseId, String newTitle) { + // Запись начала процесса обновления + logAction("Update Course and Enrollments", "Start"); + + try { + // Реализация обновления деталей курса + // ... + + // Вложенная транзакция для обновления зачислений + updateEnrollments(courseId); + + // Запись успешного обновления + logAction("Update Course and Enrollments", "Success"); + } catch (Exception e) { + // Запись неудачи + logAction("Update Course and Enrollments", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +2. **Обновление зачислений независимо** + + **Сценарий**: Некоторые административные задачи могут потребовать обновления зачислений независимо от обновлений курса. Эта операция должна поддерживать целостность данных, позволяя при этом отдельное транзакционное управление. + + **Реализация метода `updateEnrollments`**: Определите метод для обновления зачислений для курса с вложенным транзакционным поведением. Мы используем `Propagation.NESTED`, чтобы указать, что этот метод выполняется в рамках внешней транзакции, но может быть отменен независимо при необходимости. Установка `Isolation.REPEATABLE_READ` гарантирует, что данные, считываемые этим методом, остаются согласованными на протяжении всей транзакции. + + ```java + @Transactional(propagation = Propagation.NESTED, isolation = Isolation.REPEATABLE_READ) + public void updateEnrollments(UUID courseId) { + // Запись начала процесса обновления зачислений + logAction("Update Enrollments", "Start"); + + try { + // Реализация обновления зачислений + // ... + + // Запись успешного обновления + logAction("Update Enrollments", "Success"); + } catch (Exception e) { + // Запись неудачи + logAction("Update Enrollments", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +--- + +# [ДАЛЕЕ: З + +[ДАЛЕЕ: Задания](../../lab-work.md) \ No newline at end of file diff --git a/docs/ru/transactions/practice/lessons/transactional-logging.md b/docs/ru/transactions/practice/lessons/transactional-logging.md new file mode 100644 index 0000000..0a4fff2 --- /dev/null +++ b/docs/ru/transactions/practice/lessons/transactional-logging.md @@ -0,0 +1,105 @@ +## Урок 3: Дополнение транзакционных методов подробным журналированием + +## Цель + +Этот раздел направлен на интеграцию подробного журналирования для каждой транзакционной операции, обеспечивая запись действий с их результатами. + +## Шаги + +1. **Реализация метода журналирования** + + **Сценарий**: Прежде чем улучшать транзакционные методы с помощью журналирования, нам нужно реализовать метод для обработки журналирования независимо от основной транзакции. Это гарантирует, что журналирование происходит надежно, независимо от результата основной транзакции. + + **Реализация метода `logAction`**: Создайте метод для независимого журналирования действий, обеспечивая точное отслеживание результатов транзакции. Мы используем `Propagation.REQUIRES_NEW`, чтобы выполнить операцию журналирования в отдельной транзакции, делая ее независимой от любых текущих транзакций и гарантируя ее завершение даже в случае сбоя основной транзакции. + + ```java + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void logAction(String action, String outcome) { + Log log = new Log(action, outcome, LocalDateTime.now()); + logRepository.save(log); + } + ``` + +2. **Журналирование зачисления студента на курс** + + **Сценарий**: В качестве администратора университета вам необходимо зарегистрировать зачисление студента на курс для отслеживания успешных зачислений и возможных ошибок. + + **Улучшение метода `enrollStudentInCourse`**: Измените метод для журналирования успешного или неудачного действия. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) + public void enrollStudentInCourse(UUID studentId, UUID courseId) { + // Запись начала процесса зачисления + logAction("Enroll Student", "Start"); + + try { + // Реализация зачисления студента на курс + // ... + + // Журналирование успешного зачисления + logAction("Enroll Student", "Success"); + } catch (Exception e) { + // Журналирование ошибки + logAction("Enroll Student", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +3. **Журналирование получения списка студентов для курса** + + **Сценарий**: Для поддержания аудита активностей, связанных с курсом, вам необходимо зарегистрировать получение списка студентов для курса и гарантировать, что журналирование происходит даже в случае исключений. + + **Улучшение метода `getStudentsForCourse`**: Измените метод для журналирования успешного или неудачного действия. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) + public List getStudentsForCourse(UUID courseId) { + // Запись начала получения списка студентов для курса + logAction("Retrieve Students for Course", "Start"); + + try { + // Реализация получения списка студентов для курса + // ... + + // Журналирование успешного получения + logAction("Retrieve Students for Course", "Success"); + return students; + } catch (Exception e) { + // Журналирование ошибки + logAction("Retrieve Students for Course", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +4. **Журналирование добавления нового курса** + + **Сценарий**: При добавлении нового курса важно зарегистрировать результат операции для отслеживания успешного или неудачного добавления. + + **Улучшение метода `addNewCourse`**: Измените метод для журналирования успешного или неудачного действия. + + ```java + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Course addNewCourse(String title) { + // Запись начала добавления нового курса + logAction("Add New Course", "Start"); + + try { + // Реализация добавления нового курса + // ... + + // Журналирование успешного добавления + logAction("Add New Course", "Success"); + return savedCourse; + } catch (Exception e) { + // Журналирование ошибки + logAction("Add New Course", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +--- + +# [ДАЛЕЕ: Реализация вложенных транзакций и непривязанных к транзакции операций](nested-and-non-transactional-operations.md) \ No newline at end of file From 364fa8ace63bf2017d42a70a7396320610c6a18b Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 20 May 2024 12:42:34 +0300 Subject: [PATCH 18/40] [SpringSecurity] Updated Tasks --- docs/en/springsecurity/lab-work.md | 38 +++++++++++++++++++++++++---- docs/ru/springsecurity/lab-work.md | 34 ++++++++++++++++++++++++++ docs/srcs/springsecurity/task.png | Bin 0 -> 359489 bytes 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 docs/srcs/springsecurity/task.png diff --git a/docs/en/springsecurity/lab-work.md b/docs/en/springsecurity/lab-work.md index cde2198..245d193 100644 --- a/docs/en/springsecurity/lab-work.md +++ b/docs/en/springsecurity/lab-work.md @@ -25,9 +25,37 @@ The primary goal of this lab work is to provide you with practical experience an ## Lab Work Tasks -- multi chain security -- create allowed paths -- create authenticated paths ( form-based ) -- create admin page ( role based ) -- hide and show content in depends on authorities and role. +![img.png](../../srcs/springsecurity/task.png) +### Task 1: Setup Spring Security +Initialize Spring Security in your project. + +### Task 2: Define User Roles and Authorities +Define different user roles (Manager, Teacher, Student) and their respective authorities. + +### Task 3: Configure Security in Controllers +Protect endpoints using role-based access control. + +#### Implementation Details +**Manager Role**: +- Add New Teacher (`/teachers/new`) +- Modify Teacher Profile (`/teachers/{id}/edit`) +- Modify Student Profile (`/students/{id}/edit`) +- Modify Student Marks (`/students/{id}/marks/edit`) + +**Teacher Role**: +- Modify Student Marks (`/students/{id}/marks/edit`) +- Add New Subject (`/subjects/new`) +- Add New Test (`/tests/new`) + +**Student Role**: +- Pass Test (`/tests/{id}/take`) +- Read Marks (`/students/{id}/marks`) + +### Task 4: Implement Authorization in Thymeleaf Templates + +Restrict access to UI elements based on user roles. + + +### Task 5: Test Role-Based Access Control +Ensure that endpoints and UI elements are correctly protected. diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md index f79bc17..f4554d7 100644 --- a/docs/ru/springsecurity/lab-work.md +++ b/docs/ru/springsecurity/lab-work.md @@ -24,3 +24,37 @@ 14. [Задача 14: Пользовательская форма входа](practice/custom-login-form.md) ## Задачи лабораторной работы + +![img.png](../../srcs/springsecurity/task.png) + +### Задача 1: Настройка Spring Security +Инициализация Spring Security в вашем проекте. + +### Задача 2: Определение Ролей и Полномочий Пользователей +Определение различных пользовательских ролей (Менеджер, Учитель, Студент) и их соответствующих полномочий. + +### Задача 3: Настройка Безопасности в Контроллерах +Защита конечных точек с использованием контроля доступа на основе ролей. + +#### Детали реализации +**Роль Менеджера**: +- Добавление Нового Учителя (`/teachers/new`) +- Изменение Профиля Учителя (`/teachers/{id}/edit`) +- Изменение Профиля Студента (`/students/{id}/edit`) +- Изменение Оценок Студента (`/students/{id}/marks/edit`) + +**Роль Учителя**: +- Изменение Оценок Студента (`/students/{id}/marks/edit`) +- Добавление Нового Предмета (`/subjects/new`) +- Добавление Нового Теста (`/tests/new`) + +**Роль Студента**: +- Прохождение Теста (`/tests/{id}/take`) +- Просмотр Оценок (`/students/{id}/marks`) + +### Задача 4: Реализация Авторизации в Шаблонах Thymeleaf + +Ограничение доступа к элементам пользовательского интерфейса на основе ролей пользователей. + +### Задача 5: Тестирование Контроля Доступа на Основе Ролей +Убедитесь, что конечные точки и элементы пользовательского интерфейса правильно защищены. \ No newline at end of file diff --git a/docs/srcs/springsecurity/task.png b/docs/srcs/springsecurity/task.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8e7177b2018b38e08dd510caa1fc4a6a25718b GIT binary patch literal 359489 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 %G5Y909=Qn6YzDqW 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�_Bi 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 Date: Tue, 21 May 2024 00:23:35 +0300 Subject: [PATCH 19/40] [Master] Fix bugs --- docs/en/springsecurity/tasks.md | 13 ------------- docs/srcs/springsecurity/task.png | Bin 359489 -> 0 bytes 2 files changed, 13 deletions(-) delete mode 100644 docs/en/springsecurity/tasks.md delete mode 100644 docs/srcs/springsecurity/task.png diff --git a/docs/en/springsecurity/tasks.md b/docs/en/springsecurity/tasks.md deleted file mode 100644 index 52f7231..0000000 --- a/docs/en/springsecurity/tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -- Setup and Configuration -- base implementation to user -- password hashing algorithms -- add dummy users ( password hashing) -- create identity to users -- - -## TASKS -- create allowed paths -- create authenticated paths ( form-based ) -- create admin page ( role based ) -- hide and show content in depends on authorities and role. -- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file diff --git a/docs/srcs/springsecurity/task.png b/docs/srcs/springsecurity/task.png deleted file mode 100644 index 7b8e7177b2018b38e08dd510caa1fc4a6a25718b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359489 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 %G5Y909=Qn6YzDqW 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�_Bi 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 Date: Tue, 21 May 2024 00:27:32 +0300 Subject: [PATCH 20/40] [Master] Merged thymeleaf --- docs/en/thymeleaf/lab-work.md | 73 ++++++++++ .../thymeleaf/practice/configure-thymeleaf.md | 119 ++++++++++++++++ .../thymeleaf/practice/create-first-view.md | 63 +++++++++ docs/en/thymeleaf/practice/form-handling.md | 74 ++++++++++ docs/en/thymeleaf/practice/forms.md | 120 ++++++++++++++++ .../practice/fragments-and-layouts.md | 130 ++++++++++++++++++ docs/en/thymeleaf/practice/iteration.md | 107 ++++++++++++++ docs/en/thymeleaf/practice/literals.md | 55 ++++++++ docs/en/thymeleaf/practice/validation.md | 85 ++++++++++++ .../practice/variables-and-controller.md | 67 +++++++++ .../practice/working-with-variables.md | 92 +++++++++++++ docs/ru/thymeleaf/lab-work.md | 74 ++++++++++ .../thymeleaf/practice/configure-thymeleaf.md | 119 ++++++++++++++++ .../thymeleaf/practice/create-first-view.md | 63 +++++++++ docs/ru/thymeleaf/practice/form-handling.md | 74 ++++++++++ docs/ru/thymeleaf/practice/forms.md | 120 ++++++++++++++++ .../practice/fragments-and-layouts.md | 130 ++++++++++++++++++ docs/ru/thymeleaf/practice/iteration.md | 107 ++++++++++++++ docs/ru/thymeleaf/practice/literals.md | 55 ++++++++ docs/ru/thymeleaf/practice/validation.md | 85 ++++++++++++ .../practice/variables-and-controller.md | 67 +++++++++ .../practice/working-with-variables.md | 92 +++++++++++++ docs/srcs/thymeleaf/first-view.png | Bin 0 -> 7080 bytes docs/srcs/thymeleaf/fourth-view.png | Bin 0 -> 23618 bytes docs/srcs/thymeleaf/home-page.png | Bin 0 -> 13921 bytes docs/srcs/thymeleaf/layout.png | Bin 0 -> 50263 bytes docs/srcs/thymeleaf/login-page.png | Bin 0 -> 12495 bytes docs/srcs/thymeleaf/login-validation.png | Bin 0 -> 14150 bytes docs/srcs/thymeleaf/modify-user-page.png | Bin 0 -> 17129 bytes docs/srcs/thymeleaf/second-view-enhanced.png | Bin 0 -> 10468 bytes docs/srcs/thymeleaf/second-view.png | Bin 0 -> 9090 bytes docs/srcs/thymeleaf/signup-page.png | Bin 0 -> 14133 bytes docs/srcs/thymeleaf/third-view-error.png | Bin 0 -> 6204 bytes docs/srcs/thymeleaf/third-view-success.png | Bin 0 -> 5944 bytes docs/srcs/thymeleaf/third-view.png | Bin 0 -> 5754 bytes docs/srcs/thymeleaf/users-page.png | Bin 0 -> 13978 bytes 36 files changed, 1971 insertions(+) create mode 100644 docs/en/thymeleaf/lab-work.md create mode 100644 docs/en/thymeleaf/practice/configure-thymeleaf.md create mode 100644 docs/en/thymeleaf/practice/create-first-view.md create mode 100644 docs/en/thymeleaf/practice/form-handling.md create mode 100644 docs/en/thymeleaf/practice/forms.md create mode 100644 docs/en/thymeleaf/practice/fragments-and-layouts.md create mode 100644 docs/en/thymeleaf/practice/iteration.md create mode 100644 docs/en/thymeleaf/practice/literals.md create mode 100644 docs/en/thymeleaf/practice/validation.md create mode 100644 docs/en/thymeleaf/practice/variables-and-controller.md create mode 100644 docs/en/thymeleaf/practice/working-with-variables.md create mode 100644 docs/ru/thymeleaf/lab-work.md create mode 100644 docs/ru/thymeleaf/practice/configure-thymeleaf.md create mode 100644 docs/ru/thymeleaf/practice/create-first-view.md create mode 100644 docs/ru/thymeleaf/practice/form-handling.md create mode 100644 docs/ru/thymeleaf/practice/forms.md create mode 100644 docs/ru/thymeleaf/practice/fragments-and-layouts.md create mode 100644 docs/ru/thymeleaf/practice/iteration.md create mode 100644 docs/ru/thymeleaf/practice/literals.md create mode 100644 docs/ru/thymeleaf/practice/validation.md create mode 100644 docs/ru/thymeleaf/practice/variables-and-controller.md create mode 100644 docs/ru/thymeleaf/practice/working-with-variables.md create mode 100644 docs/srcs/thymeleaf/first-view.png create mode 100644 docs/srcs/thymeleaf/fourth-view.png create mode 100644 docs/srcs/thymeleaf/home-page.png create mode 100644 docs/srcs/thymeleaf/layout.png create mode 100644 docs/srcs/thymeleaf/login-page.png create mode 100644 docs/srcs/thymeleaf/login-validation.png create mode 100644 docs/srcs/thymeleaf/modify-user-page.png create mode 100644 docs/srcs/thymeleaf/second-view-enhanced.png create mode 100644 docs/srcs/thymeleaf/second-view.png create mode 100644 docs/srcs/thymeleaf/signup-page.png create mode 100644 docs/srcs/thymeleaf/third-view-error.png create mode 100644 docs/srcs/thymeleaf/third-view-success.png create mode 100644 docs/srcs/thymeleaf/third-view.png create mode 100644 docs/srcs/thymeleaf/users-page.png diff --git a/docs/en/thymeleaf/lab-work.md b/docs/en/thymeleaf/lab-work.md new file mode 100644 index 0000000..8872e1b --- /dev/null +++ b/docs/en/thymeleaf/lab-work.md @@ -0,0 +1,73 @@ +# Thymeleaf Lab Work + +Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in using Thymeleaf within a Spring environment. Thymeleaf is widely utilized for server-side rendering in web development, and through these tasks, you will gain valuable insights into its configuration, usage of variables, controllers, form handling, and more. + +## Practice Tasks + +1. [Task 1: Configure Thymeleaf in Spring](practice/configure-thymeleaf.md) +2. [Task 2: Create First View](practice/create-first-view.md) +3. [Task 3: Working With Variables](practice/working-with-variables.md) +4. [Task 4: Variables and Controller](practice/variables-and-controller.md) +5. [Task 5: Iteration](practice/iteration.md) +6. [Task 6: Literals](practice/literals.md) +7. [Task 7: Forms](practice/forms.md) +8. [Task 8: Form Handling](practice/form-handling.md) +9. [Task 9: Query Parameter and Validation](practice/validation.md) +10. [Task 10: Fragments and Layouts](practice/fragments-and-layouts.md) + + +## Lab Work Tasks + +1. **Task 1: Create HTML Layout with Fragments** + + - Create individual fragments for different parts of an HTML page, such as navbar, header, head, and footer. + - Assemble these fragments in a single HTML file to form a complete layout + - For example: + ![layout.png](../../srcs/thymeleaf/layout.png) + +2. **Task 2: Create Home Page with Localization** + + - Implement a home page accessible at the path `/`. + - Utilize the layout created in Task 1 for structuring the home page. + - Use `#{}` expressions for all text content within the home page, demonstrating localization or messages from a file.properties file. + - For Example: + + ![home-page.png](../../srcs/thymeleaf/home-page.png) + +3. **Task 3: Create Login and Register Forms** + + - Design and implement login and register forms for user authentication. + - Utilize Thymeleaf's model binding to handle form data. + - For Example: + + ![login-page.png](../../srcs/thymeleaf/login-page.png) + + ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + +4. **Task 4: Validate Login and Register Actions** + + - Implement validation for login and register actions. + - Use query parameters to pass error messages in case of validation failures. + - Ensure secure and proper handling of user input. + - For Example: + + ![login-validation.png](../../srcs/thymeleaf/login-validation.png) + +5. **Task 5: Create Users Page** + + - Develop a Users page that displays a table of users. + - Implement iteration to dynamically populate the table with user data. + - Provide functionality to delete or modify user entries from the page. + - For Example: + + ![users-page.png](../../srcs/thymeleaf/users-page.png) + + ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) + +Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. + +Happy coding! diff --git a/docs/en/thymeleaf/practice/configure-thymeleaf.md b/docs/en/thymeleaf/practice/configure-thymeleaf.md new file mode 100644 index 0000000..2c016c4 --- /dev/null +++ b/docs/en/thymeleaf/practice/configure-thymeleaf.md @@ -0,0 +1,119 @@ +# Configure Thymeleaf in Spring + +**Description:** + +This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. + +## **Steps:** + +1. **Create Thymeleaf Configuration Class:** + - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. + - Extend the class with `WebMvcConfigurer`. + + Example: + + ```java + package edu.labs.thymeleaf.config; + + import org.springframework.context.annotation.Configuration; + import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + @Configuration + public class WebMvcConfig implements WebMvcConfigurer { + // Configuration code goes here + } + ``` + + Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. + +2. **Configure Thymeleaf Template Resolver:** + - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. + - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. + + ```java + @Bean + public ClassLoaderTemplateResolver templateResolver() { + // Create a ClassLoaderTemplateResolver bean + ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); + + // Set the path where Thymeleaf will find templates + templateResolver.setPrefix("/templates/"); + + // Set the file extension for templates + templateResolver.setSuffix(".html"); + + // Set the template mode to HTML + templateResolver.setTemplateMode(TemplateMode.HTML); + + // Set the character encoding for templates + templateResolver.setCharacterEncoding("UTF-8"); + + // Return the configured template resolver bean + return templateResolver; + } + ``` + +3. **Configure Message Source:** + - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. + - Set the default encoding. + + ```java + @Bean + public MessageSource messageSource() { + // Create a ReloadableResourceBundleMessageSource bean + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + + // Set the default encoding for messages + messageSource.setDefaultEncoding("UTF-8"); + + // Return the configured message source bean + return messageSource; + } + ``` + +4. **Configure Thymeleaf View Resolver:** + - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. + - Set the template engine. + + ```java + @Bean + public ViewResolver thymeleafViewResolver() { + // Create a ThymeleafViewResolver bean + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + + // Set the template engine for the view resolver + resolver.setTemplateEngine(templateEngine()); + + // Return the configured ThymeleafViewResolver bean + return resolver; + } + ``` + +5. **Configure Thymeleaf Template Engine:** + - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. + - Set the template resolver and template engine message source. + + ```java + @Bean + public SpringTemplateEngine templateEngine() { + // Create a SpringTemplateEngine bean + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + + // Set the template resolver for the template engine + templateEngine.setTemplateResolver(templateResolver()); + + // Set the template engine message source + templateEngine.setTemplateEngineMessageSource(messageSource()); + + // Return the configured SpringTemplateEngine bean + return templateEngine; + } + ``` + +--- + +**Conclusion:** + +Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). + +# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/create-first-view.md b/docs/en/thymeleaf/practice/create-first-view.md new file mode 100644 index 0000000..30577eb --- /dev/null +++ b/docs/en/thymeleaf/practice/create-first-view.md @@ -0,0 +1,63 @@ +# Create First View + +**Description:** + +In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. + +## **Steps:** + +1. **Create the View File:** + - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. + - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. + + ```plaintext + Project Directory + └── src + └── main + └── resources + └── templates + └── practice + └── first.html + ``` + + Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. + +2. **Register the View in Configuration Class:** + - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). + - Add the following method to register the Thymeleaf view: + + ```java + public void addViewControllers(ViewControllerRegistry registry) { + // First View + registry.addViewController("/first").setViewName("practice/first"); + } + ``` + + This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. + +3. **Test the View:** + - Run your Spring application. + - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. + +4. **Optional: Configure Redirect from Root Path:** + - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: + + ```java + public void addViewControllers(ViewControllerRegistry registry) { + // First View + registry.addViewController("/first").setViewName("practice/first"); + + // Redirect from root path to the first view + registry.addRedirectViewController("/", "/first"); + } + ``` + + Now, visiting `http://localhost:8080/` will automatically redirect to the first view. + +--- + +**Conclusion:** + +You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. + +# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/form-handling.md b/docs/en/thymeleaf/practice/form-handling.md new file mode 100644 index 0000000..c7b6b7b --- /dev/null +++ b/docs/en/thymeleaf/practice/form-handling.md @@ -0,0 +1,74 @@ +# Form Handling + +**Description:** + +In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. + +**Steps:** + +1. **Show Form View (PracticeController):** + + - Open the `PracticeController` class and add a method to show the form view: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.GetMapping; + + @Controller + public class PracticeController { + + // Other methods... + + @GetMapping("/third") + public String showAddStudentForm(Model model) { + model.addAttribute("model", new StudentModel()); + return "practice/third"; + } + } + ``` + + - Explanation: + - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. + - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. + - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. + +2. **Handle Form Submission (PracticeController):** + + - Add a method in `PracticeController` to handle form submissions: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // Other methods... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + students.add(model); + + return "redirect:/third"; + } + } + ``` + + - Explanation: + - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. + - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. + - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. + - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). + +**Conclusion:** + +You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. + +# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/forms.md b/docs/en/thymeleaf/practice/forms.md new file mode 100644 index 0000000..3876c1d --- /dev/null +++ b/docs/en/thymeleaf/practice/forms.md @@ -0,0 +1,120 @@ +# Forms + +**Description:** + +In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. + +**Steps:** + +1. **Create Third View (third.html):** + + - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. + + ```html + + + + + Add Student Form + + +
+ Add Student + +
+ +

+ + +

+
+
+ + + ``` + +2. **Configure Form Submission:** + + - In the `form` tag, configure the form submission details: + + ```html +
+ ``` + + - Explanation: + - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. + - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. + - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. + - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. + +3. **Pass the 'id' Field:** + + - In the form, locate the section for the `id` field: + + ```html + +

+ + +

+ ``` + + - Explanation: + - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. + - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. + +4. **Repeat these steps:** + + - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. + - There is code example: + ```html + + + + + Add Student Form + + +
+ Add Student + + + +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+ + + +
+ + + ``` + +## Result +Your view should look like that: + +![third-view.png](../../../srcs/thymeleaf/third-view.png) + +**Conclusion:** + +You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. + +# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/fragments-and-layouts.md b/docs/en/thymeleaf/practice/fragments-and-layouts.md new file mode 100644 index 0000000..b3e2f8e --- /dev/null +++ b/docs/en/thymeleaf/practice/fragments-and-layouts.md @@ -0,0 +1,130 @@ +# Fragments and Layouts + +**Description:** + +In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. + +## **Steps:** + +1. **Update `first.html` with a Fragment:** + + - Open the `first.html` file in the `practice` directory. + - Add the `th:fragment` attribute to the `
` inside the `` tag: + + ```html + + + + + + + +
+

This is the information section of the first view.

+
+ + + + ``` + +2. **Update `second.html` with a Fragment:** + + - Open the `second.html` file in the `practice` directory. + - Add the `th:fragment` attribute to the `` inside the `` tag: + + ```html + + + + + + + +
+ + + + + + + + + + + + + +
IdFirstNameSecondNameGraduatedMarkDiploma Type
+ + + + ``` + +3. **Update `third.html` with a Fragment:** + + - Open the `third.html` file in the `practice` directory. + - Add the `th:fragment` attribute to the `
` inside the `` tag: + + ```html + + + + + + + +
+ Add Student + +
+

Student Added Successfully!

+
+ +
+ +
+
+ + + + ``` + +4. **Create `fourth.html` with Fragments Usage:** + + - Create a new file named `fourth.html` in the `practice` directory. + - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: + + ```html + + + + + + + +
+ + +
+ + +
+ + + + ``` + + - Explanation: + - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. + - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. + +## Result +Your view should look like that: + +![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) + +**Conclusion:** + +You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. + +# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/iteration.md b/docs/en/thymeleaf/practice/iteration.md new file mode 100644 index 0000000..9f8cc3a --- /dev/null +++ b/docs/en/thymeleaf/practice/iteration.md @@ -0,0 +1,107 @@ +# Iteration + +**Description:** + +In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. + +**Steps:** + +1. **Create StudentModel:** + - In the `models/` package, create a `StudentModel` class with the following attributes: + + ```java + public class StudentModel { + private Integer id = 0; + private String firstName = ""; + private String sureName = ""; + private Boolean isGraduated = false; + private Integer mark = 0; + + // Constructor, getters, and setters + } + ``` + +2. **Populate List of Students in PracticeController:** + - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: + + ```java + @Controller + public class PracticeController { + private final List students = new ArrayList<>(); + + public PracticeController() { + // Populate the list with users + this.students.add(new StudentModel(1, "First", "User", true, 4)); + this.students.add(new StudentModel(2, "Second", "User", false, 2)); + this.students.add(new StudentModel(3, "Third", "User", true, 5)); + this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); + } + + // Rest of the controller methods + } + ``` + +3. **Pass Students to secondView:** + - In the `secondView` method of the `PracticeController`, add the list of students to the model. + + ```java + @Controller + public class PracticeController { + // Other methods... + + @GetMapping("/second") + public String secondView(Model model) { + // Pass the list of students to the view + model.addAttribute("students", students); + // Rest of the method... + } + } + ``` + +4. **Render Students Table in second.html:** + - Open the `second.html` Thymeleaf view file. + +5. **Render Table Header:** + - Add the table header section within the `` tag: + + ```html + + + + + + + + + + + +
IdFirstNamesureNameGraduatedMark
+ ``` + +6. **Render Table Body with Iteration:** + - Add the table body section within the `` tag and iterate over the list of students to render each row: + + ```html + + + + + + + + + + + ``` + +## Result +Your page should look like that: + +![second-view.png](../../../srcs/thymeleaf/second-view.png) + +**Conclusion:** + +You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. + +# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/literals.md b/docs/en/thymeleaf/practice/literals.md new file mode 100644 index 0000000..f77ca7b --- /dev/null +++ b/docs/en/thymeleaf/practice/literals.md @@ -0,0 +1,55 @@ +# Literals + +**Description:** + +In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. + +**Steps:** + +1. **Update students-table Fragment in second.html:** + - Open the `second.html` Thymeleaf view file. + +2. **Enhance Literal for Student Id:** + - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. + + ```html + + ``` + +3. **Enhance Literal for Graduated Field:** + - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. + + ```html + + ``` + +4. **Enhance Literal for Mark Field:** + - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. + + ```html + Good + Very Good + Excellent + Not Passed + ``` + +5. **Add Literal for Diploma Type Field:** + - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. + + ```html + Blue + Blue + Red + No Diploma + ``` + +## Result +Your view should look like that: + +![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) + +**Conclusion:** + +You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. + +# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/validation.md b/docs/en/thymeleaf/practice/validation.md new file mode 100644 index 0000000..283fba4 --- /dev/null +++ b/docs/en/thymeleaf/practice/validation.md @@ -0,0 +1,85 @@ +# Query Parameter and Validation + +**Description:** + +In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. + +**Steps:** + +1. **Adapt the View (thirdView.html):** + + - Open the `third.html` file and add sections to display both success and error messages: + + ```html + + + + + + + + +
+

Student Added Successfully!

+
+ +
+

Error:

+
+ + + + + ``` + + - Explanation: + - The `
` checks if the query parameter `error` is present in the URL. + - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. + +2. **Handle Form Submission with Additional Validation (PracticeController):** + + - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // Other methods... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + // Additional validation: Check if the mark is more than 5. + if (model.getMark() > 5) { + // If the mark is more than 5, redirect with an error message. + return "redirect:/third?error=Mark should not be more than 5"; + } else { + students.add(model); + + return "redirect:/third?addedStudent=true"; + } + } + } + ``` + +## Result +Your view should look like that: + +![third-view-error.png](../../../srcs/thymeleaf/third-view-success.png) + +![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) + + +**Conclusion:** + +You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. + +# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/variables-and-controller.md b/docs/en/thymeleaf/practice/variables-and-controller.md new file mode 100644 index 0000000..ca4ad12 --- /dev/null +++ b/docs/en/thymeleaf/practice/variables-and-controller.md @@ -0,0 +1,67 @@ +# Variables and Controller + +**Description:** + +In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. + +**Steps:** + +1. **Create the New View File:** + - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. + + ```plaintext + Project Directory + └── src + └── main + └── resources + └── templates + └── practice + └── second.html + ``` + +2. **Define the Controller:** + - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. + + ```java + @Controller + public class PracticeController { + + @GetMapping("/second") + public String secondView(Model model) { + // Pass variables to the view + model.addAttribute("title", "Second Page"); + + // Return the view name + return "practice/second"; + } + } + ``` + + This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. + +3. **Update the View to Use Controller-Passed Variable:** + - Open the `second.html` Thymeleaf view file. + - Use the `title` variable passed from the controller in the `

` tag. + + ```html + + + + + Title + + +

Welcome to the Second Page

+ + Go Back to Home + + + ``` + + The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. + +**Conclusion:** + +You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task + +# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/working-with-variables.md b/docs/en/thymeleaf/practice/working-with-variables.md new file mode 100644 index 0000000..43ea184 --- /dev/null +++ b/docs/en/thymeleaf/practice/working-with-variables.md @@ -0,0 +1,92 @@ +# Working with variables + +**Description:** + +In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. + +## **Steps:** + +1. **Define Local Variables in Thymeleaf View:** + - Open your Thymeleaf view file (e.g., `first.html`). + - Explore the usage of local variables defined directly within the view. + - In the example code provided: + + ```html + + + Title + + ``` + + The local variable `title` is defined within the `` section of the HTML. + +2. **Localization Variables from Properties File:** + - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: + + ```java + @Bean + public MessageSource messageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.addBasenames("classpath:local/practice"); + messageSource.setDefaultEncoding("UTF-8"); + + return messageSource; + } + ``` + - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: + + ```properties + student.name=MyName + student.group=PRE-121 + message.welcome=Welcome, {0} + message.info=Your Group is: {0} + ``` + **Note on `{0}`:** + - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. + + - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. + - In the example code provided: + + ```html +

+

+ ``` + + The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. + +3. **Static Variables in Thymeleaf Configuration Class:** + - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: + + ```java + @Bean + public ViewResolver thymeleafViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.addStaticVariable("projectName", "Practice Tasks"); + resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); + resolver.setTemplateEngine(templateEngine()); + + return resolver; + } + ``` + + - Access these static variables in the Thymeleaf view using the `#vars` syntax. + - In the example code provided: + + ```html +

Project Name

+

Current Date and Time

+ ``` + +## Result + +now your page should look like that: + +![first-view.png](../../../srcs/thymeleaf/first-view.png) + +**Conclusion:** + +You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. + +Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. + +# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md new file mode 100644 index 0000000..e531959 --- /dev/null +++ b/docs/ru/thymeleaf/lab-work.md @@ -0,0 +1,74 @@ +# Лабораторная работа по Thymeleaf + +Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. + +## Цель лабораторной работы + +Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство использования Thymeleaf в среде Spring. Thymeleaf широко используется для серверного рендеринга в веб-разработке, и через эти задачи вы получите ценные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом. + +## Практические задачи + +1. [Задача 1: Настройка Thymeleaf в Spring](practice/configure-thymeleaf.md) +2. [Задача 2: Создание первого представления](practice/create-first-view.md) +3. [Задача 3: Работа с переменными](practice/working-with-variables.md) +4. [Задача 4: Переменные и контроллер](practice/variables-and-controller.md) +5. [Задача 5: Итерация](practice/iteration.md) +6. [Задача 6: Литералы](practice/literals.md) +7. [Задача 7: Формы](practice/forms.md) +8. [Задача 8: Обработка форм](practice/form-handling.md) +9. [Задача 9: Query Parameter и валидация](practice/validation.md) +10. [Задача 10: Фрагменты и макеты](practice/fragments-and-layouts.md) + + +## Задачи лабораторной работы + +1. **Задача 1: Создание HTML-макета с фрагментами** + + - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, head и подвал. + - Соберите эти фрагменты в один HTML-файл, чтобы создать полный макет. + - Например: + + ![layout.png](../../srcs/thymeleaf/layout.png) + +2. **Задача 2: Создание домашней страницы с локализацией** + + - Реализуйте домашнюю страницу, доступную по пути `/`. + - Используйте созданный в Задаче 1 макет для структурирования домашней страницы. + - Используйте выражения `#{}` для всего текстового содержимого на домашней странице, демонстрируя локализацию или сообщения из файла .properties. + - Например: + + ![home-page.png](../../srcs/thymeleaf/home-page.png) + +3. **Задача 3: Создание форм входа и регистрации** + + - Разработайте и реализуйте формы входа и регистрации для аутентификации пользователей. + - Используйте привязку модели Thymeleaf для обработки данных формы. + - Например: + + ![login-page.png](../../srcs/thymeleaf/login-page.png) + + ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + +4. **Задача 4: Валидация действий входа и регистрации** + + - Реализуйте валидацию для действий входа и регистрации. + - Используйте параметры запроса для передачи сообщений об ошибках в случае неудачной валидации. + - Обеспечьте безопасное и правильное обращение с вводом пользователя. + - Например: + + ![login-validation.png](../../srcs/thymeleaf/login-validation.png) + +5. **Задача 5: Создание страницы пользователей** + + - Разработайте страницу "Пользователи", отображающую таблицу пользователей. + - Реализуйте итерацию для динамического заполнения таблицы данными пользователей. + - Предоставьте функциональность удаления или изменения записей пользователя со страницы. + - Например: + + ![users-page.png](../../srcs/thymeleaf/users-page.png) + + ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) + +Не стесняйтесь исследовать и выполнять эти задачи в своем собственном темпе. Каждая задача разработана для дополнительного развития ваших навыков в Thymeleaf и веб-разработке. Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться. + +Счастливого кодирования! \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md new file mode 100644 index 0000000..f767e45 --- /dev/null +++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md @@ -0,0 +1,119 @@ +# Настройка Thymeleaf в Spring + +**Описание:** + +Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения беспроблемной интеграции шаблонного движка для веб-разработки. + +## **Шаги:** + +1. **Создайте Класс Конфигурации Thymeleaf:** + - В вашем проекте Spring создайте новый Java-класс, аннотированный `@Configuration`. Мы рекомендуем разместить этот класс в пакете `config`. + - Расширьте класс с `WebMvcConfigurer`. + + Пример: + + ```java + package edu.labs.thymeleaf.config; + + import org.springframework.context.annotation.Configuration; + import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + @Configuration + public class WebMvcConfig implements WebMvcConfigurer { + // Код конфигурации размещается здесь + } + ``` + + Размещение класса конфигурации в пакете `config` повышает организованность и обеспечивает четкую структуру в вашем проекте. Скорректируйте имя пакета в зависимости от структуры вашего проекта. + +2. **Настройте Разрешитель Шаблонов Thymeleaf:** + - Определите метод, аннотированный `@Bean`, для конфигурации разрешителя шаблонов Thymeleaf. + - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов. + + ```java + @Bean + public ClassLoaderTemplateResolver templateResolver() { + // Создайте bean ClassLoaderTemplateResolver + ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); + + // Установите путь, где Thymeleaf будет искать шаблоны + templateResolver.setPrefix("/templates/"); + + // Установите расширение файла для шаблонов + templateResolver.setSuffix(".html"); + + // Установите режим шаблона в HTML + templateResolver.setTemplateMode(TemplateMode.HTML); + + // Установите кодировку символов для шаблонов + templateResolver.setCharacterEncoding("UTF-8"); + + // Верните настроенный bean разрешителя шаблонов + return templateResolver; + } + ``` + +3. **Настройте Источник Сообщений:** + - Добавьте метод, аннотированный `@Bean`, для настройки источника сообщений с использованием `ReloadableResourceBundleMessageSource`. + - Установите кодировку по умолчанию. + + ```java + @Bean + public MessageSource messageSource() { + // Создайте bean ReloadableResourceBundleMessageSource + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + + // Установите кодировку по умолчанию для сообщений + messageSource.setDefaultEncoding("UTF-8"); + + // Верните настроенный bean источника сообщений + return messageSource; + } + ``` + +4. **Настройте Разрешитель Представлений Thymeleaf:** + - Создайте метод, аннотированный `@Bean`, для настройки разрешителя представлений Thymeleaf. + - Установите шаблонный движок. + + ```java + @Bean + public ViewResolver thymeleafViewResolver() { + // Создайте bean ThymeleafViewResolver + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + + // Установите шаблонный движок для разрешителя представлений + resolver.setTemplateEngine(templateEngine()); + + // Верните настроенный bean ThymeleafViewResolver + return resolver; + } + ``` + +5. **Настройте Шаблонный Движок Thymeleaf:** + - Реализуйте метод, аннотированный `@Bean`, для настройки шаблонного движка Thymeleaf. + - Установите разрешитель шаблонов и источник сообщений шаблонного движка. + + ```java + @Bean + public SpringTemplateEngine templateEngine() { + // Создайте bean SpringTemplateEngine + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + + // Установите разрешитель шаблонов для шаблонного движка + templateEngine.setTemplateResolver(templateResolver()); + + // Установите источник сообщений шаблонного движка + templateEngine.setTemplateEngineMessageSource(messageSource()); + + // Верните настроенный bean SpringTemplateEngine + return templateEngine; + } + ``` + +--- + +**Заключение:** + +Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html). + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/create-first-view.md b/docs/ru/thymeleaf/practice/create-first-view.md new file mode 100644 index 0000000..a2ed7b7 --- /dev/null +++ b/docs/ru/thymeleaf/practice/create-first-view.md @@ -0,0 +1,63 @@ +# Создание Первого Представления + +**Описание:** + +В данной задаче мы создадим первое представление Thymeleaf для вашего приложения Spring. Следуйте указанному пути к файлам, определенному в конфигурации Thymeleaf, и зарегистрируйте представление в приложении. + +## **Шаги:** + +1. **Создайте Файл Представления:** + - Перейдите в каталог, указанный в конфигурации Thymeleaf как префикс для шаблонов. + - По умолчанию префикс настроен как `/templates/`. Следовательно, создайте файл представления Thymeleaf в этом каталоге. + + ```plaintext + Каталог Проекта + └── src + └── main + └── resources + └── templates + └── practice + └── first.html + ``` + + Убедитесь, что файл представления имеет правильное имя (например, `first.html`). Каталог `/templates/` важен для того, чтобы Thymeleaf мог правильно находить и обрабатывать ваши шаблоны. + +2. **Зарегистрируйте Представление в Конфигурационном Классе:** + - Откройте конфигурационный класс, где вы настраивали Thymeleaf (например, `WebMvcConfig`). + - Добавьте следующий метод для регистрации представления Thymeleaf: + + ```java + public void addViewControllers(ViewControllerRegistry registry) { + // Первое представление + registry.addViewController("/first").setViewName("practice/first"); + } + ``` + + Этот метод сопоставляет URL-путь `/first` с представлением Thymeleaf с именем "practice/first". Скорректируйте путь в соответствии с структурой вашего проекта. + +3. **Проверьте Представление:** + - Запустите ваше приложение Spring. + - Откройте веб-браузер и перейдите по адресу `http://localhost:8080/first`. Вы должны увидеть отображенное представление Thymeleaf. + +4. **Дополнительно: Настройте Перенаправление с Корневого Пути:** + - Чтобы установить первое представление в качестве страницы по умолчанию, вы можете добавить перенаправление с корневого пути ("/") на путь первого представления в методе `addViewControllers`: + + ```java + public void addViewControllers(ViewControllerRegistry registry) { + // Первое представление + registry.addViewController("/first").setViewName("practice/first"); + + // Перенаправление с корневого пути на первое представление + registry.addRedirectViewController("/", "/first"); + } + ``` + + Теперь при посещении `http://localhost:8080/` произойдет автоматическое перенаправление на первое представление. + +--- + +**Вывод:** + +Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/form-handling.md b/docs/ru/thymeleaf/practice/form-handling.md new file mode 100644 index 0000000..607eba6 --- /dev/null +++ b/docs/ru/thymeleaf/practice/form-handling.md @@ -0,0 +1,74 @@ +# Обработка Формы + +**Описание:** + +В этом продолжении мы сосредоточимся на обработке отправки форм и отображении представления с использованием `PracticeController`. Это включает передачу модели в представление при его отображении и реализацию логики обработки отправки формы. + +**Шаги:** + +1. **Отображение Представления Формы (PracticeController):** + + - Откройте класс `PracticeController` и добавьте метод для отображения представления формы: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.GetMapping; + + @Controller + public class PracticeController { + + // Другие методы... + + @GetMapping("/third") + public String showAddStudentForm(Model model) { + model.addAttribute("model", new StudentModel()); + return "practice/third"; + } + } + ``` + + - Объяснение: + - `@GetMapping("/third")`: Эта аннотация сопоставляет метод с обработкой GET-запросов для конечной точки `/third`. + - `showAddStudentForm(Model model)`: Этот метод принимает параметр `Model`, добавляет в него новый объект `StudentModel` и возвращает имя представления (`"thirdView"` в данном случае). Обновлено для отражения правильного названия представления. + - Модель заполняется новым экземпляром `StudentModel`, который будет использоваться для привязки полей формы. + +2. **Обработка Отправки Формы (PracticeController):** + + - Добавьте метод в `PracticeController` для обработки отправки формы: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // Другие методы... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + students.add(model); + + return "redirect:/third"; + } + } + ``` + + - Объяснение: + - `@PostMapping("/addStudent")`: Эта аннотация сопоставляет метод с обработкой POST-запросов для конечной точки `/addStudent`. + - `addStudent(@ModelAttribute("model") StudentModel model)`: Этот метод принимает атрибут `model` из отправленной формы (`@ModelAttribute`) и обрабатывает его. Данные формы автоматически привязываются к объекту `model`. + - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия. + - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`). + +**Заключение:** + +Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/forms.md b/docs/ru/thymeleaf/practice/forms.md new file mode 100644 index 0000000..0d185da --- /dev/null +++ b/docs/ru/thymeleaf/practice/forms.md @@ -0,0 +1,120 @@ +# Формы + +**Описание:** + +В этом задании вы создадите новое представление Thymeleaf с именем `third.html` и реализуете логику обработки форм в контроллере `PracticeController`. Форма позволит пользователям добавлять новых студентов с определенными данными, и контроллер будет обрабатывать отправку формы. + +**Шаги:** + +1. **Создайте третье представление (third.html):** + + - Создайте новый файл представления Thymeleaf с именем `third.html` в каталоге `/src/main/resources/templates/practice`. + + ```html + + + + + Добавление студента + + +
+ Добавление студента + +
+ +

+ + +

+
+
+ + + ``` + +2. **Настройте отправку формы:** + + - В теге `form` настройте детали отправки формы: + + ```html +
+ ``` + + - Объяснение: + - `action="#"`: Этот атрибут указывает URL, на который будут отправлены данные формы при отправке. `#` указывает, что форма будет отправлена на тот же URL, с которого она была запрошена. + - `th:action="@{/addStudent}"`: Этот атрибут Thymeleaf динамически устанавливает атрибут `action` на основе выражения Thymeleaf. `@{/addStudent}` генерирует абсолютный URL для конечной точки `/addStudent`. + - `th:object="${model}"`: Этот атрибут связывает форму с объектом-моделью (`model`). Thymeleaf использует этот объект для привязки полей формы к свойствам во время отправки формы и рендеринга. + - `method="post"`: Этот атрибут указывает HTTP-метод, используемый при отправке данных формы на сервер. Установлено значение `post`, указывающее, что данные формы будут отправлены в теле запроса. + +3. **Передайте поле 'id':** + + - В форме найдите раздел для поля `id`: + + ```html + +

+ + +

+ ``` + + - Объяснение: + - `th:field="*{id}"`: Этот атрибут Thymeleaf привязывает поле ввода к свойству `id` объекта `model`. Это гарантирует, что значение, введенное в поле ввода, будет установлено в свойство `id` при отправке формы. + - `id="id"` и `name="id"`: Эти атрибуты предоставляют идентификаторы для поля ввода. + +4. **Повторите эти шаги:** + + - Повторите эти шаги для каждого оставшегося поля (`firstName`, `sureName`, `isGraduated` и `mark`). Убедитесь, что вы обновляете атрибуты `label`, `id`, `name` и `th:field` соответственно. + - Вот пример кода: + ```html + + + + + Добавление студента + + +
+ Добавление студента + + + +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+ + + +
+ + + ``` + +## Результат +Ваше представление должно выглядеть так: + +![third-view.png](../../../srcs/thymeleaf/third-view.png) + +**Заключение:** + +Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/fragments-and-layouts.md b/docs/ru/thymeleaf/practice/fragments-and-layouts.md new file mode 100644 index 0000000..dc9f2ef --- /dev/null +++ b/docs/ru/thymeleaf/practice/fragments-and-layouts.md @@ -0,0 +1,130 @@ +# Фрагменты и макеты + +**Описание:** + +В этом разделе мы реализуем фрагменты и макеты Thymeleaf. Мы обновим существующие представления, чтобы включить в них фрагменты, а затем создадим новое представление, использующее эти фрагменты. + +## **Шаги:** + +1. **Обновите `first.html` с фрагментом:** + + - Откройте файл `first.html` в каталоге `practice`. + - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: + + ```html + + + + + + + +
+

Это информационный раздел первого представления.

+
+ + + + ``` + +2. **Обновите `second.html` с фрагментом:** + + - Откройте файл `second.html` в каталоге `practice`. + - Добавьте атрибут `th:fragment` к тегу `` внутри тега ``: + + ```html + + + + + + + +
+ + + + + + + + + + + + + +
IdFirstNameSecondNameGraduatedMarkDiploma Type
+ + + + ``` + +3. **Обновите `third.html` с фрагментом:** + + - Откройте файл `third.html` в каталоге `practice`. + - Добавьте атрибут `th:fragment` к тегу `
` внутри тега ``: + + ```html + + + + + + + +
+ Добавление студента + +
+

Студент успешно добавлен!

+
+ +
+ +
+
+ + + + ``` + +4. **Создайте `fourth.html` с использованием фрагментов:** + + - Создайте новый файл с именем `fourth.html` в каталоге `practice`. + - Используйте атрибуты `th:insert` и `th:replace`, чтобы включить фрагменты из других представлений: + + ```html + + + + + + + +
+ + +
+ + +
+ + + + ``` + + - Объяснение: + - `th:insert` используется для включения содержимого указанного фрагмента (`info` и `add-student-form`) в файл `fourth.html`. + - `th:replace` используется для замены содержимого указанного фрагмента (`students-table`) в файле `fourth.html`. + +## Результат +Ваше представление должно выглядеть так: + +![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) + +**Заключение:** + +Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`. + +# Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)** diff --git a/docs/ru/thymeleaf/practice/iteration.md b/docs/ru/thymeleaf/practice/iteration.md new file mode 100644 index 0000000..9f7803b --- /dev/null +++ b/docs/ru/thymeleaf/practice/iteration.md @@ -0,0 +1,107 @@ +# Итерация + +**Описание:** + +В этом задании вы изучите концепцию итерации в Thymeleaf, создав класс `StudentModel` в пакете `models/` и заполнив список студентов в контроллере `PracticeController`. Целью является передача списка студентов в представление `secondView` и отображение таблицы с данными студентов. + +**Шаги:** + +1. **Создайте класс StudentModel:** + - В пакете `models/` создайте класс `StudentModel` со следующими атрибутами: + + ```java + public class StudentModel { + private Integer id = 0; + private String firstName = ""; + private String sureName = ""; + private Boolean isGraduated = false; + private Integer mark = 0; + + // Конструктор, геттеры и сеттеры + } + ``` + +2. **Заполните список студентов в контроллере PracticeController:** + - В классе `PracticeController` создайте список `StudentModel` и заполните его фиктивными данными студентов: + + ```java + @Controller + public class PracticeController { + private final List students = new ArrayList<>(); + + public PracticeController() { + // Заполните список пользователями + this.students.add(new StudentModel(1, "First", "User", true, 4)); + this.students.add(new StudentModel(2, "Second", "User", false, 2)); + this.students.add(new StudentModel(3, "Third", "User", true, 5)); + this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); + } + + // Остальные методы контроллера + } + ``` + +3. **Передайте студентов в secondView:** + - В методе `secondView` контроллера `PracticeController` добавьте список студентов в модель. + + ```java + @Controller + public class PracticeController { + // Остальные методы... + + @GetMapping("/second") + public String secondView(Model model) { + // Передайте список студентов в представление + model.addAttribute("students", students); + // Остальная часть метода... + } + } + ``` + +4. **Отобразите таблицу студентов в second.html:** + - Откройте файл представления Thymeleaf `second.html`. + +5. **Отобразите заголовок таблицы:** + - Добавьте раздел заголовка таблицы внутри тега ``: + + ```html + + + + + + + + + + + +
IdFirstNamesureNameGraduatedMark
+ ``` + +6. **Отобразите тело таблицы с использованием итерации:** + - Добавьте раздел тела таблицы внутри тега `` и выполните итерацию по списку студентов для отображения каждой строки: + + ```html + + + + + + + + + + + ``` + +## Результат +Ваша страница должна выглядеть так: + +![second-view.png](../../../srcs/thymeleaf/second-view.png) + +**Заключение:** + +Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md) diff --git a/docs/ru/thymeleaf/practice/literals.md b/docs/ru/thymeleaf/practice/literals.md new file mode 100644 index 0000000..ee0af4c --- /dev/null +++ b/docs/ru/thymeleaf/practice/literals.md @@ -0,0 +1,55 @@ +# Литералы + +**Описание:** + +В этом задании вы улучшите представление Thymeleaf `second.html`, внедрив литералы для отображения измененных значений в зависимости от определенных условий. Литералы включают добавление константного значения к `id`, отображение "Да" или "Нет" для поля "Graduated" и предоставление описательных меток для полей "Mark" и "Diploma Type". + +**Шаги:** + +1. **Обновите фрагмент students-table в second.html:** + - Откройте файл представления Thymeleaf `second.html`. + +2. **Улучшите литерал для идентификатора студента:** + - Измените выражение для поля `id`, добавив константное значение (например, 100000) к фактическому идентификатору студента. + + ```html + + ``` + +3. **Улучшите литерал для поля "Graduated":** + - Обновите выражение для поля "Graduated" так, чтобы отображалось "Да", если студент закончил обучение, и "Нет" в противном случае. + + ```html + + ``` + +4. **Улучшите литерал для поля "Mark":** + - Добавьте условные выражения для отображения описательных меток для поля "Mark" в зависимости от оценки студента. + + ```html + Хорошо + Очень хорошо + Отлично + Не сдано + ``` + +5. **Добавьте литерал для поля "Diploma Type":** + - Добавьте условные выражения для отображения описательных меток для поля "Diploma Type" в зависимости от оценки студента и статуса окончания обучения. + + ```html + Синяя + Синяя + Красная + Нет диплома + ``` + +## Результат +Ваше представление должно выглядеть примерно так: + +![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) + +**Заключение:** + +Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md) diff --git a/docs/ru/thymeleaf/practice/validation.md b/docs/ru/thymeleaf/practice/validation.md new file mode 100644 index 0000000..43f2e41 --- /dev/null +++ b/docs/ru/thymeleaf/practice/validation.md @@ -0,0 +1,85 @@ +# Запросы и валидация + +**Описание:** + +В этом продолжении мы рассмотрим использование параметров запроса для отображения сообщений в представлении после обработки отправленных форм. Это включает в себя адаптацию `thirdView` для отображения сообщений об успешном выполнении и сообщений об ошибках на основе параметров запроса. + +**Шаги:** + +1. **Адаптация представления (thirdView.html):** + + - Откройте файл `third.html` и добавьте секции для отображения сообщений об успехе и ошибок: + + ```html + + + + + + + + +
+

Студент успешно добавлен!

+
+ +
+

Ошибка:

+
+ + + + + ``` + + - Объяснение: + - `
` проверяет, присутствует ли параметр запроса `error` в URL. + - Если параметр присутствует, отображается сообщение об ошибке красного цвета, полученное из `${param.error}`. + +2. **Обработка отправки формы с дополнительной валидацией (PracticeController):** + + - Обновите метод `addStudent` в `PracticeController` для включения дополнительной валидации оценки студента с использованием структуры `if-else`: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // Остальные методы... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + // Дополнительная валидация: Проверка, что оценка не более 5. + if (model.getMark() > 5) { + // Если оценка больше 5, выполняется перенаправление с сообщением об ошибке. + return "redirect:/third?error=Оценка не должна быть более 5"; + } else { + students.add(model); + + return "redirect:/third?addedStudent=true"; + } + } + } + ``` + +## Результат +Ваша страница должна выглядеть так: + +![third-view-error.png](../../../srcs/thymeleaf/third-view-success.png) + +![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) + + +**Заключение:** + +Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md) diff --git a/docs/ru/thymeleaf/practice/variables-and-controller.md b/docs/ru/thymeleaf/practice/variables-and-controller.md new file mode 100644 index 0000000..b4a2d9f --- /dev/null +++ b/docs/ru/thymeleaf/practice/variables-and-controller.md @@ -0,0 +1,67 @@ +# Переменные и контроллер + +**Описание:** + +В этом задании вы создадите новое представление Thymeleaf с именем `second.html` и изучите концепцию передачи переменных из контроллера в представление. Вместо определения заголовка как локальной переменной в представлении, мы передадим его через контроллер. + +**Шаги:** + +1. **Создание нового файла представления:** + - Создайте новый файл представления Thymeleaf с именем `second.html` в каталоге `/src/main/resources/templates/`. + + ```plaintext + Каталог проекта + └── src + └── main + └── resources + └── templates + └── practice + └── second.html + ``` + +2. **Определение контроллера:** + - В вашем классе контроллера (например, `PracticeController`) определите метод, который сопоставляется с URL-путем, связанным с новым представлением. Передайте нужную переменную (например, `title`) в модель. + + ```java + @Controller + public class PracticeController { + + @GetMapping("/second") + public String secondView(Model model) { + // Передача переменных в представление + model.addAttribute("title", "Вторая страница"); + + // Возврат имени представления + return "practice/second"; + } + } + ``` + + Этот метод контроллера сопоставляется с URL-путем `/second` и передает переменную `title` со значением "Вторая страница" в представление Thymeleaf. + +3. **Обновление представления для использования переменной, переданной контроллером:** + - Откройте файл представления Thymeleaf `second.html`. + - Используйте переменную `title`, переданную контроллером, в теге `

`. + + ```html + + + + + Заголовок + + +

Добро пожаловать на вторую страницу

+ + Вернуться на главную + + + ``` + + Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера. + +**Заключение:** + +Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md) diff --git a/docs/ru/thymeleaf/practice/working-with-variables.md b/docs/ru/thymeleaf/practice/working-with-variables.md new file mode 100644 index 0000000..47a0281 --- /dev/null +++ b/docs/ru/thymeleaf/practice/working-with-variables.md @@ -0,0 +1,92 @@ +# Работа с переменными + +**Описание:** + +В этом задании вы исследуете и используете различные типы локальных переменных в Thymeleaf в представлениях вашего приложения Spring. К ним относятся переменные, определенные непосредственно в представлении, переменные, переданные из контроллера, переменные, определенные в файле свойств для локализации, и статические переменные, определенные в классе конфигурации Thymeleaf. + +## **Шаги:** + +1. **Определение локальных переменных в представлении Thymeleaf:** + - Откройте файл представления Thymeleaf (например, `first.html`). + - Изучите использование локальных переменных, определенных непосредственно в представлении. + - В предоставленном примере кода: + + ```html + + + Title + + ``` + + Локальная переменная `title` определена внутри секции `` HTML. + +2. **Локализация переменных из файла свойств:** + - Просмотрите конфигурацию бина `MessageSource` в вашем классе конфигурации Thymeleaf: + + ```java + @Bean + public MessageSource messageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.addBasenames("classpath:local/practice"); + messageSource.setDefaultEncoding("UTF-8"); + + return messageSource; + } + ``` + - Создайте файл `practice.properties` в папке `/src/main/resources/local/` и добавьте следующее содержимое: + + ```properties + student.name=MyName + student.group=PRE-121 + message.welcome=Welcome, {0} + message.info=Your Group is: {0} + ``` + **Примечание о `{0}`:** + - Обозначение `{0}` в локализационных сообщениях представляет собой заполнитель для переменной. Когда сообщение отображается, заполнитель `{0}` заменяется фактическим значением, предоставленным в сообщении. Например, в сообщении `Welcome, {0}`, `{0}` будет заменено значением переменной, таким как имя. + + - Изучите использование локализованных переменных в представлении Thymeleaf с использованием синтаксиса `#{}`. + - В предоставленном примере кода: + + ```html +

+

+ ``` + + Переменные `student.name`, `student.group`, `message.welcome` и `message.info` все реализуют эту идею. + +3. **Статические переменные в классе конфигурации Thymeleaf:** + - В своем классе конфигурации Thymeleaf добавьте статические переменные с использованием метода `addStaticVariable`: + + ```java + @Bean + public ViewResolver thymeleafViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.addStaticVariable("projectName", "Practice Tasks"); + resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); + resolver.setTemplateEngine(templateEngine()); + + return resolver; + } + ``` + + - Получите доступ к этим статическим переменным в представлении Thymeleaf с использованием синтаксиса `#vars`. + - В предоставленном примере кода: + + ```html +

Project Name

+

Current Date and Time

+ ``` + +## Результат + +теперь ваша страница должна выглядеть так: + +![first-view.png](../../../srcs/thymeleaf/first-view.png) + +**Заключение:** + +Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring. + +Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций. + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md) diff --git a/docs/srcs/thymeleaf/first-view.png b/docs/srcs/thymeleaf/first-view.png new file mode 100644 index 0000000000000000000000000000000000000000..01516fc51e4bbfcc81e6af9381de5c4fc0186ef5 GIT binary patch literal 7080 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 literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/fourth-view.png b/docs/srcs/thymeleaf/fourth-view.png new file mode 100644 index 0000000000000000000000000000000000000000..63bfac4f5c10f6c3da2ace40e928fb3c04a59891 GIT binary patch literal 23618 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 AyZ`_I literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/home-page.png b/docs/srcs/thymeleaf/home-page.png new file mode 100644 index 0000000000000000000000000000000000000000..e17aeaf8de0ea5f00e4ec4525722e47f263052d1 GIT binary patch literal 13921 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 literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/layout.png b/docs/srcs/thymeleaf/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2606d7810ce7e490bcb97545e35e6779473855 GIT binary patch literal 50263 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�&_|BSEZT4C} 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 TxAdL5?&p~64@dFe1^xVAax%tZ literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/login-page.png b/docs/srcs/thymeleaf/login-page.png new file mode 100644 index 0000000000000000000000000000000000000000..db0c84fac2ecd5c3c643db6061c52fa019fb6707 GIT binary patch literal 12495 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 owTH*zLbx-l7aU~10t&vWRN^l+0`6hCZ zjX*v?IcW73g|_I6%Ca+8zA2mL&hn9itt;Y$Rc^GpY=#&2slHz8O4*D(7v+JSk&A<| zZ)9IEDGv%=8aFdPFIHu;_9x5xW@OHm+!gg_xvKqCw;3|I=h8oZB7RosUG!{59S|P9 zi2zgG3dvw$VgAH9Dd<>;{D=nDRQ4eONIA9}w#`iIr@|p2`6g+afzl925QI8k4!d(h zk^r^k#;+Srg+4j5X>LGq@R(_FM^P{EHQk9PLBx}%4Cf$&^4t;Of!wFGjdTY!#oHLL zNf?Wg$dS7^Hu|1Yw^u*shdrgObLne^h?+{+L3~l#kF(9l`)_Pvc}2^8#U8c!bk9j_ z%SX3@>G4WF{c+>5!_bKp4ovf~*TU!Ejjn|rAUu3*sv~_pCq&83OVaBXRou?Xb=2va z5l7u6N@O9b9S8!I_uQS)0;^G_&8?SE6@C2yjFw_@*(>$tju#b^6EgrL?CYSy;WEB# zDU-d|upGYaHox=Of?U{PmQi5>Yp%BCRl`wiB}d^w#qB&~@B=b{Glf=}5LZ=rW%+5c z=pzI{GmUlAdieI?KGlpj{ut=ft0Z&BhcbFVI?9=B9KEW_JBD)l0uMmJ#VzSYTthpQ`I-S5+8y*=z+CG8Kykn{Ri_-%h08 zxzy){3f)PzcW9HzqL|uRHO#(c<4I(mO5csbIiI18l;kxQM|;taAdup16t0vAQ#_k) z6cSu=8t#J%-Hb&3}A89~68aJAmGm9Paj~;6OnQ7euRy#;+BXuK*Vist^1dO>DXk)@L| zV-L-d$C9_w35M@kwznD8zE=dL+bar0iR-<$f*THIql;GW=cNS+*@UZ+-stOP1aOP` zA4GV5P+0Eaxss?zZxxtebSAC#j6C_900@-*5SAh<={dh>oi`R#;)|IaZEh${E{e~= zz7-rNRjiqA9^@G7y3zcq;q(nW2Kr`2>3MqER}Q@(OmI&cP1M>^W@U= zL&RK-zsp6}1`FtKz@_jG%NsUOtHLy+(fME)M)>4-eBF^>(6#h88XjfsvCw`RKsKiy z?B9OUiC`5>tRySd_x5Y$7PAL@7I=gHb=L> z0`9dU9cXF*dWjVB)gBSz;P5-(57wp?7_CkT;}prg{kW*8jld`s=2ucLtyREa8!(rZ zB=aG*u$Fy$t6jc}(Vj4h@O-VFaXyKjp-(0lmxRR1OSsTlo!?VKz8zO_tu7aJqv~_a z7LF^@aBt44w(ouZ8mcpTrqY{hAqkwiJ7=UES{rsdJ7_CHtkvTIUB7Lfo$c3-DOdtY z=yf0v_S9v*Dygb&NQ}A8%b9Vn6gA1 zr^cF@IDBrEpRcQxmKfbm`c=|gOcc^)!zWSTfB}|ma$#{cZ_a6O5->i*V zv#}Ef>ImhfakI7>xg||&**GDcr7ykZy=#E4;_#3<@OnJ{e7`(hbwdXsrmC*G&oV-6 zwY7L6eQy`J-PtMSDST1tx*D~ZW1I+B)Up3_IGX=S$_QuHA-Bp^H-N7#i_G|)SzB=ecMTgu5Im$`ggWUzICoDu{x(}sjeKWXSo z{P%7t02R=*_ebE$Y|~!HC_A|Z!mT-eQS|QlBOFrrc(FL8_gEp|(jpTE7@z6cw*0>) zw$wRYkGNh{BoF5N)cg`mO-qU%?}A-^!posMb*yk%oFIV<*A+cGa1wVgmOv5dt|kd$<)G1o2P)Qlye+*#bi8t3=<8<)pvPLAJ?M96C9@cVy$7$%P4ua{ZN?TJUTbeW z`tA2Nj(uqjx}s9TTA$vWZ~YA0SmbyrKSt)-5}P_OZV*{o*sJ&)mhT1iDQ{0I+DZAGLoBm#T+8cV`{GMCPDMUhO0u-(t! z)3%My@ z*c=H7y)F67kr8GuKIU{o-L%)wBIm$*fw41wJ16uSNIDu!&BhtPrEtE#C#tUHh*(De zl>$Rw+~9SUlqQbwoN(gi^CyJ^eQv3(M>gr4KNn0WeD!v53hLRiirB2nC6c8I0Pgmk zN0PZ>PDrkW@s+z}VIb4GFh31ZVwkFRcG!aT@;i5Fzdz6#R|Vg`s&n6u`|wHs#vp%r z*1#&Tv>1(abJX##jzBoCQhp5kngV4F^YrOBlqkwyOGB%A<|Ys5Tr0$f+2LhHi5in5 zkoFwPuV!2h-dP7cNV?vZT~6pDZ=~4}vR{4-EwR@?Q9Sm^)EGASBGRx&f+odbPA_`> z5^X3`TbeZRe&^T1z+DCr&oeY>INMt0Jzp5x^S#2;a~A1}BqA~|sfAUS>xDGi3x858 zG=K2K1$qh;^MO(ixx8Wo03mG|U{0ThnsheDc~VE(&HP|UA+s338_NOst=I+i=rQ09 z7A4q(@n$3#aA?1Ji2tW9%7)5=i`bd`m-_E%|G6$e#j%A))5~k)tH`VSH1cl6M8+ZW zFg^Wq@b4u4!Qk&f4*<6{aK*wRHL2gAS9dgyI;VcFRxDcjuLrv)+zP(j2TqIcp78;> z4Y9?OukVDLdPeKG0O+0}?7PRQJ=D~sV;~6t@^ee9EW3XL^!o?O_n#C|x~V4LZu|I! z1$qpW13`Vfn0;Y>H zQOx-PWCXY!F}axL`h?70BNfHBVOu)Pi4QM@El8$83Q`0aYO4(Z+i}Nu;=xu{%@5&W z&yN3d+(gW0I%hks_&sH&56vN33V|zwgQuT1l*kYI#K}e(8+H{Gkj+xlNs zlB&{)4Te3H(nRz?*M`_7Tmv}RrQnIh6U4%LLN6zd$=$2t>`dC7?=XB)(9To*vzK$C z3+U&&fNxq)=xJf*1zK3wJxsxoC{3LbI!pF1DlS4ziFMwA!nw)atwGwCYH_q^*NtP+ z_pFDqF0cie5@YEcs{?n}K^35T@1xTB`W9*%E~>hsxXO(&|JpLVM}mw4TfU^)XE|Rc zzA;trtu*iWLC5VQ*3>#xNAhcdWHC z!D;Fh=BA3TRb^`!8(^G572rP`%Xhy!ds!Afx&duCisMJ`K_@DXu3-a$01IK=K{+H& z3dko@0tEHZE$@R8^5dr+Gx7Mo5@s@n&;=H_GK?852X-*=ru9&@lR4~Ydt5vI=peY^ zc&GV2CpiMwVusJRnfSat36qtqYzd564T>$yc#t$OVYVR1sV%7#ICKZal}U@9I&H_+ zqt$j<(w8H|FZ;T*vPi)CH&K9#%Bm~Lc0=ScKE9iAC<$xz^5#=|1mlgk!5oklC7K%y zyMhKJy_^@ZTi_H)+^(HnFD=e^RUwz_0n&a1(^MxEmQgb;E{U) zjXkuH$_YH3&ew(r+TUl*xd$CEyeFA$-}D0*It5n{+%4*zmJc~Asv!4nHGt=h3fQ`I8WRv#7rDC;vLe9h5Xq{`FhsgNom!37LldSw!&g|Femx6mDwL zTsRqi53rj{xnAJK)ncs0KlhfO!G}9%TeR=!0>k5&v~X%lP_Cy8Do{1wsSosPG~j85 z+3HIaPdKWsyzXgzIjSGml$o`tnZY-@6RFogH_^63mT%cQSLL|c;EVp{rR&m!8?oa| zRmnG^^zVV{DF#p)TcX?lNx#*1FUXM#lm#fD_`ziNmEM1jWc2U4J)LpbP8LckH|T9m z4Ut58u0>=5-IFi#!xO{6;gGPQ20Zm$tV__T1w!>+-o9e2t+yL(Md5(Y2#h#Q6si z&_Q6%0QIV5*dmRoCm8NZVG2H6MaNhing?DEu)cs#9{4yNtM5^Gwr^fk5hK}tmmm$d zvQ3iO;No;}uqb!+jd?8q*M_Gvz26Gb3)O*x++S7{tzVt=X$Vp!+j#vl#>_a_-DTRl zR8%p{z5MAFUB_jHAu4t}W=M5WRI&VE_r|C4E(_rNPXRcNkNkN--$`Y-Tc17Cp8rKu z=P~JPFHT>i5YyU2>@b2&!9Uh@G~G(!Uz)7S@fHG8_oc`L;k$_^I~Y z0wWl&XldB8bCxNHlM!Uxcoi#_g~0^5@#1;=$4ZCRjfda1U^PSHOS-KyfC4Es3|O~j z$nT>A%CPTaQm@C7f@IS5v4I@L*Oq6K8+MuurxK=z+TUc4A|!bE+q+(R!Y!D_d3ek~ zs(&!ySV73X@zkULxD4cusXNh^54viq)>#XWlE|{ zPBm z&J6k+@Z1)s^8OpW({Xv2V7)hcbl!br2ZN9Y3dMB(j$KE8BWPOLxHSL|KbCU%JDlAu zxfk>1GytCxE&bb4go5hOCOMrq5|H~ibEe|JH z|DBj@aGa_rK)Y&;{n9sMuyORLq{>u!XQhy3YVy& z#sg*9l$O`#eT1u8mk7+RQS_pn)bQ0QK%Q6eb_N;%C}P>}p=~7N7kk%J+VFec%nUm# z6WDcz^QYKhjRFc0m=(wevNb&g6pQsj0xr|#2Yhu_?kxC@5Er#)1694suw4>OjU}nX zP}V#J4rulhBwl@Y#|Y+JP7rE&_wY(lfJ}1RQ0(vW^w~z7&(3Nk1PjH!s_Qd2AemMZ zj6?6-$a(K(>ao%TRG!~QVMEzct^S8p2jVWX7SbS0m^m3`Wb&))C4A<^0dMvBVmC!S zxdOScG4tD~0{;G;8%>>q1Hh`5>;>4O0C-Oa?e9UKJ}7TxvA2)^Wq|sPwliSUlmD&< zn)|@_JWa7kln8(}Rki*rBlT_TY65wePqL7YV>9+@EMS@OVS6?Ea4-3F-VIeirFk!eX%e*q9^NR|NK#iauSx|Lm(wUr;YU%dw0 z0A?VSS!|WDqz=>tR09$_!!JAd7C5Cx0dtO~qTL<X#4CW8Q(`;J5>YE& z;4BsZgz7c;x&VNN*&XFoy0!EHXY?Gvz&)}i+PeZ@;`su*N>bLUcWPSHam_;4ga>DcJ!0;Lg+8~4-c=@ zvS5%-d~;@I1Tz4tgC3Z0Zi%=VIQkg%;7oVz0QxSi1|nwLDgBRi7Nmfa+e}VNpLDAN zopmU;hHU^0L)FxznjNaWBF8d&v44r18W0%DAogpad5i4O{}6hgG%5ya?UJ}LjnWqr zwlT93XnY`D^p+BvKIwNuMlGneI(^=dzUev-sQ51(EMQH#VzjlWcmWJ=@<4umb|HS* z9M(+joHcmWmW>vITjAbm;Wf?JGAPD6kJYIW(K zD{yzNs_~@1?ddAVmv>R0?B*v841IJrOd4*rCsF#)qzM{oitaA^53A^vc+hy&0G4z^ zuZCcJprtENN1!3n4R1aGzELnKoLaP5>}=6ta&Q#|2K_^&dAcqE;5Z|Jn?h#>>xVUU zVyEMx9e%Mo`~mo6Lt3hC&+|ScS`ahP<1;y5`oCmb|0Slo0F^nqS>V|cl1O47@oeMg zP7lm7t+uag8MFIK{F>F?El-!uUJ3Rn-3Cs7!2BI@^X(lnBU+dCUz0F{!MUFRFXZ;$ z4psf11YiG~G@IJiV9jOz%q|DGc(FU`&k73QztsQV|EEsX4Ds<8@Y|VRvxNc2Zd4<-yHCR`ZjiRxTOrWk0#$W6JKTIt-EKHb z-em)Meg8IWNNatJhU}?bp4$I8L}r+HUdN6wqT`4-EF0+&Rm>VUp1olm0a+`oSYQ~L?6W3a#a*{9A_BEF$yz+7B=@l7yFeP4TG10GQNCS|0{?XO{>M-Qbnv3PNZ!JwFBmx0K2A|9&k$5(P9maLbBf~h4`hIMd^;lDc zA4FZs3b$?@6k2||c}`&{NFpCY>uFC}=+xD;6=BAWC%WVmCXYx^4XzwYyWBteQSG1O1cNSfdv!~PSrrCquTHu_3|v)TQ952*22zO9ki#g!o&DtFXI~>ip8)O5g z8aOTlRin-EyfH7o%zQJ-wt4y2ih}oL&UAcy2JkTct)`fPu8#||nF+o2C?T8cdllgh zl-0YTRm`jyhl8O(lffblC9enG8V2*BIH z4h*Hr>ra*qG0I%-x5k(+?=~o$O_OzSjl4{C%q`9q-usB)VlLm8Rbq}DBOICKmPbOS1&KfbYu>CGbnpLRxASmx0>KYtY<} zarzcxkqNGUm+k2k(J5D5eyhu3{rmyqudNaa+4gH6!?rN?@16%+V*h>rTR%EB`{U_) V!UDM;h_XQU@9N(vy!H6E{|lEozajtt literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/second-view-enhanced.png b/docs/srcs/thymeleaf/second-view-enhanced.png new file mode 100644 index 0000000000000000000000000000000000000000..ffedb8a481cffcd21cf28497550d3b86b0cbb2d1 GIT binary patch literal 10468 zcmdUVXH*kRx2~WF1`$gLT~JUWQUpPIQv(7DM5^>6(m^^1BnV0i9RZapQbYslJ{S@*}yk4)CenwdQ_d**qby?3~lh6)3K4RGSb z2?o^%_aC1)K}|#XT}*eH^6m7h@XLu4-~!eAN;*EK#59@c>`@nDbtT@_Ok$g|7tje#bDC0c~sj}Z)Gd2g*0wOL%(xuzPwoTo9cSL)t>UMBU z*pcjX?02L6UMk8AC)WMr%#PbBDJAG}8%P&HecayH0v)*-n)%UtG2-w@3M4V^zgX zr)TzqTxvH44Or(B*g4=g9)|XqChQ8{Zy_e@tDjl4B1%Q2dw2MoFXqmFe?LcmL&3k= z)7|FLOp$KEz%9$~_I{B=r5$V>TEMfBr;D$Rh{O&8M>2*gzLM7%W`?uC+x~Ur6K)qr z6&0d~c9hC#P+qDM@n_2dhLHFdk}zG9*B#BCT3HNYy*?wp2zU_`Q?sen?hn zQ_m(u=~Z*#hi09ltI7%!)!?vLsl>Gemgy2W96Hsq7}q2fBQFk8`S_^On_@?~Iu9Qh z@RKSYVy68RZfXkchS>NdOqO5deE7ZYXk~NdT5JM{=EjBACZOXN57{%hW&w<&3Eu** zeO&|5B$NP&GwbD#K_MG4lS#(z0wjH4cST~!ub!>(NSf@ZOCXx@F?x(tY8g0lDNq;K z>V*16nGg)fjR-owoN~%oJ{b!1&)fCCqCZ6t0_a>Ez9E@pzN-rcz`7Ol4)_EC3rx1w z{wcEZbdEYep>(40PJx$?93F3NTOPc zEZO%uq@v_dUTz$#KCDL-YL}99n#p!twR4jWjq?J4H>!1Nke9M%CAZa|kA{5ApmUlN z)D;1(j9`>=H)n^}K&O5ESBf`$b9lO0!1~y>d3)#RjPS|UZh6+*4{571_CE10_^T7f zDZ62nX_eG`J%&--OjOv{RZAZ0^b~5o<0Mn$YzkF$a^4MOArx#4cL@P1OvRLwuqK_S z#UG~huDt@Soqo5rl=0*&rZ(QaV6EMU)9-lErCHqcnU}s#K&YJ38W=vuj z@$)62QjA?Ap=DbFNkAIuR$pj+QEod+*vu#HU%?3`7ZO|<2rO8iWUu+F_MFLEbBZ(J z8jk8gHfO(Etn3QaKdj@2P>u6(Z3Q#YI7TK3J}Fs+mcJIdE)eBNv=dFKrK>oUmJ^xYVyj&>p~3un|0jtaNA+QxU@u?Wyf4nRO!?Jw=W)Yoa}7Q7+Sa`w%92Qm>qCwZqSM4HGrON2n_7=Lb~6o0 zGlK2?R95bdpho>7By|{}zx<=*yr&KxIrDQKM8j)SDQ~_VU-}MNuq@%PlCH8-1$(kHugW-N}R;M9}Ef!b=|$pV|#L>LRrvN?2w?Pe0Z5 z6peYBS7)U$t=&m`g2cCFe6xv$#EPWx0oTZ^K#;Qsd}l-&v#4JRUTCUtm_c+Ju#g^T zh(}Q;ZHkE)iCA726bD7g38%f$y-NRG2w>~z{|*djLgl{37(`mG~7WN@Lk&DgMGesNdgDC%TH2UltFDvloXmtByU*|)&bFDo-ABff`K~>r5G%n>+QQUK z@Ynl2r&FymE4SCKHY}e``k`Y#=7H~d5+bE;6M(>ZbQG`qexPD@ z*t)wXpmo3XtpL%H@QBbZtrz1kT)9pT6vVSh`#_W)(SG)P8;W^Bmo37A&>Nl*uutO6 z`>c%Gd?#uXr}#ZPrzQSfdUF5ZsB)KyQ)B$3j|Q82KYFb$RSO%A5C3+T>FOR6&AQp> zo924MF~P#=3a7d^?_(CWbrG|GimE4vY8Wfuhb_V4`cEF}%_rj|Y_)I5zbR&Sm1sPD zIrq_xoqab838XgaHtJmpqoHIbn44bMu3aR)+XdnQjk;sr>F`hzX?HJ1F%hoH zTbpO1HkW>SjD>OF+aD|(*ORwg&D{3a$G1t@_m*zzi`d-!8fq28?=#vQ&dJDdD71ri>3g*~b{7UcHT?SM?LeF+aczg|GS+i^g@fUHlU~+pQkhFQW z(#2lZncpyE;%5!DaY1qI#9XSfXbj%}BaDAzr~UBGD{EnC7;7FfrkN2@eI=T2!zhdu z-2-YXiZ-$I|0>UxkTtB@ndUNPimmCovSqc{f)ji%T|DRhl$>*@w7D@~L?EWxIFCIV zuFrm^t;AAnSpA@6wLHmh)_0|imR>3oESX-=<-kbcDvEn|GABh*J)ISnb>N@HgQp)r zr$Co4Ia)CTX_DXnjkGv^#3v%CS6kOY*J#JIfT@Uo7+`Sdk?eehxrNqc*H0=pO3=Xj z2{AYLzqlk*0cn{3KFq)2KJQF`H8nL&IDNZgw!|>XIg}Y-6b$QN^N_LWppdL%RyXDU z7ulPQ&Eig7=NBBKuAZ*hwC!H0I8DT}ts4zy;-ylM9fo7NK;zf{U?Sy@k#-?4KuD}u zF3<~0MZ^cfIs%;uPj6Odf-AafHcyOl(jr|>?h2l)N=qnQ4$7LkyEb~#)|;an!?1up zyWpjPDpkJ+jXl)K*|Fi+VK4fkU{UD_ck+K>x{GsOy*_D)UdBB(r7BF@Pe?0AkIEH0 zJ7kti>?hSg9$~DzUIgQBf7n>+H@Y*B0=27)Q%Bt$6{<5?MddK0jpcgY-go|noA&qW zC$V;WJqdjcp?X3ma1X0EP3n9`zcqMpX~vz<94)iDbC^p#_k@f@z?bmdFEY`gc-r}C zy9~1;%WE?WeckfYKlN8%M;|=s*2469-EQshSQx659I@v}WL~G-mz`b~n;XxkLJOux zbK+h@8UjrY7&Hn&x9 zBOeBQf(l!H8(E$@-79_YWGT4S@Kw`~4b>>OUQAp-o3mzMUcgHs{vSt)a@Y>7T zyYFJ^UvRqI&vUyeD^^9Ph?1;R2 zJNcHYm2{!^j`i7xeuves8v!|&W=3-;a-_XYMMbB%f%(k&N4f0jKegwC>{m^o}>U1RQGpZc|Avl}*zXN$$lgYAt-AZFcVF2fDSHZLDsRZR-&FM7{jDfV& z4rpR62wOH-3K87{(ufVCR`}k|Eb*_!V=*%tRCs>pkHH;)5S7NhuD%zF%rt{2vC5yk z2_#@^Z91){Uv#0iuF;TLaWfLOdg1JbQROXyvhevxOSL)rqpdUcJ)mFi2K3iDg|!d5 zT*}TWJoil45sf7Qb-1_|WLtOBEN9}@=0O!+c25to>R$-`-4T3AH6;3opyhQjaxaN% zxKfTNTS)5zy>!5G4dTli| zRkQ%i@&RXGXznBSb9C|5#l^kl*VoMg81{TO*}gJY+k6{Hw^-5{@_MzmR9>M{cmCr( znrSd`>wzHS8+pB_29eG0$~n$cYKHGO<#^tr zRy2JmS5((%Sk#jJHftE8oYC;`f@ePL&Z8=^F6Dwmt2N^K+oc0p)5!^< zufzBk$-F48#{SS9%Uyl;EV?NvW8A?=&+jL#!ODH$f2-S;xZMGmxsO+LKf|`8H3e<{ z6DBzFCRGk-L-+`ia>!h8x>mm`V|~Y zssnx9a%9AdVuz6mEPiKKIMzMjE~fjOlbaZuOkPp-y{LBuoO$TD-$0`PqIHAPEAB-W zn5kH{zi@^6l&^nAgc`@XkzH|FCeH29~nY>6*uf%)MUz;%Yi^x(c zB(7rDvjIL?h2MMr`ZFk^+P(hGd`nO=ef3Y+9=FxVkl^>VB#=SngDrReM2rt(i1Iss zz7MJe?PRV~lR{3%h=g`s@HX0FZz>pW%i?BYbd%?6?uXGj5_4N_C-OFM$Pz=drpkEL z(-$%WS_X>MAq_EaZax*NECa{xC|e0WSp1BS`fw0ivb>b!-yvXoM*tv=)$oQY9P&)z zbD}m7)Lsq>_lmxuSM(QT=vQjoXg*)OXD$pNh;g1B`^+sKK^>1@XW8H~wj1q^!r?DZCdv}8Kvw6hDA_i;B< z1*D=!^izeu-;=Zii0(wDn*_XqOr?A{IOj9^4x`l_j`%4G(p18Q*XyC+mt~1|(E5Oz z_2tQ4kJ~oBQO-#z)EMaT;^i}ll3-Gs4K&QP#!7PMY7}2gLsUkrd+!mWSB}-{>YxY3 zP5NBrKuZ}l;8_-D+A}&En+P}*%TxwNDIe31>A9TFg z0TI+c`;E5fX!92&;=^m9H&31Ga7FwCRzl=#5bs`} z+P0US)j<|FK+AWY!c?wA;s9cPrnNnj*4)~Bq|fwq`H&zPs}LbK&(N~X;xrfaV-Mts zr#*9#?LL{sSrh`DvMWXeMGM%Yp?*oT%0Jt7q>p`n>prymnn@5G69ak4gwQVek}vEN z$H7CE%zEoSZS!5neqLla5O;{_BAvPCf{VC0gj zOmZ}KQ<0LzIGZz+<2Rr{WkOzfs0-Q?K3#o;3tRSmJ)@SlP{E^${rGUR?dijl0pEVS zDU))apfalN;;?EchXCFq%>p#MEPbyV6AQC4)n6pNz81R<3QwJ!uMsMOnRKf$(_9m> zTNVnl?(C<&LRx6W?fczaSuG^`M7NFU;3zJt3_bsVtu0m1$|yZly9dmbk#5xG>Sj8< zO~3rP1=n>0E3AN?p&T^@TWi13O}`;Agid@klf23B!p~HSs(UIf+FWW&1%B;cylD029RPi7`{~X%v|nb(&ijiBYIG8dj2rSYU{JXZvI*DNB)pe z1+`ttXZ*wAjg7)ck!=jS!Ur&&!bLHxZrdY@Tl6}OhRX9DZM;kz;!)$7=!ZG(l_&y^ zjy9#EwN1;D19U86N9CkOSx(~Tja(Z2&vsxz<|Eb&l!e4}>Jt7IcxKE`sd0aBq~DC4e-De+pi=G%h|HYp=Wde+Xdz1LXe)bU$OJ5f&CEuj!6bW>yLI!iw8Y z4rWf4o*wTS5e@wl@R#KJE5t8Fxx0L|YV_#(BFSPoHl$3E(jMycL6Z1_SJ!o7Daf0N zM*qj>e-Uy2Z2f;%8TM)c4T@(t$P<sQ1K`{A9ooGU>H@e3wa!7DF?&7~754%z z{V^lsH$a;O==+5+*>bsV+@6-ZWU4(@)jGh+JnVn?vmlwVe&CVG{;Vv@xNNoE7D$tD zOw=u)x6Jj+f)ffL#x*G~$_}|QEM*&@l?jGxyZ&_-2zTP|XZW~~Q*W;T1@3|*2u;00 z=6iQ@GuVS_ST*+)O&?So{i5C(AycLc&|lwKB6}!gkX#VV_WBaKz**8LvMDXd_m3dp zHZ2cRi-Vy(>v-4C(5AdkX3D0-%0H+SN#A3q~XJ#QR>}*RZ~vmnr9lgu|tn=9f01r5->}~$ZB9h)vO8&x+cJD8>raG zlzuxj;fEa`;d>l}spHb!ot5bbja!%S;HTGaN?b}tSF)+QF zt;yPUmg{Jg>hf;g%#?Jg{4@3d*v<5@gBgRnvXL=Y-4wWDWJ$8d<4=V&4*3XjQ+t<} zmdfu#Z!uD6w=oL*iH6W$^M#v}mD6WI^X1#riqs)GH7{9cEqopSI`BnEmU&Ik+$h6n zJ8uGj7Mp~7l_zIyFy?2rdmV9I6Ym^$W4>;ve|RWHAQ!0$&(&|RqtcPeTTbv#T2PzG z5cZdzZ1r*5%499{7tCC}o%%*_kYSzP( z_V%XjP}ZG@0lMy2{mp7f3oaAhVRy+(>0WMK940^m{O5xA{ioBAE4Yw6IqYEmXQ!Dg zGI)FU3Hi|CND?LRs`NRa%8#u#D+%R)HUL&uuO&zB1m!f%mr<0Zy^o+SXh(cCx*KxOh2noqH7qmzHOmm0j|oK{mWvCkYun?JEBjAO zUZ$Qkt47wV!?nVB7Oq_~I82Scvcm7Ur>Vq6Yvvb`rwuWJBJ)*@m>Y&Ph1*#_Lxku= zOK-6N_)8w-2HkaLM+Bl?aX;(aULP^Y}3t#iPI8%RUO-oKBf_CwyX-L+ddjO;Hbh*;RW*yAa;PNKBWOIuAy+8;8Fbu+|yHn<1U0yPiDk6|pv3 z^~Vh#hRD#A{fTG&UHtv~)aHMU4FC7}Qfn{huhrFy3T8Pbo~C|cw%*3Un@$Y7f)13# zsi6CVKPlz4mw%GTarYvEp7$0YpVKc#tc`wDs-9s(x;S*ZJPCFtIQ9xTxavcnGZjhy z4`PP@HQX>jULLG0NA7_dO?G!uzCEo=PlhcqyX*?a;-_m5H+_&^t5NTaT@G8&wVpK~ zH9x|m0M=uXcf;c{%fx*jyiT<(A74y5Rbk4;b>$$Rwe0l{)$0?+`CZK1#i8k;M^(!z zN_cC|V>WU_z$RL`vv?m!+MK9S@J}LLAr!}Y{uNF13N0%awf9pF-9RFWJd=ukmk)nEIOv91K44qo=rCCy-DoLTM*%XPri#`~( z=`3+4{}FlhMbBv)2CkZ-@D)ecJQmI8#w*B`n$#?FMtRdkU#>-shCm|yJD9wW!i(GK zn-)rbesv6I3`b6k+87_KPR}p)6J8fa1S!gSMdy9SF9`~M6?NJ4-7UA)@PeLi^S&tS z*O}$EPuqZ2XQ$l$K_`w~O7t?mn=cicmdp?EQu{RM3k9BdnRlQC^iO))c5r&sM)n}2 zK$8!?d^{$$uW&obH`%(8@|t)*H+0ndPaRiYPZI)h_K`=sDqNE+_!DSELA9RRuw}T; z5!<%xxB?t*Ica}h5+2t)x*Lb5xGD*H-7u)?3t!`eE z3mNxg2h?2xEN8h9EUklogXB@1Sl4tbh->{jUGw7bgepeBv*fc1p=&#O{tqhGV z{-s?Y+`0iV+Nn&ec89eQp0XKXi$??rD~xwyd=8C)`BG%#+=EO8ingU-&Qy4e3#m(8 z(#f%O*E*W_62LXJ2GSEI&0*FZQqn6D-6fW)&b0-WB|bC*|9X8xXD7IDw&q(6AGOiQ zq34`0jC_t;16)TLTYlu{AjffP*`k5Fh7r`2Q|I~# zPQUe8zZ|T{#6Ntd+=fFCJj~`$g+sz$;eNOoF+XPQ&cVa=#cEvS^_V}>}a#CirnhNFhw|ow}OW0Tf z+*RSfedZ}oO?UqV%$&#gUc20G=>yOy0MZe$6vf!YvD39nX0+ z+|Ew>_li_p_wDJJw8KUKLk}N%Utg#8Nope6ClmM&lqec&{%XPE{)hqc#ol<9(;w@! zffeDAE$SOW`10o)^s}#(?XDyoTlO>A^{RW*&M!~*h#-ymhN1tCf!zIa0&#P8B7S;l`Xn|hD~-Zt9mP&n}05-e9Z+?636E}5yB z+1BkRdKY(+>JHzfX`&UpkJcC~hd4rfKkppZUTG@lfLmv$>kU2Nq(eepod-PG%%y(v z=stan#lsoGt#c0k+L5mre;0G%x@xkfH0w4H&IYp9RNcZY0h9I}iwdwMm@9}-ccg~n zK?J4O9ilS9bW<9~gP(u<1h_9KGz>qhKk(y--T_4O!ydje?f6@G9_I#6%`?-yT$c%Q zrJ@ADHjRS)ZC)PAUm2U{0tBw^z_lA1P#RprNXlU551^fQ#K&b zW*U=~$(~M(L7>2ZyGn|vDEej1N(E->#=D#`+Pl-*gPB`s_T5=m zidlg+Q!814!YfE{rvA}{?omaQ={_D2bQjitC4$=Y)zej9_|lP#XXx=JR|rw4K=eLl zilU4v=smBK3P20u5kc!=+?S2^m0tn@HCk;kOf{CrRc$`!l9*^-?&GP*KAD(LAvBU> z77yq}WSkwK+&Ezc8@CIw^e5dW#Q01ckC#4V;|uL(MbAb-Hnz;*JPLQjVB7l9k3i%$ zxT!7E`DrxuVpsk4w&Dcmt%x9@qi(IkK6OgBsa?wHAL^efBoL=VLw>N6lW9Ynlg6?% z5u3k)oBJPIKr!wSv4OJkf@%hnn(#$fTb=7d40A+~Lj0ucC)XU(w#Y2cx#NMV{=m?C-1WP literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/second-view.png b/docs/srcs/thymeleaf/second-view.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf0480f4f2de462656782c6a00dd1a6c830fa73 GIT binary patch literal 9090 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 FKLC`GFQNbd literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/third-view-success.png b/docs/srcs/thymeleaf/third-view-success.png new file mode 100644 index 0000000000000000000000000000000000000000..0aaa4a6a3cdfe37df4b9314aa8b78b35d0cf7967 GIT binary patch literal 5944 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 BJYN6+ literal 0 HcmV?d00001 diff --git a/docs/srcs/thymeleaf/users-page.png b/docs/srcs/thymeleaf/users-page.png new file mode 100644 index 0000000000000000000000000000000000000000..70a6a767f02c76ee97a6ef4408cf02a93d9d1d51 GIT binary patch literal 13978 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 Date: Tue, 21 May 2024 00:28:44 +0300 Subject: [PATCH 21/40] [Master] Merged springsecurity --- docs/en/springsecurity/lab-work.md | 61 ++++++ .../practice/add-dummy-users.md | 64 ++++++ .../authorize-client-authenticated.md | 0 .../practice/authorize-client-authority.md | 0 .../practice/authorize-client-role.md | 0 .../authorize-server-authenticated.md | 38 ++++ .../practice/authorize-server-authority.md | 39 ++++ .../practice/authorize-server-role.md | 39 ++++ .../practice/base-implementation-user.md | 184 ++++++++++++++++++ .../practice/configure-spring-security.md | 80 ++++++++ .../practice/configure-thymeleaf-security.md | 30 +++ .../practice/create-identity-to-users.md | 61 ++++++ .../practice/custom-login-form.md | 40 ++++ .../practice/password-encryption.md | 81 ++++++++ .../practice/setup-server-authorization.md | 41 ++++ docs/en/springsecurity/tasks.md | 13 ++ 16 files changed, 771 insertions(+) create mode 100644 docs/en/springsecurity/lab-work.md create mode 100644 docs/en/springsecurity/practice/add-dummy-users.md create mode 100644 docs/en/springsecurity/practice/authorize-client-authenticated.md create mode 100644 docs/en/springsecurity/practice/authorize-client-authority.md create mode 100644 docs/en/springsecurity/practice/authorize-client-role.md create mode 100644 docs/en/springsecurity/practice/authorize-server-authenticated.md create mode 100644 docs/en/springsecurity/practice/authorize-server-authority.md create mode 100644 docs/en/springsecurity/practice/authorize-server-role.md create mode 100644 docs/en/springsecurity/practice/base-implementation-user.md create mode 100644 docs/en/springsecurity/practice/configure-spring-security.md create mode 100644 docs/en/springsecurity/practice/configure-thymeleaf-security.md create mode 100644 docs/en/springsecurity/practice/create-identity-to-users.md create mode 100644 docs/en/springsecurity/practice/custom-login-form.md create mode 100644 docs/en/springsecurity/practice/password-encryption.md create mode 100644 docs/en/springsecurity/practice/setup-server-authorization.md create mode 100644 docs/en/springsecurity/tasks.md diff --git a/docs/en/springsecurity/lab-work.md b/docs/en/springsecurity/lab-work.md new file mode 100644 index 0000000..245d193 --- /dev/null +++ b/docs/en/springsecurity/lab-work.md @@ -0,0 +1,61 @@ +# Spring Security Lab Work + +Welcome to the Spring Security Lab Work! The goal of this series of tasks is to help you practice and get know to Spring Security, and make an enough startup project. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of security integration in a Spring application. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in using security within a Spring environment. Spring Security is widely utilized for authentication, authorization and securing your project, and through these tasks, you will gain valuable insights into its configuration, authentication, authorization, and more. + +## Practice Tasks + +1. [Task 1: Configure Spring Security](practice/configure-spring-security.md) +2. [Task 2: Create a Base Implementation for User](practice/base-implementation-user.md) +3. [Task 3: Password Encryption](practice/password-encryption.md) +4. [Task 4: Add a Dummy Users](practice/add-dummy-users.md) +5. [Task 5: Create Identity to Users](practice/create-identity-to-users.md) +6. [Task 6: Create a Base for Authorization in Server](practice/setup-server-authorization.md) +7. [Task 7: Authorize Authenticated Users](practice/authorize-server-authenticated.md) +8. [Task 8: Authorize by Role](practice/authorize-server-role.md) +9. [Task 9: Authorize by Authority](practice/authorize-server-authority.md) +10. [Task 10: Configure Thymeleaf Security](practice/configure-thymeleaf-security.md) +11. [Task 11: Authorize Authenticated Users](practice/authorize-client-authenticated.md) +12. [Task 12: Authorize by Role](practice/authorize-client-role.md) +13. [Task 13: Authorize by Authority](practice/authorize-client-authority.md) +14. [Task 14: Custom Login Form](practice/custom-login-form.md) + +## Lab Work Tasks + +![img.png](../../srcs/springsecurity/task.png) + +### Task 1: Setup Spring Security +Initialize Spring Security in your project. + +### Task 2: Define User Roles and Authorities +Define different user roles (Manager, Teacher, Student) and their respective authorities. + +### Task 3: Configure Security in Controllers +Protect endpoints using role-based access control. + +#### Implementation Details +**Manager Role**: +- Add New Teacher (`/teachers/new`) +- Modify Teacher Profile (`/teachers/{id}/edit`) +- Modify Student Profile (`/students/{id}/edit`) +- Modify Student Marks (`/students/{id}/marks/edit`) + +**Teacher Role**: +- Modify Student Marks (`/students/{id}/marks/edit`) +- Add New Subject (`/subjects/new`) +- Add New Test (`/tests/new`) + +**Student Role**: +- Pass Test (`/tests/{id}/take`) +- Read Marks (`/students/{id}/marks`) + +### Task 4: Implement Authorization in Thymeleaf Templates + +Restrict access to UI elements based on user roles. + + +### Task 5: Test Role-Based Access Control +Ensure that endpoints and UI elements are correctly protected. diff --git a/docs/en/springsecurity/practice/add-dummy-users.md b/docs/en/springsecurity/practice/add-dummy-users.md new file mode 100644 index 0000000..5d8d81b --- /dev/null +++ b/docs/en/springsecurity/practice/add-dummy-users.md @@ -0,0 +1,64 @@ +# Add Dummy Users + +This task outlines the process of updating the `CustomUserDetailsService` class to include a method for adding dummy users to the in-memory storage to serving as a simple demonstration of user creation. + +## Goal + +Update the `CustomUserDetailsService` class to include a method for adding dummy users, allowing for the initialization of user data in the in-memory storage. + +## Steps + +1. **Update CustomUserDetailsService Class:** + + First, we need to update the `CustomUserDetailsService` class to include a method for adding dummy users. We'll leverage this method during bean initialization to populate the in-memory storage with dummy user data. + + ```java + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + private final PasswordEncoder passwordEncoder; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository, PasswordEncoder passwordEncoder) { + this.usersRepository = usersRepository; + this.passwordEncoder = passwordEncoder; + + // Call the addDummyUsers method to add dummy users during bean initialization + addDummyUsers(); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Retrieve user details from the repository + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + return userDetails; + } + + // Method to add dummy users + private void addDummyUsers() { + // Create dummy users + CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); + CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); + CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); + + // Add users to the repository + usersRepository.save(admin); + usersRepository.save(moderator); + usersRepository.save(user); + } + } + ``` + + In this updated class: + - We've added a constructor that accepts `UsersRepository` and `PasswordEncoder` as dependencies. + - During bean initialization, the constructor calls the `addDummyUsers` method to populate the in-memory storage with dummy users. + - The `addDummyUsers` method creates dummy users with hardcoded usernames and passwords. + - Finally, the dummy users are saved to the repository using the `save` method. + +--- + +# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-client-authenticated.md b/docs/en/springsecurity/practice/authorize-client-authenticated.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/springsecurity/practice/authorize-client-authority.md b/docs/en/springsecurity/practice/authorize-client-authority.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/springsecurity/practice/authorize-client-role.md b/docs/en/springsecurity/practice/authorize-client-role.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/springsecurity/practice/authorize-server-authenticated.md b/docs/en/springsecurity/practice/authorize-server-authenticated.md new file mode 100644 index 0000000..ef1e7a4 --- /dev/null +++ b/docs/en/springsecurity/practice/authorize-server-authenticated.md @@ -0,0 +1,38 @@ +# Authorize Authenticated User + +This task outlines the process of authorizing authenticated users in your application. By requiring authentication for specific paths or endpoints, you can ensure that only logged-in users can access certain resources. + +## Goal + +Authorize access to the `/second` path only for authenticated users while allowing public access to other paths. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify that access to the `/second` path should be restricted to authenticated users. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Other endpoints... + .requestMatchers("/second").authenticated() + // Other endpoints... + ); + } + } + ``` + + In this configuration: + - We use `.authorizeHttpRequests()` to define authorization rules. + - The `.requestMatchers("/second").authenticated()` statement specifies that access to the `/second` path should be restricted to authenticated users. + +--- + +# [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-server-authority.md b/docs/en/springsecurity/practice/authorize-server-authority.md new file mode 100644 index 0000000..d0abdeb --- /dev/null +++ b/docs/en/springsecurity/practice/authorize-server-authority.md @@ -0,0 +1,39 @@ +# Authorize by Authority + +This task outlines the process of authorizing users based on their authorities in your application. By assigning different authorities to users, you can control access to specific functionalities or actions. + +## Goal + +Authorize access to the `/addStudent` path for users with the `WRITE` authority and the `/removeStudent` path for users with the `DELETE` authority. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify authority-based access control for the `/addStudent` and `/removeStudent` paths. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Other Endpoints... + .requestMatchers("/addStudent").hasAuthority("WRITE") + .requestMatchers("/removeStudent").hasAuthority("DELETE") + // Other Endpoints... + ); + } + } + ``` + + In this configuration: + - The `.requestMatchers("/addStudent").hasAuthority("WRITE")` statement specifies that access to the `/addStudent` path should be restricted to users with the `WRITE` authority. + - Similarly, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` restricts access to the `/removeStudent` path to users with the `DELETE` authority. + +--- + +# [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-server-role.md b/docs/en/springsecurity/practice/authorize-server-role.md new file mode 100644 index 0000000..3b1ab77 --- /dev/null +++ b/docs/en/springsecurity/practice/authorize-server-role.md @@ -0,0 +1,39 @@ +# Authorize by Role + +This task outlines the process of authorizing users based on their roles in your application. By assigning different roles to users, you can control access to specific resources or functionalities. + +## Goal + +Authorize access to the `/third` path for users with the `ROLE_MODERATOR` role and the `/fourth` path for users with the `ROLE_ADMIN` role. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify role-based access control for the `/third` and `/fourth` paths. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Other Endpoints... + .requestMatchers("/third").hasAuthority("ROLE_MODERATOR") + .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN") + // Other Endpoints... + ); + } + } + ``` + + In this configuration: + - The `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` statement specifies that access to the `/third` path should be restricted to users with the `ROLE_MODERATOR` authority. + - Similarly, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` restricts access to the `/fourth` path to users with the `ROLE_ADMIN` authority. + +--- + +# [NEXT TASK: Authorize by Authority](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/base-implementation-user.md b/docs/en/springsecurity/practice/base-implementation-user.md new file mode 100644 index 0000000..c77596f --- /dev/null +++ b/docs/en/springsecurity/practice/base-implementation-user.md @@ -0,0 +1,184 @@ +# Create Base Implementation for User + +In this task, we will focus on creating a base implementation for managing users in your application. This includes defining the UserDetails entity, creating a repository to manage user data, and implementing a UserDetailsService to load user details during authentication. + +## Goal + +The goal of this task is to establish a solid foundation for managing users within your application. By implementing UserDetails, UsersRepository, and UserDetailsService, you will be able to authenticate users, manage their details, and perform user-related operations efficiently. + +## Steps + +1. **Define UserDetails Entity** + + Start by defining a UserDetails entity that represents the user details in your application. This entity should implement the UserDetails interface provided by Spring Security. + + ```java + package edu.labs.yourproject.model; + + import org.springframework.security.core.GrantedAuthority; + import org.springframework.security.core.userdetails.UserDetails; + + import java.util.Collection; + + public class CustomUserDetails implements UserDetails { + + // Implement UserDetails methods here + + } + ``` + + Implement the methods required by the UserDetails interface to provide user details such as username, password, authorities, etc. + +2. **Create UsersRepository Class** + + Since we are using in-memory storage for now, we'll create a simple UsersRepository class to manage user data. + + a. **Create UsersRepository Class** + + Create a new Java class named `UsersRepository` inside the `edu.labs.yourproject.repository` package. + + ```java + package edu.labs.yourproject.repository; + + import org.springframework.stereotype.Repository; + import edu.labs.yourproject.model.CustomUserDetails; + + @Repository + public class UsersRepository { + + private List users = new ArrayList<>(); + + // Add methods for managing users as needed + } + ``` + + This class will serve as the repository for managing user data. We'll add methods to retrieve, add, update, and delete users in subsequent steps. + + b. **Add findByUsername Method** + + Add a method named `findByUsername` to the `UsersRepository` class. This method will retrieve user details by username from the repository. + + ```java + public CustomUserDetails findByUsername(String username) { + for (CustomUserDetails user : users) { + if (user.getUsername().equals(username)) { + return user; + } + } + return null; // User not found + } + ``` + + The `findByUsername` method is used to retrieve user details by username from the repository. In this placeholder implementation, it returns `null`, but you'll replace it with the actual logic to fetch user details from the database or any other data source. + +3. **Implement UserDetailsService** + + In this step, we will implement a UserDetailsService to load user details during authentication. This service will retrieve user information from the UsersRepository. + + a. **Create CustomUserDetailsService Class** + + Start by creating a new class named `CustomUserDetailsService` within your project's service package. This class will implement the UserDetailsService interface provided by Spring Security. + + ```java + package edu.labs.yourproject.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.core.userdetails.UserDetails; + import org.springframework.security.core.userdetails.UserDetailsService; + import org.springframework.security.core.userdetails.UsernameNotFoundException; + import org.springframework.stereotype.Service; + import com.yourcompany.yourproject.model.CustomUserDetails; + import com.yourcompany.yourproject.repository.UsersRepository; + + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + + // Implement methods here + } + ``` + + We create the `CustomUserDetailsService` class and autowire the `UsersRepository` dependency using constructor injection. + + b. **Override loadUserByUsername Method** + + Override the `loadUserByUsername` method defined in the UserDetailsService interface. This method will retrieve user details from the UsersRepository based on the provided username. + + ```java + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Retrieve user details from the in-memory repository + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + return userDetails; + } + ``` + + Inside the `loadUserByUsername` method, we call the `findByUsername` method of the UsersRepository to retrieve user details by username. If the user is not found, we throw a UsernameNotFoundException. + +4. **Configure Beans in WebSecurityConfig** + + Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define beans for CustomUserDetails and UserDetailsRepository. + + ```java + package edu.labs.yourproject.config; + + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UserDetailsRepository; + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + + @Configuration + @EnableWebSecurity + public class WebSecurityConfig { + + // The rest of code is here... + + @Bean + public CustomUserDetailsService customUserDetailsService() { + // Instantiate and configure CustomUserDetails bean + return new CustomUserDetailsService(); + } + + @Bean + public UserDetailsRepository userDetailsRepository() { + // Instantiate and configure UserDetailsRepository bean + return new UserDetailsRepository(); + } + } + ``` + + Define two bean methods: `CustomUserDetailsService()` and `userDetailsRepository()`. These methods instantiate and configure CustomUserDetailsService and UserDetailsRepository beans, respectively. + +## Folder Structure + +Your project's folder structure should resemble the following: + +``` +src +└── main + └── java + └── edu + └── labs + └── yourproject + ├── model + │ └── CustomUserDetails.java + ├── repository + │ └── UsersRepository.java + └── service + └── CustomUserDetailsService.java +``` + +This folder structure indicates where to create the `CustomUserDetailsService` class and the `UsersRepository` interface within your project. Organizing your classes in this manner helps maintain a clear and structured codebase. + +--- + +# [NEXT TASK: Password Encryption](password-encryption.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/configure-spring-security.md b/docs/en/springsecurity/practice/configure-spring-security.md new file mode 100644 index 0000000..c6bcf19 --- /dev/null +++ b/docs/en/springsecurity/practice/configure-spring-security.md @@ -0,0 +1,80 @@ +# Configure Spring Security + +In this task, we will focus on configuring Spring Security in your project. Spring Security provides comprehensive security features for Java applications, including authentication, authorization, and protection against common security threats. + +## Goal + +The goal of this task is to integrate Spring Security into your existing project, ensuring that your application is secure and protected against unauthorized access. + +## Steps + +1. **Add Spring Security Dependency** + + - For Maven Projects: + + Add the following dependency to your project's `pom.xml` file: + + ```xml + + org.springframework.boot + spring-boot-starter-security + + ``` + + - For Gradle Projects: + + Add the following dependency to your project's `build.gradle` file: + + ```groovy + implementation 'org.springframework.boot:spring-boot-starter-security' + ``` + + Ensure that you include the appropriate version of Spring Security for your project. + +2. **Create Security Configuration Class** + + Create a new Java class named `WebSecurityConfig` within your project's source folder structure. Typically, this class resides in the `config` package. The file should be named `WebSecurityConfig.java`. + + Your project's folder structure should resemble the following: + + ``` + src + └── main + └── java + └── edu + └── labs + └── yourproject + ├── config + │ └── WebMvcConfig.java + │ └── WebSecurityConfig.java + └── controller + └── PracticeController.java + ``` + +3. **Configure Security Configuration Class** + + Inside the `WebSecurityConfig` class, annotate it with `@Configuration` and `@EnableWebSecurity` to indicate that it is a configuration class for Spring Security. also will annotate `configure` method with `@Bean` + + ```java + package edu.labs.yourproject.config; + + import org.springframework.context.annotation.Configuration; + import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; + import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + + @Configuration + @EnableWebSecurity + public class WebSecurityConfig { + + @Bean + public SecurityFilterChain configure(HttpSecurity http) throws Exception { + http + // Security configuration here + return http.build(); + } + } + ``` + +--- + +# [Next Task: Create a Base Implementation for User](base-implementation-user.md) diff --git a/docs/en/springsecurity/practice/configure-thymeleaf-security.md b/docs/en/springsecurity/practice/configure-thymeleaf-security.md new file mode 100644 index 0000000..2f87ae3 --- /dev/null +++ b/docs/en/springsecurity/practice/configure-thymeleaf-security.md @@ -0,0 +1,30 @@ +# Configure Thymeleaf with Spring Security + +## Goal +The goal of this task is to integrate Thymeleaf with Spring Security, enabling the use of additional Thymeleaf dialects and utilities provided by the `thymeleaf-extras-springsecurity6` library. + +## Steps + +1. **Gradle (Groovy):** + + Add the `thymeleaf-extras-springsecurity6` dependency to your `build.gradle` file: + + ```groovy + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE' + ``` + +2. **Maven:** + + Add the following dependency to your `pom.xml` file: + + ```xml + + org.thymeleaf.extras + thymeleaf-extras-springsecurity6 + 3.0.4.RELEASE + + ``` + +--- + +[NEXT TASK:]() diff --git a/docs/en/springsecurity/practice/create-identity-to-users.md b/docs/en/springsecurity/practice/create-identity-to-users.md new file mode 100644 index 0000000..c839716 --- /dev/null +++ b/docs/en/springsecurity/practice/create-identity-to-users.md @@ -0,0 +1,61 @@ +# Create Identity for Users + +This task outlines the process of adding authorities and roles to the users created in the previous step, "Add Dummy Users." By assigning roles and authorities to users, we establish their identity within the application and control their access to various resources and functionalities. + +## Goal + +Enhance the user profiles created in the previous step by assigning roles and authorities, thereby defining their identities and access permissions within the application. + +## Steps + +1. **Update User Profiles with Roles and Authorities:** + + We'll update the dummy user profiles created in the `CustomUserDetailsService` class to include roles and authorities. This involves assigning specific roles to each user, such as `ADMIN`, `MODERATOR`, or `USER`, and granting corresponding authorities based on their roles. + + ```java + // Inside addDummyUsers() method + + // Define roles + String adminRole = "ROLE_ADMIN"; + String moderatorRole = "ROLE_MODERATOR"; + String userRole = "ROLE_USER"; + + // Define authorities + List adminAuthorities = Arrays.asList( + new SimpleGrantedAuthority(adminRole), + new SimpleGrantedAuthority("READ"), + new SimpleGrantedAuthority("WRITE") + ); + + List moderatorAuthorities = Arrays.asList( + new SimpleGrantedAuthority(moderatorRole), + new SimpleGrantedAuthority("READ") + ); + + List userAuthorities = Collections.singletonList( + new SimpleGrantedAuthority(userRole) + ); + + // Create dummy users with roles and authorities + CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); + admin.setAuthorities(adminAuthorities); + admin.setRole(adminRole); + + CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); + moderator.setAuthorities(moderatorAuthorities); + moderator.setRole(moderatorRole); + + CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); + user.setAuthorities(userAuthorities); + user.setRole(userRole); + ``` + + In this updated code: + - We define roles and authorities as variables for clarity and ease of maintenance. + - Each user profile now includes a list of authorities based on their assigned roles. + - Authorities are represented as `SimpleGrantedAuthority` objects and added to the user profiles accordingly. + - Additionally, we set the role for each user to enable role-based access control in subsequent steps. + +--- + +# [NEXT TASK: Create a Base for Authorization in Server](setup-server-authorization.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/custom-login-form.md b/docs/en/springsecurity/practice/custom-login-form.md new file mode 100644 index 0000000..720cec9 --- /dev/null +++ b/docs/en/springsecurity/practice/custom-login-form.md @@ -0,0 +1,40 @@ +# Custom Login Form + +This task guides you through the process of enabling a custom login form for authentication using Spring Security. By implementing a custom login form, users can securely authenticate into your application. + +## Goal + +Activate the custom login form page that has already been created in specific path. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify the custom login page. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Add other authorization configurations here + ) + .formLogin((login) -> login + .loginPage("/custom-login-page") // Specify the custom login page URL + // Add other form login configurations here + ); + } + } + ``` + + In this configuration: + - The `.loginPage("/custom-login-page")` statement specifies the URL of the custom login page. + - You can add additional configurations to customize the form login behavior, such as setting login success or failure URLs, defining form field names, etc. + +--- + +# [TASKS](../lab-work.md) diff --git a/docs/en/springsecurity/practice/password-encryption.md b/docs/en/springsecurity/practice/password-encryption.md new file mode 100644 index 0000000..2cd1a21 --- /dev/null +++ b/docs/en/springsecurity/practice/password-encryption.md @@ -0,0 +1,81 @@ +# Password Encryption + +In this task, we will configure password encryption for user authentication in a Spring Security-enabled application. Encrypting passwords enhances security by storing them securely in the database. + +## Goal + +The goal of this setup is to configure password encryption using the BCryptPasswordEncoder provided by Spring Security. This ensures that passwords are securely hashed before being stored in the database. + +## Steps + +1. **Add BCryptPasswordEncoder Bean** + + Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define a bean for BCryptPasswordEncoder. + + ```java + package edu.labs.yourproject.config; + + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + @Configuration + public class WebSecurityConfig { + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + // Instantiate and configure BCryptPasswordEncoder bean + return new BCryptPasswordEncoder(); + } + } + ``` + + Define a bean method `passwordEncoder()` that instantiates and configures a BCryptPasswordEncoder bean. This bean will be used to encode passwords before storing them in the database. + +2. **Encrypt Passwords** + + a. **Update CustomUserDetailsService Class** + + Open the CustomUserDetailsService class located in your project's service package (`edu.labs.yourproject.service`). Inject the BCryptPasswordEncoder bean into this class. + + ```java + package edu.labs.yourproject.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + import org.springframework.stereotype.Service; + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UsersRepository; + + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + } + ``` + + b. **Implement Registration Method** + + Define a method in the CustomUserDetailsService class to handle user registration. In this method, encrypt the user's password before saving it to the database. + + ```java + public void registerUser(CustomUserDetails user) { + // Encrypt password before saving user + String encodedPassword = passwordEncoder.encode(user.getPassword()); + user.setPassword(encodedPassword); + usersRepository.save(user); + } + ``` + + This method takes a CustomUserDetails object representing the user to be registered. It encrypts the user's password using the BCryptPasswordEncoder bean and then saves the user to the database. + +--- +# [NEXT TASK: Add a Dummy Users](add-dummy-users.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/setup-server-authorization.md b/docs/en/springsecurity/practice/setup-server-authorization.md new file mode 100644 index 0000000..68cd220 --- /dev/null +++ b/docs/en/springsecurity/practice/setup-server-authorization.md @@ -0,0 +1,41 @@ +# Setup Server Authorization + +This task you through setting up authorization in your application by configuring security rules using Spring Security. By defining authorization rules, you can control access to specific paths and endpoints within your application. + +## Goal + +Configure authorization rules to restrict or allow access to various paths and endpoints in the application. + +## Steps + +1. **Add Security Configuration:** + + In the `WebSecurityConfig` class, add the `configure(HttpSecurity http)` method to define security rules for the application. We'll use the paths and endpoints defined in the previous lab work. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + .requestMatchers("/first").permitAll() + .requestMatchers("/second").permitAll() + .requestMatchers("/third").permitAll() + .requestMatchers("/fourth").permitAll() + .requestMatchers("/addStudent").permitAll() + .requestMatchers("/removeStudent").permitAll() + ); + } + } + ``` + + In this configuration: + - We use `.authorizeHttpRequests()` to define authorization rules. + - Inside the lambda expression, we specify which requests should be permitted. + +--- + +# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file diff --git a/docs/en/springsecurity/tasks.md b/docs/en/springsecurity/tasks.md new file mode 100644 index 0000000..52f7231 --- /dev/null +++ b/docs/en/springsecurity/tasks.md @@ -0,0 +1,13 @@ +- Setup and Configuration +- base implementation to user +- password hashing algorithms +- add dummy users ( password hashing) +- create identity to users +- + +## TASKS +- create allowed paths +- create authenticated paths ( form-based ) +- create admin page ( role based ) +- hide and show content in depends on authorities and role. +- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file From d141416603f391568f91bd9fcfad31705fc25b89 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 21 May 2024 00:30:03 +0300 Subject: [PATCH 22/40] [Master] Merged jpa --- docs/en/jpa/lab-work.md | 55 ++++++ .../jpa/practice/creation/characteristics.md | 111 +++++++++++ .../en/jpa/practice/creation/create-entity.md | 60 ++++++ docs/en/jpa/practice/creation/fetching.md | 49 +++++ .../en/jpa/practice/creation/relationships.md | 44 +++++ docs/en/jpa/practice/dependencies/driver.md | 100 ++++++++++ docs/en/jpa/practice/dependencies/jpa.md | 57 ++++++ .../practice/interacting/jpa-repository.md | 54 +++++ .../interacting/jpa-repository/create.md | 38 ++++ .../interacting/jpa-repository/delete.md | 41 ++++ .../interacting/jpa-repository/query.md | 43 ++++ .../interacting/jpa-repository/read.md | 42 ++++ .../en/jpa/practice/interacting/repository.md | 51 +++++ .../practice/interacting/repository/create.md | 46 +++++ .../practice/interacting/repository/delete.md | 47 +++++ .../practice/interacting/repository/query.md | 49 +++++ .../practice/interacting/repository/read.md | 46 +++++ .../practice/interacting/repository/update.md | 46 +++++ docs/ru/jpa/lab-work.md | 54 +++++ .../jpa/practice/creation/characteristics.md | 109 ++++++++++ .../ru/jpa/practice/creation/create-entity.md | 60 ++++++ docs/ru/jpa/practice/creation/fetching.md | 45 +++++ .../ru/jpa/practice/creation/relationships.md | 44 +++++ docs/ru/jpa/practice/dependencies/driver.md | 100 ++++++++++ docs/ru/jpa/practice/dependencies/jpa.md | 57 ++++++ .../practice/interacting/jpa-repository.md | 52 +++++ .../interacting/jpa-repository/create.md | 38 ++++ .../interacting/jpa-repository/delete.md | 41 ++++ .../interacting/jpa-repository/query.md | 43 ++++ .../interacting/jpa-repository/read.md | 42 ++++ .../ru/jpa/practice/interacting/repository.md | 50 +++++ .../practice/interacting/repository/create.md | 46 +++++ .../practice/interacting/repository/delete.md | 47 +++++ .../practice/interacting/repository/query.md | 48 +++++ .../practice/interacting/repository/read.md | 46 +++++ .../practice/interacting/repository/update.md | 46 +++++ docs/ru/springsecurity/lab-work.md | 60 ++++++ .../practice/add-dummy-users.md | 68 +++++++ .../authorize-server-authenticated.md | 38 ++++ .../practice/authorize-server-authority.md | 39 ++++ .../practice/authorize-server-role.md | 39 ++++ .../practice/base-implementation-user.md | 186 ++++++++++++++++++ .../practice/configure-spring-security.md | 79 ++++++++ .../practice/configure-thymeleaf-security.md | 29 +++ .../practice/create-identity-to-users.md | 61 ++++++ .../practice/custom-login-form.md | 40 ++++ .../practice/password-encryption.md | 82 ++++++++ .../practice/setup-server-authorization.md | 45 +++++ docs/srcs/jpa/er-diagram.png | Bin 0 -> 89446 bytes docs/srcs/jpa/task-er-diagram.png | Bin 0 -> 120020 bytes docs/srcs/springsecurity/task.png | Bin 0 -> 359489 bytes 51 files changed, 2713 insertions(+) create mode 100644 docs/en/jpa/lab-work.md create mode 100644 docs/en/jpa/practice/creation/characteristics.md create mode 100644 docs/en/jpa/practice/creation/create-entity.md create mode 100644 docs/en/jpa/practice/creation/fetching.md create mode 100644 docs/en/jpa/practice/creation/relationships.md create mode 100644 docs/en/jpa/practice/dependencies/driver.md create mode 100644 docs/en/jpa/practice/dependencies/jpa.md create mode 100644 docs/en/jpa/practice/interacting/jpa-repository.md create mode 100644 docs/en/jpa/practice/interacting/jpa-repository/create.md create mode 100644 docs/en/jpa/practice/interacting/jpa-repository/delete.md create mode 100644 docs/en/jpa/practice/interacting/jpa-repository/query.md create mode 100644 docs/en/jpa/practice/interacting/jpa-repository/read.md create mode 100644 docs/en/jpa/practice/interacting/repository.md create mode 100644 docs/en/jpa/practice/interacting/repository/create.md create mode 100644 docs/en/jpa/practice/interacting/repository/delete.md create mode 100644 docs/en/jpa/practice/interacting/repository/query.md create mode 100644 docs/en/jpa/practice/interacting/repository/read.md create mode 100644 docs/en/jpa/practice/interacting/repository/update.md create mode 100644 docs/ru/jpa/lab-work.md create mode 100644 docs/ru/jpa/practice/creation/characteristics.md create mode 100644 docs/ru/jpa/practice/creation/create-entity.md create mode 100644 docs/ru/jpa/practice/creation/fetching.md create mode 100644 docs/ru/jpa/practice/creation/relationships.md create mode 100644 docs/ru/jpa/practice/dependencies/driver.md create mode 100644 docs/ru/jpa/practice/dependencies/jpa.md create mode 100644 docs/ru/jpa/practice/interacting/jpa-repository.md create mode 100644 docs/ru/jpa/practice/interacting/jpa-repository/create.md create mode 100644 docs/ru/jpa/practice/interacting/jpa-repository/delete.md create mode 100644 docs/ru/jpa/practice/interacting/jpa-repository/query.md create mode 100644 docs/ru/jpa/practice/interacting/jpa-repository/read.md create mode 100644 docs/ru/jpa/practice/interacting/repository.md create mode 100644 docs/ru/jpa/practice/interacting/repository/create.md create mode 100644 docs/ru/jpa/practice/interacting/repository/delete.md create mode 100644 docs/ru/jpa/practice/interacting/repository/query.md create mode 100644 docs/ru/jpa/practice/interacting/repository/read.md create mode 100644 docs/ru/jpa/practice/interacting/repository/update.md create mode 100644 docs/ru/springsecurity/lab-work.md create mode 100644 docs/ru/springsecurity/practice/add-dummy-users.md create mode 100644 docs/ru/springsecurity/practice/authorize-server-authenticated.md create mode 100644 docs/ru/springsecurity/practice/authorize-server-authority.md create mode 100644 docs/ru/springsecurity/practice/authorize-server-role.md create mode 100644 docs/ru/springsecurity/practice/base-implementation-user.md create mode 100644 docs/ru/springsecurity/practice/configure-spring-security.md create mode 100644 docs/ru/springsecurity/practice/configure-thymeleaf-security.md create mode 100644 docs/ru/springsecurity/practice/create-identity-to-users.md create mode 100644 docs/ru/springsecurity/practice/custom-login-form.md create mode 100644 docs/ru/springsecurity/practice/password-encryption.md create mode 100644 docs/ru/springsecurity/practice/setup-server-authorization.md create mode 100644 docs/srcs/jpa/er-diagram.png create mode 100644 docs/srcs/jpa/task-er-diagram.png create mode 100644 docs/srcs/springsecurity/task.png diff --git a/docs/en/jpa/lab-work.md b/docs/en/jpa/lab-work.md new file mode 100644 index 0000000..c30081a --- /dev/null +++ b/docs/en/jpa/lab-work.md @@ -0,0 +1,55 @@ +# Lab Work: JPA (Java Persistence API) + +Welcome to the Spring Boot with JPA Lab Work! In this lab work, you will practice various tasks related to setting up a Spring Boot project with JPA (Java Persistence API). + +## Goal of the Lab Work + +The goal of this lab work is to provide hands-on experience with key concepts and tasks involved in working with Spring Boot and JPA. By completing the practice tasks, you will gain proficiency in setting up dependencies, defining entity characteristics, managing relationships between entities, and interacting with the database using JpaRepository. + +## Practice Tasks + +1. **Database Dependencies Setup** + - [Database Driver Setup](practice/dependencies/driver.md) + - [Spring Boot and JPA Dependencies](practice/dependencies/jpa.md) + +2. **Entity Creation, Characteristics, Relationships and Fetching Strategies** + - [Entity Creation](practice/creation/create-entity.md) + - [Entity Characteristics Definition](practice/creation/characteristics.md) + - [Managing Relationships](practice/creation/relationships.md) + - [Fetching Strategies](practice/creation/fetching.md) + +3. **Interacting with Custom Repository** + - [Create Record](practice/interacting/repository/create.md) + - [Read Record](practice/interacting/repository/read.md) + - [Update Record](practice/interacting/repository/update.md) + - [Delete Record](practice/interacting/repository/delete.md) + - [Custom Queries](practice/interacting/repository/query.md) + +4. **Interacting with JPA Repository** + - [Create Record](practice/interacting/jpa-repository/create.md) + - [Read Record](practice/interacting/jpa-repository/read.md) + - [Delete Record](practice/interacting/jpa-repository/delete.md) + - [Custom Queries](practice/interacting/jpa-repository/query.md) + + +## Lab Work Tasks + +1. Set up database dependencies for PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. + +2. Implement the next Entity-Relationships Diagram: +![img.png](../../srcs/jpa/task-er-diagram.png) + + 1. Define entity characteristics for Student, Enrollment, and Course entities based on the Entity Relationships diagram. + + 2. Create entity classes for Student, Enrollment, and Course according to the defined characteristics. + + 3. Implement fetching strategies for efficient data retrieval to optimize database interactions. + + 4. Manage relationships between entities such as Student, Enrollment, and Course by establishing appropriate associations and mappings. + + 5. Interact with the database by creating methods for CRUD operations using the Repository layer and EntityManager in at least two repositories. + + 6. Interact with the database by creating methods for CRUD operations using JpaRepository in at least two repositories. + + 7. Implement custom queries to perform advanced data retrieval and manipulation operations as required by the application's business logic. + diff --git a/docs/en/jpa/practice/creation/characteristics.md b/docs/en/jpa/practice/creation/characteristics.md new file mode 100644 index 0000000..0297f7a --- /dev/null +++ b/docs/en/jpa/practice/creation/characteristics.md @@ -0,0 +1,111 @@ +# Defining Entity Characteristics + +## Introduction + +This guide focuses on defining entity columns or characteristics in a Spring Boot project using JPA (Java Persistence API). + +## Goal +The goal of this guide is to provide clear instructions for defining the characteristics of entities in a Spring Boot project with JPA, utilizing annotations to enforce constraints and behaviors for each attribute. + + +## Entity Characteristics + +### Student Entity Characteristics: +- `id` (UUID): Primary key for the entity. +- `name` (String): Name of the student (must not be blank). +- `email` (String): Email address of the student (must be a valid email address). +- `major` (String): Major or field of study of the student (must not be blank). +- `year` (int): Year of study for the student (must not be null). +- `international` (boolean): Indicates if the student is international (must not be null). + +### Define `id` Attribute + +Add the `id` attribute to the `Student` class. This attribute will serve as the primary key for the entity. + +```java +@Id +@GeneratedValue(strategy = GenerationType.AUTO) +private UUID id; +``` + +- `@Id`: Indicates that this field is the primary key for the entity. +- `@GeneratedValue`: Specifies the strategy for generating primary key values automatically. + +### Define `name` Attribute + +Add the `name` attribute to the `Student` class. This attribute represents the name of the student and must not be blank. + +```java +@NotBlank +private String name; +``` + +- `@NotBlank`: Ensures that the value of `name` is not null and contains at least one non-whitespace character. + +### Define `email` Attribute + +Add the `email` attribute to the `Student` class. This attribute represents the email address of the student and must be a valid email address. + +```java +@NotBlank +@Email +private String email; +``` + +- `@Email`: Validates that the value of `email` is a valid email address. + +### Define `major` Attribute + +Add the `major` attribute to the `Student` class. This attribute represents the major or field of study of the student and must not be blank. + +```java +@NotBlank +private String major; +``` + +- `@NotBlank`: Ensures that the value of `major` is not null and contains at least one non-whitespace character. + +### Define `year` Attribute + +Add the `year` attribute to the `Student` class. This attribute represents the year of study for the student and must not be null. + +```java +@NotNull +private int year; +``` + +- `@NotNull`: Ensures that the value of `year` is not null. + +### Define `international` Attribute + +Add the `international` attribute to the `Student` class. This attribute indicates whether the student is international and must not be null. + +```java +@NotNull +private boolean international; +``` + +- `@NotNull`: Ensures that the value of `international` is not null. + + +You can repeat the previous steps to create entity characteristics for the `Course` and `Enrollment` entities, ensuring appropriate annotations are applied to each attribute. + +### Enrollment Entity Characteristics: + +- `id` (UUID): Primary key for the entity. +- `enrollmentDate` (Date): Date of enrollment. +- `grade` (int): Grade achieved in the course. + +### Course Entity Characteristics: + +- `id` (UUID): Primary key for the entity. +- `name` (String): Name of the course. +- `instructor` (String): Name of the course instructor. +- `schedule` (String): Schedule details of the course. +- `capacity` (int): Maximum capacity of the course. +- `online` (boolean): Indicates if the course is online. +- `startDate` (Date): Start date of the course. + +--- + +# [Next: Managing Relationships](relationships.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/creation/create-entity.md b/docs/en/jpa/practice/creation/create-entity.md new file mode 100644 index 0000000..851531f --- /dev/null +++ b/docs/en/jpa/practice/creation/create-entity.md @@ -0,0 +1,60 @@ +# Creating Entities + +## Introduction + +This guide focuses on creating entities in a Spring Boot project using JPA (Java Persistence API). It provides step-by-step instructions for setting up the folder structure and creating entity classes. + +## Goal + +The goal of this guide is to demonstrate how to create entity classes in a Spring Boot project, following best practices and utilizing JPA for data persistence. + +## Folder Structure + +To ensure a well-organized project, it's essential to establish a proper folder structure. Follow these guidelines: + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + └── entity/ + ├── Student.java + ├── Enrollment.java + └── Course.java + +``` + +In this structure: +- The `src/main/java` directory contains your Java source files. +- The `com/example/demo/entity` directory is where you'll create your entity classes. + +## Creating Entity Classes + +To create entity classes, follow these steps: + +1. Navigate to the `com/example/demo/entity` directory in your project. +2. Create a new Java class file for each entity. You can repeat the following steps for each entity (e.g., Student, Enrollment, Course). +3. Define your entity class with the `@Entity` annotation. + +### Example: + +```java +package com.example.demo.entity; + +import javax.persistence.Entity; + +@Entity +public class Student { + +} +``` + +The `@Entity` annotation indicates that this class is a JPA entity. + +Repeat the above steps to create `Enrollment` and `Course` entity classes. + +--- + +# [Next: Entity Characteristics Definition](characteristics.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/creation/fetching.md b/docs/en/jpa/practice/creation/fetching.md new file mode 100644 index 0000000..de11305 --- /dev/null +++ b/docs/en/jpa/practice/creation/fetching.md @@ -0,0 +1,49 @@ +Understood. Here's the revised document with the code combined with the scenario: + +--- + +# Fetching Strategies in Spring Boot with JPA: Understanding Lazy and Eager Loading + +## Introduction + +This guide explores the fetching strategies in a Spring Boot project with JPA (Java Persistence API). Specifically, we will delve into the concepts of Lazy and Eager loading and how they are applied in entity relationships. + +## Goal + +The goal of this guide is to provide a comprehensive understanding of fetching strategies in JPA. By the end of this guide, you will comprehend when to use Lazy and Eager loading and how to implement them in your application. + +## Fetching Strategies + +### Scenario + +In our entity relationships, we have a One-to-Many relationship between the `Student` entity and the `Enrollment` entity. Similarly, there is a One-to-Many relationship between the `Course` entity and the `Enrollment` entity. + +#### Student Entity + +In the `Student` entity, we have a One-to-Many relationship with the `Enrollment` entity. Each student can have multiple enrollments. + +To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "student"` in the `Student` entity. Here, we have a choice between Lazy and Eager loading strategies for fetching the associated enrollments. + +```java +@OneToMany(mappedBy = "student", fetch = FetchType.EAGER, cascade = CascadeType.ALL) +private List enrollments; +``` + +We opt for Eager loading (`FetchType.EAGER`) in this scenario. Since we typically expect to access all enrollments of a student together, Eager loading ensures that all enrollments are fetched immediately when loading the student. + +#### Course Entity + +Similarly, in the `Course` entity, we also have a One-to-Many relationship with the `Enrollment` entity. Each course can have multiple enrollments. + +To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "course"` in the `Course` entity. Here, we have another choice between Lazy and Eager loading strategies for fetching the associated enrollments. + +```java +@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL) +private List enrollments; +``` + +We opt for Lazy loading (`FetchType.LAZY`) in this scenario. Since we may not always need to access all enrollments of a course, Lazy loading ensures that enrollments are fetched only when explicitly requested. + +--- + +# [Next: Create Repository](../interacting/repository.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/creation/relationships.md b/docs/en/jpa/practice/creation/relationships.md new file mode 100644 index 0000000..e7cdd1b --- /dev/null +++ b/docs/en/jpa/practice/creation/relationships.md @@ -0,0 +1,44 @@ +# Defining Entity Relationships + +## Introduction + +This guide delves into understanding and implementing relationships between entities in a Spring Boot project using JPA (Java Persistence API). Specifically, we will explore the relationship between the `Enrollment` entity and its associated entities `Student` and `Course`. + +## Goal + +The goal of this guide is to provide clear instructions for defining and understanding entity relationships in a Spring Boot project with JPA. By the end of this guide, you will comprehend how to establish associations between entities and implement them in your application. + +## Entity Associations + +![img.png](../../../../srcs/jpa/er-diagram.png) +### Enrollment Entity Characteristics: + +- `id` (UUID): Primary key for the entity. +- `student` (Student): Student associated with the enrollment. +- `course` (Course): Course associated with the enrollment. +- `enrollmentDate` (Date): Date of enrollment. +- `grade` (int): Grade achieved in the course. + +#### Student Relationship + +The relationship between the `Enrollment` entity and the `Student` entity represents a scenario where a student enrolls in a course. This is a Many-to-One relationship, where many enrollments can be associated with one student. To establish this relationship, annotate the `student` attribute in the `Enrollment` entity with `@ManyToOne`. + +```java +@ManyToOne +@JoinColumn(name = "student_id") +private Student student; +``` + +#### Course Relationship + +Similarly, the relationship between the `Enrollment` entity and the `Course` entity signifies a scenario where a course is enrolled by multiple students. This is also a Many-to-One relationship, where many enrollments can be associated with one course. Annotate the `course` attribute in the `Enrollment` entity with `@ManyToOne`. + +```java +@ManyToOne +@JoinColumn(name = "course_id") +private Course course; +``` + +--- + +# [Next: Fetching Strategies](fetching.md) diff --git a/docs/en/jpa/practice/dependencies/driver.md b/docs/en/jpa/practice/dependencies/driver.md new file mode 100644 index 0000000..928b2ab --- /dev/null +++ b/docs/en/jpa/practice/dependencies/driver.md @@ -0,0 +1,100 @@ +# JPA: Setup Dependencies + +## Introduction + +This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include database drivers for various databases such as PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. By following this guide, you will configure all the required dependencies to establish connections with these databases in your Spring Boot application. + +## Goal +The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on database drivers for different databases. + +## Setup Dependencies + +### Database Drivers + +To connect to different databases in your Spring Boot application, include the appropriate database drivers. + +#### PostgreSQL + +**For Gradle:** +```groovy +implementation "org.postgresql:postgresql" +``` + +**For Maven:** +```xml + + org.postgresql + postgresql + INSERT_VERSION_HERE + +``` + +#### MySQL + +**For Gradle:** +```groovy +implementation "mysql:mysql-connector-java" +``` + +**For Maven:** +```xml + + mysql + mysql-connector-java + INSERT_VERSION_HERE + +``` + +#### Oracle Database Driver + +**For Gradle:** +```groovy +implementation 'com.oracle.database.jdbc:ojdbc8' +``` + +**For Maven:** +```xml + + com.oracle.database.jdbc + ojdbc8 + +``` + +#### MongoDB Driver (MongoDB Java Driver) + +**For Gradle:** +```groovy +implementation 'org.mongodb:mongodb-driver-sync:4.4.3' +``` + +**For Maven:** +```xml + + org.mongodb + mongodb-driver-sync + 4.4.3 + +``` + +#### Microsoft SQL Server JDBC Driver + +**For Gradle:** +```groovy +implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' +``` + +**For Maven:** +```xml + + com.microsoft.sqlserver + mssql-jdbc + 9.4.0.jre11 + +``` + +These dependencies facilitate database connectivity. + +--- + +# [Next: Spring Boot and JPA Dependencies](jpa.md) + diff --git a/docs/en/jpa/practice/dependencies/jpa.md b/docs/en/jpa/practice/dependencies/jpa.md new file mode 100644 index 0000000..ec67ad5 --- /dev/null +++ b/docs/en/jpa/practice/dependencies/jpa.md @@ -0,0 +1,57 @@ +# JPA: Setup Dependencies + +## Introduction + +This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. + +## Goal + +The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. + +## Setup Dependencies + +### Spring Boot Starter JDBC + +To enable JDBC support in your Spring Boot application: + +#### Gradle + +```groovy +implementation "org.springframework.boot:spring-boot-starter-jdbc" +``` + +#### Maven + +```xml + + org.springframework.boot + spring-boot-starter-jdbc + +``` + +This dependency provides auto-configuration for JDBC-based data access. + +### Spring Boot Starter Data JPA + +To include support for JPA (Java Persistence API) in your Spring Boot application: + +#### Gradle + +```groovy +implementation "org.springframework.boot:spring-boot-starter-data-jpa" +``` + +#### Maven + +```xml + + org.springframework.boot + spring-boot-starter-data-jpa + +``` + +This dependency simplifies the setup of JPA-based repositories and provides default configurations for Hibernate. + +--- + +# [Next: Entity Creation](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/jpa-repository.md b/docs/en/jpa/practice/interacting/jpa-repository.md new file mode 100644 index 0000000..e81961e --- /dev/null +++ b/docs/en/jpa/practice/interacting/jpa-repository.md @@ -0,0 +1,54 @@ +# Creating JpaRepository + +## Introduction + +This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API) using JpaRepository. + +## Goal + +The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository and service classes for the `Course` entity. + +## Folder Structure + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + ├── data/ + │ └── entities/ + │ ├── Student.java + │ ├── Enrollment.java + │ └── Course.java + └── repository/ + ├── StudentRepository.java + └── CourseRepository.java + +``` +## Repository Class + +### CourseRepository.java + +```java +package com.yourcompany.yourproject.repository; + +import com.yourcompany.yourproject.model.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CourseRepository extends JpaRepository { + // Add repository methods for course entity +} +``` + + +The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. + + +--- + +# [Next: Create Record](jpa-repository/create.md) + diff --git a/docs/en/jpa/practice/interacting/jpa-repository/create.md b/docs/en/jpa/practice/interacting/jpa-repository/create.md new file mode 100644 index 0000000..9bcf784 --- /dev/null +++ b/docs/en/jpa/practice/interacting/jpa-repository/create.md @@ -0,0 +1,38 @@ +# Creating Records in a Table Using JpaRepository + +## Introduction + +This guide demonstrates how to create records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of creating records in a table by implementing a method within the `CourseRepository` interface using JpaRepository. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.UUID; + +@Repository +public interface CourseRepository extends JpaRepository { + + Course save(Course course); +} +``` + +### Explanation + +The `save(Course course)` method provided by JpaRepository allows us to persist a new record in the `Course` table. + +By invoking this method and passing a `Course` object as a parameter, JpaRepository automatically handles the process of persisting the entity to the database. + +--- + +# [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/jpa-repository/delete.md b/docs/en/jpa/practice/interacting/jpa-repository/delete.md new file mode 100644 index 0000000..b24cfcf --- /dev/null +++ b/docs/en/jpa/practice/interacting/jpa-repository/delete.md @@ -0,0 +1,41 @@ +# Deleting Records from a Table Using JpaRepository + +## Introduction + +This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `CourseRepository` interface using JpaRepository. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.UUID; + +@Repository +public interface CourseRepository extends JpaRepository { + + void deleteById(UUID id); +} +``` + +## Explanation + +The `deleteById(UUID id)` method signature follows a convention recognized by JpaRepository for deleting records based on their unique identifier. + +- The `delete` keyword indicates that this method is used for deleting data. +- `ById` specifies the criteria for identifying the record to be deleted. In this case, we are targeting a record with a specific ID. + +By adhering to this naming convention, JpaRepository automatically generates the appropriate SQL query behind the scenes to delete the desired record from the database. This simplifies the development process by eliminating the need to write explicit SQL delete statements, allowing developers to focus on defining method signatures that reflect the intended data deletion operations. + +--- + +# [Next: Custom Query](query.md) diff --git a/docs/en/jpa/practice/interacting/jpa-repository/query.md b/docs/en/jpa/practice/interacting/jpa-repository/query.md new file mode 100644 index 0000000..0804429 --- /dev/null +++ b/docs/en/jpa/practice/interacting/jpa-repository/query.md @@ -0,0 +1,43 @@ +# Custom Query Using JpaRepository + +## Introduction + +This guide demonstrates how to implement custom query methods using the `@Query` annotation in the repository layer of a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of creating custom query methods in the repository interface to perform specific database operations tailored to application requirements. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + + @Query("SELECT c FROM Course c WHERE c.instructor = :instructor") + List findCoursesByInstructor(@Param("instructor") String instructor); +} +``` + +### Explanation + +The `@Query` annotation allows us to define custom JPQL (Java Persistence Query Language) queries directly within the repository interface. + +- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` is a JPQL query that selects all courses where the instructor matches the provided value. +- `@Param("instructor")` annotation binds the method parameter `instructor` to the named parameter `:instructor` in the JPQL query. + +By using `@Query`, we can create complex queries tailored to specific data retrieval needs, providing flexibility and control over the database operations. + +--- + +# [Next: Tasks](../../../lab-work.md) diff --git a/docs/en/jpa/practice/interacting/jpa-repository/read.md b/docs/en/jpa/practice/interacting/jpa-repository/read.md new file mode 100644 index 0000000..ce7a6b2 --- /dev/null +++ b/docs/en/jpa/practice/interacting/jpa-repository/read.md @@ -0,0 +1,42 @@ +# Reading Records from a Table Using JpaRepository + +## Introduction + +This guide demonstrates how to retrieve data from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of reading data from a table by implementing a method within the `CourseRepository` interface using JpaRepository. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + + List findCoursesByInstructor(String instructor); +} +``` + +### Explanation + +The `findCoursesByInstructor(String instructor)` method signature follows a specific naming convention recognized by Spring Data JPA. + +- The `find` keyword indicates that this method is used for retrieving data. +- `Courses` represents the entity type we want to retrieve. +- `ByInstructor` specifies the criteria for filtering the results. In this case, we are querying for courses based on the `instructor` attribute. + +By adhering to this naming convention, Spring Data JPA automatically generates the appropriate SQL query behind the scenes to fetch the required data from the database. This simplifies the development process by eliminating the need to write explicit SQL queries, allowing developers to focus on defining method signatures that reflect the desired data retrieval operations. + +--- + +# [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/repository.md b/docs/en/jpa/practice/interacting/repository.md new file mode 100644 index 0000000..42cd863 --- /dev/null +++ b/docs/en/jpa/practice/interacting/repository.md @@ -0,0 +1,51 @@ +# Creating Repository + +## Introduction + +This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository for the `Student` entity. + +## Folder Structure + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + ├── data/ + │ └── entites/ + │ ├── Student.java + │ ├── Enrollment.java + │ └── Course.java + └── repository/ + └── StudentRepository.java + +``` +## Repository Class + +### StudentRepository.java + +```java +package com.yourcompany.yourproject.repository; + +import com.yourcompany.yourproject.model.Student; +import org.springframework.stereotype.Repository; + +@Repository +public class StudentRepository { + // Add repository methods for student entity +} +``` + + +The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. + + +--- + +# [Next: Create Record](repository/create.md) diff --git a/docs/en/jpa/practice/interacting/repository/create.md b/docs/en/jpa/practice/interacting/repository/create.md new file mode 100644 index 0000000..34e92de --- /dev/null +++ b/docs/en/jpa/practice/interacting/repository/create.md @@ -0,0 +1,46 @@ +# Creating New Records in a Table Using Repository Layer + +## Introduction + +This guide illustrates how to create new records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to demonstrate the process of creating new records in a table by utilizing the repository layer. We will achieve this by implementing a method within the `StudentRepository` interface using the `EntityManager` instead of `JpaRepository`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public void saveStudent(Student student) { + entityManager.persist(student); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.persist(student)`: This line of code persists the new `Student` entity to the database. + +--- + +# [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/repository/delete.md b/docs/en/jpa/practice/interacting/repository/delete.md new file mode 100644 index 0000000..25fa2de --- /dev/null +++ b/docs/en/jpa/practice/interacting/repository/delete.md @@ -0,0 +1,47 @@ +# Deleting Records from a Table Using Repository Layer + +## Introduction + +This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public void deleteStudent(UUID id) { + Student studentToDelete = entityManager.find(Student.class, id); + entityManager.remove(studentToDelete); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.remove(studentToDelete)`: This line of code deletes the `Student` entity from the database. + +--- + +# [Next: Custom Query](query.md) diff --git a/docs/en/jpa/practice/interacting/repository/query.md b/docs/en/jpa/practice/interacting/repository/query.md new file mode 100644 index 0000000..d8c2129 --- /dev/null +++ b/docs/en/jpa/practice/interacting/repository/query.md @@ -0,0 +1,49 @@ +# Creating Custom Queries in a Table Using Repository Layer + +## Introduction + +This guide demonstrates how to create custom queries to fetch records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to illustrate the process of creating custom queries to fetch records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; +import java.util.List; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public List findStudentsByMajor(String major) { + return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class) + .setParameter("major", major) + .getResultList(); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.createQuery(...)`: This line of code creates a custom JPQL (Java Persistence Query Language) query to fetch records based on the provided criteria (`major` in this example). + +--- + +# [Next: Create JpaRepository](../jpa-repository.md) \ No newline at end of file diff --git a/docs/en/jpa/practice/interacting/repository/read.md b/docs/en/jpa/practice/interacting/repository/read.md new file mode 100644 index 0000000..cd32262 --- /dev/null +++ b/docs/en/jpa/practice/interacting/repository/read.md @@ -0,0 +1,46 @@ +# Reading Records from a Table Using Repository Layer + +## Introduction + +This guide demonstrates how to read records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to illustrate the process of reading records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public Student findStudentById(UUID id) { + return entityManager.find(Student.class, id); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.find(Student.class, id)`: This line of code retrieves the `Student` entity from the database based on the provided `id`. + +--- + +# [Next: Update Record](update.md) diff --git a/docs/en/jpa/practice/interacting/repository/update.md b/docs/en/jpa/practice/interacting/repository/update.md new file mode 100644 index 0000000..ba2b0bc --- /dev/null +++ b/docs/en/jpa/practice/interacting/repository/update.md @@ -0,0 +1,46 @@ +# Updating Records in a Table Using Repository Layer + +## Introduction + +This guide illustrates how to update records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to demonstrate the process of updating records in a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public Student updateStudent(Student student) { + return entityManager.merge(student); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.merge(student)`: This line of code updates the `Student` entity in the database. + +--- + +# [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/ru/jpa/lab-work.md b/docs/ru/jpa/lab-work.md new file mode 100644 index 0000000..49c1dfc --- /dev/null +++ b/docs/ru/jpa/lab-work.md @@ -0,0 +1,54 @@ +# Лабораторная работа: JPA (Java Persistence API) + +Добро пожаловать на лабораторную работу по Spring Boot с JPA! В этой лабораторной работе вы попрактикуетесь в различных задачах, связанных с настройкой проекта Spring Boot с JPA (Java Persistence API). + +## Цель лабораторной работы + +Цель этой лабораторной работы - предоставить практический опыт работы с основными концепциями и задачами, связанными с работой с Spring Boot и JPA. Завершив практические задачи, вы приобретете навыки настройки зависимостей, определения характеристик сущностей, управления отношениями между сущностями и взаимодействия с базой данных с использованием JpaRepository. + +## Задачи практики + +1. **Настройка зависимостей базы данных** + - [Настройка драйвера базы данных](practice/dependencies/driver.md) + - [Зависимости Spring Boot и JPA](practice/dependencies/jpa.md) + +2. **Создание сущностей, определение характеристик, отношений и стратегий извлечения данных** + - [Создание сущности](practice/creation/create-entity.md) + - [Определение характеристик сущности](practice/creation/characteristics.md) + - [Управление отношениями](practice/creation/relationships.md) + - [Стратегии извлечения](practice/creation/fetching.md) + +3. **Взаимодействие с пользовательским репозиторием** + - [Создание записи](practice/interacting/repository/create.md) + - [Чтение записи](practice/interacting/repository/read.md) + - [Обновление записи](practice/interacting/repository/update.md) + - [Удаление записи](practice/interacting/repository/delete.md) + - [Пользовательские запросы](practice/interacting/repository/query.md) + +4. **Взаимодействие с репозиторием JPA** + - [Создание записи](practice/interacting/jpa-repository/create.md) + - [Чтение записи](practice/interacting/jpa-repository/read.md) + - [Удаление записи](practice/interacting/jpa-repository/delete.md) + - [Пользовательские запросы](practice/interacting/jpa-repository/query.md) + + +## Задачи лабораторной работы + +1. Настройте зависимости базы данных для PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. + +2. Реализуйте следующую схему сущностей и отношений: + ![img.png](../../srcs/jpa/task-er-diagram.png) + + 1. Определите характеристики сущностей для сущностей Student, Enrollment и Course на основе диаграммы сущностей и отношений. + + 2. Создайте классы сущностей для Student, Enrollment и Course в соответствии с определенными характеристиками. + + 3. Реализуйте стратегии извлечения для эффективного извлечения данных для оптимизации взаимодействия с базой данных. + + 4. Управляйте отношениями между сущностями, такими как Student, Enrollment и Course, установив соответствующие ассоциации и отображения. + + 5. Взаимодействуйте с базой данных, создав методы для операций CRUD с использованием слоя Repository и EntityManager как минимум в двух репозиториях. + + 6. Взаимодействуйте с базой данных, создав методы для операций CRUD с использованием JpaRepository как минимум в двух репозиториях. + + 7. Реализуйте пользовательские запросы для выполнения расширенных операций извлечения и манипулирования данными, необходимых для бизнес-логики приложения. diff --git a/docs/ru/jpa/practice/creation/characteristics.md b/docs/ru/jpa/practice/creation/characteristics.md new file mode 100644 index 0000000..0410195 --- /dev/null +++ b/docs/ru/jpa/practice/creation/characteristics.md @@ -0,0 +1,109 @@ +# Определение Характеристик Сущностей + +## Введение + +Это руководство фокусируется на определении колонок или характеристик сущностей в проекте Spring Boot с использованием JPA (Java Persistence API). + +## Цель + +Цель этого руководства - предоставить четкие инструкции по определению характеристик сущностей в проекте Spring Boot с JPA, используя аннотации для обеспечения ограничений и поведения для каждого атрибута. + +## Характеристики Сущностей + +### Характеристики Сущности Student: +- `id` (UUID): Первичный ключ для сущности. +- `name` (String): Имя студента (не должно быть пустым). +- `email` (String): Адрес электронной почты студента (должен быть действительным адресом электронной почты). +- `major` (String): Специализация или направление обучения студента (не должно быть пустым). +- `year` (int): Год обучения студента (не должен быть null). +- `international` (boolean): Указывает, является ли студент международным (не должен быть null). + +### Определение Атрибута `id` + +Добавьте атрибут `id` в класс `Student`. Этот атрибут будет служить первичным ключом для сущности. + +```java +@Id +@GeneratedValue(strategy = GenerationType.AUTO) +private UUID id; +``` + +- `@Id`: Указывает, что это поле является первичным ключом для сущности. +- `@GeneratedValue`: Указывает стратегию автоматической генерации значений первичного ключа. + +### Определение Атрибута `name` + +Добавьте атрибут `name` в класс `Student`. Этот атрибут представляет имя студента и не должен быть пустым. + +```java +@NotBlank +private String name; +``` + +- `@NotBlank`: Обеспечивает, что значение `name` не является null и содержит хотя бы один непробельный символ. + +### Определение Атрибута `email` + +Добавьте атрибут `email` в класс `Student`. Этот атрибут представляет адрес электронной почты студента и должен быть действительным адресом электронной почты. + +```java +@NotBlank +@Email +private String email; +``` + +- `@Email`: Проверяет, что значение `email` является действительным адресом электронной почты. + +### Определение Атрибута `major` + +Добавьте атрибут `major` в класс `Student`. Этот атрибут представляет специализацию или направление обучения студента и не должен быть пустым. + +```java +@NotBlank +private String major; +``` + +- `@NotBlank`: Обеспечивает, что значение `major` не является null и содержит хотя бы один непробельный символ. + +### Определение Атрибута `year` + +Добавьте атрибут `year` в класс `Student`. Этот атрибут представляет год обучения студента и не должен быть null. + +```java +@NotNull +private int year; +``` + +- `@NotNull`: Обеспечивает, что значение `year` не является null. + +### Определение Атрибута `international` + +Добавьте атрибут `international` в класс `Student`. Этот атрибут указывает, является ли студент международным, и не должен быть null. + +```java +@NotNull +private boolean international; +``` + +- `@NotNull`: Обеспечивает, что значение `international` не является null. + + +Вы можете повторить предыдущие шаги для создания характеристик сущностей для сущностей `Course` и `Enrollment`, обеспечив правильное применение аннотаций для каждого атрибута. + +### Характеристики Сущности Enrollment: + +- `id` (UUID): Первичный ключ для сущности. +- `enrollmentDate` (Date): Дата записи на курс. +- `grade` (int): Оценка, полученная за курс. + +### Характеристики Сущности Course: + +- `id` (UUID): Первичный ключ для сущности. +- `name` (String): Название курса. +- `instructor` (String): Имя преподавателя курса. +- `schedule` (String): Детали расписания курса. +- `capacity` (int): Максимальная вместимость курса. +- `online` (boolean): Указывает, является ли курс онлайн. +- `startDate` (Date): Дата начала курса. + +--- diff --git a/docs/ru/jpa/practice/creation/create-entity.md b/docs/ru/jpa/practice/creation/create-entity.md new file mode 100644 index 0000000..5183fd3 --- /dev/null +++ b/docs/ru/jpa/practice/creation/create-entity.md @@ -0,0 +1,60 @@ +# Создание Сущностей + +## Введение + +Это руководство сосредотачивается на создании сущностей в проекте Spring Boot с использованием JPA (Java Persistence API). Оно предоставляет пошаговые инструкции по настройке структуры каталогов и созданию классов сущностей. + +## Цель + +Цель этого руководства - продемонстрировать, как создавать классы сущностей в проекте Spring Boot, следуя bewt-практикам и используя JPA для сохранения данных. + +## Структура Каталогов + +Для обеспечения хорошо организованного проекта важно установить правильную структуру каталогов. Следуйте этим рекомендациям: + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + └── entity/ + ├── Student.java + ├── Enrollment.java + └── Course.java + +``` + +В этой структуре: +- Каталог `src/main/java` содержит ваши исходные файлы Java. +- Каталог `com/example/demo/entity` - это место, где вы создадите ваши классы сущностей. + +## Создание Классов Сущностей + +Для создания классов сущностей следуйте этим шагам: + +1. Перейдите в каталог `com/example/demo/entity` в вашем проекте. +2. Создайте новый файл Java-класса для каждой сущности. Вы можете повторить следующие шаги для каждой сущности (например, Student, Enrollment, Course). +3. Определите ваш класс сущности с аннотацией `@Entity`. + +### Пример: + +```java +package com.example.demo.entity; + +import javax.persistence.Entity; + +@Entity +public class Student { + +} +``` + +Аннотация `@Entity` указывает, что этот класс является сущностью JPA. + +Повторите вышеуказанные шаги для создания классов сущностей `Enrollment` и `Course`. + +--- + +# [Далее: Определение Характеристик Сущностей](characteristics.md) diff --git a/docs/ru/jpa/practice/creation/fetching.md b/docs/ru/jpa/practice/creation/fetching.md new file mode 100644 index 0000000..8c83af7 --- /dev/null +++ b/docs/ru/jpa/practice/creation/fetching.md @@ -0,0 +1,45 @@ +# Стратегии Извлечения в Spring Boot с JPA: Понимание Ленивой и Агрессивной Загрузки + +## Введение + +Это руководство исследует стратегии извлечения в проекте Spring Boot с использованием JPA (Java Persistence API). Конкретно мы погрузимся в понятия ленивой и агрессивной загрузки и как они применяются в отношениях между сущностями. + +## Цель + +Цель этого руководства - предоставить полное понимание стратегий извлечения в JPA. К концу этого руководства вы поймете, когда использовать ленивую и агрессивную загрузку и как их реализовать в вашем приложении. + +## Стратегии Извлечения + +### Сценарий + +В наших отношениях между сущностями у нас есть отношение Один-ко-Многим между сущностью `Student` и сущностью `Enrollment`. Точно так же, существует отношение Один-ко-Многим между сущностью `Course` и сущностью `Enrollment`. + +#### Сущность Student + +В сущности `Student` у нас есть отношение Один-ко-Многим с сущностью `Enrollment`. У каждого студента может быть несколько записей на курсы. + +Для представления этого отношения мы используем аннотацию `@OneToMany` с `mappedBy = "student"` в сущности `Student`. Здесь у нас есть выбор между стратегиями ленивой и агрессивной загрузки для извлечения связанных записей. + +```java +@OneToMany(mappedBy = "student", fetch = FetchType.EAGER, cascade = CascadeType.ALL) +private List enrollments; +``` + +В этом сценарии мы выбираем агрессивную загрузку (`FetchType.EAGER`). Поскольку мы обычно ожидаем получить доступ ко всем записям студента вместе, агрессивная загрузка гарантирует, что все записи будут извлечены немедленно при загрузке студента. + +#### Сущность Course + +Аналогично, в сущности `Course` у нас также есть отношение Один-ко-Многим с сущностью `Enrollment`. У каждого курса может быть несколько записей на курсы. + +Для представления этого отношения мы используем аннотацию `@OneToMany` с `mappedBy = "course"` в сущности `Course`. Здесь у нас также есть выбор между стратегиями ленивой и агрессивной загрузки для извлечения связанных записей. + +```java +@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL) +private List enrollments; +``` + +В этом сценарии мы выбираем ленивую загрузку (`FetchType.LAZY`). Поскольку нам не всегда нужно получать доступ ко всем записям курса, ленивая загрузка гарантирует, что записи будут извлечены только при явном запросе. + +--- + +# [Далее: Создание Репозитория](../interacting/repository.md) diff --git a/docs/ru/jpa/practice/creation/relationships.md b/docs/ru/jpa/practice/creation/relationships.md new file mode 100644 index 0000000..9040aab --- /dev/null +++ b/docs/ru/jpa/practice/creation/relationships.md @@ -0,0 +1,44 @@ +# Определение Связей Между Сущностями + +## Введение + +Это руководство посвящено пониманию и реализации связей между сущностями в проекте Spring Boot с использованием JPA (Java Persistence API). Конкретно мы рассмотрим отношение между сущностью `Enrollment` и ее связанными сущностями `Student` и `Course`. + +## Цель + +Цель этого руководства - предоставить четкие инструкции по определению и пониманию связей сущностей в проекте Spring Boot с JPA. К концу этого руководства вы поймете, как установить ассоциации между сущностями и реализовать их в вашем приложении. + +## Связи Между Сущностями + +![img.png](../../../../srcs/jpa/er-diagram.png) +### Характеристики Сущности Enrollment: + +- `id` (UUID): Первичный ключ для сущности. +- `student` (Student): Студент, связанный с записью на курс. +- `course` (Course): Курс, связанный с записью на курс. +- `enrollmentDate` (Date): Дата записи на курс. +- `grade` (int): Оценка, полученная за курс. + +#### Отношение со Студентом + +Отношение между сущностью `Enrollment` и сущностью `Student` представляет собой сценарий, когда студент записывается на курс. Это отношение Многие-к-Одному, где много записей на курс может быть связано с одним студентом. Чтобы установить это отношение, аннотируйте атрибут `student` в сущности `Enrollment` аннотацией `@ManyToOne`. + +```java +@ManyToOne +@JoinColumn(name = "student_id") +private Student student; +``` + +#### Отношение с Курсом + +Аналогично отношение между сущностью `Enrollment` и сущностью `Course` означает сценарий, когда на курс записывается несколько студентов. Это также отношение Многие-к-Одному, где много записей на курс может быть связано с одним курсом. Аннотируйте атрибут `course` в сущности `Enrollment` аннотацией `@ManyToOne`. + +```java +@ManyToOne +@JoinColumn(name = "course_id") +private Course course; +``` + +--- + +# [Далее: Стратегии Извлечения](fetching.md) diff --git a/docs/ru/jpa/practice/dependencies/driver.md b/docs/ru/jpa/practice/dependencies/driver.md new file mode 100644 index 0000000..5867be1 --- /dev/null +++ b/docs/ru/jpa/practice/dependencies/driver.md @@ -0,0 +1,100 @@ +# JPA: Настройка зависимостей + +## Введение + +Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги по включению драйверов базы данных для различных баз данных, таких как PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. Следуя этому руководству, вы настроите все необходимые зависимости для установления соединений с этими базами данных в вашем приложении Spring Boot. + +## Цель + +Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особенным акцентом на драйверах баз данных для различных баз данных. + +## Настройка зависимостей + +### Драйверы баз данных + +Для подключения к различным базам данных в вашем приложении Spring Boot включите соответствующие драйверы баз данных. + +#### PostgreSQL + +**Для Gradle:** +```groovy +implementation "org.postgresql:postgresql" +``` + +**Для Maven:** +```xml + + org.postgresql + postgresql + INSERT_VERSION_HERE + +``` + +#### MySQL + +**Для Gradle:** +```groovy +implementation "mysql:mysql-connector-java" +``` + +**Для Maven:** +```xml + + mysql + mysql-connector-java + INSERT_VERSION_HERE + +``` + +#### Драйвер Oracle Database + +**Для Gradle:** +```groovy +implementation 'com.oracle.database.jdbc:ojdbc8' +``` + +**Для Maven:** +```xml + + com.oracle.database.jdbc + ojdbc8 + +``` + +#### Драйвер MongoDB (MongoDB Java Driver) + +**Для Gradle:** +```groovy +implementation 'org.mongodb:mongodb-driver-sync:4.4.3' +``` + +**Для Maven:** +```xml + + org.mongodb + mongodb-driver-sync + 4.4.3 + +``` + +#### Драйвер Microsoft SQL Server JDBC + +**Для Gradle:** +```groovy +implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' +``` + +**Для Maven:** +```xml + + com.microsoft.sqlserver + mssql-jdbc + 9.4.0.jre11 + +``` + +Эти зависимости облегчают подключение к базам данных. + +--- + +# [Далее: JPA Настройка зависимостей](jpa.md) \ No newline at end of file diff --git a/docs/ru/jpa/practice/dependencies/jpa.md b/docs/ru/jpa/practice/dependencies/jpa.md new file mode 100644 index 0000000..0247303 --- /dev/null +++ b/docs/ru/jpa/practice/dependencies/jpa.md @@ -0,0 +1,57 @@ +# JPA: Настройка зависимостей + +## Введение + +Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с JPA (Java Persistence API). Оно охватывает необходимые шаги по включению зависимостей Spring Boot Starter JDBC и Spring Boot Starter Data JPA. + +## Цель + +Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особым упором на зависимости Spring Boot Starter JDBC и Spring Boot Starter Data JPA. + +## Настройка зависимостей + +### Spring Boot Starter JDBC + +Чтобы включить поддержку JDBC в вашем приложении Spring Boot: + +#### Gradle + +```groovy +implementation "org.springframework.boot:spring-boot-starter-jdbc" +``` + +#### Maven + +```xml + + org.springframework.boot + spring-boot-starter-jdbc + +``` + +Эта зависимость обеспечивает автоматическую конфигурацию для доступа к данным на основе JDBC. + +### Spring Boot Starter Data JPA + +Для включения поддержки JPA (Java Persistence API) в вашем приложении Spring Boot: + +#### Gradle + +```groovy +implementation "org.springframework.boot:spring-boot-starter-data-jpa" +``` + +#### Maven + +```xml + + org.springframework.boot + spring-boot-starter-data-jpa + +``` + +Эта зависимость упрощает настройку репозиториев на основе JPA и предоставляет конфигурации по умолчанию для Hibernate. + +--- + +[Далее: Создание сущностей](../creation/create-entity.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository.md b/docs/ru/jpa/practice/interacting/jpa-repository.md new file mode 100644 index 0000000..fd57f6f --- /dev/null +++ b/docs/ru/jpa/practice/interacting/jpa-repository.md @@ -0,0 +1,52 @@ +# Создание JpaRepository + +## Введение + +Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API) с помощью JpaRepository. + +## Цель + +Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать классы репозитория и сервиса для сущности `Course`. + +## Структура каталогов + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + ├── data/ + │ └── entities/ + │ ├── Student.java + │ ├── Enrollment.java + │ └── Course.java + └── repository/ + ├── StudentRepository.java + └── CourseRepository.java + +``` + +## Класс репозитория + +### CourseRepository.java + +```java +package com.yourcompany.yourproject.repository; + +import com.yourcompany.yourproject.model.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CourseRepository extends JpaRepository { + // Добавьте методы репозитория для сущности курса +} +``` + +Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring. + +--- + +# [Далее: Создание записи](jpa-repository/create.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/create.md b/docs/ru/jpa/practice/interacting/jpa-repository/create.md new file mode 100644 index 0000000..eda726e --- /dev/null +++ b/docs/ru/jpa/practice/interacting/jpa-repository/create.md @@ -0,0 +1,38 @@ +# Создание записей в таблице с использованием JpaRepository + +## Введение + +Это руководство демонстрирует, как создавать записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository. + +## Цель + +Цель этого руководства - проиллюстрировать процесс создания записей в таблице путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository. + +## Метод репозитория + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.UUID; + +@Repository +public interface CourseRepository extends JpaRepository { + + Course save(Course course); +} +``` + +### Объяснение + +Метод `save(Course course)`, предоставленный JpaRepository, позволяет нам сохранить новую запись в таблице `Course`. + +Вызывая этот метод и передавая объект `Course` в качестве параметра, JpaRepository автоматически обрабатывает процесс сохранения сущности в базе данных. + +--- + +# [Далее: Чтение записи](read.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/delete.md b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md new file mode 100644 index 0000000..adea12c --- /dev/null +++ b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md @@ -0,0 +1,41 @@ +# Удаление записей из таблицы с использованием JpaRepository + +## Введение + +В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository. + +## Цель + +Цель этого руководства - проиллюстрировать процесс удаления записей из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository. + +## Метод репозитория + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.UUID; + +@Repository +public interface CourseRepository extends JpaRepository { + + void deleteById(UUID id); +} +``` + +## Объяснение + +Метод `deleteById(UUID id)` следует соглашению, распознаваемому JpaRepository, для удаления записей на основе их уникального идентификатора. + +- Ключевое слово `delete` указывает, что этот метод используется для удаления данных. +- `ById` указывает критерий для идентификации записи, которую нужно удалить. В данном случае мы нацелены на запись с определенным идентификатором. + +Следуя этому соглашению по именованию, JpaRepository автоматически генерирует соответствующий SQL-запрос для удаления желаемой записи из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы на удаление, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих предполагаемые операции удаления данных. + +--- + +# [Далее: Пользовательский запрос](query.md) diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/query.md b/docs/ru/jpa/practice/interacting/jpa-repository/query.md new file mode 100644 index 0000000..5d2c4b5 --- /dev/null +++ b/docs/ru/jpa/practice/interacting/jpa-repository/query.md @@ -0,0 +1,43 @@ +# Пользовательский запрос с использованием JpaRepository + +## Введение + +Это руководство демонстрирует, как реализовать методы пользовательского запроса, используя аннотацию `@Query` в слое репозитория приложения Spring Boot с JPA (Java Persistence API) и JpaRepository. + +## Цель + +Цель этого руководства - проиллюстрировать процесс создания методов пользовательского запроса в интерфейсе репозитория для выполнения определенных операций с базой данных, адаптированных к требованиям приложения. + +## Метод репозитория + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + + @Query("SELECT c FROM Course c WHERE c.instructor = :instructor") + List findCoursesByInstructor(@Param("instructor") String instructor); +} +``` + +### Объяснение + +Аннотация `@Query` позволяет нам определять пользовательские запросы JPQL (Java Persistence Query Language) непосредственно в интерфейсе репозитория. + +- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` - это запрос JPQL, который выбирает все курсы, где имя инструктора соответствует предоставленному значению. +- Аннотация `@Param("instructor")` привязывает параметр метода `instructor` к именованному параметру `:instructor` в запросе JPQL. + +Используя `@Query`, мы можем создавать сложные запросы, адаптированные к конкретным потребностям извлечения данных, обеспечивая гибкость и контроль над операциями с базой данных. + +--- + +# [Next: Tasks](../../../lab-work.md) \ No newline at end of file diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/read.md b/docs/ru/jpa/practice/interacting/jpa-repository/read.md new file mode 100644 index 0000000..7cd66e0 --- /dev/null +++ b/docs/ru/jpa/practice/interacting/jpa-repository/read.md @@ -0,0 +1,42 @@ +# Чтение записей из таблицы с использованием JpaRepository + +## Введение + +Это руководство демонстрирует, как извлекать данные из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository. + +## Цель + +Цель этого руководства - проиллюстрировать процесс чтения данных из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository. + +## Метод репозитория + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + + List findCoursesByInstructor(String instructor); +} +``` + +### Объяснение + +Сигнатура метода `findCoursesByInstructor(String instructor)` следует определенному соглашению по именованию, распознаваемому Spring Data JPA. + +- Ключевое слово `find` указывает, что этот метод используется для извлечения данных. +- `Courses` представляет тип сущности, который мы хотим извлечь. +- `ByInstructor` указывает критерий для фильтрации результатов. В данном случае мы запрашиваем курсы на основе атрибута `instructor`. + +Следуя этому соглашению по именованию, Spring Data JPA автоматически генерирует соответствующий SQL-запрос за кулисами, чтобы извлечь необходимые данные из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих желаемые операции извлечения данных. + +--- + +# [Далее: Удаление записи](delete.md) diff --git a/docs/ru/jpa/practice/interacting/repository.md b/docs/ru/jpa/practice/interacting/repository.md new file mode 100644 index 0000000..16e82e1 --- /dev/null +++ b/docs/ru/jpa/practice/interacting/repository.md @@ -0,0 +1,50 @@ +# Создание репозитория + +## Введение + +Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API). + +## Цель + +Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать репозиторий для сущности `Student`. + +## Структура каталогов + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + ├── data/ + │ └── entites/ + │ ├── Student.java + │ ├── Enrollment.java + │ └── Course.java + └── repository/ + └── StudentRepository.java + +``` + +## Класс репозитория + +### StudentRepository.java + +```java +package com.yourcompany.yourproject.repository; + +import com.yourcompany.yourproject.model.Student; +import org.springframework.stereotype.Repository; + +@Repository +public class StudentRepository { + // Добавьте методы репозитория для сущности студента +} +``` + +Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring. + +--- + +# [Далее: Создание записи](repository/create.md) diff --git a/docs/ru/jpa/practice/interacting/repository/create.md b/docs/ru/jpa/practice/interacting/repository/create.md new file mode 100644 index 0000000..8fbbbf9 --- /dev/null +++ b/docs/ru/jpa/practice/interacting/repository/create.md @@ -0,0 +1,46 @@ +# Создание новых записей в таблице с использованием слоя репозитория + +## Введение + +Это руководство иллюстрирует, как создавать новые записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). + +## Цель + +Цель этого руководства - продемонстрировать процесс создания новых записей в таблице с использованием слоя репозитория. Мы достигнем этого, реализовав метод в интерфейсе `StudentRepository`, используя `EntityManager` вместо `JpaRepository`. + +## Метод репозитория + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public void saveStudent(Student student) { + entityManager.persist(student); + } +} +``` + +### Объяснение + +- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. + +- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. + +- `entityManager.persist(student)`: Этот код сохраняет новую сущность `Student` в базе данных. + +--- + +# [Далее: Чтение записи](read.md) diff --git a/docs/ru/jpa/practice/interacting/repository/delete.md b/docs/ru/jpa/practice/interacting/repository/delete.md new file mode 100644 index 0000000..c6ade0d --- /dev/null +++ b/docs/ru/jpa/practice/interacting/repository/delete.md @@ -0,0 +1,47 @@ +# Удаление записей из таблицы с использованием слоя репозитория + +## Введение + +В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). + +## Цель + +Цель этого руководства - продемонстрировать процесс удаления записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. + +## Метод репозитория + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public void deleteStudent(UUID id) { + Student studentToDelete = entityManager.find(Student.class, id); + entityManager.remove(studentToDelete); + } +} +``` + +### Объяснение + +- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. + +- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. + +- `entityManager.remove(studentToDelete)`: Этот код удаляет сущность `Student` из базы данных. + +--- + +# [Далее: Пользовательский запрос](query.md) diff --git a/docs/ru/jpa/practice/interacting/repository/query.md b/docs/ru/jpa/practice/interacting/repository/query.md new file mode 100644 index 0000000..b25f84d --- /dev/null +++ b/docs/ru/jpa/practice/interacting/repository/query.md @@ -0,0 +1,48 @@ +# Создание пользовательских запросов в таблице с использованием слоя репозитория + +## Введение + +В этом руководстве показано, как создавать пользовательские запросы для извлечения записей из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). + +## Цель + +Цель этого руководства - проиллюстрировать процесс создания пользовательских запросов для извлечения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. + +## Метод репозитория + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public List findStudentsByMajor(String major) { + return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class) + .setParameter("major", major) + .getResultList(); + } +} +``` + +### Объяснение + +- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. + +- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. + +- `entityManager.createQuery(...)`: Этот код создает пользовательский запрос на JPQL (Java Persistence Query Language) для извлечения записей на основе предоставленного критерия (`major` в этом примере). + +--- + +# [Далее: Создание JpaRepository](../jpa-repository.md) diff --git a/docs/ru/jpa/practice/interacting/repository/read.md b/docs/ru/jpa/practice/interacting/repository/read.md new file mode 100644 index 0000000..36e6af3 --- /dev/null +++ b/docs/ru/jpa/practice/interacting/repository/read.md @@ -0,0 +1,46 @@ +# Чтение записей из таблицы с использованием слоя репозитория + +## Введение + +В этом руководстве показано, как читать записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API). + +## Цель + +Цель этого руководства - проиллюстрировать процесс чтения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. + +## Метод репозитория + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.UUID; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public Student findStudentById(UUID id) { + return entityManager.find(Student.class, id); + } +} +``` + +### Объяснение + +- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. + +- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. + +- `entityManager.find(Student.class, id)`: Этот код извлекает сущность `Student` из базы данных на основе предоставленного `id`. + +--- + +# [Далее: Обновление записи](update.md) diff --git a/docs/ru/jpa/practice/interacting/repository/update.md b/docs/ru/jpa/practice/interacting/repository/update.md new file mode 100644 index 0000000..2fe9b31 --- /dev/null +++ b/docs/ru/jpa/practice/interacting/repository/update.md @@ -0,0 +1,46 @@ +# Обновление записей в таблице с использованием слоя репозитория + +## Введение + +Это руководство иллюстрирует, как обновлять записи в таблице с использованием слоя репозитория в приложении Spring Boot с JPA (Java Persistence API). + +## Цель + +Цель этого руководства - продемонстрировать процесс обновления записей в таблице, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`. + +## Метод репозитория + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public Student updateStudent(Student student) { + return entityManager.merge(student); + } +} +``` + +### Объяснение + +- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным. + +- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория. + +- `entityManager.merge(student)`: Этот код обновляет сущность `Student` в базе данных. + +--- + +# [Далее: Удаление записи](delete.md) diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md new file mode 100644 index 0000000..f4554d7 --- /dev/null +++ b/docs/ru/springsecurity/lab-work.md @@ -0,0 +1,60 @@ +# Лабораторные работы по Spring Security + +Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам практиковаться и познакомиться с Spring Security, а также создать достаточно полноценный проект. Будь вы начинающим или стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring. + +## Цель лабораторных работ + +Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего проекта, и через эти задачи вы получите ценные знания о его конфигурации, аутентификации, авторизации и многом другом. + +## Задачи практики + +1. [Задача 1: Настройка Spring Security](practice/configure-spring-security.md) +2. [Задача 2: Создание базовой реализации для пользователя](practice/base-implementation-user.md) +3. [Задача 3: Шифрование пароля](practice/password-encryption.md) +4. [Задача 4: Добавление фиктивных пользователей](practice/add-dummy-users.md) +5. [Задача 5: Создание идентификации для пользователей](practice/create-identity-to-users.md) +6. [Задача 6: Создание базы для авторизации на сервере](practice/setup-server-authorization.md) +7. [Задача 7: Авторизация аутентифицированных пользователей](practice/authorize-server-authenticated.md) +8. [Задача 8: Авторизация по ролям](practice/authorize-server-role.md) +9. [Задача 9: Авторизация по полномочиям](practice/authorize-server-authority.md) +10. [Задача 10: Настройка Thymeleaf Security](practice/configure-thymeleaf-security.md) +11. [Задача 11: Авторизация аутентифицированных пользователей](practice/authorize-client-authenticated.md) +12. [Задача 12: Авторизация по ролям](practice/authorize-client-role.md) +13. [Задача 13: Авторизация по полномочиям](practice/authorize-client-authority.md) +14. [Задача 14: Пользовательская форма входа](practice/custom-login-form.md) + +## Задачи лабораторной работы + +![img.png](../../srcs/springsecurity/task.png) + +### Задача 1: Настройка Spring Security +Инициализация Spring Security в вашем проекте. + +### Задача 2: Определение Ролей и Полномочий Пользователей +Определение различных пользовательских ролей (Менеджер, Учитель, Студент) и их соответствующих полномочий. + +### Задача 3: Настройка Безопасности в Контроллерах +Защита конечных точек с использованием контроля доступа на основе ролей. + +#### Детали реализации +**Роль Менеджера**: +- Добавление Нового Учителя (`/teachers/new`) +- Изменение Профиля Учителя (`/teachers/{id}/edit`) +- Изменение Профиля Студента (`/students/{id}/edit`) +- Изменение Оценок Студента (`/students/{id}/marks/edit`) + +**Роль Учителя**: +- Изменение Оценок Студента (`/students/{id}/marks/edit`) +- Добавление Нового Предмета (`/subjects/new`) +- Добавление Нового Теста (`/tests/new`) + +**Роль Студента**: +- Прохождение Теста (`/tests/{id}/take`) +- Просмотр Оценок (`/students/{id}/marks`) + +### Задача 4: Реализация Авторизации в Шаблонах Thymeleaf + +Ограничение доступа к элементам пользовательского интерфейса на основе ролей пользователей. + +### Задача 5: Тестирование Контроля Доступа на Основе Ролей +Убедитесь, что конечные точки и элементы пользовательского интерфейса правильно защищены. \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/add-dummy-users.md b/docs/ru/springsecurity/practice/add-dummy-users.md new file mode 100644 index 0000000..d439254 --- /dev/null +++ b/docs/ru/springsecurity/practice/add-dummy-users.md @@ -0,0 +1,68 @@ +# Добавление фиктивных пользователей + +В этом задании описан процесс обновления класса `CustomUserDetailsService` для включения метода добавления фиктивных пользователей в хранилище в памяти, чтобы использовать его в качестве простого демонстрационного примера создания пользователей. + +## Цель + +Обновить класс `CustomUserDetailsService`, чтобы включить метод добавления фиктивных пользователей, позволяющий инициализировать данные пользователей в хранилище в памяти. + +## Шаги + +1. **Обновление класса CustomUserDetailsService:** + + Сначала нам нужно обновить класс `CustomUserDetailsService`, чтобы добавить метод добавления фиктивных пользователей. Мы будем использовать этот метод во время инициализации бина для заполнения хранилища в памяти данными о фиктивных пользователях. + + ```java + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + private final PasswordEncoder passwordEncoder; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository, PasswordEncoder passwordEncoder) { + this.usersRepository = usersRepository; + this.passwordEncoder = passwordEncoder; + + // Вызываем метод addDummyUsers для добавления фиктивных пользователей во время инициализации бина + addDummyUsers(); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Получаем данные пользователя из репозитория + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("Пользователь с именем пользователя не найден: " + username); + } + return userDetails; + } + + // Метод для добавления фиктивных пользователей + private void addDummyUsers() { + // Создаем фиктивных пользователей + CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); + CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); + CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); + + // Добавляем пользователей в репозиторий + usersRepository.save(admin); + usersRepository.save(moderator); + usersRepository.save(user); + } + } + ``` + + В этом обновленном классе: + - Мы добавили конструктор, который принимает `UsersRepository` и `PasswordEncoder` в качестве зависимостей. + - Во время инициализации бина конструктор вызывает метод `addDummyUsers` для заполнения хранилища в памяти фиктивными пользователями. + - Метод `addDummyUsers` создает фиктивных пользователей с захардкоженными именами пользователей и паролями. + - Наконец, фиктивные пользователи сохраняются в репозитории с помощью метода `save`. + +## Заключение + +Поздравляем! Вы успешно добавили фиктивных пользователей для имитации базы данных в вашем приложении с использованием Spring Security. Путем инициализации списка фиктивных пользователей в классе UserRepositoryImpl и заполнения его во время запуска приложения вы теперь можете аутентифицировать и авторизовывать пользователей в вашем приложении. + +--- + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создание идентификации для пользователей](create-identity-to-users.md) diff --git a/docs/ru/springsecurity/practice/authorize-server-authenticated.md b/docs/ru/springsecurity/practice/authorize-server-authenticated.md new file mode 100644 index 0000000..93f418e --- /dev/null +++ b/docs/ru/springsecurity/practice/authorize-server-authenticated.md @@ -0,0 +1,38 @@ +# Авторизация аутентифицированного пользователя + +Это задание описывает процесс авторизации аутентифицированных пользователей в вашем приложении. Путем требования аутентификации для определенных путей или конечных точек вы можете гарантировать, что только вошедшие в систему пользователи могут получить доступ к определенным ресурсам. + +## Цель + +Авторизовать доступ к пути `/second` только для аутентифицированных пользователей, разрешив публичный доступ к другим путям. + +## Шаги + +1. **Обновление конфигурации безопасности:** + + В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` так, чтобы доступ к пути `/second` был ограничен только для аутентифицированных пользователей. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Другие конечные точки... + .requestMatchers("/second").authenticated() + // Другие конечные точки... + ); + } + } + ``` + + В этой конфигурации: + - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации. + - Заявление `.requestMatchers("/second").authenticated()` указывает, что доступ к пути `/second` должен быть ограничен только для аутентифицированных пользователей. + +## Заключение + +Вы успешно настроили авторизацию для разрешения доступа к пути `/second` только для аутентифицированных пользователей. Путем требования аутентификации для этого пути. diff --git a/docs/ru/springsecurity/practice/authorize-server-authority.md b/docs/ru/springsecurity/practice/authorize-server-authority.md new file mode 100644 index 0000000..d6f7346 --- /dev/null +++ b/docs/ru/springsecurity/practice/authorize-server-authority.md @@ -0,0 +1,39 @@ +# Авторизация по правам + +В этом задании описывается процесс авторизации пользователей на основе их прав в вашем приложении. Присваивая различные права пользователям, вы можете контролировать доступ к определенным функциональностям или действиям. + +## Цель + +Авторизовать доступ к пути `/addStudent` для пользователей с правами `WRITE` и к пути `/removeStudent` для пользователей с правами `DELETE`. + +## Шаги + +1. **Обновление конфигурации безопасности:** + + В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для определения контроля доступа на основе прав для путей `/addStudent` и `/removeStudent`. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Другие конечные точки... + .requestMatchers("/addStudent").hasAuthority("WRITE") + .requestMatchers("/removeStudent").hasAuthority("DELETE") + // Другие конечные точки... + ); + } + } + ``` + + В этой конфигурации: + - Заявление `.requestMatchers("/addStudent").hasAuthority("WRITE")` указывает, что доступ к пути `/addStudent` должен быть ограничен для пользователей с правами `WRITE`. + - Аналогично, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` ограничивает доступ к пути `/removeStudent` для пользователей с правами `DELETE`. + +## Заключение + +Вы успешно настроили контроль доступа на основе прав для путей `/addStudent` и `/removeStudent` в вашем приложении. Присваивая конкретные права пользователям, вы можете контролировать доступ к различным функциональностям или действиям на основе их разрешений. diff --git a/docs/ru/springsecurity/practice/authorize-server-role.md b/docs/ru/springsecurity/practice/authorize-server-role.md new file mode 100644 index 0000000..6b6ff73 --- /dev/null +++ b/docs/ru/springsecurity/practice/authorize-server-role.md @@ -0,0 +1,39 @@ +# Авторизация по ролям + +Это задание описывает процесс авторизации пользователей на основе их ролей в вашем приложении. Присваивая различные роли пользователям, вы можете контролировать доступ к определенным ресурсам или функциональностям. + +## Цель + +Авторизовать доступ к пути `/third` для пользователей с ролью `ROLE_MODERATOR` и к пути `/fourth` для пользователей с ролью `ROLE_ADMIN`. + +## Шаги + +1. **Обновление конфигурации безопасности:** + + В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для определения контроля доступа на основе ролей для путей `/third` и `/fourth`. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Другие конечные точки... + .requestMatchers("/third").hasAuthority("ROLE_MODERATOR") + .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN") + // Другие конечные точки... + ); + } + } + ``` + + В этой конфигурации: + - Заявление `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` указывает, что доступ к пути `/third` должен быть ограничен для пользователей с авторитетом `ROLE_MODERATOR`. + - Аналогично, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` ограничивает доступ к пути `/fourth` для пользователей с авторитетом `ROLE_ADMIN`. + +## Заключение + +Вы успешно настроили контроль доступа на основе ролей для путей `/third` и `/fourth` в вашем приложении. Присваивая конкретные роли пользователям, вы можете контролировать доступ к различным частям вашего приложения на основе их разрешений. diff --git a/docs/ru/springsecurity/practice/base-implementation-user.md b/docs/ru/springsecurity/practice/base-implementation-user.md new file mode 100644 index 0000000..83c9688 --- /dev/null +++ b/docs/ru/springsecurity/practice/base-implementation-user.md @@ -0,0 +1,186 @@ +# Создание базовой реализации для управления пользователями + +В этом задании мы сосредоточимся на создании базовой реализации для управления пользователями в вашем приложении. Это включает в себя определение сущности UserDetails, создание репозитория для управления данными пользователей и реализацию UserDetailsService для загрузки деталей пользователей во время аутентификации. + +## Цель + +Цель этого задания - установить надежное основание для управления пользователями в вашем приложении. Реализовав UserDetails, UsersRepository и UserDetailsService, вы сможете аутентифицировать пользователей, управлять их данными и эффективно выполнять операции, связанные с пользователями. + +## Шаги + +1. **Определение сущности UserDetails** + + Начните с определения сущности UserDetails, которая представляет детали пользователя в вашем приложении. Эта сущность должна реализовывать интерфейс UserDetails, предоставляемый Spring Security. + + ```java + package edu.labs.yourproject.model; + + import org.springframework.security.core.GrantedAuthority; + import org.springframework.security.core.userdetails.UserDetails; + + import java.util.Collection; + + public class CustomUserDetails implements UserDetails { + + // Реализуйте методы UserDetails здесь + + } + ``` + + Реализуйте методы, необходимые интерфейсом UserDetails, для предоставления деталей пользователя, таких как имя пользователя, пароль, права доступа и т. д. + +2. **Создание класса UsersRepository** + + Поскольку мы используем хранилище в памяти на данный момент, создадим простой класс UsersRepository для управления данными пользователей. + + a. **Создание класса UsersRepository** + + Создайте новый класс Java с именем `UsersRepository` внутри пакета `edu.labs.yourproject.repository`. + + ```java + package edu.labs.yourproject.repository; + + import org.springframework.stereotype.Repository; + import edu.labs.yourproject.model.CustomUserDetails; + + @Repository + public class UsersRepository { + + private List users = new ArrayList<>(); + + // Добавьте методы для управления пользователями по мере необходимости + } + ``` + + Этот класс будет служить репозиторием для управления данными пользователей. Мы добавим методы для извлечения, добавления, обновления и удаления пользователей в последующих шагах. + + b. **Добавление метода findByUsername** + + Добавьте метод с именем `findByUsername` в класс `UsersRepository`. Этот метод будет извлекать детали пользователя по имени пользователя из репозитория. + + ```java + public CustomUserDetails findByUsername(String username) { + for (CustomUserDetails user : users) { + if (user.getUsername().equals(username)) { + return user; + } + } + return null; // Пользователь не найден + } + ``` + + Метод `findByUsername` используется для извлечения деталей пользователя по имени пользователя из репозитория. В этой заполнительной реализации он возвращает `null`, но вы замените его фактической логикой извлечения деталей пользователя из базы данных или любого другого источника данных. + +3. **Реализация UserDetailsService** + + На этом шаге мы реализуем UserDetailsService для загрузки деталей пользователя во время аутентификации. Этот сервис будет извлекать информацию о пользователе из UsersRepository. + + a. **Создание класса CustomUserDetailsService** + + Начните с создания нового класса с именем `CustomUserDetailsService` в пакете сервиса вашего проекта. Этот класс будет реализовывать интерфейс UserDetailsService, предоставляемый Spring Security. + + ```java + package edu.labs.yourproject.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.core.userdetails.UserDetails; + import org.springframework.security.core.userdetails.UserDetailsService; + import org.springframework.security.core.userdetails.UsernameNotFoundException; + import org.springframework.stereotype.Service; + import com.yourcompany.yourproject.model.CustomUserDetails; + import com.yourcompany.yourproject.repository.UsersRepository; + + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + + // Здесь реализуются методы + } + ``` + + Мы создаем класс `CustomUserDetailsService` и проводим инъекцию зависимости `UsersRepository` с помощ + +ью конструктора. + + b. **Переопределение метода loadUserByUsername** + + Переопределите метод `loadUserByUsername`, определенный в интерфейсе UserDetailsService. Этот метод будет извлекать детали пользователя из UsersRepository на основе предоставленного имени пользователя. + + ```java + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Извлечение деталей пользователя из репозитория в памяти + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("Пользователь с именем пользователя не найден: " + username); + } + return userDetails; + } + ``` + + Внутри метода `loadUserByUsername` мы вызываем метод `findByUsername` у UsersRepository для извлечения деталей пользователя по имени пользователя. Если пользователь не найден, мы генерируем исключение UsernameNotFoundException. + +4. **Настройка бинов в WebSecurityConfig** + + Откройте класс WebSecurityConfig, расположенный в пакете конфигурации вашего проекта (`edu.labs.yourproject.config`). Внутри этого класса определите бины для CustomUserDetails и UserDetailsRepository. + + ```java + package edu.labs.yourproject.config; + + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UserDetailsRepository; + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + + @Configuration + @EnableWebSecurity + public class WebSecurityConfig { + + // Весь остальной код здесь... + + @Bean + public CustomUserDetailsService customUserDetailsService() { + // Создание и настройка бина CustomUserDetails + return new CustomUserDetailsService(); + } + + @Bean + public UserDetailsRepository userDetailsRepository() { + // Создание и настройка бина UserDetailsRepository + return new UserDetailsRepository(); + } + } + ``` + + Определите два метода бина: `CustomUserDetailsService()` и `userDetailsRepository()`. Эти методы создают и настраивают бины CustomUserDetailsService и UserDetailsRepository соответственно. + +## Структура папок + +Структура папок вашего проекта должна выглядеть примерно так: + +``` +src +└── main + └── java + └── edu + └── labs + └── yourproject + ├── model + │ └── CustomUserDetails.java + ├── repository + │ └── UsersRepository.java + └── service + └── CustomUserDetailsService.java +``` + +Эта структура папок показывает, где создать класс `CustomUserDetailsService` и интерфейс `UsersRepository` в вашем проекте. Организация ваших классов таким образом помогает поддерживать чистый и структурированный код. + +## Заключение + +Поздравляю! Вы успешно создали базовую реализацию для управления пользователями в вашем приложении. С UserDetails, UsersRepository и UserDetailsService вы можете аутентифицировать пользователей, управлять их данными и выполнять операции, связанные с пользователями, эффективно. diff --git a/docs/ru/springsecurity/practice/configure-spring-security.md b/docs/ru/springsecurity/practice/configure-spring-security.md new file mode 100644 index 0000000..f556b3f --- /dev/null +++ b/docs/ru/springsecurity/practice/configure-spring-security.md @@ -0,0 +1,79 @@ +# Настройка Spring Security + +В этом задании мы сосредоточимся на настройке Spring Security в вашем проекте. Spring Security предоставляет обширные средства безопасности для Java-приложений, включая аутентификацию, авторизацию и защиту от распространенных угроз безопасности. + +## Цель + +Цель этого задания - интегрировать Spring Security в ваш существующий проект, гарантируя, что ваше приложение защищено от несанкционированного доступа. + +## Шаги + +1. **Добавление зависимости Spring Security** + + - Для проектов Maven: + + Добавьте следующую зависимость в файл `pom.xml` вашего проекта: + + ```xml + + org.springframework.boot + spring-boot-starter-security + + ``` + + - Для проектов Gradle: + + Добавьте следующую зависимость в файл `build.gradle` вашего проекта: + + ```groovy + implementation 'org.springframework.boot:spring-boot-starter-security' + ``` + + Убедитесь, что вы используете соответствующую версию Spring Security для вашего проекта. + +2. **Создание класса конфигурации безопасности** + + Создайте новый класс Java с именем `WebSecurityConfig` в структуре исходных файлов вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`. + + Структура папок вашего проекта должна выглядеть примерно так: + + ``` + src + └── main + └── java + └── edu + └── labs + └── yourproject + ├── config + │ └── WebMvcConfig.java + │ └── WebSecurityConfig.java + └── controller + └── PracticeController.java + ``` + +3. **Настройка класса конфигурации безопасности** + + Внутри класса `WebSecurityConfig` отметьте его аннотациями `@Configuration` и `@EnableWebSecurity`, чтобы указать, что это класс конфигурации для Spring Security. + + ```java + package edu.labs.yourproject.config; + + import org.springframework.context.annotation.Configuration; + import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; + import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + // Конфигурация безопасности здесь + } + } + ``` + +## Заключение + +Поздравляем! Вы успешно настроили Spring Security в своем проекте. Ваше приложение теперь обладает надежными средствами безопасности для защиты от несанкционированного доступа и обеспечения конфиденциальности и целостности данных пользователей. diff --git a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md new file mode 100644 index 0000000..78960e2 --- /dev/null +++ b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md @@ -0,0 +1,29 @@ +# Настройка Thymeleaf с Spring Security + +## Цель +Цель этого задания - интегрировать Thymeleaf с Spring Security, обеспечивая использование дополнительных диалектов и утилит, предоставляемых библиотекой `thymeleaf-extras-springsecurity6`. + +## Шаги + +1. **Gradle (Groovy):** + + Добавьте зависимость `thymeleaf-extras-springsecurity6` в ваш файл `build.gradle`: + + ```groovy + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE' + ``` + +2. **Maven:** + + Добавьте следующую зависимость в ваш файл `pom.xml`: + + ```xml + + org.thymeleaf.extras + thymeleaf-extras-springsecurity6 + 3.0.4.RELEASE + + ``` + +## Заключение +После добавления зависимости Thymeleaf будет настроен для работы с Spring Security, предоставляя дополнительные функции и утилиты для интеграции функциональности, связанной с безопасностью, в ваше веб-приложение. Не забудьте синхронизировать ваш проект, чтобы загрузить зависимость и сделать ее доступной для использования. diff --git a/docs/ru/springsecurity/practice/create-identity-to-users.md b/docs/ru/springsecurity/practice/create-identity-to-users.md new file mode 100644 index 0000000..e96f03c --- /dev/null +++ b/docs/ru/springsecurity/practice/create-identity-to-users.md @@ -0,0 +1,61 @@ +# Создание идентификации пользователей + +Это задание описывает процесс добавления ролей и полномочий пользователям, созданным на предыдущем этапе, "Добавление фиктивных пользователей". Присваивая роли и полномочия пользователям, мы устанавливаем их идентификацию в приложении и контролируем доступ к различным ресурсам и функционалу. + +## Цель + +Расширить профили пользователей, созданные на предыдущем этапе, присвоив им роли и полномочия, тем самым определив их идентификацию и разрешения на доступ в приложении. + +## Шаги + +1. **Обновление профилей пользователей с ролями и полномочиями:** + + Мы обновим фиктивные профили пользователей, созданные в классе `CustomUserDetailsService`, чтобы добавить роли и полномочия. Это включает в себя назначение конкретных ролей каждому пользователю, таких как `ADMIN`, `MODERATOR` или `USER`, и предоставление соответствующих полномочий на основе их ролей. + + ```java + // Внутри метода addDummyUsers() + + // Определение ролей + String adminRole = "ROLE_ADMIN"; + String moderatorRole = "ROLE_MODERATOR"; + String userRole = "ROLE_USER"; + + // Определение полномочий + List adminAuthorities = Arrays.asList( + new SimpleGrantedAuthority(adminRole), + new SimpleGrantedAuthority("READ"), + new SimpleGrantedAuthority("WRITE") + ); + + List moderatorAuthorities = Arrays.asList( + new SimpleGrantedAuthority(moderatorRole), + new SimpleGrantedAuthority("READ") + ); + + List userAuthorities = Collections.singletonList( + new SimpleGrantedAuthority(userRole) + ); + + // Создание фиктивных пользователей с ролями и полномочиями + CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); + admin.setAuthorities(adminAuthorities); + admin.setRole(adminRole); + + CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); + moderator.setAuthorities(moderatorAuthorities); + moderator.setRole(moderatorRole); + + CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); + user.setAuthorities(userAuthorities); + user.setRole(userRole); + ``` + + В этом обновленном коде: + - Мы определяем роли и полномочия в виде переменных для ясности и удобства обслуживания. + - Теперь каждый профиль пользователя включает список полномочий на основе назначенных им ролей. + - Полномочия представлены объектами `SimpleGrantedAuthority` и добавляются в профили пользователей соответственно. + - Кроме того, мы устанавливаем роль для каждого пользователя, чтобы в дальнейшем использовать контроль доступа на основе ролей. + +## Заключение + +Вы успешно улучшили профили пользователей в вашем приложении, назначив роли и полномочия фиктивным пользователям. Определив их идентификацию и разрешения на доступ, теперь вы можете контролировать действия и функциональность, доступные каждому пользователю в приложении. diff --git a/docs/ru/springsecurity/practice/custom-login-form.md b/docs/ru/springsecurity/practice/custom-login-form.md new file mode 100644 index 0000000..c9a9681 --- /dev/null +++ b/docs/ru/springsecurity/practice/custom-login-form.md @@ -0,0 +1,40 @@ +# Пользовательский формуляр входа + +Это задание руководит вас через процесс активации пользовательской страницы формы входа для аутентификации с использованием Spring Security. Реализуя пользовательскую страницу входа, пользователи могут безопасно аутентифицироваться в вашем приложении. + +## Цель + +Активировать пользовательскую страницу формы входа, которая уже была создана по определенному пути. + +## Шаги + +1. **Обновить конфигурацию безопасности:** + + В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для указания пользовательской страницы входа. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Добавьте другие конфигурации авторизации здесь + ) + .formLogin((login) -> login + .loginPage("/custom-login-page") // Укажите URL пользовательской страницы входа + // Добавьте другие конфигурации формы входа здесь + ); + } + } + ``` + + В этой конфигурации: + - Оператор `.loginPage("/custom-login-page")` указывает URL пользовательской страницы входа. + - Вы можете добавить дополнительные конфигурации для настройки поведения формы входа, такие как установка URL для успешного или неудачного входа, определение имен полей формы и т. д. + +## Заключение + +Вы успешно активировали пользовательскую страницу формы входа для аутентификации в вашем приложении. Пользователи теперь могут получить доступ к пользовательской странице входа, чтобы безопасно войти и аутентифицироваться в системе. diff --git a/docs/ru/springsecurity/practice/password-encryption.md b/docs/ru/springsecurity/practice/password-encryption.md new file mode 100644 index 0000000..30633f9 --- /dev/null +++ b/docs/ru/springsecurity/practice/password-encryption.md @@ -0,0 +1,82 @@ +# Шифрование паролей + +В этой задаче мы настроим шифрование паролей для аутентификации пользователей в приложении, использующем Spring Security. Шифрование паролей повышает безопасность, сохраняя их в базе данных в зашифрованном виде. + +## Цель + +Цель этой настройки - настроить шифрование паролей с использованием BCryptPasswordEncoder, предоставляемого Spring Security. Это обеспечит защиту паролей путем их безопасного хеширования перед сохранением в базе данных. + +## Шаги + +1. **Добавление бина BCryptPasswordEncoder** + + Откройте класс WebSecurityConfig, находящийся в пакете конфигурации вашего проекта (`edu.labs.yourproject.config`). Внутри этого класса определите бин для BCryptPasswordEncoder. + + ```java + package edu.labs.yourproject.config; + + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + @Configuration + public class WebSecurityConfig { + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + // Создание и настройка бина BCryptPasswordEncoder + return new BCryptPasswordEncoder(); + } + } + ``` + + Определите метод бина `passwordEncoder()`, который создает и настраивает бин BCryptPasswordEncoder. Этот бин будет использоваться для шифрования паролей перед их сохранением в базе данных. + +2. **Шифрование паролей** + + a. **Обновление класса CustomUserDetailsService** + + Откройте класс CustomUserDetailsService, находящийся в вашем пакете сервисов (`edu.labs.yourproject.service`). Внедрите бин BCryptPasswordEncoder в этот класс. + + ```java + package edu.labs.yourproject.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + import org.springframework.stereotype.Service; + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UsersRepository; + + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + } + ``` + + b. **Реализация метода регистрации** + + Определите метод в классе CustomUserDetailsService для обработки регистрации пользователя. В этом методе зашифруйте пароль пользователя перед сохранением его в базе данных. + + ```java + public void registerUser(CustomUserDetails user) { + // Шифрование пароля перед сохранением пользователя + String encodedPassword = passwordEncoder.encode(user.getPassword()); + user.setPassword(encodedPassword); + usersRepository.save(user); + } + ``` + + Этот метод принимает объект CustomUserDetails, представляющий пользователя для регистрации. Он шифрует пароль пользователя с использованием бина BCryptPasswordEncoder, а затем сохраняет пользователя в базе данных. + +## Заключение + +Поздравляем! Вы успешно настроили шифрование паролей с использованием BCryptPasswordEncoder в вашем приложении, использующем Spring Security. Шифрование паролей повышает безопасность аутентификации пользователей и защищает конфиденциальные данные пользователей. diff --git a/docs/ru/springsecurity/practice/setup-server-authorization.md b/docs/ru/springsecurity/practice/setup-server-authorization.md new file mode 100644 index 0000000..28672bc --- /dev/null +++ b/docs/ru/springsecurity/practice/setup-server-authorization.md @@ -0,0 +1,45 @@ +# Настройка авторизации на сервере + +В этой задаче мы настроим авторизацию в вашем приложении, определив правила безопасности с использованием Spring Security. Определяя правила авторизации, вы можете контролировать доступ к определенным путям и конечным точкам в вашем приложении. + +## Цель + +Настроить правила авторизации для ограничения или разрешения доступа к различным путям и конечным точкам в приложении. + +## Шаги + +1. **Добавление конфигурации безопасности:** + + В классе `WebSecurityConfig` добавьте метод `configure(HttpSecurity http)`, чтобы определить правила безопасности для приложения. Мы будем использовать пути и конечные точки, определенные в предыдущей лабораторной работе. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + .requestMatchers("/first").permitAll() + .requestMatchers("/second").permitAll() + .requestMatchers("/third").permitAll() + .requestMatchers("/fourth").permitAll() + .requestMatchers("/addStudent").permitAll() + .requestMatchers("/removeStudent").permitAll() + ); + } + } + ``` + + В этой конфигурации: + - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации. + - Внутри лямбда-выражения мы указываем, какие запросы следует разрешить. + +## Вывод + +Вы успешно настроили правила авторизации в вашем приложении для управления доступом к различным путям и конечным точкам. Определяя конкретные разрешения для каждого пути, вы можете гарантировать, что пользователи смогут получить доступ только к ресурсам, к которым у них есть соответствующие разрешения. + +--- + +# [СЛЕДУЮЩАЯ ЗАДАЧА: Авторизация аутентифицированных пользователей](authorize-server-authenticated.md) diff --git a/docs/srcs/jpa/er-diagram.png b/docs/srcs/jpa/er-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3d47dc42ebaf7c8de0a5c3bf6139078a7499af91 GIT binary patch literal 89446 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%0AqyG7 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 literal 0 HcmV?d00001 diff --git a/docs/srcs/jpa/task-er-diagram.png b/docs/srcs/jpa/task-er-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3dbcc7175ea4c3b483b7a362ef140a6743621d GIT binary patch literal 120020 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%0AK7cxP-d>U!X!OKN#Mv(4BU@`7Ldg6hkzd-qy< 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 %G5Y909=Qn6YzDqW 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�_Bi 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 Date: Tue, 21 May 2024 00:31:33 +0300 Subject: [PATCH 23/40] [Master] Recovered Readme Files --- README-EN.md | 24 ++++++++++++++++++++++++ README.md | 24 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 README-EN.md create mode 100644 README.md diff --git a/README-EN.md b/README-EN.md new file mode 100644 index 0000000..31434b9 --- /dev/null +++ b/README-EN.md @@ -0,0 +1,24 @@ +## Java Web Development Tutorials + +Welcome to the tutorials on Java web development utilizing the Spring framework! These structured tutorials aim to provide comprehensive guidance on various aspects of Java web development through the lens of the Spring framework. Each tutorial is meticulously designed to focus on specific concepts and methodologies, facilitating a robust understanding of web development principles. + +### Tutorials + +1. **Tutorial 1: [Thymeleaf](docs/en/thymeleaf/lab-work.md)** + + The Thymeleaf tutorial offers practical guidance on configuring Thymeleaf within a Spring application. Through this tutorial, participants will engage in activities involving the setup of views, manipulation of variables, and other essential functionalities. + + +2. **Tutorial 2: [Spring Security](docs/en/springsecurity/lab-work.md)** + + This tutorial delves into the intricacies of security mechanisms within Spring applications using Spring Security. Participants will explore configuring authentication and authorization mechanisms, safeguarding paths and resources, implementing custom login forms, and other pertinent security practices. + + +3. **Tutorial 3: [JPA (Java Persistence API)](docs/en/jpa/lab-work.md)** + + The JPA tutorial provides practical guidance on utilizing the Java Persistence API within a Spring application. Participants will learn to interact with databases using JPA, perform CRUD operations, manage entity relationships, and other essential data persistence tasks. + + +4. **Tutorial 4: [Transactions](docs/en/transactions/lab-work.md)** + + The transactions tutorial delves into controlling transactions with various propagation scenarios and isolation levels. Participants will explore transaction management, different isolation levels, and propagation scenarios, providing them with a deep understanding of transaction management in the context of Spring applications. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..018b1ab --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +## Учебные пособия по веб-разработке на Java + +Добро пожаловать на учебные пособия по веб-разработке на Java с использованием фреймворка Spring! Эти структурированные учебные пособия направлены на предоставление всестороннего руководства по различным аспектам веб-разработки на Java через призму фреймворка Spring. Каждое учебное пособие тщательно разработано для акцентирования на конкретных концепциях и методологиях, обеспечивая крепкое понимание принципов веб-разработки. + +### Учебные пособия + +1. **Урок 1: [Thymeleaf](docs/en/thymeleaf/lab-work.md)** + + Учебное пособие по Thymeleaf предлагает практическое руководство по настройке Thymeleaf в приложении Spring. В рамках этого учебного пособия участники будут заниматься заданиями, связанными с настройкой представлений, манипулированием переменными и другими важными функциями. + + +2. **Урок 2: [Spring Security](docs/en/springsecurity/lab-work.md)** + + Это учебное пособие углубляется в тонкости механизмов безопасности в приложениях Spring с использованием Spring Security. Участники изучат настройку механизмов аутентификации и авторизации, защиту путей и ресурсов, реализацию пользовательских форм входа и другие соответствующие практики безопасности. + + +3. **Урок 3: [JPA (Java Persistence API)](docs/en/jpa/lab-work.md)** + + Учебное пособие по JPA предоставляет практическое руководство по использованию Java Persistence API в приложении Spring. Участники узнают, как взаимодействовать с базами данных с использованием JPA, выполнять операции CRUD, управлять отношениями между сущностями и другие важные задачи по сохранению данных. + + +4. **Урок 4: [Транзакции](docs/en/transactions/lab-work.md)** + + Учебное пособие по транзакциям позволяет погрузиться в управление транзакциями с различными сценариями распространения и изоляции. Участники изучат контроль транзакций, различные уровни изоляции и сценарии распространения, что обеспечит им глубокое понимание управления транзакциями в контексте приложений Spring. \ No newline at end of file From 0692176e42fd21eeed748e2cd5844b5887137758 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Tue, 21 May 2024 00:34:15 +0300 Subject: [PATCH 24/40] [Master] Added Missed Lab in Readme --- README-EN.md | 6 +++++- README.md | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README-EN.md b/README-EN.md index 31434b9..9d4b067 100644 --- a/README-EN.md +++ b/README-EN.md @@ -21,4 +21,8 @@ Welcome to the tutorials on Java web development utilizing the Spring framework! 4. **Tutorial 4: [Transactions](docs/en/transactions/lab-work.md)** - The transactions tutorial delves into controlling transactions with various propagation scenarios and isolation levels. Participants will explore transaction management, different isolation levels, and propagation scenarios, providing them with a deep understanding of transaction management in the context of Spring applications. \ No newline at end of file + The transactions tutorial delves into controlling transactions with various propagation scenarios and isolation levels. Participants will explore transaction management, different isolation levels, and propagation scenarios, providing them with a deep understanding of transaction management in the context of Spring applications. + +5. **Tutorial 5: [JMeter](docs/en/jmeter/lab-work.md)** + + The JMeter tutorial series provides comprehensive guidance on using JMeter for load testing and performance analysis of web applications. Participants will learn to set up JMeter, record HTTP requests, create and execute test scenarios, and analyze the test results. diff --git a/README.md b/README.md index 018b1ab..b571701 100644 --- a/README.md +++ b/README.md @@ -21,4 +21,8 @@ 4. **Урок 4: [Транзакции](docs/en/transactions/lab-work.md)** - Учебное пособие по транзакциям позволяет погрузиться в управление транзакциями с различными сценариями распространения и изоляции. Участники изучат контроль транзакций, различные уровни изоляции и сценарии распространения, что обеспечит им глубокое понимание управления транзакциями в контексте приложений Spring. \ No newline at end of file + Учебное пособие по транзакциям позволяет погрузиться в управление транзакциями с различными сценариями распространения и изоляции. Участники изучат контроль транзакций, различные уровни изоляции и сценарии распространения, что обеспечит им глубокое понимание управления транзакциями в контексте приложений Spring. + +5. **Урок 5: [JMeter](docs/ru/jmeter/lab-work.md)** + + Серия уроков по JMeter предоставляет полное руководство по использованию JMeter для тестирования нагрузки и анализа производительности веб-приложений. Участники узнают, как настроить JMeter, записать HTTP-запросы, создать и выполнить тестовые сценарии, а также проанализировать результаты тестирования. From 88b13e801601e4977ba0e096892a7b3a4c3a5294 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Fri, 24 May 2024 19:54:30 +0300 Subject: [PATCH 25/40] [Master] Added Chinese folders --- README-CN.md | 29 +++ docs/cn/jmeter/lab-work.md | 25 +++ .../adding-listeners-and-running-tests.md | 28 +++ .../jmeter/lessons/analyzing-test-results.md | 19 ++ .../configuring-and-using-the-proxy-server.md | 19 ++ ...iguring-browser-to-use-the-proxy-server.md | 17 ++ .../lessons/creating-a-test-scenario.md | 30 +++ .../jmeter/lessons/executing-load-testing.md | 26 +++ docs/cn/jmeter/lessons/first.md | 0 .../introduction-to-jmeter-and-basic-setup.md | 27 +++ .../lessons/organizing-recorded-requests.md | 22 +++ .../lessons/parameterizing-http-requests.md | 15 ++ .../recording-and-managing-http-requests.md | 21 ++ docs/cn/jmeter/lessons/second.md | 0 .../setting-up-http-test-script-recorder.md | 24 +++ docs/cn/jmeter/lessons/third.md | 1 + docs/cn/jpa/lab-work.md | 55 ++++++ .../jpa/practice/creation/characteristics.md | 111 +++++++++++ .../cn/jpa/practice/creation/create-entity.md | 60 ++++++ docs/cn/jpa/practice/creation/fetching.md | 49 +++++ .../cn/jpa/practice/creation/relationships.md | 44 +++++ docs/cn/jpa/practice/dependencies/driver.md | 100 ++++++++++ docs/cn/jpa/practice/dependencies/jpa.md | 57 ++++++ .../practice/interacting/jpa-repository.md | 54 +++++ .../interacting/jpa-repository/create.md | 38 ++++ .../interacting/jpa-repository/delete.md | 41 ++++ .../interacting/jpa-repository/query.md | 43 ++++ .../interacting/jpa-repository/read.md | 42 ++++ .../cn/jpa/practice/interacting/repository.md | 51 +++++ .../practice/interacting/repository/create.md | 46 +++++ .../practice/interacting/repository/delete.md | 47 +++++ .../practice/interacting/repository/query.md | 49 +++++ .../practice/interacting/repository/read.md | 46 +++++ .../practice/interacting/repository/update.md | 46 +++++ docs/cn/springsecurity/lab-work.md | 61 ++++++ .../practice/add-dummy-users.md | 64 ++++++ .../authorize-client-authenticated.md | 0 .../practice/authorize-client-authority.md | 0 .../practice/authorize-client-role.md | 0 .../authorize-server-authenticated.md | 38 ++++ .../practice/authorize-server-authority.md | 39 ++++ .../practice/authorize-server-role.md | 39 ++++ .../practice/base-implementation-user.md | 184 ++++++++++++++++++ .../practice/configure-spring-security.md | 80 ++++++++ .../practice/configure-thymeleaf-security.md | 30 +++ .../practice/create-identity-to-users.md | 61 ++++++ .../practice/custom-login-form.md | 40 ++++ .../practice/password-encryption.md | 81 ++++++++ .../practice/setup-server-authorization.md | 41 ++++ docs/cn/springsecurity/tasks.md | 13 ++ docs/cn/thymeleaf/lab-work.md | 73 +++++++ .../thymeleaf/practice/configure-thymeleaf.md | 119 +++++++++++ .../thymeleaf/practice/create-first-view.md | 63 ++++++ docs/cn/thymeleaf/practice/form-handling.md | 74 +++++++ docs/cn/thymeleaf/practice/forms.md | 120 ++++++++++++ .../practice/fragments-and-layouts.md | 130 +++++++++++++ docs/cn/thymeleaf/practice/iteration.md | 107 ++++++++++ docs/cn/thymeleaf/practice/literals.md | 55 ++++++ docs/cn/thymeleaf/practice/validation.md | 85 ++++++++ .../practice/variables-and-controller.md | 67 +++++++ .../practice/working-with-variables.md | 92 +++++++++ docs/cn/transactions/lab-work.md | 55 ++++++ .../cn/transactions/practice/configuration.md | 40 ++++ .../lessons/basic-transactional-operations.md | 50 +++++ .../lessons/entities-and-repositories.md | 38 ++++ ...nested-and-non-transactional-operations.md | 66 +++++++ .../practice/lessons/transactional-logging.md | 105 ++++++++++ 67 files changed, 3392 insertions(+) create mode 100644 README-CN.md create mode 100644 docs/cn/jmeter/lab-work.md create mode 100644 docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md create mode 100644 docs/cn/jmeter/lessons/analyzing-test-results.md create mode 100644 docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md create mode 100644 docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md create mode 100644 docs/cn/jmeter/lessons/creating-a-test-scenario.md create mode 100644 docs/cn/jmeter/lessons/executing-load-testing.md create mode 100644 docs/cn/jmeter/lessons/first.md create mode 100644 docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md create mode 100644 docs/cn/jmeter/lessons/organizing-recorded-requests.md create mode 100644 docs/cn/jmeter/lessons/parameterizing-http-requests.md create mode 100644 docs/cn/jmeter/lessons/recording-and-managing-http-requests.md create mode 100644 docs/cn/jmeter/lessons/second.md create mode 100644 docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md create mode 100644 docs/cn/jmeter/lessons/third.md create mode 100644 docs/cn/jpa/lab-work.md create mode 100644 docs/cn/jpa/practice/creation/characteristics.md create mode 100644 docs/cn/jpa/practice/creation/create-entity.md create mode 100644 docs/cn/jpa/practice/creation/fetching.md create mode 100644 docs/cn/jpa/practice/creation/relationships.md create mode 100644 docs/cn/jpa/practice/dependencies/driver.md create mode 100644 docs/cn/jpa/practice/dependencies/jpa.md create mode 100644 docs/cn/jpa/practice/interacting/jpa-repository.md create mode 100644 docs/cn/jpa/practice/interacting/jpa-repository/create.md create mode 100644 docs/cn/jpa/practice/interacting/jpa-repository/delete.md create mode 100644 docs/cn/jpa/practice/interacting/jpa-repository/query.md create mode 100644 docs/cn/jpa/practice/interacting/jpa-repository/read.md create mode 100644 docs/cn/jpa/practice/interacting/repository.md create mode 100644 docs/cn/jpa/practice/interacting/repository/create.md create mode 100644 docs/cn/jpa/practice/interacting/repository/delete.md create mode 100644 docs/cn/jpa/practice/interacting/repository/query.md create mode 100644 docs/cn/jpa/practice/interacting/repository/read.md create mode 100644 docs/cn/jpa/practice/interacting/repository/update.md create mode 100644 docs/cn/springsecurity/lab-work.md create mode 100644 docs/cn/springsecurity/practice/add-dummy-users.md create mode 100644 docs/cn/springsecurity/practice/authorize-client-authenticated.md create mode 100644 docs/cn/springsecurity/practice/authorize-client-authority.md create mode 100644 docs/cn/springsecurity/practice/authorize-client-role.md create mode 100644 docs/cn/springsecurity/practice/authorize-server-authenticated.md create mode 100644 docs/cn/springsecurity/practice/authorize-server-authority.md create mode 100644 docs/cn/springsecurity/practice/authorize-server-role.md create mode 100644 docs/cn/springsecurity/practice/base-implementation-user.md create mode 100644 docs/cn/springsecurity/practice/configure-spring-security.md create mode 100644 docs/cn/springsecurity/practice/configure-thymeleaf-security.md create mode 100644 docs/cn/springsecurity/practice/create-identity-to-users.md create mode 100644 docs/cn/springsecurity/practice/custom-login-form.md create mode 100644 docs/cn/springsecurity/practice/password-encryption.md create mode 100644 docs/cn/springsecurity/practice/setup-server-authorization.md create mode 100644 docs/cn/springsecurity/tasks.md create mode 100644 docs/cn/thymeleaf/lab-work.md create mode 100644 docs/cn/thymeleaf/practice/configure-thymeleaf.md create mode 100644 docs/cn/thymeleaf/practice/create-first-view.md create mode 100644 docs/cn/thymeleaf/practice/form-handling.md create mode 100644 docs/cn/thymeleaf/practice/forms.md create mode 100644 docs/cn/thymeleaf/practice/fragments-and-layouts.md create mode 100644 docs/cn/thymeleaf/practice/iteration.md create mode 100644 docs/cn/thymeleaf/practice/literals.md create mode 100644 docs/cn/thymeleaf/practice/validation.md create mode 100644 docs/cn/thymeleaf/practice/variables-and-controller.md create mode 100644 docs/cn/thymeleaf/practice/working-with-variables.md create mode 100644 docs/cn/transactions/lab-work.md create mode 100644 docs/cn/transactions/practice/configuration.md create mode 100644 docs/cn/transactions/practice/lessons/basic-transactional-operations.md create mode 100644 docs/cn/transactions/practice/lessons/entities-and-repositories.md create mode 100644 docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md create mode 100644 docs/cn/transactions/practice/lessons/transactional-logging.md diff --git a/README-CN.md b/README-CN.md new file mode 100644 index 0000000..7faf79d --- /dev/null +++ b/README-CN.md @@ -0,0 +1,29 @@ +## 使用Java进行Web开发的教程 + +欢迎使用Spring框架进行Java Web开发的教程!这些结构化的教程旨在提供全面的指导,涵盖Java Web开发的各个方面,侧重于Spring框架。每个教程都精心设计,重点介绍特定的概念和方法,确保对Web开发原理的牢固理解。 + +### 教程 + +1. **第1课: [Thymeleaf](docs/en/thymeleaf/lab-work.md)** + + Thymeleaf教程提供了在Spring应用中设置Thymeleaf的实用指南。在本教程中,参与者将进行与视图设置、变量操作和其他重要功能相关的任务。 + +2. **第2课: [Spring Security](docs/en/springsecurity/lab-work.md)** + + 本教程深入探讨了在Spring应用中使用Spring Security的安全机制。参与者将学习如何设置认证和授权机制,保护路径和资源,实现自定义登录表单以及其他相关的安全实践。 + +3. **第3课: [JPA (Java Persistence API)](docs/en/jpa/lab-work.md)** + + JPA教程提供了在Spring应用中使用Java Persistence API的实用指南。参与者将学习如何使用JPA与数据库交互,执行CRUD操作,管理实体之间的关系以及其他重要的数据持久化任务。 + +4. **第4课: [事务](docs/en/transactions/lab-work.md)** + + 本教程深入探讨了不同传播和隔离场景下的事务管理。参与者将学习事务控制、不同的隔离级别和传播场景,从而深入理解在Spring应用中管理事务。 + +5. **第5课: [JMeter](docs/ru/jmeter/lab-work.md)** + + JMeter系列教程提供了使用JMeter进行负载测试和性能分析的完整指南。参与者将学习如何设置JMeter、记录HTTP请求、创建和执行测试场景,以及分析测试结果。 + +--- + +translate to Chinese language \ No newline at end of file diff --git a/docs/cn/jmeter/lab-work.md b/docs/cn/jmeter/lab-work.md new file mode 100644 index 0000000..7758ec7 --- /dev/null +++ b/docs/cn/jmeter/lab-work.md @@ -0,0 +1,25 @@ +# JMeter Lab Work + +Welcome to the JMeter Lab Work! The goal of this series of tasks is to help you practice and master JMeter, a powerful tool for performance testing and measuring the performance of web applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of using JMeter for load testing, recording, and analyzing HTTP requests. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in using JMeter for performance testing. JMeter is widely utilized for testing the performance of web applications and services, and through these tasks, you will gain valuable insights into its configuration, scripting, recording, and analysis features. + +## Practice Tasks + +- [Lesson 1: Introduction to JMeter and Basic Setup](lessons/introduction-to-jmeter-and-basic-setup.md) +- [Lesson 2: Setting Up HTTP(S) Test Script Recorder](lessons/setting-up-http-test-script-recorder.md) +- [Lesson 3: Configuring and Using the Proxy Server](lessons/configuring-and-using-the-proxy-server.md) +- [Lesson 4: Configuring Browser to Use the Proxy Server](lessons/configuring-browser-to-use-the-proxy-server.md) +- [Lesson 5: Recording and Managing HTTP Requests](lessons/recording-and-managing-http-requests.md) +- [Lesson 6: Organizing Recorded Requests](lessons/organizing-recorded-requests.md) +- [Lesson 7: Creating a Test Scenario](lessons/creating-a-test-scenario.md) +- [Lesson 8: Parameterizing HTTP Requests](lessons/parameterizing-http-requests.md) +- [Lesson 9: Adding Listeners and Running Tests](lessons/adding-listeners-and-running-tests.md) +- [Lesson 10: Executing Load Testing](lessons/executing-load-testing.md) +- [Lesson 11: Analyzing Test Results](lessons/analyzing-test-results.md) + +## Lab Work Tasks + +idk :D diff --git a/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md b/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md new file mode 100644 index 0000000..de68c1a --- /dev/null +++ b/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md @@ -0,0 +1,28 @@ +# Lesson 9: Adding Listeners and Running Tests + +## Goal +The goal of this lesson is to add listeners to view test results and to run the test scenarios in JMeter. + +## Steps + +### 9.1. Adding a Listener +1. **View Results Tree** + - Right-click on the **Thread Group**. + - Select **Add > Listener > View Results Tree**. + +### 9.2. Saving the Test Plan +1. **Saving** + - Click on the **Test Plan** node. + - Go to **File > Save Test Plan as**. + - Choose a location, enter a filename, and save the test plan. + +### 9.3. Running the Test Scenario +1. **Execution** + - Click **Run > Start** to begin the test. +
![run-test-scenraio-button.png](../../../srcs/jmeter/run-test-scenraio-button.png) + - View the results in the **View Results Tree** listener. + - Ensure there are no errors in the test results. + +--- + +# [Next: Executing Load Testing](executing-load-testing.md) diff --git a/docs/cn/jmeter/lessons/analyzing-test-results.md b/docs/cn/jmeter/lessons/analyzing-test-results.md new file mode 100644 index 0000000..17ce637 --- /dev/null +++ b/docs/cn/jmeter/lessons/analyzing-test-results.md @@ -0,0 +1,19 @@ +# Lesson 11: Analyzing Test Results + +## Goal +The goal of this lesson is to analyze test results using electronic spreadsheets and to prepare for subsequent test runs in JMeter. + +## Steps + +### 11.1. Utilizing Electronic Spreadsheets +1. **Exporting and Analyzing Data** + - Export the results from the **Aggregate Report** listener to a CSV file. + - Use a spreadsheet application (e.g., Excel) to analyze the average response times and other metrics. + +### 11.2. Clearing Statistics for Subsequent Runs +1. **Clearing Data** + - Before running a new test, clear the previous results by selecting **Run > Clear All**. + +--- + +# [Next: Tasks](../lab-work.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md b/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md new file mode 100644 index 0000000..00f6a33 --- /dev/null +++ b/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md @@ -0,0 +1,19 @@ +# Lesson 3: Configuring and Using the Proxy Server + +## Goal +The goal of this lesson is to configure the Proxy Server in JMeter and demonstrate how to use it for recording HTTP(S) requests. + +## Steps + +### 3.1. Configuring the Proxy Server +1. **Setting Port and URL Patterns** + - In the **HTTP(S) Test Script Recorder** window, set the **Port** field to `9090`. + - In the **URL Patterns to Exclude** section, click **Add** and enter patterns such as `.*\.gif`, `.*\.js`, and `.*\.css`. +
![setting-port-and-url-pattern.png](../../../srcs/jmeter/setting-port-and-url-pattern.png) +### 3.2. Starting the Proxy Server +1. **Starting Recording** + - Click the **Start** button at the bottom of the **HTTP(S) Test Script Recorder** window. +
![start-recording-button.png](../../../srcs/jmeter/start-recording-button.png) +--- + +# [Next: Recording and Managing HTTP Requests](recording-and-managing-http-requests.md) diff --git a/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md b/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md new file mode 100644 index 0000000..977b400 --- /dev/null +++ b/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md @@ -0,0 +1,17 @@ +# Lesson 4: Configuring Browser to Use the Proxy Server + +## Goal +The goal of this lesson is to configure your browser to use the Proxy Server set up in JMeter for recording HTTP(S) requests. + +## Steps + +### 4.1. Configuring Browser Settings +1. **Setting Up Proxy in Browser** + - Open your browser settings and navigate to the proxy settings. + - Set the proxy server address to `localhost` and the port to `9090`. + - Save the settings and restart the browser if necessary. + +--- + +# [Next: Organizing Recorded Requests](organizing-recorded-requests.md) + diff --git a/docs/cn/jmeter/lessons/creating-a-test-scenario.md b/docs/cn/jmeter/lessons/creating-a-test-scenario.md new file mode 100644 index 0000000..0ec5dfd --- /dev/null +++ b/docs/cn/jmeter/lessons/creating-a-test-scenario.md @@ -0,0 +1,30 @@ +# Lesson 7: Creating a Test Scenario + +## Goal +The goal of this lesson is to create a test scenario by organizing recorded requests and adding dynamic value extraction in JMeter. + +## Steps + +### 7.1. Adding a Simple Controller +1. **Organizing Requests** + - Right-click on the **Thread Group**. +
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) + - Select **Add > Logic Controller > Simple Controller**. +
![new-simple-controller-button.png](../../../srcs/jmeter/new-simple-controller-button.png) + - Rename the Simple Controller to match the function you are testing. + - Drag and drop all recorded HTTP requests from the **Recording Controller** to the **Simple Controller**. + +### 7.2. Adding a Regular Expression Extractor +1. **Dynamic Value Extraction** + - Right-click on the HTTP request that requires a dynamic value (e.g., `javax.faces.ViewState`). + - Select **Add > Post Processors > Regular Expression Extractor**. +
![new-regular-expression-button.png](../../../srcs/jmeter/new-regular-expression-button.png) + - Configure the extractor: + - **Reference Name:** `jsfViewState` + - **Regular Expression:** `![regular-expression-extractor-fields.png](../../../srcs/jmeter/regular-expression-extractor-fields.png) +--- + +# [Next: Parameterizing HTTP Requests](parameterizing-http-requests.md) diff --git a/docs/cn/jmeter/lessons/executing-load-testing.md b/docs/cn/jmeter/lessons/executing-load-testing.md new file mode 100644 index 0000000..165d7e3 --- /dev/null +++ b/docs/cn/jmeter/lessons/executing-load-testing.md @@ -0,0 +1,26 @@ +# Lesson 10: Executing Load Testing + +## Goal +The goal of this lesson is to configure and execute load testing in JMeter. + +## Steps + +### 10.1. Adjusting Thread Settings +1. **Load Testing Configuration** + - Click on the **Thread Group**. + - Set the **Number of Threads** (users), **Ramp-Up Period** (seconds), and **Loop Count** as needed for your load test. + +### 10.2. Adding an Aggregate Report Listener +1. **Summary Report** + - Right-click on the **Simple Controller**. + - Select **Add > Listener > Aggregate Report**. + - Disable the **View Results Tree** listener to improve performance during load testing. + +### 10.3. Running the Load Test +1. **Execution** + - Click **Run > Start** to begin the load test. + - View the summarized results in the **Aggregate Report** listener. + +--- + +# [Next: Analyzing Test Results](analyzing-test-results.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/first.md b/docs/cn/jmeter/lessons/first.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md b/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md new file mode 100644 index 0000000..241ab1e --- /dev/null +++ b/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md @@ -0,0 +1,27 @@ +# Lesson 1: Introduction to JMeter and Basic Setup + +## Goal +The goal of this lesson is to introduce JMeter and guide you through the basic setup process, including starting JMeter and adding a Thread Group to your Test Plan. + +## Steps + +### 1.1. Starting JMeter + +![jmeter-site.png](../../../srcs/jmeter/site.png) +1. **Download and Install JMeter** + - Visit the [official JMeter website](https://jmeter.apache.org/download_jmeter.cgi) and download the latest version. + - Extract the downloaded archive. + - Navigate to the `bin` directory and start JMeter by running the `jmeter.bat` file (Windows) or `jmeter.sh` (macOS/Linux). + +### 1.2. Adding a Thread Group +![interface.png](../../../srcs/jmeter/interface.png) +1. **Creating a Test Plan** + - Open JMeter. + - Right-click on the **Test Plan** node. +
![test-plan.png](../../../srcs/jmeter/test-plan.png) + + - Select **Add > Threads (Users) > Thread Group**. +
![test-plan.png](../../../srcs/jmeter/thread-group.png) + +--- +# [Next: Setting Up HTTP Test Script Recorder](setting-up-http-test-script-recorder.md) diff --git a/docs/cn/jmeter/lessons/organizing-recorded-requests.md b/docs/cn/jmeter/lessons/organizing-recorded-requests.md new file mode 100644 index 0000000..a914890 --- /dev/null +++ b/docs/cn/jmeter/lessons/organizing-recorded-requests.md @@ -0,0 +1,22 @@ +# Lesson 6: Organizing Recorded Requests + +## Goal +The goal of this lesson is to organize the recorded HTTP requests in JMeter for better management and test execution. + +## Steps + +### 6.1. Disabling the Recording Controller +1. **Disabling** + - Right-click on the **Recording Controller** in JMeter. +
![recording-controller-button.png](../../../srcs/jmeter/recording-controller-button.png) + - Select **Disable** to stop capturing further requests. +
![disable-element.png](../../../srcs/jmeter/disable-element.png) +### 6.2. Adding an HTTP Cookie Manager +1. **Session Management** + - Right-click on the **Thread Group**. +
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) + - Select **Add > Config Element > HTTP Cookie Manager**. +
![new-http-cookie-manager-button.png](../../../srcs/jmeter/new-http-cookie-manager-button.png) +--- + +# [Next: Creating a Test Scenario](creating-a-test-scenario.md) diff --git a/docs/cn/jmeter/lessons/parameterizing-http-requests.md b/docs/cn/jmeter/lessons/parameterizing-http-requests.md new file mode 100644 index 0000000..a2daa62 --- /dev/null +++ b/docs/cn/jmeter/lessons/parameterizing-http-requests.md @@ -0,0 +1,15 @@ +# Lesson 8: Parameterizing HTTP Requests + +## Goal +The goal of this lesson is to parameterize HTTP requests in JMeter using extracted dynamic values. + +## Steps + +### 8.1. Modifying HTTP Requests +1. **Using Extracted Values** + - In each HTTP request that uses the parameter `javax.faces.ViewState`, replace the value with `${jsfViewState}`. + - Ensure the **Encode** checkbox is selected if needed. + +--- + +# [Next: Adding Listeners and Running Tests](adding-listeners-and-running-tests.md) diff --git a/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md b/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md new file mode 100644 index 0000000..d67bc0a --- /dev/null +++ b/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md @@ -0,0 +1,21 @@ +# Lesson 5: Recording and Managing HTTP Requests + +## Goal +The goal of this lesson is to record HTTP requests made by navigating through a web application and manage the recorded requests in JMeter. + +## Steps + +### 5.1. Recording HTTP Requests +1. **Navigating Through the Application** + - Navigate through your web application as you normally would. The HTTP requests will be recorded by JMeter. + +### 5.2. Stopping the Recording +1. **Stopping Proxy Server** + - Return to JMeter and click the **Stop** button in the **HTTP(S) Test Script Recorder** window. +
![stop-recording-button.png](../../../srcs/jmeter/stop-recording-button.png) + - Disable the proxy settings in your browser to revert to direct internet access. + +--- + +# [Next: Organizing Recorded Requests](organizing-recorded-requests.md) + diff --git a/docs/cn/jmeter/lessons/second.md b/docs/cn/jmeter/lessons/second.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md b/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md new file mode 100644 index 0000000..008f569 --- /dev/null +++ b/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md @@ -0,0 +1,24 @@ +# Lesson 2: Setting Up HTTP(S) Test Script Recorder + +## Goal +The goal of this lesson is to guide you through setting up the HTTP(S) Test Script Recorder in JMeter, including adding a Recording Controller and configuring a Proxy Server. + +## Steps + +### 2.1. Adding a Recording Controller +1. **Adding to Thread Group** + - Right-click on the **Thread Group**. +
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) + + - Select **Add > Logic Controller > Recording Controller**. +
![recording-controller-button.png](../../../srcs/jmeter/recording-controller-button.png) + +### 2.2. Adding a Proxy Server +1. **Configuring Proxy** + - Right-click on the **Workbench** node. +
![test-plan.png](../../../srcs/jmeter/test-plan.png) + - Select **Add > Non-Test Elements > HTTP(S) Test Script Recorder**. +
![test-script-recorder.png](../../../srcs/jmeter/test-script-recorder.png) +--- + +# [Next: Configuring and Using the Proxy Server](configuring-and-using-the-proxy-server.md) diff --git a/docs/cn/jmeter/lessons/third.md b/docs/cn/jmeter/lessons/third.md new file mode 100644 index 0000000..945c9b4 --- /dev/null +++ b/docs/cn/jmeter/lessons/third.md @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/docs/cn/jpa/lab-work.md b/docs/cn/jpa/lab-work.md new file mode 100644 index 0000000..c30081a --- /dev/null +++ b/docs/cn/jpa/lab-work.md @@ -0,0 +1,55 @@ +# Lab Work: JPA (Java Persistence API) + +Welcome to the Spring Boot with JPA Lab Work! In this lab work, you will practice various tasks related to setting up a Spring Boot project with JPA (Java Persistence API). + +## Goal of the Lab Work + +The goal of this lab work is to provide hands-on experience with key concepts and tasks involved in working with Spring Boot and JPA. By completing the practice tasks, you will gain proficiency in setting up dependencies, defining entity characteristics, managing relationships between entities, and interacting with the database using JpaRepository. + +## Practice Tasks + +1. **Database Dependencies Setup** + - [Database Driver Setup](practice/dependencies/driver.md) + - [Spring Boot and JPA Dependencies](practice/dependencies/jpa.md) + +2. **Entity Creation, Characteristics, Relationships and Fetching Strategies** + - [Entity Creation](practice/creation/create-entity.md) + - [Entity Characteristics Definition](practice/creation/characteristics.md) + - [Managing Relationships](practice/creation/relationships.md) + - [Fetching Strategies](practice/creation/fetching.md) + +3. **Interacting with Custom Repository** + - [Create Record](practice/interacting/repository/create.md) + - [Read Record](practice/interacting/repository/read.md) + - [Update Record](practice/interacting/repository/update.md) + - [Delete Record](practice/interacting/repository/delete.md) + - [Custom Queries](practice/interacting/repository/query.md) + +4. **Interacting with JPA Repository** + - [Create Record](practice/interacting/jpa-repository/create.md) + - [Read Record](practice/interacting/jpa-repository/read.md) + - [Delete Record](practice/interacting/jpa-repository/delete.md) + - [Custom Queries](practice/interacting/jpa-repository/query.md) + + +## Lab Work Tasks + +1. Set up database dependencies for PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. + +2. Implement the next Entity-Relationships Diagram: +![img.png](../../srcs/jpa/task-er-diagram.png) + + 1. Define entity characteristics for Student, Enrollment, and Course entities based on the Entity Relationships diagram. + + 2. Create entity classes for Student, Enrollment, and Course according to the defined characteristics. + + 3. Implement fetching strategies for efficient data retrieval to optimize database interactions. + + 4. Manage relationships between entities such as Student, Enrollment, and Course by establishing appropriate associations and mappings. + + 5. Interact with the database by creating methods for CRUD operations using the Repository layer and EntityManager in at least two repositories. + + 6. Interact with the database by creating methods for CRUD operations using JpaRepository in at least two repositories. + + 7. Implement custom queries to perform advanced data retrieval and manipulation operations as required by the application's business logic. + diff --git a/docs/cn/jpa/practice/creation/characteristics.md b/docs/cn/jpa/practice/creation/characteristics.md new file mode 100644 index 0000000..0297f7a --- /dev/null +++ b/docs/cn/jpa/practice/creation/characteristics.md @@ -0,0 +1,111 @@ +# Defining Entity Characteristics + +## Introduction + +This guide focuses on defining entity columns or characteristics in a Spring Boot project using JPA (Java Persistence API). + +## Goal +The goal of this guide is to provide clear instructions for defining the characteristics of entities in a Spring Boot project with JPA, utilizing annotations to enforce constraints and behaviors for each attribute. + + +## Entity Characteristics + +### Student Entity Characteristics: +- `id` (UUID): Primary key for the entity. +- `name` (String): Name of the student (must not be blank). +- `email` (String): Email address of the student (must be a valid email address). +- `major` (String): Major or field of study of the student (must not be blank). +- `year` (int): Year of study for the student (must not be null). +- `international` (boolean): Indicates if the student is international (must not be null). + +### Define `id` Attribute + +Add the `id` attribute to the `Student` class. This attribute will serve as the primary key for the entity. + +```java +@Id +@GeneratedValue(strategy = GenerationType.AUTO) +private UUID id; +``` + +- `@Id`: Indicates that this field is the primary key for the entity. +- `@GeneratedValue`: Specifies the strategy for generating primary key values automatically. + +### Define `name` Attribute + +Add the `name` attribute to the `Student` class. This attribute represents the name of the student and must not be blank. + +```java +@NotBlank +private String name; +``` + +- `@NotBlank`: Ensures that the value of `name` is not null and contains at least one non-whitespace character. + +### Define `email` Attribute + +Add the `email` attribute to the `Student` class. This attribute represents the email address of the student and must be a valid email address. + +```java +@NotBlank +@Email +private String email; +``` + +- `@Email`: Validates that the value of `email` is a valid email address. + +### Define `major` Attribute + +Add the `major` attribute to the `Student` class. This attribute represents the major or field of study of the student and must not be blank. + +```java +@NotBlank +private String major; +``` + +- `@NotBlank`: Ensures that the value of `major` is not null and contains at least one non-whitespace character. + +### Define `year` Attribute + +Add the `year` attribute to the `Student` class. This attribute represents the year of study for the student and must not be null. + +```java +@NotNull +private int year; +``` + +- `@NotNull`: Ensures that the value of `year` is not null. + +### Define `international` Attribute + +Add the `international` attribute to the `Student` class. This attribute indicates whether the student is international and must not be null. + +```java +@NotNull +private boolean international; +``` + +- `@NotNull`: Ensures that the value of `international` is not null. + + +You can repeat the previous steps to create entity characteristics for the `Course` and `Enrollment` entities, ensuring appropriate annotations are applied to each attribute. + +### Enrollment Entity Characteristics: + +- `id` (UUID): Primary key for the entity. +- `enrollmentDate` (Date): Date of enrollment. +- `grade` (int): Grade achieved in the course. + +### Course Entity Characteristics: + +- `id` (UUID): Primary key for the entity. +- `name` (String): Name of the course. +- `instructor` (String): Name of the course instructor. +- `schedule` (String): Schedule details of the course. +- `capacity` (int): Maximum capacity of the course. +- `online` (boolean): Indicates if the course is online. +- `startDate` (Date): Start date of the course. + +--- + +# [Next: Managing Relationships](relationships.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/create-entity.md b/docs/cn/jpa/practice/creation/create-entity.md new file mode 100644 index 0000000..851531f --- /dev/null +++ b/docs/cn/jpa/practice/creation/create-entity.md @@ -0,0 +1,60 @@ +# Creating Entities + +## Introduction + +This guide focuses on creating entities in a Spring Boot project using JPA (Java Persistence API). It provides step-by-step instructions for setting up the folder structure and creating entity classes. + +## Goal + +The goal of this guide is to demonstrate how to create entity classes in a Spring Boot project, following best practices and utilizing JPA for data persistence. + +## Folder Structure + +To ensure a well-organized project, it's essential to establish a proper folder structure. Follow these guidelines: + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + └── entity/ + ├── Student.java + ├── Enrollment.java + └── Course.java + +``` + +In this structure: +- The `src/main/java` directory contains your Java source files. +- The `com/example/demo/entity` directory is where you'll create your entity classes. + +## Creating Entity Classes + +To create entity classes, follow these steps: + +1. Navigate to the `com/example/demo/entity` directory in your project. +2. Create a new Java class file for each entity. You can repeat the following steps for each entity (e.g., Student, Enrollment, Course). +3. Define your entity class with the `@Entity` annotation. + +### Example: + +```java +package com.example.demo.entity; + +import javax.persistence.Entity; + +@Entity +public class Student { + +} +``` + +The `@Entity` annotation indicates that this class is a JPA entity. + +Repeat the above steps to create `Enrollment` and `Course` entity classes. + +--- + +# [Next: Entity Characteristics Definition](characteristics.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/fetching.md b/docs/cn/jpa/practice/creation/fetching.md new file mode 100644 index 0000000..de11305 --- /dev/null +++ b/docs/cn/jpa/practice/creation/fetching.md @@ -0,0 +1,49 @@ +Understood. Here's the revised document with the code combined with the scenario: + +--- + +# Fetching Strategies in Spring Boot with JPA: Understanding Lazy and Eager Loading + +## Introduction + +This guide explores the fetching strategies in a Spring Boot project with JPA (Java Persistence API). Specifically, we will delve into the concepts of Lazy and Eager loading and how they are applied in entity relationships. + +## Goal + +The goal of this guide is to provide a comprehensive understanding of fetching strategies in JPA. By the end of this guide, you will comprehend when to use Lazy and Eager loading and how to implement them in your application. + +## Fetching Strategies + +### Scenario + +In our entity relationships, we have a One-to-Many relationship between the `Student` entity and the `Enrollment` entity. Similarly, there is a One-to-Many relationship between the `Course` entity and the `Enrollment` entity. + +#### Student Entity + +In the `Student` entity, we have a One-to-Many relationship with the `Enrollment` entity. Each student can have multiple enrollments. + +To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "student"` in the `Student` entity. Here, we have a choice between Lazy and Eager loading strategies for fetching the associated enrollments. + +```java +@OneToMany(mappedBy = "student", fetch = FetchType.EAGER, cascade = CascadeType.ALL) +private List enrollments; +``` + +We opt for Eager loading (`FetchType.EAGER`) in this scenario. Since we typically expect to access all enrollments of a student together, Eager loading ensures that all enrollments are fetched immediately when loading the student. + +#### Course Entity + +Similarly, in the `Course` entity, we also have a One-to-Many relationship with the `Enrollment` entity. Each course can have multiple enrollments. + +To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "course"` in the `Course` entity. Here, we have another choice between Lazy and Eager loading strategies for fetching the associated enrollments. + +```java +@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL) +private List enrollments; +``` + +We opt for Lazy loading (`FetchType.LAZY`) in this scenario. Since we may not always need to access all enrollments of a course, Lazy loading ensures that enrollments are fetched only when explicitly requested. + +--- + +# [Next: Create Repository](../interacting/repository.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/relationships.md b/docs/cn/jpa/practice/creation/relationships.md new file mode 100644 index 0000000..e7cdd1b --- /dev/null +++ b/docs/cn/jpa/practice/creation/relationships.md @@ -0,0 +1,44 @@ +# Defining Entity Relationships + +## Introduction + +This guide delves into understanding and implementing relationships between entities in a Spring Boot project using JPA (Java Persistence API). Specifically, we will explore the relationship between the `Enrollment` entity and its associated entities `Student` and `Course`. + +## Goal + +The goal of this guide is to provide clear instructions for defining and understanding entity relationships in a Spring Boot project with JPA. By the end of this guide, you will comprehend how to establish associations between entities and implement them in your application. + +## Entity Associations + +![img.png](../../../../srcs/jpa/er-diagram.png) +### Enrollment Entity Characteristics: + +- `id` (UUID): Primary key for the entity. +- `student` (Student): Student associated with the enrollment. +- `course` (Course): Course associated with the enrollment. +- `enrollmentDate` (Date): Date of enrollment. +- `grade` (int): Grade achieved in the course. + +#### Student Relationship + +The relationship between the `Enrollment` entity and the `Student` entity represents a scenario where a student enrolls in a course. This is a Many-to-One relationship, where many enrollments can be associated with one student. To establish this relationship, annotate the `student` attribute in the `Enrollment` entity with `@ManyToOne`. + +```java +@ManyToOne +@JoinColumn(name = "student_id") +private Student student; +``` + +#### Course Relationship + +Similarly, the relationship between the `Enrollment` entity and the `Course` entity signifies a scenario where a course is enrolled by multiple students. This is also a Many-to-One relationship, where many enrollments can be associated with one course. Annotate the `course` attribute in the `Enrollment` entity with `@ManyToOne`. + +```java +@ManyToOne +@JoinColumn(name = "course_id") +private Course course; +``` + +--- + +# [Next: Fetching Strategies](fetching.md) diff --git a/docs/cn/jpa/practice/dependencies/driver.md b/docs/cn/jpa/practice/dependencies/driver.md new file mode 100644 index 0000000..928b2ab --- /dev/null +++ b/docs/cn/jpa/practice/dependencies/driver.md @@ -0,0 +1,100 @@ +# JPA: Setup Dependencies + +## Introduction + +This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include database drivers for various databases such as PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. By following this guide, you will configure all the required dependencies to establish connections with these databases in your Spring Boot application. + +## Goal +The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on database drivers for different databases. + +## Setup Dependencies + +### Database Drivers + +To connect to different databases in your Spring Boot application, include the appropriate database drivers. + +#### PostgreSQL + +**For Gradle:** +```groovy +implementation "org.postgresql:postgresql" +``` + +**For Maven:** +```xml + + org.postgresql + postgresql + INSERT_VERSION_HERE + +``` + +#### MySQL + +**For Gradle:** +```groovy +implementation "mysql:mysql-connector-java" +``` + +**For Maven:** +```xml + + mysql + mysql-connector-java + INSERT_VERSION_HERE + +``` + +#### Oracle Database Driver + +**For Gradle:** +```groovy +implementation 'com.oracle.database.jdbc:ojdbc8' +``` + +**For Maven:** +```xml + + com.oracle.database.jdbc + ojdbc8 + +``` + +#### MongoDB Driver (MongoDB Java Driver) + +**For Gradle:** +```groovy +implementation 'org.mongodb:mongodb-driver-sync:4.4.3' +``` + +**For Maven:** +```xml + + org.mongodb + mongodb-driver-sync + 4.4.3 + +``` + +#### Microsoft SQL Server JDBC Driver + +**For Gradle:** +```groovy +implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' +``` + +**For Maven:** +```xml + + com.microsoft.sqlserver + mssql-jdbc + 9.4.0.jre11 + +``` + +These dependencies facilitate database connectivity. + +--- + +# [Next: Spring Boot and JPA Dependencies](jpa.md) + diff --git a/docs/cn/jpa/practice/dependencies/jpa.md b/docs/cn/jpa/practice/dependencies/jpa.md new file mode 100644 index 0000000..ec67ad5 --- /dev/null +++ b/docs/cn/jpa/practice/dependencies/jpa.md @@ -0,0 +1,57 @@ +# JPA: Setup Dependencies + +## Introduction + +This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. + +## Goal + +The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. + +## Setup Dependencies + +### Spring Boot Starter JDBC + +To enable JDBC support in your Spring Boot application: + +#### Gradle + +```groovy +implementation "org.springframework.boot:spring-boot-starter-jdbc" +``` + +#### Maven + +```xml + + org.springframework.boot + spring-boot-starter-jdbc + +``` + +This dependency provides auto-configuration for JDBC-based data access. + +### Spring Boot Starter Data JPA + +To include support for JPA (Java Persistence API) in your Spring Boot application: + +#### Gradle + +```groovy +implementation "org.springframework.boot:spring-boot-starter-data-jpa" +``` + +#### Maven + +```xml + + org.springframework.boot + spring-boot-starter-data-jpa + +``` + +This dependency simplifies the setup of JPA-based repositories and provides default configurations for Hibernate. + +--- + +# [Next: Entity Creation](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository.md b/docs/cn/jpa/practice/interacting/jpa-repository.md new file mode 100644 index 0000000..e81961e --- /dev/null +++ b/docs/cn/jpa/practice/interacting/jpa-repository.md @@ -0,0 +1,54 @@ +# Creating JpaRepository + +## Introduction + +This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API) using JpaRepository. + +## Goal + +The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository and service classes for the `Course` entity. + +## Folder Structure + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + ├── data/ + │ └── entities/ + │ ├── Student.java + │ ├── Enrollment.java + │ └── Course.java + └── repository/ + ├── StudentRepository.java + └── CourseRepository.java + +``` +## Repository Class + +### CourseRepository.java + +```java +package com.yourcompany.yourproject.repository; + +import com.yourcompany.yourproject.model.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CourseRepository extends JpaRepository { + // Add repository methods for course entity +} +``` + + +The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. + + +--- + +# [Next: Create Record](jpa-repository/create.md) + diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/create.md b/docs/cn/jpa/practice/interacting/jpa-repository/create.md new file mode 100644 index 0000000..9bcf784 --- /dev/null +++ b/docs/cn/jpa/practice/interacting/jpa-repository/create.md @@ -0,0 +1,38 @@ +# Creating Records in a Table Using JpaRepository + +## Introduction + +This guide demonstrates how to create records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of creating records in a table by implementing a method within the `CourseRepository` interface using JpaRepository. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.UUID; + +@Repository +public interface CourseRepository extends JpaRepository { + + Course save(Course course); +} +``` + +### Explanation + +The `save(Course course)` method provided by JpaRepository allows us to persist a new record in the `Course` table. + +By invoking this method and passing a `Course` object as a parameter, JpaRepository automatically handles the process of persisting the entity to the database. + +--- + +# [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/delete.md b/docs/cn/jpa/practice/interacting/jpa-repository/delete.md new file mode 100644 index 0000000..b24cfcf --- /dev/null +++ b/docs/cn/jpa/practice/interacting/jpa-repository/delete.md @@ -0,0 +1,41 @@ +# Deleting Records from a Table Using JpaRepository + +## Introduction + +This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `CourseRepository` interface using JpaRepository. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.UUID; + +@Repository +public interface CourseRepository extends JpaRepository { + + void deleteById(UUID id); +} +``` + +## Explanation + +The `deleteById(UUID id)` method signature follows a convention recognized by JpaRepository for deleting records based on their unique identifier. + +- The `delete` keyword indicates that this method is used for deleting data. +- `ById` specifies the criteria for identifying the record to be deleted. In this case, we are targeting a record with a specific ID. + +By adhering to this naming convention, JpaRepository automatically generates the appropriate SQL query behind the scenes to delete the desired record from the database. This simplifies the development process by eliminating the need to write explicit SQL delete statements, allowing developers to focus on defining method signatures that reflect the intended data deletion operations. + +--- + +# [Next: Custom Query](query.md) diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/query.md b/docs/cn/jpa/practice/interacting/jpa-repository/query.md new file mode 100644 index 0000000..0804429 --- /dev/null +++ b/docs/cn/jpa/practice/interacting/jpa-repository/query.md @@ -0,0 +1,43 @@ +# Custom Query Using JpaRepository + +## Introduction + +This guide demonstrates how to implement custom query methods using the `@Query` annotation in the repository layer of a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of creating custom query methods in the repository interface to perform specific database operations tailored to application requirements. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + + @Query("SELECT c FROM Course c WHERE c.instructor = :instructor") + List findCoursesByInstructor(@Param("instructor") String instructor); +} +``` + +### Explanation + +The `@Query` annotation allows us to define custom JPQL (Java Persistence Query Language) queries directly within the repository interface. + +- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` is a JPQL query that selects all courses where the instructor matches the provided value. +- `@Param("instructor")` annotation binds the method parameter `instructor` to the named parameter `:instructor` in the JPQL query. + +By using `@Query`, we can create complex queries tailored to specific data retrieval needs, providing flexibility and control over the database operations. + +--- + +# [Next: Tasks](../../../lab-work.md) diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/read.md b/docs/cn/jpa/practice/interacting/jpa-repository/read.md new file mode 100644 index 0000000..ce7a6b2 --- /dev/null +++ b/docs/cn/jpa/practice/interacting/jpa-repository/read.md @@ -0,0 +1,42 @@ +# Reading Records from a Table Using JpaRepository + +## Introduction + +This guide demonstrates how to retrieve data from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. + +## Goal + +The goal of this guide is to illustrate the process of reading data from a table by implementing a method within the `CourseRepository` interface using JpaRepository. + +## Repository Method + +### CourseRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + + List findCoursesByInstructor(String instructor); +} +``` + +### Explanation + +The `findCoursesByInstructor(String instructor)` method signature follows a specific naming convention recognized by Spring Data JPA. + +- The `find` keyword indicates that this method is used for retrieving data. +- `Courses` represents the entity type we want to retrieve. +- `ByInstructor` specifies the criteria for filtering the results. In this case, we are querying for courses based on the `instructor` attribute. + +By adhering to this naming convention, Spring Data JPA automatically generates the appropriate SQL query behind the scenes to fetch the required data from the database. This simplifies the development process by eliminating the need to write explicit SQL queries, allowing developers to focus on defining method signatures that reflect the desired data retrieval operations. + +--- + +# [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository.md b/docs/cn/jpa/practice/interacting/repository.md new file mode 100644 index 0000000..42cd863 --- /dev/null +++ b/docs/cn/jpa/practice/interacting/repository.md @@ -0,0 +1,51 @@ +# Creating Repository + +## Introduction + +This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository for the `Student` entity. + +## Folder Structure + +``` +src/ +└── main/ + └── java/ + └── com/ + └── example/ + └── demo/ + ├── data/ + │ └── entites/ + │ ├── Student.java + │ ├── Enrollment.java + │ └── Course.java + └── repository/ + └── StudentRepository.java + +``` +## Repository Class + +### StudentRepository.java + +```java +package com.yourcompany.yourproject.repository; + +import com.yourcompany.yourproject.model.Student; +import org.springframework.stereotype.Repository; + +@Repository +public class StudentRepository { + // Add repository methods for student entity +} +``` + + +The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. + + +--- + +# [Next: Create Record](repository/create.md) diff --git a/docs/cn/jpa/practice/interacting/repository/create.md b/docs/cn/jpa/practice/interacting/repository/create.md new file mode 100644 index 0000000..34e92de --- /dev/null +++ b/docs/cn/jpa/practice/interacting/repository/create.md @@ -0,0 +1,46 @@ +# Creating New Records in a Table Using Repository Layer + +## Introduction + +This guide illustrates how to create new records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to demonstrate the process of creating new records in a table by utilizing the repository layer. We will achieve this by implementing a method within the `StudentRepository` interface using the `EntityManager` instead of `JpaRepository`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public void saveStudent(Student student) { + entityManager.persist(student); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.persist(student)`: This line of code persists the new `Student` entity to the database. + +--- + +# [Next: Read Record](read.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository/delete.md b/docs/cn/jpa/practice/interacting/repository/delete.md new file mode 100644 index 0000000..25fa2de --- /dev/null +++ b/docs/cn/jpa/practice/interacting/repository/delete.md @@ -0,0 +1,47 @@ +# Deleting Records from a Table Using Repository Layer + +## Introduction + +This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public void deleteStudent(UUID id) { + Student studentToDelete = entityManager.find(Student.class, id); + entityManager.remove(studentToDelete); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.remove(studentToDelete)`: This line of code deletes the `Student` entity from the database. + +--- + +# [Next: Custom Query](query.md) diff --git a/docs/cn/jpa/practice/interacting/repository/query.md b/docs/cn/jpa/practice/interacting/repository/query.md new file mode 100644 index 0000000..d8c2129 --- /dev/null +++ b/docs/cn/jpa/practice/interacting/repository/query.md @@ -0,0 +1,49 @@ +# Creating Custom Queries in a Table Using Repository Layer + +## Introduction + +This guide demonstrates how to create custom queries to fetch records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to illustrate the process of creating custom queries to fetch records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; +import java.util.List; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public List findStudentsByMajor(String major) { + return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class) + .setParameter("major", major) + .getResultList(); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.createQuery(...)`: This line of code creates a custom JPQL (Java Persistence Query Language) query to fetch records based on the provided criteria (`major` in this example). + +--- + +# [Next: Create JpaRepository](../jpa-repository.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository/read.md b/docs/cn/jpa/practice/interacting/repository/read.md new file mode 100644 index 0000000..cd32262 --- /dev/null +++ b/docs/cn/jpa/practice/interacting/repository/read.md @@ -0,0 +1,46 @@ +# Reading Records from a Table Using Repository Layer + +## Introduction + +This guide demonstrates how to read records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to illustrate the process of reading records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public Student findStudentById(UUID id) { + return entityManager.find(Student.class, id); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.find(Student.class, id)`: This line of code retrieves the `Student` entity from the database based on the provided `id`. + +--- + +# [Next: Update Record](update.md) diff --git a/docs/cn/jpa/practice/interacting/repository/update.md b/docs/cn/jpa/practice/interacting/repository/update.md new file mode 100644 index 0000000..ba2b0bc --- /dev/null +++ b/docs/cn/jpa/practice/interacting/repository/update.md @@ -0,0 +1,46 @@ +# Updating Records in a Table Using Repository Layer + +## Introduction + +This guide illustrates how to update records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). + +## Goal + +The goal of this guide is to demonstrate the process of updating records in a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. + +## Repository Method + +### StudentRepository.java + +```java +package com.example.demo.repository; + +import com.example.demo.data.entities.Student; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Repository +public class StudentRepository { + + @PersistenceContext + private EntityManager entityManager; + + public Student updateStudent(Student student) { + return entityManager.merge(student); + } +} +``` + +### Explanation + +- `@Repository`: This annotation marks the class as a repository component in the data access layer. + +- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. + +- `entityManager.merge(student)`: This line of code updates the `Student` entity in the database. + +--- + +# [Next: Delete Record](delete.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/lab-work.md b/docs/cn/springsecurity/lab-work.md new file mode 100644 index 0000000..245d193 --- /dev/null +++ b/docs/cn/springsecurity/lab-work.md @@ -0,0 +1,61 @@ +# Spring Security Lab Work + +Welcome to the Spring Security Lab Work! The goal of this series of tasks is to help you practice and get know to Spring Security, and make an enough startup project. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of security integration in a Spring application. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in using security within a Spring environment. Spring Security is widely utilized for authentication, authorization and securing your project, and through these tasks, you will gain valuable insights into its configuration, authentication, authorization, and more. + +## Practice Tasks + +1. [Task 1: Configure Spring Security](practice/configure-spring-security.md) +2. [Task 2: Create a Base Implementation for User](practice/base-implementation-user.md) +3. [Task 3: Password Encryption](practice/password-encryption.md) +4. [Task 4: Add a Dummy Users](practice/add-dummy-users.md) +5. [Task 5: Create Identity to Users](practice/create-identity-to-users.md) +6. [Task 6: Create a Base for Authorization in Server](practice/setup-server-authorization.md) +7. [Task 7: Authorize Authenticated Users](practice/authorize-server-authenticated.md) +8. [Task 8: Authorize by Role](practice/authorize-server-role.md) +9. [Task 9: Authorize by Authority](practice/authorize-server-authority.md) +10. [Task 10: Configure Thymeleaf Security](practice/configure-thymeleaf-security.md) +11. [Task 11: Authorize Authenticated Users](practice/authorize-client-authenticated.md) +12. [Task 12: Authorize by Role](practice/authorize-client-role.md) +13. [Task 13: Authorize by Authority](practice/authorize-client-authority.md) +14. [Task 14: Custom Login Form](practice/custom-login-form.md) + +## Lab Work Tasks + +![img.png](../../srcs/springsecurity/task.png) + +### Task 1: Setup Spring Security +Initialize Spring Security in your project. + +### Task 2: Define User Roles and Authorities +Define different user roles (Manager, Teacher, Student) and their respective authorities. + +### Task 3: Configure Security in Controllers +Protect endpoints using role-based access control. + +#### Implementation Details +**Manager Role**: +- Add New Teacher (`/teachers/new`) +- Modify Teacher Profile (`/teachers/{id}/edit`) +- Modify Student Profile (`/students/{id}/edit`) +- Modify Student Marks (`/students/{id}/marks/edit`) + +**Teacher Role**: +- Modify Student Marks (`/students/{id}/marks/edit`) +- Add New Subject (`/subjects/new`) +- Add New Test (`/tests/new`) + +**Student Role**: +- Pass Test (`/tests/{id}/take`) +- Read Marks (`/students/{id}/marks`) + +### Task 4: Implement Authorization in Thymeleaf Templates + +Restrict access to UI elements based on user roles. + + +### Task 5: Test Role-Based Access Control +Ensure that endpoints and UI elements are correctly protected. diff --git a/docs/cn/springsecurity/practice/add-dummy-users.md b/docs/cn/springsecurity/practice/add-dummy-users.md new file mode 100644 index 0000000..5d8d81b --- /dev/null +++ b/docs/cn/springsecurity/practice/add-dummy-users.md @@ -0,0 +1,64 @@ +# Add Dummy Users + +This task outlines the process of updating the `CustomUserDetailsService` class to include a method for adding dummy users to the in-memory storage to serving as a simple demonstration of user creation. + +## Goal + +Update the `CustomUserDetailsService` class to include a method for adding dummy users, allowing for the initialization of user data in the in-memory storage. + +## Steps + +1. **Update CustomUserDetailsService Class:** + + First, we need to update the `CustomUserDetailsService` class to include a method for adding dummy users. We'll leverage this method during bean initialization to populate the in-memory storage with dummy user data. + + ```java + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + private final PasswordEncoder passwordEncoder; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository, PasswordEncoder passwordEncoder) { + this.usersRepository = usersRepository; + this.passwordEncoder = passwordEncoder; + + // Call the addDummyUsers method to add dummy users during bean initialization + addDummyUsers(); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Retrieve user details from the repository + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + return userDetails; + } + + // Method to add dummy users + private void addDummyUsers() { + // Create dummy users + CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); + CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); + CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); + + // Add users to the repository + usersRepository.save(admin); + usersRepository.save(moderator); + usersRepository.save(user); + } + } + ``` + + In this updated class: + - We've added a constructor that accepts `UsersRepository` and `PasswordEncoder` as dependencies. + - During bean initialization, the constructor calls the `addDummyUsers` method to populate the in-memory storage with dummy users. + - The `addDummyUsers` method creates dummy users with hardcoded usernames and passwords. + - Finally, the dummy users are saved to the repository using the `save` method. + +--- + +# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-client-authenticated.md b/docs/cn/springsecurity/practice/authorize-client-authenticated.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/cn/springsecurity/practice/authorize-client-authority.md b/docs/cn/springsecurity/practice/authorize-client-authority.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/cn/springsecurity/practice/authorize-client-role.md b/docs/cn/springsecurity/practice/authorize-client-role.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/cn/springsecurity/practice/authorize-server-authenticated.md b/docs/cn/springsecurity/practice/authorize-server-authenticated.md new file mode 100644 index 0000000..ef1e7a4 --- /dev/null +++ b/docs/cn/springsecurity/practice/authorize-server-authenticated.md @@ -0,0 +1,38 @@ +# Authorize Authenticated User + +This task outlines the process of authorizing authenticated users in your application. By requiring authentication for specific paths or endpoints, you can ensure that only logged-in users can access certain resources. + +## Goal + +Authorize access to the `/second` path only for authenticated users while allowing public access to other paths. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify that access to the `/second` path should be restricted to authenticated users. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Other endpoints... + .requestMatchers("/second").authenticated() + // Other endpoints... + ); + } + } + ``` + + In this configuration: + - We use `.authorizeHttpRequests()` to define authorization rules. + - The `.requestMatchers("/second").authenticated()` statement specifies that access to the `/second` path should be restricted to authenticated users. + +--- + +# [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-server-authority.md b/docs/cn/springsecurity/practice/authorize-server-authority.md new file mode 100644 index 0000000..d0abdeb --- /dev/null +++ b/docs/cn/springsecurity/practice/authorize-server-authority.md @@ -0,0 +1,39 @@ +# Authorize by Authority + +This task outlines the process of authorizing users based on their authorities in your application. By assigning different authorities to users, you can control access to specific functionalities or actions. + +## Goal + +Authorize access to the `/addStudent` path for users with the `WRITE` authority and the `/removeStudent` path for users with the `DELETE` authority. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify authority-based access control for the `/addStudent` and `/removeStudent` paths. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Other Endpoints... + .requestMatchers("/addStudent").hasAuthority("WRITE") + .requestMatchers("/removeStudent").hasAuthority("DELETE") + // Other Endpoints... + ); + } + } + ``` + + In this configuration: + - The `.requestMatchers("/addStudent").hasAuthority("WRITE")` statement specifies that access to the `/addStudent` path should be restricted to users with the `WRITE` authority. + - Similarly, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` restricts access to the `/removeStudent` path to users with the `DELETE` authority. + +--- + +# [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-server-role.md b/docs/cn/springsecurity/practice/authorize-server-role.md new file mode 100644 index 0000000..3b1ab77 --- /dev/null +++ b/docs/cn/springsecurity/practice/authorize-server-role.md @@ -0,0 +1,39 @@ +# Authorize by Role + +This task outlines the process of authorizing users based on their roles in your application. By assigning different roles to users, you can control access to specific resources or functionalities. + +## Goal + +Authorize access to the `/third` path for users with the `ROLE_MODERATOR` role and the `/fourth` path for users with the `ROLE_ADMIN` role. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify role-based access control for the `/third` and `/fourth` paths. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Other Endpoints... + .requestMatchers("/third").hasAuthority("ROLE_MODERATOR") + .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN") + // Other Endpoints... + ); + } + } + ``` + + In this configuration: + - The `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` statement specifies that access to the `/third` path should be restricted to users with the `ROLE_MODERATOR` authority. + - Similarly, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` restricts access to the `/fourth` path to users with the `ROLE_ADMIN` authority. + +--- + +# [NEXT TASK: Authorize by Authority](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/base-implementation-user.md b/docs/cn/springsecurity/practice/base-implementation-user.md new file mode 100644 index 0000000..c77596f --- /dev/null +++ b/docs/cn/springsecurity/practice/base-implementation-user.md @@ -0,0 +1,184 @@ +# Create Base Implementation for User + +In this task, we will focus on creating a base implementation for managing users in your application. This includes defining the UserDetails entity, creating a repository to manage user data, and implementing a UserDetailsService to load user details during authentication. + +## Goal + +The goal of this task is to establish a solid foundation for managing users within your application. By implementing UserDetails, UsersRepository, and UserDetailsService, you will be able to authenticate users, manage their details, and perform user-related operations efficiently. + +## Steps + +1. **Define UserDetails Entity** + + Start by defining a UserDetails entity that represents the user details in your application. This entity should implement the UserDetails interface provided by Spring Security. + + ```java + package edu.labs.yourproject.model; + + import org.springframework.security.core.GrantedAuthority; + import org.springframework.security.core.userdetails.UserDetails; + + import java.util.Collection; + + public class CustomUserDetails implements UserDetails { + + // Implement UserDetails methods here + + } + ``` + + Implement the methods required by the UserDetails interface to provide user details such as username, password, authorities, etc. + +2. **Create UsersRepository Class** + + Since we are using in-memory storage for now, we'll create a simple UsersRepository class to manage user data. + + a. **Create UsersRepository Class** + + Create a new Java class named `UsersRepository` inside the `edu.labs.yourproject.repository` package. + + ```java + package edu.labs.yourproject.repository; + + import org.springframework.stereotype.Repository; + import edu.labs.yourproject.model.CustomUserDetails; + + @Repository + public class UsersRepository { + + private List users = new ArrayList<>(); + + // Add methods for managing users as needed + } + ``` + + This class will serve as the repository for managing user data. We'll add methods to retrieve, add, update, and delete users in subsequent steps. + + b. **Add findByUsername Method** + + Add a method named `findByUsername` to the `UsersRepository` class. This method will retrieve user details by username from the repository. + + ```java + public CustomUserDetails findByUsername(String username) { + for (CustomUserDetails user : users) { + if (user.getUsername().equals(username)) { + return user; + } + } + return null; // User not found + } + ``` + + The `findByUsername` method is used to retrieve user details by username from the repository. In this placeholder implementation, it returns `null`, but you'll replace it with the actual logic to fetch user details from the database or any other data source. + +3. **Implement UserDetailsService** + + In this step, we will implement a UserDetailsService to load user details during authentication. This service will retrieve user information from the UsersRepository. + + a. **Create CustomUserDetailsService Class** + + Start by creating a new class named `CustomUserDetailsService` within your project's service package. This class will implement the UserDetailsService interface provided by Spring Security. + + ```java + package edu.labs.yourproject.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.core.userdetails.UserDetails; + import org.springframework.security.core.userdetails.UserDetailsService; + import org.springframework.security.core.userdetails.UsernameNotFoundException; + import org.springframework.stereotype.Service; + import com.yourcompany.yourproject.model.CustomUserDetails; + import com.yourcompany.yourproject.repository.UsersRepository; + + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + + // Implement methods here + } + ``` + + We create the `CustomUserDetailsService` class and autowire the `UsersRepository` dependency using constructor injection. + + b. **Override loadUserByUsername Method** + + Override the `loadUserByUsername` method defined in the UserDetailsService interface. This method will retrieve user details from the UsersRepository based on the provided username. + + ```java + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Retrieve user details from the in-memory repository + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + return userDetails; + } + ``` + + Inside the `loadUserByUsername` method, we call the `findByUsername` method of the UsersRepository to retrieve user details by username. If the user is not found, we throw a UsernameNotFoundException. + +4. **Configure Beans in WebSecurityConfig** + + Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define beans for CustomUserDetails and UserDetailsRepository. + + ```java + package edu.labs.yourproject.config; + + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UserDetailsRepository; + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + + @Configuration + @EnableWebSecurity + public class WebSecurityConfig { + + // The rest of code is here... + + @Bean + public CustomUserDetailsService customUserDetailsService() { + // Instantiate and configure CustomUserDetails bean + return new CustomUserDetailsService(); + } + + @Bean + public UserDetailsRepository userDetailsRepository() { + // Instantiate and configure UserDetailsRepository bean + return new UserDetailsRepository(); + } + } + ``` + + Define two bean methods: `CustomUserDetailsService()` and `userDetailsRepository()`. These methods instantiate and configure CustomUserDetailsService and UserDetailsRepository beans, respectively. + +## Folder Structure + +Your project's folder structure should resemble the following: + +``` +src +└── main + └── java + └── edu + └── labs + └── yourproject + ├── model + │ └── CustomUserDetails.java + ├── repository + │ └── UsersRepository.java + └── service + └── CustomUserDetailsService.java +``` + +This folder structure indicates where to create the `CustomUserDetailsService` class and the `UsersRepository` interface within your project. Organizing your classes in this manner helps maintain a clear and structured codebase. + +--- + +# [NEXT TASK: Password Encryption](password-encryption.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/configure-spring-security.md b/docs/cn/springsecurity/practice/configure-spring-security.md new file mode 100644 index 0000000..c6bcf19 --- /dev/null +++ b/docs/cn/springsecurity/practice/configure-spring-security.md @@ -0,0 +1,80 @@ +# Configure Spring Security + +In this task, we will focus on configuring Spring Security in your project. Spring Security provides comprehensive security features for Java applications, including authentication, authorization, and protection against common security threats. + +## Goal + +The goal of this task is to integrate Spring Security into your existing project, ensuring that your application is secure and protected against unauthorized access. + +## Steps + +1. **Add Spring Security Dependency** + + - For Maven Projects: + + Add the following dependency to your project's `pom.xml` file: + + ```xml + + org.springframework.boot + spring-boot-starter-security + + ``` + + - For Gradle Projects: + + Add the following dependency to your project's `build.gradle` file: + + ```groovy + implementation 'org.springframework.boot:spring-boot-starter-security' + ``` + + Ensure that you include the appropriate version of Spring Security for your project. + +2. **Create Security Configuration Class** + + Create a new Java class named `WebSecurityConfig` within your project's source folder structure. Typically, this class resides in the `config` package. The file should be named `WebSecurityConfig.java`. + + Your project's folder structure should resemble the following: + + ``` + src + └── main + └── java + └── edu + └── labs + └── yourproject + ├── config + │ └── WebMvcConfig.java + │ └── WebSecurityConfig.java + └── controller + └── PracticeController.java + ``` + +3. **Configure Security Configuration Class** + + Inside the `WebSecurityConfig` class, annotate it with `@Configuration` and `@EnableWebSecurity` to indicate that it is a configuration class for Spring Security. also will annotate `configure` method with `@Bean` + + ```java + package edu.labs.yourproject.config; + + import org.springframework.context.annotation.Configuration; + import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; + import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + + @Configuration + @EnableWebSecurity + public class WebSecurityConfig { + + @Bean + public SecurityFilterChain configure(HttpSecurity http) throws Exception { + http + // Security configuration here + return http.build(); + } + } + ``` + +--- + +# [Next Task: Create a Base Implementation for User](base-implementation-user.md) diff --git a/docs/cn/springsecurity/practice/configure-thymeleaf-security.md b/docs/cn/springsecurity/practice/configure-thymeleaf-security.md new file mode 100644 index 0000000..2f87ae3 --- /dev/null +++ b/docs/cn/springsecurity/practice/configure-thymeleaf-security.md @@ -0,0 +1,30 @@ +# Configure Thymeleaf with Spring Security + +## Goal +The goal of this task is to integrate Thymeleaf with Spring Security, enabling the use of additional Thymeleaf dialects and utilities provided by the `thymeleaf-extras-springsecurity6` library. + +## Steps + +1. **Gradle (Groovy):** + + Add the `thymeleaf-extras-springsecurity6` dependency to your `build.gradle` file: + + ```groovy + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE' + ``` + +2. **Maven:** + + Add the following dependency to your `pom.xml` file: + + ```xml + + org.thymeleaf.extras + thymeleaf-extras-springsecurity6 + 3.0.4.RELEASE + + ``` + +--- + +[NEXT TASK:]() diff --git a/docs/cn/springsecurity/practice/create-identity-to-users.md b/docs/cn/springsecurity/practice/create-identity-to-users.md new file mode 100644 index 0000000..c839716 --- /dev/null +++ b/docs/cn/springsecurity/practice/create-identity-to-users.md @@ -0,0 +1,61 @@ +# Create Identity for Users + +This task outlines the process of adding authorities and roles to the users created in the previous step, "Add Dummy Users." By assigning roles and authorities to users, we establish their identity within the application and control their access to various resources and functionalities. + +## Goal + +Enhance the user profiles created in the previous step by assigning roles and authorities, thereby defining their identities and access permissions within the application. + +## Steps + +1. **Update User Profiles with Roles and Authorities:** + + We'll update the dummy user profiles created in the `CustomUserDetailsService` class to include roles and authorities. This involves assigning specific roles to each user, such as `ADMIN`, `MODERATOR`, or `USER`, and granting corresponding authorities based on their roles. + + ```java + // Inside addDummyUsers() method + + // Define roles + String adminRole = "ROLE_ADMIN"; + String moderatorRole = "ROLE_MODERATOR"; + String userRole = "ROLE_USER"; + + // Define authorities + List adminAuthorities = Arrays.asList( + new SimpleGrantedAuthority(adminRole), + new SimpleGrantedAuthority("READ"), + new SimpleGrantedAuthority("WRITE") + ); + + List moderatorAuthorities = Arrays.asList( + new SimpleGrantedAuthority(moderatorRole), + new SimpleGrantedAuthority("READ") + ); + + List userAuthorities = Collections.singletonList( + new SimpleGrantedAuthority(userRole) + ); + + // Create dummy users with roles and authorities + CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); + admin.setAuthorities(adminAuthorities); + admin.setRole(adminRole); + + CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); + moderator.setAuthorities(moderatorAuthorities); + moderator.setRole(moderatorRole); + + CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); + user.setAuthorities(userAuthorities); + user.setRole(userRole); + ``` + + In this updated code: + - We define roles and authorities as variables for clarity and ease of maintenance. + - Each user profile now includes a list of authorities based on their assigned roles. + - Authorities are represented as `SimpleGrantedAuthority` objects and added to the user profiles accordingly. + - Additionally, we set the role for each user to enable role-based access control in subsequent steps. + +--- + +# [NEXT TASK: Create a Base for Authorization in Server](setup-server-authorization.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/custom-login-form.md b/docs/cn/springsecurity/practice/custom-login-form.md new file mode 100644 index 0000000..720cec9 --- /dev/null +++ b/docs/cn/springsecurity/practice/custom-login-form.md @@ -0,0 +1,40 @@ +# Custom Login Form + +This task guides you through the process of enabling a custom login form for authentication using Spring Security. By implementing a custom login form, users can securely authenticate into your application. + +## Goal + +Activate the custom login form page that has already been created in specific path. + +## Steps + +1. **Update Security Configuration:** + + In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify the custom login page. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + // Add other authorization configurations here + ) + .formLogin((login) -> login + .loginPage("/custom-login-page") // Specify the custom login page URL + // Add other form login configurations here + ); + } + } + ``` + + In this configuration: + - The `.loginPage("/custom-login-page")` statement specifies the URL of the custom login page. + - You can add additional configurations to customize the form login behavior, such as setting login success or failure URLs, defining form field names, etc. + +--- + +# [TASKS](../lab-work.md) diff --git a/docs/cn/springsecurity/practice/password-encryption.md b/docs/cn/springsecurity/practice/password-encryption.md new file mode 100644 index 0000000..2cd1a21 --- /dev/null +++ b/docs/cn/springsecurity/practice/password-encryption.md @@ -0,0 +1,81 @@ +# Password Encryption + +In this task, we will configure password encryption for user authentication in a Spring Security-enabled application. Encrypting passwords enhances security by storing them securely in the database. + +## Goal + +The goal of this setup is to configure password encryption using the BCryptPasswordEncoder provided by Spring Security. This ensures that passwords are securely hashed before being stored in the database. + +## Steps + +1. **Add BCryptPasswordEncoder Bean** + + Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define a bean for BCryptPasswordEncoder. + + ```java + package edu.labs.yourproject.config; + + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + @Configuration + public class WebSecurityConfig { + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + // Instantiate and configure BCryptPasswordEncoder bean + return new BCryptPasswordEncoder(); + } + } + ``` + + Define a bean method `passwordEncoder()` that instantiates and configures a BCryptPasswordEncoder bean. This bean will be used to encode passwords before storing them in the database. + +2. **Encrypt Passwords** + + a. **Update CustomUserDetailsService Class** + + Open the CustomUserDetailsService class located in your project's service package (`edu.labs.yourproject.service`). Inject the BCryptPasswordEncoder bean into this class. + + ```java + package edu.labs.yourproject.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + import org.springframework.stereotype.Service; + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UsersRepository; + + @Service + public class CustomUserDetailsService implements UserDetailsService { + + private final UsersRepository usersRepository; + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + } + ``` + + b. **Implement Registration Method** + + Define a method in the CustomUserDetailsService class to handle user registration. In this method, encrypt the user's password before saving it to the database. + + ```java + public void registerUser(CustomUserDetails user) { + // Encrypt password before saving user + String encodedPassword = passwordEncoder.encode(user.getPassword()); + user.setPassword(encodedPassword); + usersRepository.save(user); + } + ``` + + This method takes a CustomUserDetails object representing the user to be registered. It encrypts the user's password using the BCryptPasswordEncoder bean and then saves the user to the database. + +--- +# [NEXT TASK: Add a Dummy Users](add-dummy-users.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/setup-server-authorization.md b/docs/cn/springsecurity/practice/setup-server-authorization.md new file mode 100644 index 0000000..68cd220 --- /dev/null +++ b/docs/cn/springsecurity/practice/setup-server-authorization.md @@ -0,0 +1,41 @@ +# Setup Server Authorization + +This task you through setting up authorization in your application by configuring security rules using Spring Security. By defining authorization rules, you can control access to specific paths and endpoints within your application. + +## Goal + +Configure authorization rules to restrict or allow access to various paths and endpoints in the application. + +## Steps + +1. **Add Security Configuration:** + + In the `WebSecurityConfig` class, add the `configure(HttpSecurity http)` method to define security rules for the application. We'll use the paths and endpoints defined in the previous lab work. + + ```java + @Configuration + @EnableWebSecurity + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests((requests) -> requests + .requestMatchers("/first").permitAll() + .requestMatchers("/second").permitAll() + .requestMatchers("/third").permitAll() + .requestMatchers("/fourth").permitAll() + .requestMatchers("/addStudent").permitAll() + .requestMatchers("/removeStudent").permitAll() + ); + } + } + ``` + + In this configuration: + - We use `.authorizeHttpRequests()` to define authorization rules. + - Inside the lambda expression, we specify which requests should be permitted. + +--- + +# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/tasks.md b/docs/cn/springsecurity/tasks.md new file mode 100644 index 0000000..52f7231 --- /dev/null +++ b/docs/cn/springsecurity/tasks.md @@ -0,0 +1,13 @@ +- Setup and Configuration +- base implementation to user +- password hashing algorithms +- add dummy users ( password hashing) +- create identity to users +- + +## TASKS +- create allowed paths +- create authenticated paths ( form-based ) +- create admin page ( role based ) +- hide and show content in depends on authorities and role. +- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file diff --git a/docs/cn/thymeleaf/lab-work.md b/docs/cn/thymeleaf/lab-work.md new file mode 100644 index 0000000..8872e1b --- /dev/null +++ b/docs/cn/thymeleaf/lab-work.md @@ -0,0 +1,73 @@ +# Thymeleaf Lab Work + +Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in using Thymeleaf within a Spring environment. Thymeleaf is widely utilized for server-side rendering in web development, and through these tasks, you will gain valuable insights into its configuration, usage of variables, controllers, form handling, and more. + +## Practice Tasks + +1. [Task 1: Configure Thymeleaf in Spring](practice/configure-thymeleaf.md) +2. [Task 2: Create First View](practice/create-first-view.md) +3. [Task 3: Working With Variables](practice/working-with-variables.md) +4. [Task 4: Variables and Controller](practice/variables-and-controller.md) +5. [Task 5: Iteration](practice/iteration.md) +6. [Task 6: Literals](practice/literals.md) +7. [Task 7: Forms](practice/forms.md) +8. [Task 8: Form Handling](practice/form-handling.md) +9. [Task 9: Query Parameter and Validation](practice/validation.md) +10. [Task 10: Fragments and Layouts](practice/fragments-and-layouts.md) + + +## Lab Work Tasks + +1. **Task 1: Create HTML Layout with Fragments** + + - Create individual fragments for different parts of an HTML page, such as navbar, header, head, and footer. + - Assemble these fragments in a single HTML file to form a complete layout + - For example: + ![layout.png](../../srcs/thymeleaf/layout.png) + +2. **Task 2: Create Home Page with Localization** + + - Implement a home page accessible at the path `/`. + - Utilize the layout created in Task 1 for structuring the home page. + - Use `#{}` expressions for all text content within the home page, demonstrating localization or messages from a file.properties file. + - For Example: + + ![home-page.png](../../srcs/thymeleaf/home-page.png) + +3. **Task 3: Create Login and Register Forms** + + - Design and implement login and register forms for user authentication. + - Utilize Thymeleaf's model binding to handle form data. + - For Example: + + ![login-page.png](../../srcs/thymeleaf/login-page.png) + + ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + +4. **Task 4: Validate Login and Register Actions** + + - Implement validation for login and register actions. + - Use query parameters to pass error messages in case of validation failures. + - Ensure secure and proper handling of user input. + - For Example: + + ![login-validation.png](../../srcs/thymeleaf/login-validation.png) + +5. **Task 5: Create Users Page** + + - Develop a Users page that displays a table of users. + - Implement iteration to dynamically populate the table with user data. + - Provide functionality to delete or modify user entries from the page. + - For Example: + + ![users-page.png](../../srcs/thymeleaf/users-page.png) + + ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) + +Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. + +Happy coding! diff --git a/docs/cn/thymeleaf/practice/configure-thymeleaf.md b/docs/cn/thymeleaf/practice/configure-thymeleaf.md new file mode 100644 index 0000000..2c016c4 --- /dev/null +++ b/docs/cn/thymeleaf/practice/configure-thymeleaf.md @@ -0,0 +1,119 @@ +# Configure Thymeleaf in Spring + +**Description:** + +This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. + +## **Steps:** + +1. **Create Thymeleaf Configuration Class:** + - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. + - Extend the class with `WebMvcConfigurer`. + + Example: + + ```java + package edu.labs.thymeleaf.config; + + import org.springframework.context.annotation.Configuration; + import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + @Configuration + public class WebMvcConfig implements WebMvcConfigurer { + // Configuration code goes here + } + ``` + + Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. + +2. **Configure Thymeleaf Template Resolver:** + - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. + - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. + + ```java + @Bean + public ClassLoaderTemplateResolver templateResolver() { + // Create a ClassLoaderTemplateResolver bean + ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); + + // Set the path where Thymeleaf will find templates + templateResolver.setPrefix("/templates/"); + + // Set the file extension for templates + templateResolver.setSuffix(".html"); + + // Set the template mode to HTML + templateResolver.setTemplateMode(TemplateMode.HTML); + + // Set the character encoding for templates + templateResolver.setCharacterEncoding("UTF-8"); + + // Return the configured template resolver bean + return templateResolver; + } + ``` + +3. **Configure Message Source:** + - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. + - Set the default encoding. + + ```java + @Bean + public MessageSource messageSource() { + // Create a ReloadableResourceBundleMessageSource bean + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + + // Set the default encoding for messages + messageSource.setDefaultEncoding("UTF-8"); + + // Return the configured message source bean + return messageSource; + } + ``` + +4. **Configure Thymeleaf View Resolver:** + - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. + - Set the template engine. + + ```java + @Bean + public ViewResolver thymeleafViewResolver() { + // Create a ThymeleafViewResolver bean + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + + // Set the template engine for the view resolver + resolver.setTemplateEngine(templateEngine()); + + // Return the configured ThymeleafViewResolver bean + return resolver; + } + ``` + +5. **Configure Thymeleaf Template Engine:** + - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. + - Set the template resolver and template engine message source. + + ```java + @Bean + public SpringTemplateEngine templateEngine() { + // Create a SpringTemplateEngine bean + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + + // Set the template resolver for the template engine + templateEngine.setTemplateResolver(templateResolver()); + + // Set the template engine message source + templateEngine.setTemplateEngineMessageSource(messageSource()); + + // Return the configured SpringTemplateEngine bean + return templateEngine; + } + ``` + +--- + +**Conclusion:** + +Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). + +# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/create-first-view.md b/docs/cn/thymeleaf/practice/create-first-view.md new file mode 100644 index 0000000..30577eb --- /dev/null +++ b/docs/cn/thymeleaf/practice/create-first-view.md @@ -0,0 +1,63 @@ +# Create First View + +**Description:** + +In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. + +## **Steps:** + +1. **Create the View File:** + - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. + - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. + + ```plaintext + Project Directory + └── src + └── main + └── resources + └── templates + └── practice + └── first.html + ``` + + Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. + +2. **Register the View in Configuration Class:** + - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). + - Add the following method to register the Thymeleaf view: + + ```java + public void addViewControllers(ViewControllerRegistry registry) { + // First View + registry.addViewController("/first").setViewName("practice/first"); + } + ``` + + This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. + +3. **Test the View:** + - Run your Spring application. + - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. + +4. **Optional: Configure Redirect from Root Path:** + - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: + + ```java + public void addViewControllers(ViewControllerRegistry registry) { + // First View + registry.addViewController("/first").setViewName("practice/first"); + + // Redirect from root path to the first view + registry.addRedirectViewController("/", "/first"); + } + ``` + + Now, visiting `http://localhost:8080/` will automatically redirect to the first view. + +--- + +**Conclusion:** + +You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. + +# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/form-handling.md b/docs/cn/thymeleaf/practice/form-handling.md new file mode 100644 index 0000000..c7b6b7b --- /dev/null +++ b/docs/cn/thymeleaf/practice/form-handling.md @@ -0,0 +1,74 @@ +# Form Handling + +**Description:** + +In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. + +**Steps:** + +1. **Show Form View (PracticeController):** + + - Open the `PracticeController` class and add a method to show the form view: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.GetMapping; + + @Controller + public class PracticeController { + + // Other methods... + + @GetMapping("/third") + public String showAddStudentForm(Model model) { + model.addAttribute("model", new StudentModel()); + return "practice/third"; + } + } + ``` + + - Explanation: + - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. + - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. + - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. + +2. **Handle Form Submission (PracticeController):** + + - Add a method in `PracticeController` to handle form submissions: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // Other methods... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + students.add(model); + + return "redirect:/third"; + } + } + ``` + + - Explanation: + - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. + - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. + - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. + - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). + +**Conclusion:** + +You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. + +# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/forms.md b/docs/cn/thymeleaf/practice/forms.md new file mode 100644 index 0000000..3876c1d --- /dev/null +++ b/docs/cn/thymeleaf/practice/forms.md @@ -0,0 +1,120 @@ +# Forms + +**Description:** + +In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. + +**Steps:** + +1. **Create Third View (third.html):** + + - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. + + ```html + + + + + Add Student Form + + +
+ Add Student + +
+ +

+ + +

+
+
+ + + ``` + +2. **Configure Form Submission:** + + - In the `form` tag, configure the form submission details: + + ```html +
+ ``` + + - Explanation: + - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. + - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. + - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. + - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. + +3. **Pass the 'id' Field:** + + - In the form, locate the section for the `id` field: + + ```html + +

+ + +

+ ``` + + - Explanation: + - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. + - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. + +4. **Repeat these steps:** + + - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. + - There is code example: + ```html + + + + + Add Student Form + + +
+ Add Student + + + +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+ + + +
+ + + ``` + +## Result +Your view should look like that: + +![third-view.png](../../../srcs/thymeleaf/third-view.png) + +**Conclusion:** + +You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. + +# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/fragments-and-layouts.md b/docs/cn/thymeleaf/practice/fragments-and-layouts.md new file mode 100644 index 0000000..b3e2f8e --- /dev/null +++ b/docs/cn/thymeleaf/practice/fragments-and-layouts.md @@ -0,0 +1,130 @@ +# Fragments and Layouts + +**Description:** + +In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. + +## **Steps:** + +1. **Update `first.html` with a Fragment:** + + - Open the `first.html` file in the `practice` directory. + - Add the `th:fragment` attribute to the `
` inside the `` tag: + + ```html + + + + + + + +
+

This is the information section of the first view.

+
+ + + + ``` + +2. **Update `second.html` with a Fragment:** + + - Open the `second.html` file in the `practice` directory. + - Add the `th:fragment` attribute to the `` inside the `` tag: + + ```html + + + + + + + +
+ + + + + + + + + + + + + +
IdFirstNameSecondNameGraduatedMarkDiploma Type
+ + + + ``` + +3. **Update `third.html` with a Fragment:** + + - Open the `third.html` file in the `practice` directory. + - Add the `th:fragment` attribute to the `
` inside the `` tag: + + ```html + + + + + + + +
+ Add Student + +
+

Student Added Successfully!

+
+ +
+ +
+
+ + + + ``` + +4. **Create `fourth.html` with Fragments Usage:** + + - Create a new file named `fourth.html` in the `practice` directory. + - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: + + ```html + + + + + + + +
+ + +
+ + +
+ + + + ``` + + - Explanation: + - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. + - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. + +## Result +Your view should look like that: + +![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) + +**Conclusion:** + +You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. + +# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/iteration.md b/docs/cn/thymeleaf/practice/iteration.md new file mode 100644 index 0000000..9f8cc3a --- /dev/null +++ b/docs/cn/thymeleaf/practice/iteration.md @@ -0,0 +1,107 @@ +# Iteration + +**Description:** + +In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. + +**Steps:** + +1. **Create StudentModel:** + - In the `models/` package, create a `StudentModel` class with the following attributes: + + ```java + public class StudentModel { + private Integer id = 0; + private String firstName = ""; + private String sureName = ""; + private Boolean isGraduated = false; + private Integer mark = 0; + + // Constructor, getters, and setters + } + ``` + +2. **Populate List of Students in PracticeController:** + - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: + + ```java + @Controller + public class PracticeController { + private final List students = new ArrayList<>(); + + public PracticeController() { + // Populate the list with users + this.students.add(new StudentModel(1, "First", "User", true, 4)); + this.students.add(new StudentModel(2, "Second", "User", false, 2)); + this.students.add(new StudentModel(3, "Third", "User", true, 5)); + this.students.add(new StudentModel(4, "Fourth", "User", false, 3)); + } + + // Rest of the controller methods + } + ``` + +3. **Pass Students to secondView:** + - In the `secondView` method of the `PracticeController`, add the list of students to the model. + + ```java + @Controller + public class PracticeController { + // Other methods... + + @GetMapping("/second") + public String secondView(Model model) { + // Pass the list of students to the view + model.addAttribute("students", students); + // Rest of the method... + } + } + ``` + +4. **Render Students Table in second.html:** + - Open the `second.html` Thymeleaf view file. + +5. **Render Table Header:** + - Add the table header section within the `` tag: + + ```html + + + + + + + + + + + +
IdFirstNamesureNameGraduatedMark
+ ``` + +6. **Render Table Body with Iteration:** + - Add the table body section within the `` tag and iterate over the list of students to render each row: + + ```html + + + + + + + + + + + ``` + +## Result +Your page should look like that: + +![second-view.png](../../../srcs/thymeleaf/second-view.png) + +**Conclusion:** + +You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. + +# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/literals.md b/docs/cn/thymeleaf/practice/literals.md new file mode 100644 index 0000000..f77ca7b --- /dev/null +++ b/docs/cn/thymeleaf/practice/literals.md @@ -0,0 +1,55 @@ +# Literals + +**Description:** + +In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. + +**Steps:** + +1. **Update students-table Fragment in second.html:** + - Open the `second.html` Thymeleaf view file. + +2. **Enhance Literal for Student Id:** + - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. + + ```html + + ``` + +3. **Enhance Literal for Graduated Field:** + - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. + + ```html + + ``` + +4. **Enhance Literal for Mark Field:** + - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. + + ```html + Good + Very Good + Excellent + Not Passed + ``` + +5. **Add Literal for Diploma Type Field:** + - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. + + ```html + Blue + Blue + Red + No Diploma + ``` + +## Result +Your view should look like that: + +![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) + +**Conclusion:** + +You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. + +# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/validation.md b/docs/cn/thymeleaf/practice/validation.md new file mode 100644 index 0000000..283fba4 --- /dev/null +++ b/docs/cn/thymeleaf/practice/validation.md @@ -0,0 +1,85 @@ +# Query Parameter and Validation + +**Description:** + +In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. + +**Steps:** + +1. **Adapt the View (thirdView.html):** + + - Open the `third.html` file and add sections to display both success and error messages: + + ```html + + + + + + + + +
+

Student Added Successfully!

+
+ +
+

Error:

+
+ + + + + ``` + + - Explanation: + - The `
` checks if the query parameter `error` is present in the URL. + - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. + +2. **Handle Form Submission with Additional Validation (PracticeController):** + + - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // Other methods... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + // Additional validation: Check if the mark is more than 5. + if (model.getMark() > 5) { + // If the mark is more than 5, redirect with an error message. + return "redirect:/third?error=Mark should not be more than 5"; + } else { + students.add(model); + + return "redirect:/third?addedStudent=true"; + } + } + } + ``` + +## Result +Your view should look like that: + +![third-view-error.png](../../../srcs/thymeleaf/third-view-success.png) + +![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) + + +**Conclusion:** + +You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. + +# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/variables-and-controller.md b/docs/cn/thymeleaf/practice/variables-and-controller.md new file mode 100644 index 0000000..ca4ad12 --- /dev/null +++ b/docs/cn/thymeleaf/practice/variables-and-controller.md @@ -0,0 +1,67 @@ +# Variables and Controller + +**Description:** + +In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. + +**Steps:** + +1. **Create the New View File:** + - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. + + ```plaintext + Project Directory + └── src + └── main + └── resources + └── templates + └── practice + └── second.html + ``` + +2. **Define the Controller:** + - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. + + ```java + @Controller + public class PracticeController { + + @GetMapping("/second") + public String secondView(Model model) { + // Pass variables to the view + model.addAttribute("title", "Second Page"); + + // Return the view name + return "practice/second"; + } + } + ``` + + This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. + +3. **Update the View to Use Controller-Passed Variable:** + - Open the `second.html` Thymeleaf view file. + - Use the `title` variable passed from the controller in the `

` tag. + + ```html + + + + + Title + + +

Welcome to the Second Page

+ + Go Back to Home + + + ``` + + The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. + +**Conclusion:** + +You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task + +# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/working-with-variables.md b/docs/cn/thymeleaf/practice/working-with-variables.md new file mode 100644 index 0000000..43ea184 --- /dev/null +++ b/docs/cn/thymeleaf/practice/working-with-variables.md @@ -0,0 +1,92 @@ +# Working with variables + +**Description:** + +In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. + +## **Steps:** + +1. **Define Local Variables in Thymeleaf View:** + - Open your Thymeleaf view file (e.g., `first.html`). + - Explore the usage of local variables defined directly within the view. + - In the example code provided: + + ```html + + + Title + + ``` + + The local variable `title` is defined within the `` section of the HTML. + +2. **Localization Variables from Properties File:** + - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: + + ```java + @Bean + public MessageSource messageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.addBasenames("classpath:local/practice"); + messageSource.setDefaultEncoding("UTF-8"); + + return messageSource; + } + ``` + - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: + + ```properties + student.name=MyName + student.group=PRE-121 + message.welcome=Welcome, {0} + message.info=Your Group is: {0} + ``` + **Note on `{0}`:** + - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. + + - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. + - In the example code provided: + + ```html +

+

+ ``` + + The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. + +3. **Static Variables in Thymeleaf Configuration Class:** + - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: + + ```java + @Bean + public ViewResolver thymeleafViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.addStaticVariable("projectName", "Practice Tasks"); + resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); + resolver.setTemplateEngine(templateEngine()); + + return resolver; + } + ``` + + - Access these static variables in the Thymeleaf view using the `#vars` syntax. + - In the example code provided: + + ```html +

Project Name

+

Current Date and Time

+ ``` + +## Result + +now your page should look like that: + +![first-view.png](../../../srcs/thymeleaf/first-view.png) + +**Conclusion:** + +You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. + +Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. + +# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/cn/transactions/lab-work.md b/docs/cn/transactions/lab-work.md new file mode 100644 index 0000000..081cbda --- /dev/null +++ b/docs/cn/transactions/lab-work.md @@ -0,0 +1,55 @@ +# Transactions Lab Work + +Welcome to the Transactions Lab Work! The goal of this series of tasks is to help you practice and master transaction management in a Spring application. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of transaction management, including propagation, isolation levels, nested transactions, and more. + +## Goal of the Lab Work + +The primary goal of this lab work is to provide you with practical experience and proficiency in managing transactions within a Spring environment. Through these tasks, you will gain valuable insights into configuring transactions, handling different propagation behaviors, implementing nested transactions, and ensuring data integrity in your applications. + +## Practice Tasks + +1. [Transaction Setup](practice/configuration.md) +2. [Part 1: Create the Entities and Repositories](practice/lessons/entities-and-repositories.md) +3. [Part 2: Implementing Basic Transactional Operations](practice/lessons/basic-transactional-operations.md) +4. [Part 3: Enhancing Transactional Methods with Detailed Logging](practice/lessons/transactional-logging.md) +5. [Part 4: Implementing Nested Transactions and Non-Transactional Operations](practice/lessons/nested-and-non-transactional-operations.md) + +## Lab Work Tasks + +![img.png](../../srcs/transactions/task-chart.png) + +- **Registering a User for an Event** + - **Task:** Implement a method to register a user for an event. Ensure the operation is completely isolated to maintain data consistency. Log this operation separately, regardless of whether the main transaction succeeds or fails. + - **Propagation:** REQUIRED + - **Isolation:** SERIALIZABLE + - **Logging Propagation:** REQUIRES_NEW + +- **Removing a User's Registration from an Event** + - **Task:** Implement a method to remove a user's registration from an event. Ensure this method is always executed within an existing transaction. + - **Propagation:** MANDATORY + +- **Fetching Registered Users for an Event** + - **Task:** Implement a method to fetch all users registered for a specific event. Ensure the method either joins an existing transaction or creates a new one, reading only committed data. + - **Propagation:** REQUIRED + - **Isolation:** READ_COMMITTED + +- **Adding a New Event** + - **Task:** Implement a method to add a new event. This operation should run without transactional guarantees to avoid unnecessary transactional overhead. + - **Propagation:** NOT_SUPPORTED + +- **Updating Event Details and Registrations with Nested Transactions** + - **Task:** Implement a method to update event details along with related registrations. Ensure consistency within nested transactions. + - **Propagation:** REQUIRED + - **Isolation:** REPEATABLE_READ + - **Nested Task:** Update registrations within a nested transaction. + +- **Updating Registrations** + - **Task:** Implement a method to update registration records. Ensure these operations are part of a nested transaction. + - **Propagation:** NESTED + - **Isolation:** REPEATABLE_READ + +- **Performing Non-Transactional Operation** + - **Task:** Implement a method for operations that do not require a transactional context, such as non-critical tasks or logging. + - **Propagation:** None + +--- \ No newline at end of file diff --git a/docs/cn/transactions/practice/configuration.md b/docs/cn/transactions/practice/configuration.md new file mode 100644 index 0000000..03ac8a4 --- /dev/null +++ b/docs/cn/transactions/practice/configuration.md @@ -0,0 +1,40 @@ +# Transaction Setup + +## Introduction + +This guide focuses on setting up transaction management in a Spring Boot project. It provides step-by-step instructions for enabling transaction management and configuring transaction attributes. + +## Goal + +The goal of this guide is to demonstrate how to configure transaction management in a Spring Boot application, allowing for the management of database transactions. + +## Transaction Management Setup + +To enable transaction management in your Spring Boot project, follow these steps: + +1. Add the necessary dependencies to your `pom.xml` or `build.gradle` file. Ensure that you have dependencies for Spring Boot, Spring Data JPA, and any database driver you are using (e.g., H2, MySQL, PostgreSQL). + +2. Configure transaction management in your Spring Boot application. You can do this by annotating your main application class with `@EnableTransactionManagement`. + +### Example (Java Config): + +```java +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} +``` +--- + +# [Next: Create the Entities and Repositories](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/basic-transactional-operations.md b/docs/cn/transactions/practice/lessons/basic-transactional-operations.md new file mode 100644 index 0000000..ab80146 --- /dev/null +++ b/docs/cn/transactions/practice/lessons/basic-transactional-operations.md @@ -0,0 +1,50 @@ +# Lesson 2: Implementing Basic Transactional Operations + +## Goal + +This part aims to introduce simple yet important transactional methods for enrolling students and managing courses in a Spring Boot application. + +## Steps + +1. **Enrolling a Student in a Course** + + **Scenario**: As a university administrator, you need to enroll a student in a course. This action should be smooth and ensure that even if multiple enrollments happen at the same time or if there are any database issues, data integrity remains intact. + + **Implement `enrollStudentInCourse` Method**: Create a method to enroll a student in a course. Ensure that this process is transactional, meaning it's like a single package deal that guarantees everything happens correctly together. We use `Propagation.REQUIRED` to ensure that this method participates in any existing transaction or creates a new one if none exists. Additionally, we set `Isolation.SERIALIZABLE` to ensure that even if there are concurrent transactions, they don't interfere with each other, maintaining the integrity of the data. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) + public void enrollStudentInCourse(UUID studentId, UUID courseId) { + // Your implementation here + } + ``` + +2. **Fetching Students for a Course** + + **Scenario**: To create a class roster for a course, you need to fetch a list of students who have enrolled. This operation should make sure that you always get an accurate view of the database, even if other activities are happening simultaneously. + + **Implement `getStudentsForCourse` Method**: Develop a method to retrieve students for a particular course. It should ensure that the data you fetch is consistent, regardless of any ongoing transactions. We use `Propagation.REQUIRED` to make sure this method participates in any existing transaction or creates a new one if none exists. We set `Isolation.READ_COMMITTED` to ensure that the data we fetch is committed and visible to other transactions, maintaining consistency. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) + public List getStudentsForCourse(UUID courseId) { + // Your implementation here + } + ``` + +3. **Adding a New Course** + + **Scenario**: A new course is about to be introduced to the curriculum. When adding it to the system, you want to make sure this operation doesn't interfere with anything else going on, maintaining its independence. + + **Implement `addNewCourse` Method**: Create a method to add a new course to the system. Make sure this process doesn't get tangled up with any other ongoing transactions. We use `Propagation.NOT_SUPPORTED` to ensure that this method doesn't participate in any existing transaction, giving it autonomy and avoiding any potential conflicts with other operations. + + ```java + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Course addNewCourse(String title) { + // Your implementation here + } + ``` + +--- + +# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/entities-and-repositories.md b/docs/cn/transactions/practice/lessons/entities-and-repositories.md new file mode 100644 index 0000000..a8ef935 --- /dev/null +++ b/docs/cn/transactions/practice/lessons/entities-and-repositories.md @@ -0,0 +1,38 @@ +# Lesson 1: Create the Entities and Repositories + +## Goal + +The goal of this task is to define the core entities (Student, Course, Enrollment, Log) and set up the corresponding repositories in a Spring Boot project using Spring Data JPA. + +## Steps + +1. **Refer to the provided ER diagram to define the entity classes.** + ![er-diagram.png](../../../../srcs/transactions/er-diagram.png) + If you already have the entity classes based on the provided ER diagram, proceed to step 2. Otherwise, analyze the ER diagram and create the following entity classes: + + - Student + - Course + - Enrollment + - Log + + Ensure that each entity class includes the necessary attributes as depicted in the ER diagram. + +2. **Create the repositories for the entities.** + + For example, let's create the repository for the `Student` entity: + + ```java + package com.example.demo.repository; + + import com.example.demo.entity.Student; + import org.springframework.data.jpa.repository.JpaRepository; + + public interface StudentRepository extends JpaRepository { + } + ``` + + If you already have the entity repositories, proceed to next step. Else, repeat the above step for the repositories of the remaining entities (Course, Enrollment, Log). + +--- + +# [NEXT: Implementing Basic Transactional Operations](basic-transactional-operations.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md new file mode 100644 index 0000000..5ec8ec5 --- /dev/null +++ b/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md @@ -0,0 +1,66 @@ +# Lesson 4: Implementing Nested Transactions and Non-Transactional Operations + +## Goal + +This part aims to explore the use of nested transactions and non-transactional operations within the service layer, providing students with insights into managing complex transactional scenarios. + +## Steps + +1. **Updating Course Details and Enrollments** + + **Scenario**: As a university administrator, you often need to update both the course details and the enrollments associated with that course. This operation should ensure data consistency and integrity, even if multiple updates are performed simultaneously. + + **Implement `updateCourseAndEnrollments` Method**: Define a method to update the course details and enrollments with the required transactional behavior. We use `Propagation.REQUIRED` to ensure that this method participates in any existing transaction or creates a new one if none exists. Setting `Isolation.REPEATABLE_READ` ensures that the data read by this method remains consistent throughout the transaction. Inside this method, we perform a nested transaction by calling the `updateEnrollments` method to update enrollments, ensuring that this operation is atomic and isolated from the outer transaction. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ) + public void updateCourseAndEnrollments(UUID courseId, String newTitle) { + // Log the start of the update process + logAction("Update Course and Enrollments", "Start"); + + try { + // Implementation to update course details + // ... + + // Nested transaction to update enrollments + updateEnrollments(courseId); + + // Log successful update + logAction("Update Course and Enrollments", "Success"); + } catch (Exception e) { + // Log failure + logAction("Update Course and Enrollments", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +2. **Updating Enrollments Independently** + + **Scenario**: Certain administrative tasks may require updating enrollments independently of course updates. This operation should maintain data consistency while allowing for separate transactional control. + + **Implement `updateEnrollments` Method**: Define a method to update enrollments for a course with nested transactional behavior. We use `Propagation.NESTED` to indicate that this method is executed within the scope of the outer transaction but can be rolled back independently if needed. Setting `Isolation.REPEATABLE_READ` ensures that the data read by this method remains consistent throughout the transaction. + + ```java + @Transactional(propagation = Propagation.NESTED, isolation = Isolation.REPEATABLE_READ) + public void updateEnrollments(UUID courseId) { + // Log the start of the enrollment update process + logAction("Update Enrollments", "Start"); + + try { + // Implementation to update enrollments + // ... + + // Log successful update + logAction("Update Enrollments", "Success"); + } catch (Exception e) { + // Log failure + logAction("Update Enrollments", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +--- + +# [NEXT: Tasks](../../lab-work.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/transactional-logging.md b/docs/cn/transactions/practice/lessons/transactional-logging.md new file mode 100644 index 0000000..31c3719 --- /dev/null +++ b/docs/cn/transactions/practice/lessons/transactional-logging.md @@ -0,0 +1,105 @@ +# Lesson 3: Enhancing Transactional Methods with Detailed Logging + +## Goal + +This part aims to integrate detailed logging for each transactional operation, ensuring actions are logged with their outcomes. + +## Steps + +1. **Implementing the Logging Method** + + **Scenario**: Before enhancing transactional methods with logging, we need to implement a method to handle logging independently of the main transaction. This ensures that logging occurs reliably, regardless of the outcome of the main transaction. + + **Implement `logAction` Method**: Create a method to log actions independently, ensuring accurate tracking of transaction outcomes. We use `Propagation.REQUIRES_NEW` to execute the logging operation in a separate transaction, making it independent of any ongoing transactions and guaranteeing its completion even if the main transaction fails. + + ```java + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void logAction(String action, String outcome) { + Log log = new Log(action, outcome, LocalDateTime.now()); + logRepository.save(log); + } + ``` + +2. **Logging Enrollment of a Student in a Course** + + **Scenario**: As a university administrator, you need to log the enrollment of a student in a course to keep track of successful enrollments and any potential failures. + + **Enhance `enrollStudentInCourse` Method**: Modify the method to log the action's success or failure. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) + public void enrollStudentInCourse(UUID studentId, UUID courseId) { + // Log the start of the enrollment process + logAction("Enroll Student", "Start"); + + try { + // Implementation to enroll the student in the course + // ... + + // Log successful enrollment + logAction("Enroll Student", "Success"); + } catch (Exception e) { + // Log failure + logAction("Enroll Student", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +3. **Logging Retrieval of Students for a Course** + + **Scenario**: To maintain an audit trail of course-related activities, you need to log the retrieval of students for a course and ensure that the logging occurs even in case of exceptions. + + **Enhance `getStudentsForCourse` Method**: Modify the method to log the action's success or failure. + + ```java + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) + public List getStudentsForCourse(UUID courseId) { + // Log the start of retrieving students for the course + logAction("Retrieve Students for Course", "Start"); + + try { + // Implementation to retrieve students for the course + // ... + + // Log successful retrieval + logAction("Retrieve Students for Course", "Success"); + return students; + } catch (Exception e) { + // Log failure + logAction("Retrieve Students for Course", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +4. **Logging Addition of a New Course** + + **Scenario**: When adding a new course, it's essential to log the outcome of the operation to track the success or failure of the addition. + + **Enhance `addNewCourse` Method**: Modify the method to log the action's success or failure. + + ```java + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Course addNewCourse(String title) { + // Log the start of adding a new course + logAction("Add New Course", "Start"); + + try { + // Implementation to add a new course + // ... + + // Log successful addition + logAction("Add New Course", "Success"); + return savedCourse; + } catch (Exception e) { + // Log failure + logAction("Add New Course", "Failure: " + e.getMessage()); + throw e; + } + } + ``` + +--- + +# [NEXT: Implementing Nested Transactions and Non-Transactional Operations](nested-and-non-transactional-operations.md) From a86b0dc1118b44e980198d88d80956dd21561063 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Fri, 24 May 2024 19:54:41 +0300 Subject: [PATCH 26/40] [Master] Updated Russian README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b571701..a6d0176 100644 --- a/README.md +++ b/README.md @@ -4,22 +4,22 @@ ### Учебные пособия -1. **Урок 1: [Thymeleaf](docs/en/thymeleaf/lab-work.md)** +1. **Урок 1: [Thymeleaf](docs/ru/thymeleaf/lab-work.md)** Учебное пособие по Thymeleaf предлагает практическое руководство по настройке Thymeleaf в приложении Spring. В рамках этого учебного пособия участники будут заниматься заданиями, связанными с настройкой представлений, манипулированием переменными и другими важными функциями. -2. **Урок 2: [Spring Security](docs/en/springsecurity/lab-work.md)** +2. **Урок 2: [Spring Security](docs/ru/springsecurity/lab-work.md)** Это учебное пособие углубляется в тонкости механизмов безопасности в приложениях Spring с использованием Spring Security. Участники изучат настройку механизмов аутентификации и авторизации, защиту путей и ресурсов, реализацию пользовательских форм входа и другие соответствующие практики безопасности. -3. **Урок 3: [JPA (Java Persistence API)](docs/en/jpa/lab-work.md)** +3. **Урок 3: [JPA (Java Persistence API)](docs/ru/jpa/lab-work.md)** Учебное пособие по JPA предоставляет практическое руководство по использованию Java Persistence API в приложении Spring. Участники узнают, как взаимодействовать с базами данных с использованием JPA, выполнять операции CRUD, управлять отношениями между сущностями и другие важные задачи по сохранению данных. -4. **Урок 4: [Транзакции](docs/en/transactions/lab-work.md)** +4. **Урок 4: [Транзакции](docs/ru/transactions/lab-work.md)** Учебное пособие по транзакциям позволяет погрузиться в управление транзакциями с различными сценариями распространения и изоляции. Участники изучат контроль транзакций, различные уровни изоляции и сценарии распространения, что обеспечит им глубокое понимание управления транзакциями в контексте приложений Spring. From 629caec224ae3c7c076995f191cbf27962576d40 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Fri, 24 May 2024 20:34:08 +0300 Subject: [PATCH 27/40] [Master] Added Chinese files --- README-CN.md | 10 +- docs/cn/jmeter/lab-work.md | 1 + docs/cn/jpa/lab-work.md | 71 ++++--- .../jpa/practice/creation/characteristics.md | 93 ++++----- .../cn/jpa/practice/creation/create-entity.md | 38 ++-- docs/cn/jpa/practice/creation/fetching.md | 38 ++-- .../cn/jpa/practice/creation/relationships.md | 35 ++-- docs/cn/jpa/practice/dependencies/driver.md | 48 ++--- docs/cn/jpa/practice/dependencies/jpa.md | 22 +- .../practice/interacting/jpa-repository.md | 24 +-- .../interacting/jpa-repository/create.md | 20 +- .../interacting/jpa-repository/delete.md | 24 +-- .../interacting/jpa-repository/query.md | 24 +-- .../interacting/jpa-repository/read.md | 26 +-- .../cn/jpa/practice/interacting/repository.md | 25 ++- .../practice/interacting/repository/create.md | 22 +- .../practice/interacting/repository/delete.md | 22 +- .../practice/interacting/repository/query.md | 22 +- .../practice/interacting/repository/read.md | 23 ++- .../practice/interacting/repository/update.md | 22 +- docs/cn/springsecurity/lab-work.md | 87 ++++---- .../practice/add-dummy-users.md | 36 ++-- .../authorize-server-authenticated.md | 26 +-- .../practice/authorize-server-authority.md | 26 +-- .../practice/authorize-server-role.md | 26 +-- .../practice/base-implementation-user.md | 194 +++++++++--------- .../practice/configure-spring-security.md | 71 ++++--- .../practice/configure-thymeleaf-security.md | 14 +- .../practice/create-identity-to-users.md | 34 +-- .../practice/custom-login-form.md | 28 +-- .../practice/password-encryption.md | 34 +-- .../practice/setup-server-authorization.md | 23 +-- docs/cn/springsecurity/tasks.md | 13 -- docs/cn/thymeleaf/lab-work.md | 104 +++++----- docs/cn/transactions/lab-work.md | 90 ++++---- .../cn/transactions/practice/configuration.md | 22 +- .../lessons/basic-transactional-operations.md | 34 +-- .../lessons/entities-and-repositories.md | 30 +-- ...nested-and-non-transactional-operations.md | 40 ++-- .../practice/lessons/transactional-logging.md | 58 +++--- 40 files changed, 792 insertions(+), 808 deletions(-) delete mode 100644 docs/cn/springsecurity/tasks.md diff --git a/README-CN.md b/README-CN.md index 7faf79d..b6cb997 100644 --- a/README-CN.md +++ b/README-CN.md @@ -4,23 +4,23 @@ ### 教程 -1. **第1课: [Thymeleaf](docs/en/thymeleaf/lab-work.md)** +1. **第1课: [Thymeleaf](docs/cn/thymeleaf/lab-work.md)** Thymeleaf教程提供了在Spring应用中设置Thymeleaf的实用指南。在本教程中,参与者将进行与视图设置、变量操作和其他重要功能相关的任务。 -2. **第2课: [Spring Security](docs/en/springsecurity/lab-work.md)** +2. **第2课: [Spring Security](docs/cn/springsecurity/lab-work.md)** 本教程深入探讨了在Spring应用中使用Spring Security的安全机制。参与者将学习如何设置认证和授权机制,保护路径和资源,实现自定义登录表单以及其他相关的安全实践。 -3. **第3课: [JPA (Java Persistence API)](docs/en/jpa/lab-work.md)** +3. **第3课: [JPA (Java Persistence API)](docs/cn/jpa/lab-work.md)** JPA教程提供了在Spring应用中使用Java Persistence API的实用指南。参与者将学习如何使用JPA与数据库交互,执行CRUD操作,管理实体之间的关系以及其他重要的数据持久化任务。 -4. **第4课: [事务](docs/en/transactions/lab-work.md)** +4. **第4课: [事务](docs/cn/transactions/lab-work.md)** 本教程深入探讨了不同传播和隔离场景下的事务管理。参与者将学习事务控制、不同的隔离级别和传播场景,从而深入理解在Spring应用中管理事务。 -5. **第5课: [JMeter](docs/ru/jmeter/lab-work.md)** +5. **第5课: [JMeter](docs/cn/jmeter/lab-work.md)** JMeter系列教程提供了使用JMeter进行负载测试和性能分析的完整指南。参与者将学习如何设置JMeter、记录HTTP请求、创建和执行测试场景,以及分析测试结果。 diff --git a/docs/cn/jmeter/lab-work.md b/docs/cn/jmeter/lab-work.md index 7758ec7..e7cb1cb 100644 --- a/docs/cn/jmeter/lab-work.md +++ b/docs/cn/jmeter/lab-work.md @@ -23,3 +23,4 @@ The primary goal of this lab work is to provide you with practical experience an ## Lab Work Tasks idk :D + \ No newline at end of file diff --git a/docs/cn/jpa/lab-work.md b/docs/cn/jpa/lab-work.md index c30081a..bec5b47 100644 --- a/docs/cn/jpa/lab-work.md +++ b/docs/cn/jpa/lab-work.md @@ -1,55 +1,54 @@ -# Lab Work: JPA (Java Persistence API) +# 实验任务: JPA (Java Persistence API) -Welcome to the Spring Boot with JPA Lab Work! In this lab work, you will practice various tasks related to setting up a Spring Boot project with JPA (Java Persistence API). +欢迎来到 Spring Boot with JPA 实验任务!在这个实验中,您将练习与使用 Spring Boot 和 JPA (Java Persistence API) 相关的各种任务。 -## Goal of the Lab Work +## 实验任务的目标 -The goal of this lab work is to provide hands-on experience with key concepts and tasks involved in working with Spring Boot and JPA. By completing the practice tasks, you will gain proficiency in setting up dependencies, defining entity characteristics, managing relationships between entities, and interacting with the database using JpaRepository. +这个实验的目标是提供与 Spring Boot 和 JPA 相关的关键概念和任务的实践经验。通过完成练习任务,您将掌握设置依赖关系、定义实体特性、管理实体之间关系以及使用 JpaRepository 与数据库交互等方面的技能。 -## Practice Tasks +## 练习任务 -1. **Database Dependencies Setup** - - [Database Driver Setup](practice/dependencies/driver.md) - - [Spring Boot and JPA Dependencies](practice/dependencies/jpa.md) +1. **设置数据库依赖关系** + - [设置数据库驱动程序](practice/dependencies/driver.md) + - [Spring Boot 和 JPA 依赖关系](practice/dependencies/jpa.md) -2. **Entity Creation, Characteristics, Relationships and Fetching Strategies** - - [Entity Creation](practice/creation/create-entity.md) - - [Entity Characteristics Definition](practice/creation/characteristics.md) - - [Managing Relationships](practice/creation/relationships.md) - - [Fetching Strategies](practice/creation/fetching.md) +2. **实体创建、特性、关系和获取策略** + - [创建实体](practice/creation/create-entity.md) + - [定义实体特性](practice/creation/characteristics.md) + - [管理关系](practice/creation/relationships.md) + - [获取策略](practice/creation/fetching.md) -3. **Interacting with Custom Repository** - - [Create Record](practice/interacting/repository/create.md) - - [Read Record](practice/interacting/repository/read.md) - - [Update Record](practice/interacting/repository/update.md) - - [Delete Record](practice/interacting/repository/delete.md) - - [Custom Queries](practice/interacting/repository/query.md) +3. **与自定义存储库交互** + - [创建记录](practice/interacting/repository/create.md) + - [读取记录](practice/interacting/repository/read.md) + - [更新记录](practice/interacting/repository/update.md) + - [删除记录](practice/interacting/repository/delete.md) + - [自定义查询](practice/interacting/repository/query.md) -4. **Interacting with JPA Repository** - - [Create Record](practice/interacting/jpa-repository/create.md) - - [Read Record](practice/interacting/jpa-repository/read.md) - - [Delete Record](practice/interacting/jpa-repository/delete.md) - - [Custom Queries](practice/interacting/jpa-repository/query.md) +4. **与 JPA 存储库交互** + - [创建记录](practice/interacting/jpa-repository/create.md) + - [读取记录](practice/interacting/jpa-repository/read.md) + - [删除记录](practice/interacting/jpa-repository/delete.md) + - [自定义查询](practice/interacting/jpa-repository/query.md) -## Lab Work Tasks +## 实验任务 -1. Set up database dependencies for PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. +1. 为 PostgreSQL、MySQL、Oracle、MongoDB 和 Microsoft SQL Server 设置数据库依赖关系。 -2. Implement the next Entity-Relationships Diagram: -![img.png](../../srcs/jpa/task-er-diagram.png) +2. 实现下一个实体关系图: + ![img.png](../../srcs/jpa/task-er-diagram.png) - 1. Define entity characteristics for Student, Enrollment, and Course entities based on the Entity Relationships diagram. + 1. 根据实体关系图定义 Student、Enrollment 和 Course 实体的特性。 - 2. Create entity classes for Student, Enrollment, and Course according to the defined characteristics. + 2. 根据定义的特性创建 Student、Enrollment 和 Course 实体类。 - 3. Implement fetching strategies for efficient data retrieval to optimize database interactions. + 3. 实现有效的数据检索获取策略,以优化数据库交互。 - 4. Manage relationships between entities such as Student, Enrollment, and Course by establishing appropriate associations and mappings. + 4. 通过建立适当的关联和映射,管理实体之间的关系,如 Student、Enrollment 和 Course。 - 5. Interact with the database by creating methods for CRUD operations using the Repository layer and EntityManager in at least two repositories. + 5. 通过在至少两个存储库中使用 Repository 层和 EntityManager,创建用于 CRUD 操作的方法,与数据库进行交互。 - 6. Interact with the database by creating methods for CRUD operations using JpaRepository in at least two repositories. - - 7. Implement custom queries to perform advanced data retrieval and manipulation operations as required by the application's business logic. + 6. 通过在至少两个存储库中使用 JpaRepository,创建用于 CRUD 操作的方法,与数据库进行交互。 + 7. 根据应用程序的业务逻辑需求,实现自定义查询,执行高级数据检索和操作。 \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/characteristics.md b/docs/cn/jpa/practice/creation/characteristics.md index 0297f7a..7f54c88 100644 --- a/docs/cn/jpa/practice/creation/characteristics.md +++ b/docs/cn/jpa/practice/creation/characteristics.md @@ -1,26 +1,17 @@ -# Defining Entity Characteristics +## 实体特性 -## Introduction +### 学生实体特性: -This guide focuses on defining entity columns or characteristics in a Spring Boot project using JPA (Java Persistence API). +- `id`(UUID):实体的主键。 +- `name`(String):学生的姓名(不能为空)。 +- `email`(String):学生的电子邮件地址(必须是有效的电子邮件地址)。 +- `major`(String):学生的专业或研究领域(不能为空)。 +- `year`(int):学生的年级(不能为空)。 +- `international`(boolean):指示学生是否为国际学生(不能为空)。 -## Goal -The goal of this guide is to provide clear instructions for defining the characteristics of entities in a Spring Boot project with JPA, utilizing annotations to enforce constraints and behaviors for each attribute. +### 定义 `id` 属性 - -## Entity Characteristics - -### Student Entity Characteristics: -- `id` (UUID): Primary key for the entity. -- `name` (String): Name of the student (must not be blank). -- `email` (String): Email address of the student (must be a valid email address). -- `major` (String): Major or field of study of the student (must not be blank). -- `year` (int): Year of study for the student (must not be null). -- `international` (boolean): Indicates if the student is international (must not be null). - -### Define `id` Attribute - -Add the `id` attribute to the `Student` class. This attribute will serve as the primary key for the entity. +向 `Student` 类添加 `id` 属性。该属性将作为实体的主键。 ```java @Id @@ -28,23 +19,23 @@ Add the `id` attribute to the `Student` class. This attribute will serve as the private UUID id; ``` -- `@Id`: Indicates that this field is the primary key for the entity. -- `@GeneratedValue`: Specifies the strategy for generating primary key values automatically. +- `@Id`:表示该字段是实体的主键。 +- `@GeneratedValue`:指定生成主键值的策略。 -### Define `name` Attribute +### 定义 `name` 属性 -Add the `name` attribute to the `Student` class. This attribute represents the name of the student and must not be blank. +向 `Student` 类添加 `name` 属性。该属性表示学生的姓名,不能为空。 ```java @NotBlank private String name; ``` -- `@NotBlank`: Ensures that the value of `name` is not null and contains at least one non-whitespace character. +- `@NotBlank`:确保 `name` 的值不为 null 并包含至少一个非空白字符。 -### Define `email` Attribute +### 定义 `email` 属性 -Add the `email` attribute to the `Student` class. This attribute represents the email address of the student and must be a valid email address. +向 `Student` 类添加 `email` 属性。该属性表示学生的电子邮件地址,必须是有效的电子邮件地址。 ```java @NotBlank @@ -52,60 +43,58 @@ Add the `email` attribute to the `Student` class. This attribute represents the private String email; ``` -- `@Email`: Validates that the value of `email` is a valid email address. +- `@Email`:验证 `email` 的值是否为有效的电子邮件地址。 -### Define `major` Attribute +### 定义 `major` 属性 -Add the `major` attribute to the `Student` class. This attribute represents the major or field of study of the student and must not be blank. +向 `Student` 类添加 `major` 属性。该属性表示学生的专业或研究领域,不能为空。 ```java @NotBlank private String major; ``` -- `@NotBlank`: Ensures that the value of `major` is not null and contains at least one non-whitespace character. +- `@NotBlank`:确保 `major` 的值不为 null 并包含至少一个非空白字符。 -### Define `year` Attribute +### 定义 `year` 属性 -Add the `year` attribute to the `Student` class. This attribute represents the year of study for the student and must not be null. +向 `Student` 类添加 `year` 属性。该属性表示学生的年级,不能为空。 ```java @NotNull private int year; ``` -- `@NotNull`: Ensures that the value of `year` is not null. +- `@NotNull`:确保 `year` 的值不为 null。 -### Define `international` Attribute +### 定义 `international` 属性 -Add the `international` attribute to the `Student` class. This attribute indicates whether the student is international and must not be null. +向 `Student` 类添加 `international` 属性。该属性表示学生是否为国际学生,不能为空。 ```java @NotNull private boolean international; ``` -- `@NotNull`: Ensures that the value of `international` is not null. - - -You can repeat the previous steps to create entity characteristics for the `Course` and `Enrollment` entities, ensuring appropriate annotations are applied to each attribute. +- `@NotNull`:确保 `international` 的值不为 null。 -### Enrollment Entity Characteristics: +您可以重复上述步骤,为 `Course` 和 `Enrollment` 实体创建实体特性,确保为每个属性应用适当的注释。 -- `id` (UUID): Primary key for the entity. -- `enrollmentDate` (Date): Date of enrollment. -- `grade` (int): Grade achieved in the course. +### Enrollment 实体特性: -### Course Entity Characteristics: +- `id`(UUID):实体的主键。 +- `enrollmentDate`(Date):注册日期。 +- `grade`(int):课程中获得的成绩。 -- `id` (UUID): Primary key for the entity. -- `name` (String): Name of the course. -- `instructor` (String): Name of the course instructor. -- `schedule` (String): Schedule details of the course. -- `capacity` (int): Maximum capacity of the course. -- `online` (boolean): Indicates if the course is online. -- `startDate` (Date): Start date of the course. +### Course 实体特性: +- `id`(UUID):实体的主键。 +- `name`(String):课程名称。 +- `instructor`(String):课程讲师姓名。 +- `schedule`(String):课程的安排详情。 +- `capacity`(int):课程的最大容量。 +- `online`(boolean):指示课程是否在线。 +- `startDate`(Date):课程的开始日期。 --- -# [Next: Managing Relationships](relationships.md) \ No newline at end of file +# [下一步:管理关系](relationships.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/create-entity.md b/docs/cn/jpa/practice/creation/create-entity.md index 851531f..1fdcdc2 100644 --- a/docs/cn/jpa/practice/creation/create-entity.md +++ b/docs/cn/jpa/practice/creation/create-entity.md @@ -1,16 +1,16 @@ -# Creating Entities +# 创建实体 -## Introduction +## 介绍 -This guide focuses on creating entities in a Spring Boot project using JPA (Java Persistence API). It provides step-by-step instructions for setting up the folder structure and creating entity classes. +本指南侧重于使用JPA(Java Persistence API)在Spring Boot项目中创建实体。它提供了逐步的说明,用于设置文件夹结构和创建实体类。 -## Goal +## 目标 -The goal of this guide is to demonstrate how to create entity classes in a Spring Boot project, following best practices and utilizing JPA for data persistence. +本指南的目标是演示如何在Spring Boot项目中创建实体类,遵循最佳实践并利用JPA进行数据持久化。 -## Folder Structure +## 文件夹结构 -To ensure a well-organized project, it's essential to establish a proper folder structure. Follow these guidelines: +为了确保项目组织良好,建立正确的文件夹结构至关重要。请遵循以下准则: ``` src/ @@ -26,19 +26,19 @@ src/ ``` -In this structure: -- The `src/main/java` directory contains your Java source files. -- The `com/example/demo/entity` directory is where you'll create your entity classes. +在这个结构中: +- `src/main/java` 目录包含您的Java源文件。 +- `com/example/demo/entity` 目录是您将创建实体类的地方。 -## Creating Entity Classes +## 创建实体类 -To create entity classes, follow these steps: +要创建实体类,请按照以下步骤操作: -1. Navigate to the `com/example/demo/entity` directory in your project. -2. Create a new Java class file for each entity. You can repeat the following steps for each entity (e.g., Student, Enrollment, Course). -3. Define your entity class with the `@Entity` annotation. +1. 导航到您项目中的 `com/example/demo/entity` 目录。 +2. 为每个实体创建一个新的Java类文件。您可以为每个实体(例如,Student、Enrollment、Course)重复以下步骤。 +3. 使用 `@Entity` 注解定义您的实体类。 -### Example: +### 示例: ```java package com.example.demo.entity; @@ -51,10 +51,10 @@ public class Student { } ``` -The `@Entity` annotation indicates that this class is a JPA entity. +`@Entity` 注解表示该类是一个JPA实体。 -Repeat the above steps to create `Enrollment` and `Course` entity classes. +重复以上步骤以创建 `Enrollment` 和 `Course` 实体类。 --- -# [Next: Entity Characteristics Definition](characteristics.md) \ No newline at end of file +# [下一步:实体特征定义](characteristics.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/fetching.md b/docs/cn/jpa/practice/creation/fetching.md index de11305..66ebb8e 100644 --- a/docs/cn/jpa/practice/creation/fetching.md +++ b/docs/cn/jpa/practice/creation/fetching.md @@ -1,49 +1,45 @@ -Understood. Here's the revised document with the code combined with the scenario: +# Spring Boot中的获取策略与JPA:理解懒加载和急加载 ---- - -# Fetching Strategies in Spring Boot with JPA: Understanding Lazy and Eager Loading - -## Introduction +## 介绍 -This guide explores the fetching strategies in a Spring Boot project with JPA (Java Persistence API). Specifically, we will delve into the concepts of Lazy and Eager loading and how they are applied in entity relationships. +本指南探讨了在使用JPA(Java Persistence API)的Spring Boot项目中的获取策略。具体来说,我们将深入研究懒加载和急加载的概念以及它们在实体关系中的应用。 -## Goal +## 目标 -The goal of this guide is to provide a comprehensive understanding of fetching strategies in JPA. By the end of this guide, you will comprehend when to use Lazy and Eager loading and how to implement them in your application. +本指南的目标是全面了解JPA中的获取策略。通过本指南,您将了解何时使用懒加载和急加载以及如何在应用程序中实现它们。 -## Fetching Strategies +## 获取策略 -### Scenario +### 场景 -In our entity relationships, we have a One-to-Many relationship between the `Student` entity and the `Enrollment` entity. Similarly, there is a One-to-Many relationship between the `Course` entity and the `Enrollment` entity. +在我们的实体关系中,`Student` 实体和 `Enrollment` 实体之间存在一对多的关系。同样,`Course` 实体和 `Enrollment` 实体之间也存在一对多的关系。 -#### Student Entity +#### Student 实体 -In the `Student` entity, we have a One-to-Many relationship with the `Enrollment` entity. Each student can have multiple enrollments. +在 `Student` 实体中,我们与 `Enrollment` 实体之间存在一对多的关系。每个学生可以有多个注册。 -To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "student"` in the `Student` entity. Here, we have a choice between Lazy and Eager loading strategies for fetching the associated enrollments. +为了表示这种关系,我们在 `Student` 实体中使用了 `@OneToMany` 注解,并指定了 `mappedBy = "student"`。在这里,我们可以选择懒加载和急加载策略来获取关联的注册。 ```java @OneToMany(mappedBy = "student", fetch = FetchType.EAGER, cascade = CascadeType.ALL) private List enrollments; ``` -We opt for Eager loading (`FetchType.EAGER`) in this scenario. Since we typically expect to access all enrollments of a student together, Eager loading ensures that all enrollments are fetched immediately when loading the student. +在这种情况下,我们选择了急加载(`FetchType.EAGER`)。由于我们通常期望一次访问一个学生的所有注册,急加载确保在加载学生时立即获取所有注册。 -#### Course Entity +#### Course 实体 -Similarly, in the `Course` entity, we also have a One-to-Many relationship with the `Enrollment` entity. Each course can have multiple enrollments. +类似地,在 `Course` 实体中,我们还与 `Enrollment` 实体存在一对多的关系。每个课程可以有多个注册。 -To represent this relationship, we use the `@OneToMany` annotation with `mappedBy = "course"` in the `Course` entity. Here, we have another choice between Lazy and Eager loading strategies for fetching the associated enrollments. +为了表示这种关系,我们在 `Course` 实体中使用了 `@OneToMany` 注解,并指定了 `mappedBy = "course"`。在这里,我们可以选择另一种懒加载和急加载策略来获取关联的注册。 ```java @OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List enrollments; ``` -We opt for Lazy loading (`FetchType.LAZY`) in this scenario. Since we may not always need to access all enrollments of a course, Lazy loading ensures that enrollments are fetched only when explicitly requested. +在这种情况下,我们选择了懒加载(`FetchType.LAZY`)。由于我们可能并不总是需要访问一个课程的所有注册,懒加载确保只有在明确请求时才获取注册。 --- -# [Next: Create Repository](../interacting/repository.md) \ No newline at end of file +# [下一步:创建存储库](../interacting/repository.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/creation/relationships.md b/docs/cn/jpa/practice/creation/relationships.md index e7cdd1b..cfe78aa 100644 --- a/docs/cn/jpa/practice/creation/relationships.md +++ b/docs/cn/jpa/practice/creation/relationships.md @@ -1,27 +1,28 @@ -# Defining Entity Relationships +# 定义实体关系 -## Introduction +## 介绍 -This guide delves into understanding and implementing relationships between entities in a Spring Boot project using JPA (Java Persistence API). Specifically, we will explore the relationship between the `Enrollment` entity and its associated entities `Student` and `Course`. +本指南深入探讨了在使用JPA(Java Persistence API)的Spring Boot项目中理解和实现实体之间的关系。具体来说,我们将探讨 `Enrollment` 实体与其关联实体 `Student` 和 `Course` 之间的关系。 -## Goal +## 目标 -The goal of this guide is to provide clear instructions for defining and understanding entity relationships in a Spring Boot project with JPA. By the end of this guide, you will comprehend how to establish associations between entities and implement them in your application. +本指南的目标是提供清晰的说明,以便在使用JPA的Spring Boot项目中定义和理解实体关系。通过本指南,您将了解如何在应用程序中建立实体之间的关联并加以实现。 -## Entity Associations +## 实体关联 ![img.png](../../../../srcs/jpa/er-diagram.png) -### Enrollment Entity Characteristics: -- `id` (UUID): Primary key for the entity. -- `student` (Student): Student associated with the enrollment. -- `course` (Course): Course associated with the enrollment. -- `enrollmentDate` (Date): Date of enrollment. -- `grade` (int): Grade achieved in the course. +### Enrollment 实体特征: -#### Student Relationship +- `id`(UUID):实体的主键。 +- `student`(Student):与注册关联的学生。 +- `course`(Course):与注册关联的课程。 +- `enrollmentDate`(日期):注册日期。 +- `grade`(整数):课程中获得的成绩。 -The relationship between the `Enrollment` entity and the `Student` entity represents a scenario where a student enrolls in a course. This is a Many-to-One relationship, where many enrollments can be associated with one student. To establish this relationship, annotate the `student` attribute in the `Enrollment` entity with `@ManyToOne`. +#### 学生关系 + +`Enrollment` 实体与 `Student` 实体之间的关系代表了一个场景,即学生在课程中注册。这是一种多对一的关系,一个学生可以与多个注册相关联。要建立这种关系,在 `Enrollment` 实体中的 `student` 属性上使用 `@ManyToOne` 进行注解。 ```java @ManyToOne @@ -29,9 +30,9 @@ The relationship between the `Enrollment` entity and the `Student` entity repres private Student student; ``` -#### Course Relationship +#### 课程关系 -Similarly, the relationship between the `Enrollment` entity and the `Course` entity signifies a scenario where a course is enrolled by multiple students. This is also a Many-to-One relationship, where many enrollments can be associated with one course. Annotate the `course` attribute in the `Enrollment` entity with `@ManyToOne`. +同样,`Enrollment` 实体与 `Course` 实体之间的关系表示了多个学生注册了一个课程的场景。这也是一种多对一的关系,一个课程可以与多个注册相关联。在 `Enrollment` 实体中的 `course` 属性上进行注解,使用 `@ManyToOne`。 ```java @ManyToOne @@ -41,4 +42,4 @@ private Course course; --- -# [Next: Fetching Strategies](fetching.md) +# [下一步:获取策略](fetching.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/dependencies/driver.md b/docs/cn/jpa/practice/dependencies/driver.md index 928b2ab..ef401b6 100644 --- a/docs/cn/jpa/practice/dependencies/driver.md +++ b/docs/cn/jpa/practice/dependencies/driver.md @@ -1,26 +1,27 @@ -# JPA: Setup Dependencies +# JPA: 设置依赖项 -## Introduction +## 简介 -This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include database drivers for various databases such as PostgreSQL, MySQL, Oracle, MongoDB, and Microsoft SQL Server. By following this guide, you will configure all the required dependencies to establish connections with these databases in your Spring Boot application. +本指南着重介绍了如何为具有JPA(Java Persistence API)的Spring Boot项目设置依赖项。它涵盖了包括PostgreSQL、MySQL、Oracle、MongoDB和Microsoft SQL Server等各种数据库的数据库驱动程序的必要步骤。通过按照本指南的步骤,您将配置所有必需的依赖项,以在Spring Boot应用程序中与这些数据库建立连接。 -## Goal -The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on database drivers for different databases. +## 目标 -## Setup Dependencies +本指南的目标是提供清晰的说明,以便设置Spring Boot和JPA的必要依赖项,特别关注不同数据库的数据库驱动程序。 -### Database Drivers +## 设置依赖项 -To connect to different databases in your Spring Boot application, include the appropriate database drivers. +### 数据库驱动程序 + +要连接Spring Boot应用程序中的不同数据库,请包含相应的数据库驱动程序。 #### PostgreSQL -**For Gradle:** +**对于Gradle:** ```groovy implementation "org.postgresql:postgresql" ``` -**For Maven:** +**对于Maven:** ```xml org.postgresql @@ -31,12 +32,12 @@ implementation "org.postgresql:postgresql" #### MySQL -**For Gradle:** +**对于Gradle:** ```groovy implementation "mysql:mysql-connector-java" ``` -**For Maven:** +**对于Maven:** ```xml mysql @@ -45,14 +46,14 @@ implementation "mysql:mysql-connector-java" ``` -#### Oracle Database Driver +#### Oracle数据库驱动程序 -**For Gradle:** +**对于Gradle:** ```groovy implementation 'com.oracle.database.jdbc:ojdbc8' ``` -**For Maven:** +**对于Maven:** ```xml com.oracle.database.jdbc @@ -60,14 +61,14 @@ implementation 'com.oracle.database.jdbc:ojdbc8' ``` -#### MongoDB Driver (MongoDB Java Driver) +#### MongoDB驱动程序(MongoDB Java驱动程序) -**For Gradle:** +**对于Gradle:** ```groovy implementation 'org.mongodb:mongodb-driver-sync:4.4.3' ``` -**For Maven:** +**对于Maven:** ```xml org.mongodb @@ -76,14 +77,14 @@ implementation 'org.mongodb:mongodb-driver-sync:4.4.3' ``` -#### Microsoft SQL Server JDBC Driver +#### Microsoft SQL Server JDBC驱动程序 -**For Gradle:** +**对于Gradle:** ```groovy implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' ``` -**For Maven:** +**对于Maven:** ```xml com.microsoft.sqlserver @@ -92,9 +93,8 @@ implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11' ``` -These dependencies facilitate database connectivity. +这些依赖项有助于数据库连接。 --- -# [Next: Spring Boot and JPA Dependencies](jpa.md) - +# [下一步:Spring Boot和JPA依赖项](jpa.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/dependencies/jpa.md b/docs/cn/jpa/practice/dependencies/jpa.md index ec67ad5..9d45963 100644 --- a/docs/cn/jpa/practice/dependencies/jpa.md +++ b/docs/cn/jpa/practice/dependencies/jpa.md @@ -1,18 +1,18 @@ -# JPA: Setup Dependencies +# JPA:设置依赖项 -## Introduction +## 简介 -This guide focuses on setting up dependencies for a Spring Boot project with JPA (Java Persistence API). It covers the necessary steps to include Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. +本指南专注于为具有JPA(Java Persistence API)的Spring Boot项目设置依赖项。它涵盖了包括Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项的必要步骤。 -## Goal +## 目标 -The goal of this guide is to provide clear instructions for setting up the necessary dependencies for Spring Boot and JPA, specifically focusing on Spring Boot Starter JDBC and Spring Boot Starter Data JPA dependencies. +本指南的目标是提供清晰的说明,以便设置Spring Boot和JPA的必要依赖项,特别关注Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项。 -## Setup Dependencies +## 设置依赖项 ### Spring Boot Starter JDBC -To enable JDBC support in your Spring Boot application: +要在Spring Boot应用程序中启用JDBC支持: #### Gradle @@ -29,11 +29,11 @@ implementation "org.springframework.boot:spring-boot-starter-jdbc" ``` -This dependency provides auto-configuration for JDBC-based data access. +此依赖项提供了基于JDBC的数据访问的自动配置。 ### Spring Boot Starter Data JPA -To include support for JPA (Java Persistence API) in your Spring Boot application: +要在Spring Boot应用程序中包含对JPA(Java Persistence API)的支持: #### Gradle @@ -50,8 +50,8 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" ``` -This dependency simplifies the setup of JPA-based repositories and provides default configurations for Hibernate. +此依赖项简化了JPA存储库的设置,并为Hibernate提供了默认配置。 --- -# [Next: Entity Creation](../creation/create-entity.md) \ No newline at end of file +# [下一步:实体创建](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository.md b/docs/cn/jpa/practice/interacting/jpa-repository.md index e81961e..e0dd740 100644 --- a/docs/cn/jpa/practice/interacting/jpa-repository.md +++ b/docs/cn/jpa/practice/interacting/jpa-repository.md @@ -1,14 +1,14 @@ -# Creating JpaRepository +# 创建JpaRepository -## Introduction +## 介绍 -This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API) using JpaRepository. +本指南演示了如何在Spring Boot项目中使用JpaRepository创建实体管理的存储库(Repository)。 -## Goal +## 目标 -The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository and service classes for the `Course` entity. +本指南的目标是提供清晰的说明,以便在Spring Boot应用程序中设置用于管理实体的存储库。通过本指南,您将能够为`Course`实体创建存储库和服务类。 -## Folder Structure +## 文件夹结构 ``` src/ @@ -27,7 +27,8 @@ src/ └── CourseRepository.java ``` -## Repository Class + +## 存储库类 ### CourseRepository.java @@ -40,15 +41,12 @@ import org.springframework.stereotype.Repository; @Repository public interface CourseRepository extends JpaRepository { - // Add repository methods for course entity + // 添加用于课程实体的存储库方法 } ``` - -The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. - +`@Repository` 注解是一个Spring的构造型注解,用于指示被修饰的类是数据访问层中的存储库组件。它作为任何充当存储库角色的类的标记,有助于将异常转换为Spring的统一异常层次结构。 --- -# [Next: Create Record](jpa-repository/create.md) - +# [下一步:创建记录](jpa-repository/create.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/create.md b/docs/cn/jpa/practice/interacting/jpa-repository/create.md index 9bcf784..19f9eb5 100644 --- a/docs/cn/jpa/practice/interacting/jpa-repository/create.md +++ b/docs/cn/jpa/practice/interacting/jpa-repository/create.md @@ -1,14 +1,14 @@ -# Creating Records in a Table Using JpaRepository +# 使用JpaRepository在表中创建记录 -## Introduction +## 简介 -This guide demonstrates how to create records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. +本指南演示了如何在Spring Boot应用程序中使用JPA(Java Persistence API)和JpaRepository的存储库层创建表中的记录。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of creating records in a table by implementing a method within the `CourseRepository` interface using JpaRepository. +本指南的目标是通过在`CourseRepository`接口中实现方法来说明在表中创建记录的过程。 -## Repository Method +## 存储库方法 ### CourseRepository.java @@ -27,12 +27,12 @@ public interface CourseRepository extends JpaRepository { } ``` -### Explanation +### 解释 -The `save(Course course)` method provided by JpaRepository allows us to persist a new record in the `Course` table. +JpaRepository提供的`save(Course course)`方法允许我们将新记录持久化到`Course`表中。 -By invoking this method and passing a `Course` object as a parameter, JpaRepository automatically handles the process of persisting the entity to the database. +通过调用此方法并将`Course`对象作为参数传递,JpaRepository自动处理将实体持久化到数据库的过程。 --- -# [Next: Read Record](read.md) \ No newline at end of file +# [下一步:读取记录](read.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/delete.md b/docs/cn/jpa/practice/interacting/jpa-repository/delete.md index b24cfcf..ef0cb6d 100644 --- a/docs/cn/jpa/practice/interacting/jpa-repository/delete.md +++ b/docs/cn/jpa/practice/interacting/jpa-repository/delete.md @@ -1,14 +1,14 @@ -# Deleting Records from a Table Using JpaRepository +# 使用JpaRepository从表中删除记录 -## Introduction +## 简介 -This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. +本指南演示了如何在Spring Boot应用程序中使用JPA(Java Persistence API)和JpaRepository的存储库层删除表中的记录。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `CourseRepository` interface using JpaRepository. +本指南的目标是通过在`CourseRepository`接口中实现方法来说明从表中删除记录的过程。 -## Repository Method +## 存储库方法 ### CourseRepository.java @@ -27,15 +27,15 @@ public interface CourseRepository extends JpaRepository { } ``` -## Explanation +## 解释 -The `deleteById(UUID id)` method signature follows a convention recognized by JpaRepository for deleting records based on their unique identifier. +`deleteById(UUID id)`方法的签名遵循JpaRepository的约定,用于根据唯一标识符删除记录。 -- The `delete` keyword indicates that this method is used for deleting data. -- `ById` specifies the criteria for identifying the record to be deleted. In this case, we are targeting a record with a specific ID. +- `delete`关键字表示此方法用于删除数据。 +- `ById`指定了要删除的记录的标识条件。在本例中,我们针对具有特定ID的记录进行操作。 -By adhering to this naming convention, JpaRepository automatically generates the appropriate SQL query behind the scenes to delete the desired record from the database. This simplifies the development process by eliminating the need to write explicit SQL delete statements, allowing developers to focus on defining method signatures that reflect the intended data deletion operations. +通过遵循这种命名约定,JpaRepository会在后台自动生成适当的SQL查询,以从数据库中删除所需的记录。这简化了开发过程,无需编写显式的SQL删除语句,使开发人员可以专注于定义反映预期数据删除操作的方法签名。 --- -# [Next: Custom Query](query.md) +# [下一步:自定义查询](query.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/query.md b/docs/cn/jpa/practice/interacting/jpa-repository/query.md index 0804429..e5274b8 100644 --- a/docs/cn/jpa/practice/interacting/jpa-repository/query.md +++ b/docs/cn/jpa/practice/interacting/jpa-repository/query.md @@ -1,14 +1,14 @@ -# Custom Query Using JpaRepository +# 使用JpaRepository进行自定义查询 -## Introduction +## 简介 -This guide demonstrates how to implement custom query methods using the `@Query` annotation in the repository layer of a Spring Boot application with JPA (Java Persistence API) and JpaRepository. +本指南演示了如何在Spring Boot应用程序的存储库层中使用`@Query`注解实现自定义查询方法,该应用程序使用JPA(Java Persistence API)和JpaRepository。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of creating custom query methods in the repository interface to perform specific database operations tailored to application requirements. +本指南的目标是说明在存储库接口中创建自定义查询方法的过程,以执行特定于应用程序要求的数据库操作。 -## Repository Method +## 存储库方法 ### CourseRepository.java @@ -29,15 +29,15 @@ public interface CourseRepository extends JpaRepository { } ``` -### Explanation +### 解释 -The `@Query` annotation allows us to define custom JPQL (Java Persistence Query Language) queries directly within the repository interface. +`@Query`注解允许我们在存储库接口中直接定义自定义JPQL(Java Persistence Query Language)查询。 -- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` is a JPQL query that selects all courses where the instructor matches the provided value. -- `@Param("instructor")` annotation binds the method parameter `instructor` to the named parameter `:instructor` in the JPQL query. +- `"SELECT c FROM Course c WHERE c.instructor = :instructor"`是一个JPQL查询,它选择所有教师与提供的值匹配的课程。 +- `@Param("instructor")`注解将方法参数`instructor`绑定到JPQL查询中的命名参数`:instructor`。 -By using `@Query`, we can create complex queries tailored to specific data retrieval needs, providing flexibility and control over the database operations. +通过使用`@Query`,我们可以创建适用于特定数据检索需求的复杂查询,从而提供对数据库操作的灵活性和控制。 --- -# [Next: Tasks](../../../lab-work.md) +# [下一步:任务](../../../lab-work.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/jpa-repository/read.md b/docs/cn/jpa/practice/interacting/jpa-repository/read.md index ce7a6b2..0579d17 100644 --- a/docs/cn/jpa/practice/interacting/jpa-repository/read.md +++ b/docs/cn/jpa/practice/interacting/jpa-repository/read.md @@ -1,14 +1,14 @@ -# Reading Records from a Table Using JpaRepository +# 使用JpaRepository从表中读取记录 -## Introduction +## 简介 -This guide demonstrates how to retrieve data from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API) and JpaRepository. +本指南演示了如何在Spring Boot应用程序的存储库层中使用JPA(Java Persistence API)和JpaRepository检索数据表中的数据。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of reading data from a table by implementing a method within the `CourseRepository` interface using JpaRepository. +本指南的目标是通过在`CourseRepository`接口中使用JpaRepository实现一个方法,来说明从表中读取数据的过程。 -## Repository Method +## 存储库方法 ### CourseRepository.java @@ -27,16 +27,16 @@ public interface CourseRepository extends JpaRepository { } ``` -### Explanation +### 解释 -The `findCoursesByInstructor(String instructor)` method signature follows a specific naming convention recognized by Spring Data JPA. +`findCoursesByInstructor(String instructor)`方法签名遵循Spring Data JPA识别的特定命名约定。 -- The `find` keyword indicates that this method is used for retrieving data. -- `Courses` represents the entity type we want to retrieve. -- `ByInstructor` specifies the criteria for filtering the results. In this case, we are querying for courses based on the `instructor` attribute. +- `find`关键字表示此方法用于检索数据。 +- `Courses`表示我们要检索的实体类型。 +- `ByInstructor`指定了筛选结果的条件。在本例中,我们基于`instructor`属性查询课程。 -By adhering to this naming convention, Spring Data JPA automatically generates the appropriate SQL query behind the scenes to fetch the required data from the database. This simplifies the development process by eliminating the need to write explicit SQL queries, allowing developers to focus on defining method signatures that reflect the desired data retrieval operations. +通过遵循这种命名约定,Spring Data JPA在幕后自动生成适当的SQL查询,以从数据库中提取所需的数据。这简化了开发过程,无需编写显式的SQL查询,开发人员可以专注于定义反映所需数据检索操作的方法签名。 --- -# [Next: Delete Record](delete.md) \ No newline at end of file +# [下一步:删除记录](delete.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository.md b/docs/cn/jpa/practice/interacting/repository.md index 42cd863..abe7d96 100644 --- a/docs/cn/jpa/practice/interacting/repository.md +++ b/docs/cn/jpa/practice/interacting/repository.md @@ -1,14 +1,14 @@ -# Creating Repository +# 创建存储库 -## Introduction +## 简介 -This guide demonstrates how to create repository for entity management in a Spring Boot project with JPA (Java Persistence API). +本指南演示了如何在Spring Boot项目中使用JPA(Java Persistence API)创建用于实体管理的存储库。 -## Goal +## 目标 -The goal of this guide is to provide clear instructions for setting up repository for managing entities in a Spring Boot application. By the end of this guide, you will be able to create repository for the `Student` entity. +本指南的目标是提供清晰的说明,以便在Spring Boot应用程序中设置用于管理实体的存储库。通过本指南,您将能够为`Student`实体创建存储库。 -## Folder Structure +## 文件夹结构 ``` src/ @@ -18,7 +18,7 @@ src/ └── example/ └── demo/ ├── data/ - │ └── entites/ + │ └── entities/ │ ├── Student.java │ ├── Enrollment.java │ └── Course.java @@ -26,7 +26,8 @@ src/ └── StudentRepository.java ``` -## Repository Class + +## 存储库类 ### StudentRepository.java @@ -38,14 +39,12 @@ import org.springframework.stereotype.Repository; @Repository public class StudentRepository { - // Add repository methods for student entity + // 为学生实体添加存储库方法 } ``` - -The `@Repository` annotation is a Spring stereotype annotation used to indicate that the decorated class is a repository component in the data access layer. It serves as a marker for any class that fulfills the role of a repository, facilitating the translation of exceptions into Spring's unified exception hierarchy. - +`@Repository` 注解是Spring的一种类型注解,用于指示被修饰的类是数据访问层中的存储库组件。它作为任何充当存储库角色的类的标记,有助于将异常转换为Spring的统一异常层次结构。 --- -# [Next: Create Record](repository/create.md) +# [下一步:创建记录](repository/create.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository/create.md b/docs/cn/jpa/practice/interacting/repository/create.md index 34e92de..4f0df03 100644 --- a/docs/cn/jpa/practice/interacting/repository/create.md +++ b/docs/cn/jpa/practice/interacting/repository/create.md @@ -1,14 +1,14 @@ -# Creating New Records in a Table Using Repository Layer +# 使用存储库层在表中创建新记录 -## Introduction +## 简介 -This guide illustrates how to create new records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). +本指南演示了如何在Spring Boot应用程序中使用存储库层创建表中的新记录,该应用程序使用了JPA(Java Persistence API)。 -## Goal +## 目标 -The goal of this guide is to demonstrate the process of creating new records in a table by utilizing the repository layer. We will achieve this by implementing a method within the `StudentRepository` interface using the `EntityManager` instead of `JpaRepository`. +本指南的目标是通过利用存储库层实现在表中创建新记录的过程。我们将通过在`StudentRepository`接口中使用`EntityManager`而不是`JpaRepository`来实现这一目标。 -## Repository Method +## 存储库方法 ### StudentRepository.java @@ -33,14 +33,14 @@ public class StudentRepository { } ``` -### Explanation +### 解释 -- `@Repository`: This annotation marks the class as a repository component in the data access layer. +- `@Repository`:此注解将该类标记为数据访问层中的存储库组件。 -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. +- `@PersistenceContext`:此注解用于将EntityManager实例注入存储库类中。 -- `entityManager.persist(student)`: This line of code persists the new `Student` entity to the database. +- `entityManager.persist(student)`:这行代码将新的`Student`实体持久化到数据库中。 --- -# [Next: Read Record](read.md) \ No newline at end of file +# [下一步:读取记录](read.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository/delete.md b/docs/cn/jpa/practice/interacting/repository/delete.md index 25fa2de..bdc3752 100644 --- a/docs/cn/jpa/practice/interacting/repository/delete.md +++ b/docs/cn/jpa/practice/interacting/repository/delete.md @@ -1,14 +1,14 @@ -# Deleting Records from a Table Using Repository Layer +# 使用存储库层从表中删除记录 -## Introduction +## 简介 -This guide demonstrates how to delete records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). +本指南演示了如何在Spring Boot应用程序中使用存储库层删除表中的记录,该应用程序使用了JPA(Java Persistence API)。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of deleting records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. +本指南的目标是通过在`StudentRepository`接口中使用`EntityManager`实现删除表中记录的过程。 -## Repository Method +## 存储库方法 ### StudentRepository.java @@ -34,14 +34,14 @@ public class StudentRepository { } ``` -### Explanation +### 解释 -- `@Repository`: This annotation marks the class as a repository component in the data access layer. +- `@Repository`:此注解将该类标记为数据访问层中的存储库组件。 -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. +- `@PersistenceContext`:此注解用于将EntityManager实例注入存储库类中。 -- `entityManager.remove(studentToDelete)`: This line of code deletes the `Student` entity from the database. +- `entityManager.remove(studentToDelete)`:这行代码从数据库中删除`Student`实体。 --- -# [Next: Custom Query](query.md) +# [下一步:自定义查询](query.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository/query.md b/docs/cn/jpa/practice/interacting/repository/query.md index d8c2129..f8bfaf3 100644 --- a/docs/cn/jpa/practice/interacting/repository/query.md +++ b/docs/cn/jpa/practice/interacting/repository/query.md @@ -1,14 +1,14 @@ -# Creating Custom Queries in a Table Using Repository Layer +# 在存储库层创建自定义查询以从表中获取记录 -## Introduction +## 简介 -This guide demonstrates how to create custom queries to fetch records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). +本指南演示了如何在Spring Boot应用程序中使用存储库层创建自定义查询来从表中获取记录,该应用程序使用了JPA(Java Persistence API)。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of creating custom queries to fetch records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. +本指南的目标是通过在`StudentRepository`接口中使用`EntityManager`实现创建自定义查询来从表中获取记录的过程。 -## Repository Method +## 存储库方法 ### StudentRepository.java @@ -36,14 +36,14 @@ public class StudentRepository { } ``` -### Explanation +### 解释 -- `@Repository`: This annotation marks the class as a repository component in the data access layer. +- `@Repository`:此注解将该类标记为数据访问层中的存储库组件。 -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. +- `@PersistenceContext`:此注解用于将EntityManager实例注入存储库类中。 -- `entityManager.createQuery(...)`: This line of code creates a custom JPQL (Java Persistence Query Language) query to fetch records based on the provided criteria (`major` in this example). +- `entityManager.createQuery(...)`:这行代码创建了一个自定义的JPQL(Java Persistence Query Language)查询,以根据提供的条件(在此示例中为`major`)从表中获取记录。 --- -# [Next: Create JpaRepository](../jpa-repository.md) \ No newline at end of file +# [下一步:创建JpaRepository](../jpa-repository.md) \ No newline at end of file diff --git a/docs/cn/jpa/practice/interacting/repository/read.md b/docs/cn/jpa/practice/interacting/repository/read.md index cd32262..a87f290 100644 --- a/docs/cn/jpa/practice/interacting/repository/read.md +++ b/docs/cn/jpa/practice/interacting/repository/read.md @@ -1,14 +1,14 @@ -# Reading Records from a Table Using Repository Layer +# 使用存储库层从表中读取记录 -## Introduction +## 简介 -This guide demonstrates how to read records from a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). +本指南演示了如何在Spring Boot应用程序中使用存储库层从表中读取记录,该应用程序使用了JPA(Java Persistence API)。 -## Goal +## 目标 -The goal of this guide is to illustrate the process of reading records from a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. +本指南的目标是通过在`StudentRepository`接口中使用`EntityManager`实现方法来从表中读取记录的过程。 -## Repository Method +## 存储库方法 ### StudentRepository.java @@ -20,6 +20,7 @@ import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.Transactional; +import java.util.UUID; @Repository public class StudentRepository { @@ -33,14 +34,14 @@ public class StudentRepository { } ``` -### Explanation +### 解释 -- `@Repository`: This annotation marks the class as a repository component in the data access layer. +- `@Repository`:此注解将该类标记为数据访问层中的存储库组件。 -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. +- `@PersistenceContext`:此注解用于将EntityManager实例注入存储库类中。 -- `entityManager.find(Student.class, id)`: This line of code retrieves the `Student` entity from the database based on the provided `id`. +- `entityManager.find(Student.class, id)`:这行代码根据提供的`id`从数据库中检索`Student`实体。 --- -# [Next: Update Record](update.md) +# [下一步:更新记录](update.md) diff --git a/docs/cn/jpa/practice/interacting/repository/update.md b/docs/cn/jpa/practice/interacting/repository/update.md index ba2b0bc..97a54f9 100644 --- a/docs/cn/jpa/practice/interacting/repository/update.md +++ b/docs/cn/jpa/practice/interacting/repository/update.md @@ -1,14 +1,14 @@ -# Updating Records in a Table Using Repository Layer +# 使用存储库层更新表中的记录 -## Introduction +## 简介 -This guide illustrates how to update records in a table using the repository layer in a Spring Boot application with JPA (Java Persistence API). +本指南演示了如何在Spring Boot应用程序中使用存储库层更新表中的记录,该应用程序使用了JPA(Java Persistence API)。 -## Goal +## 目标 -The goal of this guide is to demonstrate the process of updating records in a table by implementing a method within the `StudentRepository` interface using the `EntityManager`. +本指南的目标是通过在`StudentRepository`接口中使用`EntityManager`实现方法来更新表中的记录。 -## Repository Method +## 存储库方法 ### StudentRepository.java @@ -33,14 +33,14 @@ public class StudentRepository { } ``` -### Explanation +### 解释 -- `@Repository`: This annotation marks the class as a repository component in the data access layer. +- `@Repository`:此注解将该类标记为数据访问层中的存储库组件。 -- `@PersistenceContext`: This annotation is used to inject an EntityManager instance into the repository class. +- `@PersistenceContext`:此注解用于将EntityManager实例注入存储库类中。 -- `entityManager.merge(student)`: This line of code updates the `Student` entity in the database. +- `entityManager.merge(student)`:这行代码将在数据库中更新`Student`实体。 --- -# [Next: Delete Record](delete.md) \ No newline at end of file +# [下一步:删除记录](delete.md) diff --git a/docs/cn/springsecurity/lab-work.md b/docs/cn/springsecurity/lab-work.md index 245d193..79557f9 100644 --- a/docs/cn/springsecurity/lab-work.md +++ b/docs/cn/springsecurity/lab-work.md @@ -1,61 +1,60 @@ -# Spring Security Lab Work +# Spring Security 实验任务 -Welcome to the Spring Security Lab Work! The goal of this series of tasks is to help you practice and get know to Spring Security, and make an enough startup project. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of security integration in a Spring application. +欢迎来到 Spring Security 实验任务系列!本系列任务旨在帮助您实践并熟悉 Spring Security,从而建立一个足够的启动项目。无论您是初学者还是希望提升技能,这些动手任务将引导您完成在 Spring 应用中集成安全性的各个方面。 -## Goal of the Lab Work +## 实验任务的目标 -The primary goal of this lab work is to provide you with practical experience and proficiency in using security within a Spring environment. Spring Security is widely utilized for authentication, authorization and securing your project, and through these tasks, you will gain valuable insights into its configuration, authentication, authorization, and more. +本实验任务的主要目标是让您在 Spring 环境中使用安全性获得实际经验和熟练程度。Spring Security 广泛用于身份验证、授权和保护项目,通过这些任务,您将深入了解其配置、身份验证、授权等方面。 -## Practice Tasks +## 练习任务 -1. [Task 1: Configure Spring Security](practice/configure-spring-security.md) -2. [Task 2: Create a Base Implementation for User](practice/base-implementation-user.md) -3. [Task 3: Password Encryption](practice/password-encryption.md) -4. [Task 4: Add a Dummy Users](practice/add-dummy-users.md) -5. [Task 5: Create Identity to Users](practice/create-identity-to-users.md) -6. [Task 6: Create a Base for Authorization in Server](practice/setup-server-authorization.md) -7. [Task 7: Authorize Authenticated Users](practice/authorize-server-authenticated.md) -8. [Task 8: Authorize by Role](practice/authorize-server-role.md) -9. [Task 9: Authorize by Authority](practice/authorize-server-authority.md) -10. [Task 10: Configure Thymeleaf Security](practice/configure-thymeleaf-security.md) -11. [Task 11: Authorize Authenticated Users](practice/authorize-client-authenticated.md) -12. [Task 12: Authorize by Role](practice/authorize-client-role.md) -13. [Task 13: Authorize by Authority](practice/authorize-client-authority.md) -14. [Task 14: Custom Login Form](practice/custom-login-form.md) +1. [任务 1:配置 Spring Security](practice/configure-spring-security.md) +2. [任务 2:创建用户的基本实现](practice/base-implementation-user.md) +3. [任务 3:密码加密](practice/password-encryption.md) +4. [任务 4:添加虚拟用户](practice/add-dummy-users.md) +5. [任务 5:为用户创建身份](practice/create-identity-to-users.md) +6. [任务 6:在服务器中创建授权基础](practice/setup-server-authorization.md) +7. [任务 7:授权已认证用户](practice/authorize-server-authenticated.md) +8. [任务 8:按角色授权](practice/authorize-server-role.md) +9. [任务 9:按权限授权](practice/authorize-server-authority.md) +10. [任务 10:配置 Thymeleaf 安全性](practice/configure-thymeleaf-security.md) +11. [任务 11:授权已认证用户](practice/authorize-client-authenticated.md) +12. [任务 12:按角色授权](practice/authorize-client-role.md) +13. [任务 13:按权限授权](practice/authorize-client-authority.md) +14. [任务 14:自定义登录表单](practice/custom-login-form.md) -## Lab Work Tasks +## 实验任务 ![img.png](../../srcs/springsecurity/task.png) -### Task 1: Setup Spring Security -Initialize Spring Security in your project. +### 任务 1:设置 Spring Security +在项目中初始化 Spring Security。 -### Task 2: Define User Roles and Authorities -Define different user roles (Manager, Teacher, Student) and their respective authorities. +### 任务 2:定义用户角色和权限 +定义不同的用户角色(管理员、教师、学生)及其相应的权限。 -### Task 3: Configure Security in Controllers -Protect endpoints using role-based access control. +### 任务 3:在控制器中配置安全性 +使用基于角色的访问控制保护端点。 -#### Implementation Details -**Manager Role**: -- Add New Teacher (`/teachers/new`) -- Modify Teacher Profile (`/teachers/{id}/edit`) -- Modify Student Profile (`/students/{id}/edit`) -- Modify Student Marks (`/students/{id}/marks/edit`) +#### 实现细节 +**管理员角色**: +- 添加新教师 (`/teachers/new`) +- 修改教师资料 (`/teachers/{id}/edit`) +- 修改学生资料 (`/students/{id}/edit`) +- 修改学生成绩 (`/students/{id}/marks/edit`) -**Teacher Role**: -- Modify Student Marks (`/students/{id}/marks/edit`) -- Add New Subject (`/subjects/new`) -- Add New Test (`/tests/new`) +**教师角色**: +- 修改学生成绩 (`/students/{id}/marks/edit`) +- 添加新科目 (`/subjects/new`) +- 添加新考试 (`/tests/new`) -**Student Role**: -- Pass Test (`/tests/{id}/take`) -- Read Marks (`/students/{id}/marks`) +**学生角色**: +- 参加考试 (`/tests/{id}/take`) +- 查看成绩 (`/students/{id}/marks`) -### Task 4: Implement Authorization in Thymeleaf Templates +### 任务 4:在 Thymeleaf 模板中实现授权 +基于用户角色限制对 UI 元素的访问。 -Restrict access to UI elements based on user roles. +### 任务 5:测试基于角色的访问控制 +确保端点和 UI 元素受到正确保护。 - -### Task 5: Test Role-Based Access Control -Ensure that endpoints and UI elements are correctly protected. diff --git a/docs/cn/springsecurity/practice/add-dummy-users.md b/docs/cn/springsecurity/practice/add-dummy-users.md index 5d8d81b..7ec6c28 100644 --- a/docs/cn/springsecurity/practice/add-dummy-users.md +++ b/docs/cn/springsecurity/practice/add-dummy-users.md @@ -1,16 +1,16 @@ -# Add Dummy Users +# 添加虚拟用户 -This task outlines the process of updating the `CustomUserDetailsService` class to include a method for adding dummy users to the in-memory storage to serving as a simple demonstration of user creation. +本任务概述了更新 `CustomUserDetailsService` 类的过程,以包含用于将虚拟用户添加到内存存储的方法,从而作为用户创建的简单演示。 -## Goal +## 目标 -Update the `CustomUserDetailsService` class to include a method for adding dummy users, allowing for the initialization of user data in the in-memory storage. +更新 `CustomUserDetailsService` 类以包含添加虚拟用户的方法,允许在内存存储中初始化用户数据。 -## Steps +## 步骤 -1. **Update CustomUserDetailsService Class:** +1. **更新 CustomUserDetailsService 类:** - First, we need to update the `CustomUserDetailsService` class to include a method for adding dummy users. We'll leverage this method during bean initialization to populate the in-memory storage with dummy user data. + 首先,我们需要更新 `CustomUserDetailsService` 类,以包含用于添加虚拟用户的方法。我们将在 bean 初始化期间利用此方法将虚拟用户数据填充到内存存储中。 ```java @Service @@ -24,13 +24,13 @@ Update the `CustomUserDetailsService` class to include a method for adding dummy this.usersRepository = usersRepository; this.passwordEncoder = passwordEncoder; - // Call the addDummyUsers method to add dummy users during bean initialization + // 在 bean 初始化期间调用 addDummyUsers 方法以添加虚拟用户 addDummyUsers(); } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // Retrieve user details from the repository + // 从存储库中检索用户详细信息 CustomUserDetails userDetails = usersRepository.findByUsername(username); if (userDetails == null) { throw new UsernameNotFoundException("User not found with username: " + username); @@ -38,14 +38,14 @@ Update the `CustomUserDetailsService` class to include a method for adding dummy return userDetails; } - // Method to add dummy users + // 添加虚拟用户的方法 private void addDummyUsers() { - // Create dummy users + // 创建虚拟用户 CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true); CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true); - // Add users to the repository + // 将用户添加到存储库 usersRepository.save(admin); usersRepository.save(moderator); usersRepository.save(user); @@ -53,12 +53,12 @@ Update the `CustomUserDetailsService` class to include a method for adding dummy } ``` - In this updated class: - - We've added a constructor that accepts `UsersRepository` and `PasswordEncoder` as dependencies. - - During bean initialization, the constructor calls the `addDummyUsers` method to populate the in-memory storage with dummy users. - - The `addDummyUsers` method creates dummy users with hardcoded usernames and passwords. - - Finally, the dummy users are saved to the repository using the `save` method. + 在这个更新的类中: + - 我们添加了一个接受 `UsersRepository` 和 `PasswordEncoder` 作为依赖项的构造函数。 + - 在 bean 初始化期间,构造函数调用 `addDummyUsers` 方法,将虚拟用户数据填充到内存存储中。 + - `addDummyUsers` 方法创建具有硬编码用户名和密码的虚拟用户。 + - 最后,虚拟用户通过 `save` 方法保存到存储库中。 --- -# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file +# [下一任务: 为用户创建身份](create-identity-to-users.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-server-authenticated.md b/docs/cn/springsecurity/practice/authorize-server-authenticated.md index ef1e7a4..ea235ce 100644 --- a/docs/cn/springsecurity/practice/authorize-server-authenticated.md +++ b/docs/cn/springsecurity/practice/authorize-server-authenticated.md @@ -1,16 +1,16 @@ -# Authorize Authenticated User +# 授权已认证用户 -This task outlines the process of authorizing authenticated users in your application. By requiring authentication for specific paths or endpoints, you can ensure that only logged-in users can access certain resources. +本任务概述了在应用中授权已认证用户的过程。通过为特定路径或端点要求认证,可以确保只有已登录的用户才能访问某些资源。 -## Goal +## 目标 -Authorize access to the `/second` path only for authenticated users while allowing public access to other paths. +仅允许已认证用户访问 `/second` 路径,同时允许其他路径的公共访问。 -## Steps +## 步骤 -1. **Update Security Configuration:** +1. **更新安全配置:** - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify that access to the `/second` path should be restricted to authenticated users. + 在 `WebSecurityConfig` 类中,修改 `configure(HttpSecurity http)` 方法,指定访问 `/second` 路径应仅限于已认证用户。 ```java @Configuration @@ -21,18 +21,18 @@ Authorize access to the `/second` path only for authenticated users while allowi protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests - // Other endpoints... + // 其他端点... .requestMatchers("/second").authenticated() - // Other endpoints... + // 其他端点... ); } } ``` - In this configuration: - - We use `.authorizeHttpRequests()` to define authorization rules. - - The `.requestMatchers("/second").authenticated()` statement specifies that access to the `/second` path should be restricted to authenticated users. + 在此配置中: + - 我们使用 `.authorizeHttpRequests()` 定义授权规则。 + - `.requestMatchers("/second").authenticated()` 语句指定访问 `/second` 路径应仅限于已认证用户。 --- -# [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file +# [下一任务: 按角色授权](authorize-server-role.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-server-authority.md b/docs/cn/springsecurity/practice/authorize-server-authority.md index d0abdeb..eeda872 100644 --- a/docs/cn/springsecurity/practice/authorize-server-authority.md +++ b/docs/cn/springsecurity/practice/authorize-server-authority.md @@ -1,16 +1,16 @@ -# Authorize by Authority +# 按权限授权 -This task outlines the process of authorizing users based on their authorities in your application. By assigning different authorities to users, you can control access to specific functionalities or actions. +本任务概述了在应用中基于用户权限进行授权的过程。通过为用户分配不同的权限,可以控制对特定功能或操作的访问。 -## Goal +## 目标 -Authorize access to the `/addStudent` path for users with the `WRITE` authority and the `/removeStudent` path for users with the `DELETE` authority. +为具有 `WRITE` 权限的用户授权访问 `/addStudent` 路径,为具有 `DELETE` 权限的用户授权访问 `/removeStudent` 路径。 -## Steps +## 步骤 -1. **Update Security Configuration:** +1. **更新安全配置:** - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify authority-based access control for the `/addStudent` and `/removeStudent` paths. + 在 `WebSecurityConfig` 类中,修改 `configure(HttpSecurity http)` 方法,指定基于权限的访问控制 `/addStudent` 和 `/removeStudent` 路径。 ```java @Configuration @@ -21,19 +21,19 @@ Authorize access to the `/addStudent` path for users with the `WRITE` authority protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests - // Other Endpoints... + // 其他端点... .requestMatchers("/addStudent").hasAuthority("WRITE") .requestMatchers("/removeStudent").hasAuthority("DELETE") - // Other Endpoints... + // 其他端点... ); } } ``` - In this configuration: - - The `.requestMatchers("/addStudent").hasAuthority("WRITE")` statement specifies that access to the `/addStudent` path should be restricted to users with the `WRITE` authority. - - Similarly, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` restricts access to the `/removeStudent` path to users with the `DELETE` authority. + 在此配置中: + - `.requestMatchers("/addStudent").hasAuthority("WRITE")` 语句指定访问 `/addStudent` 路径应限于具有 `WRITE` 权限的用户。 + - 类似地,`.requestMatchers("/removeStudent").hasAuthority("DELETE")` 限制访问 `/removeStudent` 路径仅限于具有 `DELETE` 权限的用户。 --- -# [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file +# [下一任务: 自定义登录表单](custom-login-form.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-server-role.md b/docs/cn/springsecurity/practice/authorize-server-role.md index 3b1ab77..e6aa2ab 100644 --- a/docs/cn/springsecurity/practice/authorize-server-role.md +++ b/docs/cn/springsecurity/practice/authorize-server-role.md @@ -1,16 +1,16 @@ -# Authorize by Role +# 按角色授权 -This task outlines the process of authorizing users based on their roles in your application. By assigning different roles to users, you can control access to specific resources or functionalities. +本任务概述了在应用中基于用户角色进行授权的过程。通过为用户分配不同的角色,可以控制对特定资源或功能的访问。 -## Goal +## 目标 -Authorize access to the `/third` path for users with the `ROLE_MODERATOR` role and the `/fourth` path for users with the `ROLE_ADMIN` role. +为具有 `ROLE_MODERATOR` 角色的用户授权访问 `/third` 路径,为具有 `ROLE_ADMIN` 角色的用户授权访问 `/fourth` 路径。 -## Steps +## 步骤 -1. **Update Security Configuration:** +1. **更新安全配置:** - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify role-based access control for the `/third` and `/fourth` paths. + 在 `WebSecurityConfig` 类中,修改 `configure(HttpSecurity http)` 方法,指定基于角色的访问控制 `/third` 和 `/fourth` 路径。 ```java @Configuration @@ -21,19 +21,19 @@ Authorize access to the `/third` path for users with the `ROLE_MODERATOR` role a protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests - // Other Endpoints... + // 其他端点... .requestMatchers("/third").hasAuthority("ROLE_MODERATOR") .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN") - // Other Endpoints... + // 其他端点... ); } } ``` - In this configuration: - - The `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` statement specifies that access to the `/third` path should be restricted to users with the `ROLE_MODERATOR` authority. - - Similarly, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` restricts access to the `/fourth` path to users with the `ROLE_ADMIN` authority. + 在此配置中: + - `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` 语句指定访问 `/third` 路径应限于具有 `ROLE_MODERATOR` 权限的用户。 + - 类似地,`.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` 限制访问 `/fourth` 路径仅限于具有 `ROLE_ADMIN` 权限的用户。 --- -# [NEXT TASK: Authorize by Authority](authorize-server-authority.md) \ No newline at end of file +# [下一任务: 按权限授权](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/base-implementation-user.md b/docs/cn/springsecurity/practice/base-implementation-user.md index c77596f..cd4de1a 100644 --- a/docs/cn/springsecurity/practice/base-implementation-user.md +++ b/docs/cn/springsecurity/practice/base-implementation-user.md @@ -1,16 +1,16 @@ -# Create Base Implementation for User +# 为用户创建基础实现 -In this task, we will focus on creating a base implementation for managing users in your application. This includes defining the UserDetails entity, creating a repository to manage user data, and implementing a UserDetailsService to load user details during authentication. +在本任务中,我们将专注于为应用中的用户管理创建基础实现。这包括定义 UserDetails 实体,创建管理用户数据的存储库,以及实现 UserDetailsService 以在认证过程中加载用户详情。 -## Goal +## 目标 -The goal of this task is to establish a solid foundation for managing users within your application. By implementing UserDetails, UsersRepository, and UserDetailsService, you will be able to authenticate users, manage their details, and perform user-related operations efficiently. +本任务的目标是在应用中建立一个稳固的用户管理基础。通过实现 UserDetails、UsersRepository 和 UserDetailsService,您将能够对用户进行认证、管理其详情,并高效地执行与用户相关的操作。 -## Steps +## 步骤 -1. **Define UserDetails Entity** +1. **定义 UserDetails 实体** - Start by defining a UserDetails entity that represents the user details in your application. This entity should implement the UserDetails interface provided by Spring Security. + 首先,定义一个代表应用中用户详情的 UserDetails 实体。该实体应实现 Spring Security 提供的 UserDetails 接口。 ```java package edu.labs.yourproject.model; @@ -22,145 +22,149 @@ The goal of this task is to establish a solid foundation for managing users with public class CustomUserDetails implements UserDetails { - // Implement UserDetails methods here + // 在这里实现 UserDetails 方法 } ``` - Implement the methods required by the UserDetails interface to provide user details such as username, password, authorities, etc. + 实现 UserDetails 接口所需的方法,以提供用户名、密码、权限等用户详情。 -2. **Create UsersRepository Class** +2. **创建 UsersRepository 类** - Since we are using in-memory storage for now, we'll create a simple UsersRepository class to manage user data. + 由于我们目前使用内存存储,将创建一个简单的 UsersRepository 类来管理用户数据。 - a. **Create UsersRepository Class** + a. **创建 UsersRepository 类** - Create a new Java class named `UsersRepository` inside the `edu.labs.yourproject.repository` package. + 在 `edu.labs.yourproject.repository` 包中创建一个名为 `UsersRepository` 的新 Java 类。 - ```java - package edu.labs.yourproject.repository; + ```java + package edu.labs.yourproject.repository; - import org.springframework.stereotype.Repository; - import edu.labs.yourproject.model.CustomUserDetails; + import org.springframework.stereotype.Repository; + import edu.labs.yourproject.model.CustomUserDetails; + import java.util.ArrayList; + import java.util.List; - @Repository - public class UsersRepository { - - private List users = new ArrayList<>(); - - // Add methods for managing users as needed - } - ``` + @Repository + public class UsersRepository { - This class will serve as the repository for managing user data. We'll add methods to retrieve, add, update, and delete users in subsequent steps. + private List users = new ArrayList<>(); - b. **Add findByUsername Method** + // 根据需要添加管理用户的方法 + } + ``` - Add a method named `findByUsername` to the `UsersRepository` class. This method will retrieve user details by username from the repository. + 该类将作为管理用户数据的存储库。稍后我们将添加检索、添加、更新和删除用户的方法。 - ```java - public CustomUserDetails findByUsername(String username) { - for (CustomUserDetails user : users) { - if (user.getUsername().equals(username)) { - return user; - } - } - return null; // User not found - } - ``` + b. **添加 findByUsername 方法** - The `findByUsername` method is used to retrieve user details by username from the repository. In this placeholder implementation, it returns `null`, but you'll replace it with the actual logic to fetch user details from the database or any other data source. + 在 `UsersRepository` 类中添加一个名为 `findByUsername` 的方法。该方法将根据用户名从存储库中检索用户详情。 -3. **Implement UserDetailsService** + ```java + public CustomUserDetails findByUsername(String username) { + for (CustomUserDetails user : users) { + if (user.getUsername().equals(username)) { + return user; + } + } + return null; // 用户未找到 + } + ``` - In this step, we will implement a UserDetailsService to load user details during authentication. This service will retrieve user information from the UsersRepository. + `findByUsername` 方法用于根据用户名从存储库中检索用户详情。在此占位实现中,它返回 `null`,但稍后您将用实际的逻辑来替换它,以从数据库或其他数据源中获取用户详情。 - a. **Create CustomUserDetailsService Class** +3. **实现 UserDetailsService** - Start by creating a new class named `CustomUserDetailsService` within your project's service package. This class will implement the UserDetailsService interface provided by Spring Security. + 在此步骤中,我们将实现一个 UserDetailsService 以在认证过程中加载用户详情。该服务将从 UsersRepository 中检索用户信息。 - ```java - package edu.labs.yourproject.service; + a. **创建 CustomUserDetailsService 类** - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.security.core.userdetails.UserDetails; - import org.springframework.security.core.userdetails.UserDetailsService; - import org.springframework.security.core.userdetails.UsernameNotFoundException; - import org.springframework.stereotype.Service; - import com.yourcompany.yourproject.model.CustomUserDetails; - import com.yourcompany.yourproject.repository.UsersRepository; + 首先,在项目的服务包中创建一个名为 `CustomUserDetailsService` 的新类。该类将实现 Spring Security 提供的 UserDetailsService 接口。 - @Service - public class CustomUserDetailsService implements UserDetailsService { - - private final UsersRepository usersRepository; + ```java + package edu.labs.yourproject.service; - @Autowired - public CustomUserDetailsService(UsersRepository usersRepository) { - this.usersRepository = usersRepository; - } + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.security.core.userdetails.UserDetails; + import org.springframework.security.core.userdetails.UserDetailsService; + import org.springframework.security.core.userdetails.UsernameNotFoundException; + import org.springframework.stereotype.Service; + import edu.labs.yourproject.model.CustomUserDetails; + import edu.labs.yourproject.repository.UsersRepository; - // Implement methods here - } - ``` + @Service + public class CustomUserDetailsService implements UserDetailsService { - We create the `CustomUserDetailsService` class and autowire the `UsersRepository` dependency using constructor injection. + private final UsersRepository usersRepository; - b. **Override loadUserByUsername Method** + @Autowired + public CustomUserDetailsService(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + + // 在这里实现方法 + } + ``` + + 我们创建了 `CustomUserDetailsService` 类,并使用构造函数注入的方式自动装配 `UsersRepository` 依赖。 + + b. **重写 loadUserByUsername 方法** - Override the `loadUserByUsername` method defined in the UserDetailsService interface. This method will retrieve user details from the UsersRepository based on the provided username. + 重写 UserDetailsService 接口中定义的 `loadUserByUsername` 方法。该方法将根据提供的用户名从 UsersRepository 中检索用户详情。 - ```java - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // Retrieve user details from the in-memory repository - CustomUserDetails userDetails = usersRepository.findByUsername(username); - if (userDetails == null) { - throw new UsernameNotFoundException("User not found with username: " + username); - } - return userDetails; - } - ``` + ```java + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // 从内存存储库中检索用户详情 + CustomUserDetails userDetails = usersRepository.findByUsername(username); + if (userDetails == null) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + return userDetails; + } + ``` - Inside the `loadUserByUsername` method, we call the `findByUsername` method of the UsersRepository to retrieve user details by username. If the user is not found, we throw a UsernameNotFoundException. + 在 `loadUserByUsername` 方法中,我们调用 UsersRepository 的 `findByUsername` 方法,根据用户名检索用户详情。如果未找到用户,我们抛出一个 UsernameNotFoundException。 -4. **Configure Beans in WebSecurityConfig** +4. **在 WebSecurityConfig 中配置 Bean** - Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define beans for CustomUserDetails and UserDetailsRepository. + 打开位于项目配置包中的 WebSecurityConfig 类 (`edu.labs.yourproject.config`)。在此类中,定义 CustomUserDetails 和 UserDetailsRepository 的 bean。 ```java package edu.labs.yourproject.config; - import edu.labs.yourproject.model.CustomUserDetails; - import edu.labs.yourproject.repository.UserDetailsRepository; + import edu.labs.yourproject.service.CustomUserDetailsService; + import edu.labs.yourproject.repository.UsersRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; + import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; + import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity - public class WebSecurityConfig { + public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + // 其他代码... - // The rest of code is here... - @Bean public CustomUserDetailsService customUserDetailsService() { - // Instantiate and configure CustomUserDetails bean - return new CustomUserDetailsService(); + // 实例化并配置 CustomUserDetailsService bean + return new CustomUserDetailsService(usersRepository()); } @Bean - public UserDetailsRepository userDetailsRepository() { - // Instantiate and configure UserDetailsRepository bean - return new UserDetailsRepository(); + public UsersRepository usersRepository() { + // 实例化并配置 UsersRepository bean + return new UsersRepository(); } } ``` - Define two bean methods: `CustomUserDetailsService()` and `userDetailsRepository()`. These methods instantiate and configure CustomUserDetailsService and UserDetailsRepository beans, respectively. + 定义两个 bean 方法:`customUserDetailsService()` 和 `usersRepository()`。这些方法分别实例化并配置 CustomUserDetailsService 和 UsersRepository bean。 -## Folder Structure +## 文件夹结构 -Your project's folder structure should resemble the following: +项目的文件夹结构应类似如下: ``` src @@ -177,8 +181,8 @@ src └── CustomUserDetailsService.java ``` -This folder structure indicates where to create the `CustomUserDetailsService` class and the `UsersRepository` interface within your project. Organizing your classes in this manner helps maintain a clear and structured codebase. +这种文件夹结构指示了在项目中创建 `CustomUserDetailsService` 类和 `UsersRepository` 接口的位置。以这种方式组织类有助于保持清晰和结构化的代码库。 --- -# [NEXT TASK: Password Encryption](password-encryption.md) \ No newline at end of file +# [下一任务: 密码加密](password-encryption.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/configure-spring-security.md b/docs/cn/springsecurity/practice/configure-spring-security.md index c6bcf19..40e5640 100644 --- a/docs/cn/springsecurity/practice/configure-spring-security.md +++ b/docs/cn/springsecurity/practice/configure-spring-security.md @@ -1,41 +1,41 @@ -# Configure Spring Security +# 配置 Spring Security -In this task, we will focus on configuring Spring Security in your project. Spring Security provides comprehensive security features for Java applications, including authentication, authorization, and protection against common security threats. +在本任务中,我们将重点配置项目中的 Spring Security。Spring Security 为 Java 应用程序提供全面的安全功能,包括认证、授权和防止常见安全威胁的保护。 -## Goal +## 目标 -The goal of this task is to integrate Spring Security into your existing project, ensuring that your application is secure and protected against unauthorized access. +本任务的目标是将 Spring Security 集成到现有项目中,确保应用程序的安全性,防止未授权访问。 -## Steps +## 步骤 -1. **Add Spring Security Dependency** +1. **添加 Spring Security 依赖** - - For Maven Projects: + - 对于 Maven 项目: - Add the following dependency to your project's `pom.xml` file: + 在项目的 `pom.xml` 文件中添加以下依赖: - ```xml - - org.springframework.boot - spring-boot-starter-security - - ``` + ```xml + + org.springframework.boot + spring-boot-starter-security + + ``` - - For Gradle Projects: + - 对于 Gradle 项目: - Add the following dependency to your project's `build.gradle` file: + 在项目的 `build.gradle` 文件中添加以下依赖: - ```groovy - implementation 'org.springframework.boot:spring-boot-starter-security' - ``` + ```groovy + implementation 'org.springframework.boot:spring-boot-starter-security' + ``` - Ensure that you include the appropriate version of Spring Security for your project. + 确保包含项目适用的 Spring Security 版本。 -2. **Create Security Configuration Class** +2. **创建安全配置类** - Create a new Java class named `WebSecurityConfig` within your project's source folder structure. Typically, this class resides in the `config` package. The file should be named `WebSecurityConfig.java`. + 在项目的源码文件夹结构中创建一个名为 `WebSecurityConfig` 的新 Java 类。通常,该类位于 `config` 包中。文件应命名为 `WebSecurityConfig.java`。 - Your project's folder structure should resemble the following: + 项目的文件夹结构应类似如下: ``` src @@ -51,30 +51,43 @@ The goal of this task is to integrate Spring Security into your existing project └── PracticeController.java ``` -3. **Configure Security Configuration Class** +3. **配置安全配置类** - Inside the `WebSecurityConfig` class, annotate it with `@Configuration` and `@EnableWebSecurity` to indicate that it is a configuration class for Spring Security. also will annotate `configure` method with `@Bean` + 在 `WebSecurityConfig` 类内部,用 `@Configuration` 和 `@EnableWebSecurity` 注解对其进行标注,以表明这是 Spring Security 的配置类。同时,用 `@Bean` 注解标注 `configure` 方法。 ```java package edu.labs.yourproject.config; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; + import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; - import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurityConfig { - + @Bean public SecurityFilterChain configure(HttpSecurity http) throws Exception { http - // Security configuration here + // 在这里进行安全配置 + .authorizeRequests() + .anyRequest().authenticated() + .and() + .formLogin() + .and() + .httpBasic(); return http.build(); } } ``` + 上述配置示例中: + - `.authorizeRequests()` 方法用于定义授权规则。 + - `.anyRequest().authenticated()` 表示所有请求都需要认证。 + - `.formLogin()` 和 `.httpBasic()` 启用表单登录和基本 HTTP 认证。 + --- -# [Next Task: Create a Base Implementation for User](base-implementation-user.md) +# [下一任务: 为用户创建基础实现](base-implementation-user.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/configure-thymeleaf-security.md b/docs/cn/springsecurity/practice/configure-thymeleaf-security.md index 2f87ae3..93d4188 100644 --- a/docs/cn/springsecurity/practice/configure-thymeleaf-security.md +++ b/docs/cn/springsecurity/practice/configure-thymeleaf-security.md @@ -1,13 +1,13 @@ -# Configure Thymeleaf with Spring Security +# 配置 Thymeleaf 与 Spring Security 集成 -## Goal -The goal of this task is to integrate Thymeleaf with Spring Security, enabling the use of additional Thymeleaf dialects and utilities provided by the `thymeleaf-extras-springsecurity6` library. +## 目标 +本任务的目标是将 Thymeleaf 与 Spring Security 集成,利用 `thymeleaf-extras-springsecurity6` 库提供的额外 Thymeleaf 方言和实用程序。 -## Steps +## 步骤 1. **Gradle (Groovy):** - Add the `thymeleaf-extras-springsecurity6` dependency to your `build.gradle` file: + 在 `build.gradle` 文件中添加 `thymeleaf-extras-springsecurity6` 依赖: ```groovy implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE' @@ -15,7 +15,7 @@ The goal of this task is to integrate Thymeleaf with Spring Security, enabling t 2. **Maven:** - Add the following dependency to your `pom.xml` file: + 在 `pom.xml` 文件中添加以下依赖: ```xml @@ -27,4 +27,4 @@ The goal of this task is to integrate Thymeleaf with Spring Security, enabling t --- -[NEXT TASK:]() +[下一任务:]() \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/create-identity-to-users.md b/docs/cn/springsecurity/practice/create-identity-to-users.md index c839716..ad72884 100644 --- a/docs/cn/springsecurity/practice/create-identity-to-users.md +++ b/docs/cn/springsecurity/practice/create-identity-to-users.md @@ -1,26 +1,26 @@ -# Create Identity for Users +# 为用户创建身份 -This task outlines the process of adding authorities and roles to the users created in the previous step, "Add Dummy Users." By assigning roles and authorities to users, we establish their identity within the application and control their access to various resources and functionalities. +本任务概述了在“添加模拟用户”步骤中为用户添加权限和角色的过程。通过为用户分配角色和权限,我们在应用程序中建立了他们的身份,并控制他们对各种资源和功能的访问。 -## Goal +## 目标 -Enhance the user profiles created in the previous step by assigning roles and authorities, thereby defining their identities and access permissions within the application. +通过为之前创建的用户配置角色和权限来增强用户配置文件,从而在应用程序中定义他们的身份和访问权限。 -## Steps +## 步骤 -1. **Update User Profiles with Roles and Authorities:** +1. **为用户配置文件添加角色和权限:** - We'll update the dummy user profiles created in the `CustomUserDetailsService` class to include roles and authorities. This involves assigning specific roles to each user, such as `ADMIN`, `MODERATOR`, or `USER`, and granting corresponding authorities based on their roles. + 我们将更新在 `CustomUserDetailsService` 类中创建的模拟用户配置文件,以包含角色和权限。这涉及为每个用户分配特定的角色,例如 `ADMIN`、`MODERATOR` 或 `USER`,并根据他们的角色授予相应的权限。 ```java - // Inside addDummyUsers() method + // 在 addDummyUsers() 方法内 - // Define roles + // 定义角色 String adminRole = "ROLE_ADMIN"; String moderatorRole = "ROLE_MODERATOR"; String userRole = "ROLE_USER"; - // Define authorities + // 定义权限 List adminAuthorities = Arrays.asList( new SimpleGrantedAuthority(adminRole), new SimpleGrantedAuthority("READ"), @@ -36,7 +36,7 @@ Enhance the user profiles created in the previous step by assigning roles and au new SimpleGrantedAuthority(userRole) ); - // Create dummy users with roles and authorities + // 创建包含角色和权限的模拟用户 CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true); admin.setAuthorities(adminAuthorities); admin.setRole(adminRole); @@ -50,12 +50,12 @@ Enhance the user profiles created in the previous step by assigning roles and au user.setRole(userRole); ``` - In this updated code: - - We define roles and authorities as variables for clarity and ease of maintenance. - - Each user profile now includes a list of authorities based on their assigned roles. - - Authorities are represented as `SimpleGrantedAuthority` objects and added to the user profiles accordingly. - - Additionally, we set the role for each user to enable role-based access control in subsequent steps. + 在这段更新的代码中: + - 我们定义了角色和权限变量,以便清晰和便于维护。 + - 每个用户配置文件现在都包含一个基于其分配角色的权限列表。 + - 权限表示为 `SimpleGrantedAuthority` 对象,并相应地添加到用户配置文件中。 + - 另外,我们为每个用户设置了角色,以便在后续步骤中实现基于角色的访问控制。 --- -# [NEXT TASK: Create a Base for Authorization in Server](setup-server-authorization.md) \ No newline at end of file +# [下一任务:在服务器中创建授权基础](setup-server-authorization.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/custom-login-form.md b/docs/cn/springsecurity/practice/custom-login-form.md index 720cec9..9d7540c 100644 --- a/docs/cn/springsecurity/practice/custom-login-form.md +++ b/docs/cn/springsecurity/practice/custom-login-form.md @@ -1,16 +1,16 @@ -# Custom Login Form +# 自定义登录表单 -This task guides you through the process of enabling a custom login form for authentication using Spring Security. By implementing a custom login form, users can securely authenticate into your application. +该任务指导您通过使用Spring Security实现自定义登录表单来启用身份验证。通过实现自定义登录表单,用户可以安全地登录到您的应用程序中。 -## Goal +## 目标 -Activate the custom login form page that has already been created in specific path. +激活已经创建的自定义登录页面,并将其设置在指定的路径上。 -## Steps +## 步骤 -1. **Update Security Configuration:** +1. **更新安全配置:** - In the `WebSecurityConfig` class, modify the `configure(HttpSecurity http)` method to specify the custom login page. + 在 `WebSecurityConfig` 类中,修改 `configure(HttpSecurity http)` 方法以指定自定义登录页面。 ```java @Configuration @@ -21,20 +21,20 @@ Activate the custom login form page that has already been created in specific pa protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests - // Add other authorization configurations here + // 在此添加其他授权配置 ) .formLogin((login) -> login - .loginPage("/custom-login-page") // Specify the custom login page URL - // Add other form login configurations here + .loginPage("/custom-login-page") // 指定自定义登录页面的URL + // 在此添加其他表单登录配置 ); } } ``` - In this configuration: - - The `.loginPage("/custom-login-page")` statement specifies the URL of the custom login page. - - You can add additional configurations to customize the form login behavior, such as setting login success or failure URLs, defining form field names, etc. + 在此配置中: + - `.loginPage("/custom-login-page")` 语句指定了自定义登录页面的URL。 + - 您可以添加其他配置以自定义表单登录行为,例如设置登录成功或失败的URL,定义表单字段名称等。 --- -# [TASKS](../lab-work.md) +# [任务列表](../lab-work.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/password-encryption.md b/docs/cn/springsecurity/practice/password-encryption.md index 2cd1a21..3d9ea23 100644 --- a/docs/cn/springsecurity/practice/password-encryption.md +++ b/docs/cn/springsecurity/practice/password-encryption.md @@ -1,16 +1,16 @@ -# Password Encryption +# 密码加密 -In this task, we will configure password encryption for user authentication in a Spring Security-enabled application. Encrypting passwords enhances security by storing them securely in the database. +在这个任务中,我们将为Spring Security启用的应用程序中的用户身份验证配置密码加密。通过加密密码,可以通过安全地存储它们在数据库中来增强安全性。 -## Goal +## 目标 -The goal of this setup is to configure password encryption using the BCryptPasswordEncoder provided by Spring Security. This ensures that passwords are securely hashed before being stored in the database. +此设置的目标是使用Spring Security提供的BCryptPasswordEncoder配置密码加密。这样可以确保在将密码存储在数据库之前对其进行安全哈希处理。 -## Steps +## 步骤 -1. **Add BCryptPasswordEncoder Bean** +1. **添加 BCryptPasswordEncoder Bean** - Open the WebSecurityConfig class located in your project's configuration package (`edu.labs.yourproject.config`). Inside this class, define a bean for BCryptPasswordEncoder. + 打开位于项目的配置包(`edu.labs.yourproject.config`)中的 `WebSecurityConfig` 类。在这个类中,为 BCryptPasswordEncoder 定义一个 bean。 ```java package edu.labs.yourproject.config; @@ -24,19 +24,19 @@ The goal of this setup is to configure password encryption using the BCryptPassw @Bean public BCryptPasswordEncoder passwordEncoder() { - // Instantiate and configure BCryptPasswordEncoder bean + // 实例化和配置 BCryptPasswordEncoder bean return new BCryptPasswordEncoder(); } } ``` - Define a bean method `passwordEncoder()` that instantiates and configures a BCryptPasswordEncoder bean. This bean will be used to encode passwords before storing them in the database. + 定义一个名为 `passwordEncoder()` 的 bean 方法,它实例化并配置了一个 BCryptPasswordEncoder bean。这个 bean 将用于在将密码存储在数据库之前对其进行编码。 -2. **Encrypt Passwords** +2. **加密密码** - a. **Update CustomUserDetailsService Class** + a. **更新 CustomUserDetailsService 类** - Open the CustomUserDetailsService class located in your project's service package (`edu.labs.yourproject.service`). Inject the BCryptPasswordEncoder bean into this class. + 打开位于项目的服务包(`edu.labs.yourproject.service`)中的 `CustomUserDetailsService` 类。将 BCryptPasswordEncoder bean 注入到这个类中。 ```java package edu.labs.yourproject.service; @@ -62,20 +62,20 @@ The goal of this setup is to configure password encryption using the BCryptPassw } ``` - b. **Implement Registration Method** + b. **实现注册方法** - Define a method in the CustomUserDetailsService class to handle user registration. In this method, encrypt the user's password before saving it to the database. + 在 `CustomUserDetailsService` 类中定义一个方法来处理用户注册。在这个方法中,加密用户的密码然后保存到数据库中。 ```java public void registerUser(CustomUserDetails user) { - // Encrypt password before saving user + // 保存用户之前加密密码 String encodedPassword = passwordEncoder.encode(user.getPassword()); user.setPassword(encodedPassword); usersRepository.save(user); } ``` - This method takes a CustomUserDetails object representing the user to be registered. It encrypts the user's password using the BCryptPasswordEncoder bean and then saves the user to the database. + 此方法接受一个表示要注册的用户的 CustomUserDetails 对象。它使用 BCryptPasswordEncoder bean 对用户的密码进行加密,然后将用户保存到数据库中。 --- -# [NEXT TASK: Add a Dummy Users](add-dummy-users.md) \ No newline at end of file +# [下一个任务:添加虚拟用户](add-dummy-users.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/setup-server-authorization.md b/docs/cn/springsecurity/practice/setup-server-authorization.md index 68cd220..d4dc084 100644 --- a/docs/cn/springsecurity/practice/setup-server-authorization.md +++ b/docs/cn/springsecurity/practice/setup-server-authorization.md @@ -1,16 +1,16 @@ -# Setup Server Authorization +# 设置服务器授权 -This task you through setting up authorization in your application by configuring security rules using Spring Security. By defining authorization rules, you can control access to specific paths and endpoints within your application. +这个任务指导您通过使用Spring Security配置安全规则来设置应用程序的授权。通过定义授权规则,您可以控制对应用程序中特定路径和端点的访问权限。 -## Goal +## 目标 -Configure authorization rules to restrict or allow access to various paths and endpoints in the application. +配置授权规则,以限制或允许访问应用程序中的各种路径和端点。 -## Steps +## 步骤 -1. **Add Security Configuration:** +1. **添加安全配置:** - In the `WebSecurityConfig` class, add the `configure(HttpSecurity http)` method to define security rules for the application. We'll use the paths and endpoints defined in the previous lab work. + 在 `WebSecurityConfig` 类中,添加 `configure(HttpSecurity http)` 方法来为应用程序定义安全规则。我们将使用上一个实验任务中定义的路径和端点。 ```java @Configuration @@ -32,10 +32,9 @@ Configure authorization rules to restrict or allow access to various paths and e } ``` - In this configuration: - - We use `.authorizeHttpRequests()` to define authorization rules. - - Inside the lambda expression, we specify which requests should be permitted. - + 在这个配置中: + - 我们使用 `.authorizeHttpRequests()` 来定义授权规则。 + - 在 lambda 表达式中,我们指定了哪些请求应该被允许。 --- -# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file +# [下一个任务:授权经过身份验证的用户](authorize-server-authenticated.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/tasks.md b/docs/cn/springsecurity/tasks.md deleted file mode 100644 index 52f7231..0000000 --- a/docs/cn/springsecurity/tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -- Setup and Configuration -- base implementation to user -- password hashing algorithms -- add dummy users ( password hashing) -- create identity to users -- - -## TASKS -- create allowed paths -- create authenticated paths ( form-based ) -- create admin page ( role based ) -- hide and show content in depends on authorities and role. -- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file diff --git a/docs/cn/thymeleaf/lab-work.md b/docs/cn/thymeleaf/lab-work.md index 8872e1b..840fa78 100644 --- a/docs/cn/thymeleaf/lab-work.md +++ b/docs/cn/thymeleaf/lab-work.md @@ -1,73 +1,73 @@ -# Thymeleaf Lab Work +# Thymeleaf 实验任务 -Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. +欢迎来到 Thymeleaf 实验任务系列!本系列任务旨在帮助您实践和掌握 Thymeleaf,这是一种强大的 Java 应用模板引擎。无论您是初学者还是希望提升技能,这些动手任务将引导您完成在 Spring 应用中集成 Thymeleaf 的各个方面。 -## Goal of the Lab Work +## 实验任务的目标 -The primary goal of this lab work is to provide you with practical experience and proficiency in using Thymeleaf within a Spring environment. Thymeleaf is widely utilized for server-side rendering in web development, and through these tasks, you will gain valuable insights into its configuration, usage of variables, controllers, form handling, and more. +本实验任务的主要目标是让您在 Spring 环境中使用 Thymeleaf 获得实际经验和熟练程度。Thymeleaf 广泛用于网页开发中的服务器端渲染,通过这些任务,您将深入了解其配置、变量使用、控制器、表单处理等方面。 -## Practice Tasks +## 练习任务 -1. [Task 1: Configure Thymeleaf in Spring](practice/configure-thymeleaf.md) -2. [Task 2: Create First View](practice/create-first-view.md) -3. [Task 3: Working With Variables](practice/working-with-variables.md) -4. [Task 4: Variables and Controller](practice/variables-and-controller.md) -5. [Task 5: Iteration](practice/iteration.md) -6. [Task 6: Literals](practice/literals.md) -7. [Task 7: Forms](practice/forms.md) -8. [Task 8: Form Handling](practice/form-handling.md) -9. [Task 9: Query Parameter and Validation](practice/validation.md) -10. [Task 10: Fragments and Layouts](practice/fragments-and-layouts.md) +1. [任务 1:在 Spring 中配置 Thymeleaf](practice/configure-thymeleaf.md) +2. [任务 2:创建第一个视图](practice/create-first-view.md) +3. [任务 3:处理变量](practice/working-with-variables.md) +4. [任务 4:变量与控制器](practice/variables-and-controller.md) +5. [任务 5:迭代](practice/iteration.md) +6. [任务 6:文本字面量](practice/literals.md) +7. [任务 7:表单](practice/forms.md) +8. [任务 8:表单处理](practice/form-handling.md) +9. [任务 9:查询参数和验证](practice/validation.md) +10. [任务 10:片段和布局](practice/fragments-and-layouts.md) -## Lab Work Tasks +## 实验任务 -1. **Task 1: Create HTML Layout with Fragments** +1. **任务 1:创建带片段的 HTML 布局** - - Create individual fragments for different parts of an HTML page, such as navbar, header, head, and footer. - - Assemble these fragments in a single HTML file to form a complete layout - - For example: - ![layout.png](../../srcs/thymeleaf/layout.png) + - 为 HTML 页面的不同部分创建单独的片段,如导航栏、头部、头部标签和页脚。 + - 将这些片段组合到一个 HTML 文件中形成完整的布局。 + - 例如: + ![layout.png](../../srcs/thymeleaf/layout.png) -2. **Task 2: Create Home Page with Localization** +2. **任务 2:创建带本地化的主页** - - Implement a home page accessible at the path `/`. - - Utilize the layout created in Task 1 for structuring the home page. - - Use `#{}` expressions for all text content within the home page, demonstrating localization or messages from a file.properties file. - - For Example: - - ![home-page.png](../../srcs/thymeleaf/home-page.png) + - 实现一个可在路径 `/` 访问的主页。 + - 使用任务 1 中创建的布局来构建主页。 + - 使用 `#{}` 表达式处理主页内的所有文本内容,展示从文件.properties 文件中读取的本地化消息。 + - 例如: -3. **Task 3: Create Login and Register Forms** + ![home-page.png](../../srcs/thymeleaf/home-page.png) - - Design and implement login and register forms for user authentication. - - Utilize Thymeleaf's model binding to handle form data. - - For Example: - - ![login-page.png](../../srcs/thymeleaf/login-page.png) +3. **任务 3:创建登录和注册表单** - ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + - 设计并实现用户认证的登录和注册表单。 + - 使用 Thymeleaf 的模型绑定来处理表单数据。 + - 例如: -4. **Task 4: Validate Login and Register Actions** + ![login-page.png](../../srcs/thymeleaf/login-page.png) - - Implement validation for login and register actions. - - Use query parameters to pass error messages in case of validation failures. - - Ensure secure and proper handling of user input. - - For Example: - - ![login-validation.png](../../srcs/thymeleaf/login-validation.png) + ![signup-page.png](../../srcs/thymeleaf/signup-page.png) -5. **Task 5: Create Users Page** +4. **任务 4:验证登录和注册操作** - - Develop a Users page that displays a table of users. - - Implement iteration to dynamically populate the table with user data. - - Provide functionality to delete or modify user entries from the page. - - For Example: - - ![users-page.png](../../srcs/thymeleaf/users-page.png) + - 实现登录和注册操作的验证。 + - 使用查询参数传递验证失败的错误信息。 + - 确保用户输入的安全和正确处理。 + - 例如: - ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) + ![login-validation.png](../../srcs/thymeleaf/login-validation.png) -Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. +5. **任务 5:创建用户页面** -Happy coding! + - 开发一个显示用户表格的用户页面。 + - 实现迭代来动态填充用户数据表。 + - 提供从页面删除或修改用户条目的功能。 + - 例如: + + ![users-page.png](../../srcs/thymeleaf/users-page.png) + + ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) + +请随时探索并按照自己的节奏完成这些任务。每个任务都旨在进一步提升您在 Thymeleaf 和网页开发方面的技能。如果您有任何问题或需要帮助,请随时联系。 + +祝您编程愉快! \ No newline at end of file diff --git a/docs/cn/transactions/lab-work.md b/docs/cn/transactions/lab-work.md index 081cbda..0f1c1a1 100644 --- a/docs/cn/transactions/lab-work.md +++ b/docs/cn/transactions/lab-work.md @@ -1,55 +1,53 @@ -# Transactions Lab Work +# 事务实验任务 -Welcome to the Transactions Lab Work! The goal of this series of tasks is to help you practice and master transaction management in a Spring application. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of transaction management, including propagation, isolation levels, nested transactions, and more. +欢迎来到事务实验任务!这一系列任务的目标是帮助您练习并掌握在Spring应用程序中管理事务。无论您是初学者还是希望提升技能,这些实践任务都将引导您探索事务管理的各个方面,包括传播、隔离级别、嵌套事务等。 -## Goal of the Lab Work +## 实验任务的目标 -The primary goal of this lab work is to provide you with practical experience and proficiency in managing transactions within a Spring environment. Through these tasks, you will gain valuable insights into configuring transactions, handling different propagation behaviors, implementing nested transactions, and ensuring data integrity in your applications. +这个实验任务的主要目标是为您提供在Spring环境中管理事务的实践经验和熟练度。通过这些任务,您将深入了解配置事务、处理不同的传播行为、实现嵌套事务,并确保应用程序中的数据完整性。 -## Practice Tasks +## 练习任务 -1. [Transaction Setup](practice/configuration.md) -2. [Part 1: Create the Entities and Repositories](practice/lessons/entities-and-repositories.md) -3. [Part 2: Implementing Basic Transactional Operations](practice/lessons/basic-transactional-operations.md) -4. [Part 3: Enhancing Transactional Methods with Detailed Logging](practice/lessons/transactional-logging.md) -5. [Part 4: Implementing Nested Transactions and Non-Transactional Operations](practice/lessons/nested-and-non-transactional-operations.md) +1. [事务设置](practice/configuration.md) +2. [第一部分:创建实体和存储库](practice/lessons/entities-and-repositories.md) +3. [第二部分:实现基本的事务操作](practice/lessons/basic-transactional-operations.md) +4. [第三部分:使用详细日志增强事务方法](practice/lessons/transactional-logging.md) +5. [第四部分:实现嵌套事务和非事务操作](practice/lessons/nested-and-non-transactional-operations.md) -## Lab Work Tasks +## 实验任务 ![img.png](../../srcs/transactions/task-chart.png) -- **Registering a User for an Event** - - **Task:** Implement a method to register a user for an event. Ensure the operation is completely isolated to maintain data consistency. Log this operation separately, regardless of whether the main transaction succeeds or fails. - - **Propagation:** REQUIRED - - **Isolation:** SERIALIZABLE - - **Logging Propagation:** REQUIRES_NEW - -- **Removing a User's Registration from an Event** - - **Task:** Implement a method to remove a user's registration from an event. Ensure this method is always executed within an existing transaction. - - **Propagation:** MANDATORY - -- **Fetching Registered Users for an Event** - - **Task:** Implement a method to fetch all users registered for a specific event. Ensure the method either joins an existing transaction or creates a new one, reading only committed data. - - **Propagation:** REQUIRED - - **Isolation:** READ_COMMITTED - -- **Adding a New Event** - - **Task:** Implement a method to add a new event. This operation should run without transactional guarantees to avoid unnecessary transactional overhead. - - **Propagation:** NOT_SUPPORTED - -- **Updating Event Details and Registrations with Nested Transactions** - - **Task:** Implement a method to update event details along with related registrations. Ensure consistency within nested transactions. - - **Propagation:** REQUIRED - - **Isolation:** REPEATABLE_READ - - **Nested Task:** Update registrations within a nested transaction. - -- **Updating Registrations** - - **Task:** Implement a method to update registration records. Ensure these operations are part of a nested transaction. - - **Propagation:** NESTED - - **Isolation:** REPEATABLE_READ - -- **Performing Non-Transactional Operation** - - **Task:** Implement a method for operations that do not require a transactional context, such as non-critical tasks or logging. - - **Propagation:** None - ---- \ No newline at end of file +- **为事件注册用户** + - **任务:** 实现一个方法来为事件注册用户。确保该操作完全隔离,以保持数据一致性。无论主事务成功与否,都要单独记录此操作。 + - **传播:** REQUIRED + - **隔离级别:** SERIALIZABLE + - **日志传播:** REQUIRES_NEW + +- **从事件中移除用户的注册** + - **任务:** 实现一个方法来从事件中移除用户的注册。确保此方法始终在现有事务中执行。 + - **传播:** MANDATORY + +- **获取某个事件的注册用户** + - **任务:** 实现一个方法来获取特定事件的所有注册用户。确保该方法要么加入现有事务,要么创建一个新事务,只读取已提交的数据。 + - **传播:** REQUIRED + - **隔离级别:** READ_COMMITTED + +- **添加新事件** + - **任务:** 实现一个方法来添加新事件。此操作应该没有事务保证,以避免不必要的事务开销。 + - **传播:** NOT_SUPPORTED + +- **使用嵌套事务更新事件详情和注册** + - **任务:** 实现一个方法来更新事件详情以及相关的注册信息。确保在嵌套事务中保持一致性。 + - **传播:** REQUIRED + - **隔离级别:** REPEATABLE_READ + - **嵌套任务:** 在嵌套事务中更新注册信息。 + +- **更新注册信息** + - **任务:** 实现一个方法来更新注册记录。确保这些操作属于嵌套事务。 + - **传播:** NESTED + - **隔离级别:** REPEATABLE_READ + +- **执行非事务操作** + - **任务:** 实现一个方法用于执行不需要事务上下文的操作,如非关键任务或日志记录。 + - **传播:** None \ No newline at end of file diff --git a/docs/cn/transactions/practice/configuration.md b/docs/cn/transactions/practice/configuration.md index 03ac8a4..390555e 100644 --- a/docs/cn/transactions/practice/configuration.md +++ b/docs/cn/transactions/practice/configuration.md @@ -1,22 +1,22 @@ -# Transaction Setup +# 事务设置 -## Introduction +## 简介 -This guide focuses on setting up transaction management in a Spring Boot project. It provides step-by-step instructions for enabling transaction management and configuring transaction attributes. +本指南专注于在Spring Boot项目中设置事务管理。它提供了逐步说明,以启用事务管理并配置事务属性。 -## Goal +## 目标 -The goal of this guide is to demonstrate how to configure transaction management in a Spring Boot application, allowing for the management of database transactions. +本指南的目标是演示如何在Spring Boot应用程序中配置事务管理,以便管理数据库事务。 -## Transaction Management Setup +## 事务管理设置 -To enable transaction management in your Spring Boot project, follow these steps: +要在Spring Boot项目中启用事务管理,请按照以下步骤操作: -1. Add the necessary dependencies to your `pom.xml` or `build.gradle` file. Ensure that you have dependencies for Spring Boot, Spring Data JPA, and any database driver you are using (e.g., H2, MySQL, PostgreSQL). +1. 在您的 `pom.xml` 或 `build.gradle` 文件中添加必要的依赖项。确保您拥有Spring Boot、Spring Data JPA以及您正在使用的任何数据库驱动程序的依赖项(例如,H2、MySQL、PostgreSQL)。 -2. Configure transaction management in your Spring Boot application. You can do this by annotating your main application class with `@EnableTransactionManagement`. +2. 在您的Spring Boot应用程序中配置事务管理。您可以通过在主应用程序类上添加 `@EnableTransactionManagement` 注解来实现这一点。 -### Example (Java Config): +### 示例(Java配置): ```java package com.example.demo; @@ -37,4 +37,4 @@ public class DemoApplication { ``` --- -# [Next: Create the Entities and Repositories](lessons/entities-and-repositories.md) \ No newline at end of file +# [下一步: 创建实体和存储库](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/basic-transactional-operations.md b/docs/cn/transactions/practice/lessons/basic-transactional-operations.md index ab80146..909ae7f 100644 --- a/docs/cn/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/cn/transactions/practice/lessons/basic-transactional-operations.md @@ -1,50 +1,50 @@ -# Lesson 2: Implementing Basic Transactional Operations +# 第二课:实现基本事务操作 -## Goal +## 目标 -This part aims to introduce simple yet important transactional methods for enrolling students and managing courses in a Spring Boot application. +本部分旨在为在Spring Boot应用程序中注册学生和管理课程引入简单但重要的事务方法。 -## Steps +## 步骤 -1. **Enrolling a Student in a Course** +1. **将学生注册到课程中** - **Scenario**: As a university administrator, you need to enroll a student in a course. This action should be smooth and ensure that even if multiple enrollments happen at the same time or if there are any database issues, data integrity remains intact. + **场景**:作为大学管理员,您需要将学生注册到课程中。此操作应顺利进行,并确保即使同时进行多个注册或存在任何数据库问题,数据完整性仍然保持完好。 - **Implement `enrollStudentInCourse` Method**: Create a method to enroll a student in a course. Ensure that this process is transactional, meaning it's like a single package deal that guarantees everything happens correctly together. We use `Propagation.REQUIRED` to ensure that this method participates in any existing transaction or creates a new one if none exists. Additionally, we set `Isolation.SERIALIZABLE` to ensure that even if there are concurrent transactions, they don't interfere with each other, maintaining the integrity of the data. + **实现 `enrollStudentInCourse` 方法**:创建一个方法来将学生注册到课程中。确保此过程是事务性的,意味着它就像一个整体交易一样,保证所有事情都正确地一起发生。我们使用 `Propagation.REQUIRED` 确保此方法参与任何现有事务或在不存在事务时创建新事务。另外,我们设置 `Isolation.SERIALIZABLE` 以确保即使有并发事务,它们也不会相互干扰,从而保持数据的完整性。 ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) public void enrollStudentInCourse(UUID studentId, UUID courseId) { - // Your implementation here + // 实现代码在此处 } ``` -2. **Fetching Students for a Course** +2. **检索课程的学生** - **Scenario**: To create a class roster for a course, you need to fetch a list of students who have enrolled. This operation should make sure that you always get an accurate view of the database, even if other activities are happening simultaneously. + **场景**:为了创建课程的班级名单,您需要检索已注册的学生列表。此操作应确保您始终获得数据库的准确视图,即使同时发生其他活动。 - **Implement `getStudentsForCourse` Method**: Develop a method to retrieve students for a particular course. It should ensure that the data you fetch is consistent, regardless of any ongoing transactions. We use `Propagation.REQUIRED` to make sure this method participates in any existing transaction or creates a new one if none exists. We set `Isolation.READ_COMMITTED` to ensure that the data we fetch is committed and visible to other transactions, maintaining consistency. + **实现 `getStudentsForCourse` 方法**:开发一个方法来检索特定课程的学生。它应确保无论有没有正在进行的事务,您检索的数据都是一致的。我们使用 `Propagation.REQUIRED` 确保此方法参与任何现有事务或在不存在事务时创建新事务。我们设置 `Isolation.READ_COMMITTED` 确保我们检索的数据已提交并对其他事务可见,保持一致性。 ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public List getStudentsForCourse(UUID courseId) { - // Your implementation here + // 实现代码在此处 } ``` -3. **Adding a New Course** +3. **添加新课程** - **Scenario**: A new course is about to be introduced to the curriculum. When adding it to the system, you want to make sure this operation doesn't interfere with anything else going on, maintaining its independence. + **场景**:新课程即将纳入课程表。在将其添加到系统时,您希望此操作不会干扰其他正在进行的事务,保持其独立性。 - **Implement `addNewCourse` Method**: Create a method to add a new course to the system. Make sure this process doesn't get tangled up with any other ongoing transactions. We use `Propagation.NOT_SUPPORTED` to ensure that this method doesn't participate in any existing transaction, giving it autonomy and avoiding any potential conflicts with other operations. + **实现 `addNewCourse` 方法**:创建一个方法来将新课程添加到系统中。确保此过程不会与任何其他正在进行的事务纠缠在一起。我们使用 `Propagation.NOT_SUPPORTED` 确保此方法不参与任何现有事务,使其具有自主性,并避免与其他操作发生潜在冲突。 ```java @Transactional(propagation = Propagation.NOT_SUPPORTED) public Course addNewCourse(String title) { - // Your implementation here + // 实现代码在此处 } ``` --- -# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file +# [下一步:通过详细日志增强事务方法](transactional-logging.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/entities-and-repositories.md b/docs/cn/transactions/practice/lessons/entities-and-repositories.md index a8ef935..a09abb1 100644 --- a/docs/cn/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/cn/transactions/practice/lessons/entities-and-repositories.md @@ -1,25 +1,25 @@ -# Lesson 1: Create the Entities and Repositories +# 第一课:创建实体和存储库 -## Goal +## 目标 -The goal of this task is to define the core entities (Student, Course, Enrollment, Log) and set up the corresponding repositories in a Spring Boot project using Spring Data JPA. +本任务的目标是在使用Spring Data JPA的Spring Boot项目中定义核心实体(Student、Course、Enrollment、Log)并设置相应的存储库。 -## Steps +## 步骤 -1. **Refer to the provided ER diagram to define the entity classes.** +1. **参考提供的ER图来定义实体类。** ![er-diagram.png](../../../../srcs/transactions/er-diagram.png) - If you already have the entity classes based on the provided ER diagram, proceed to step 2. Otherwise, analyze the ER diagram and create the following entity classes: + 如果您已根据提供的ER图有实体类,请继续执行步骤2。否则,请分析ER图并创建以下实体类: - - Student - - Course - - Enrollment - - Log + - Student(学生) + - Course(课程) + - Enrollment(注册) + - Log(日志) - Ensure that each entity class includes the necessary attributes as depicted in the ER diagram. + 确保每个实体类包含ER图中所示的必要属性。 -2. **Create the repositories for the entities.** +2. **为实体创建存储库。** - For example, let's create the repository for the `Student` entity: + 例如,让我们为 `Student` 实体创建存储库: ```java package com.example.demo.repository; @@ -31,8 +31,8 @@ The goal of this task is to define the core entities (Student, Course, Enrollmen } ``` - If you already have the entity repositories, proceed to next step. Else, repeat the above step for the repositories of the remaining entities (Course, Enrollment, Log). + 如果您已经有了实体存储库,请继续下一步。否则,重复上述步骤为其他实体(Course、Enrollment、Log)创建存储库。 --- -# [NEXT: Implementing Basic Transactional Operations](basic-transactional-operations.md) \ No newline at end of file +# [下一步:实现基本事务操作](basic-transactional-operations.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md index 5ec8ec5..4462e2e 100644 --- a/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md +++ b/docs/cn/transactions/practice/lessons/nested-and-non-transactional-operations.md @@ -1,60 +1,60 @@ -# Lesson 4: Implementing Nested Transactions and Non-Transactional Operations +# 第四课:实现嵌套事务和非事务操作 -## Goal +## 目标 -This part aims to explore the use of nested transactions and non-transactional operations within the service layer, providing students with insights into managing complex transactional scenarios. +本部分旨在探讨在服务层中使用嵌套事务和非事务操作,为学生提供管理复杂事务场景的见解。 -## Steps +## 步骤 -1. **Updating Course Details and Enrollments** +1. **更新课程详情和注册** - **Scenario**: As a university administrator, you often need to update both the course details and the enrollments associated with that course. This operation should ensure data consistency and integrity, even if multiple updates are performed simultaneously. + **场景**:作为大学管理员,您经常需要同时更新课程详情和与该课程相关的注册。此操作应确保数据一致性和完整性,即使同时执行多个更新也是如此。 - **Implement `updateCourseAndEnrollments` Method**: Define a method to update the course details and enrollments with the required transactional behavior. We use `Propagation.REQUIRED` to ensure that this method participates in any existing transaction or creates a new one if none exists. Setting `Isolation.REPEATABLE_READ` ensures that the data read by this method remains consistent throughout the transaction. Inside this method, we perform a nested transaction by calling the `updateEnrollments` method to update enrollments, ensuring that this operation is atomic and isolated from the outer transaction. + **实现 `updateCourseAndEnrollments` 方法**:定义一个方法来使用所需的事务行为更新课程详情和注册。我们使用 `Propagation.REQUIRED` 确保此方法参与任何现有事务或在不存在事务时创建新事务。设置 `Isolation.REPEATABLE_READ` 确保此方法读取的数据在整个事务中保持一致。在此方法内部,我们通过调用 `updateEnrollments` 方法执行嵌套事务来更新注册,确保此操作是原子的,并与外部事务隔离。 ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ) public void updateCourseAndEnrollments(UUID courseId, String newTitle) { - // Log the start of the update process + // 记录更新过程的开始 logAction("Update Course and Enrollments", "Start"); try { - // Implementation to update course details + // 更新课程详情的实现 // ... - // Nested transaction to update enrollments + // 嵌套事务更新注册 updateEnrollments(courseId); - // Log successful update + // 记录成功的更新 logAction("Update Course and Enrollments", "Success"); } catch (Exception e) { - // Log failure + // 记录失败 logAction("Update Course and Enrollments", "Failure: " + e.getMessage()); throw e; } } ``` -2. **Updating Enrollments Independently** +2. **独立更新注册** - **Scenario**: Certain administrative tasks may require updating enrollments independently of course updates. This operation should maintain data consistency while allowing for separate transactional control. + **场景**:某些管理任务可能需要独立于课程更新来更新注册。此操作应在维护数据一致性的同时,允许单独的事务控制。 - **Implement `updateEnrollments` Method**: Define a method to update enrollments for a course with nested transactional behavior. We use `Propagation.NESTED` to indicate that this method is executed within the scope of the outer transaction but can be rolled back independently if needed. Setting `Isolation.REPEATABLE_READ` ensures that the data read by this method remains consistent throughout the transaction. + **实现 `updateEnrollments` 方法**:定义一个方法来使用嵌套事务行为更新课程的注册。我们使用 `Propagation.NESTED` 表示此方法在外部事务范围内执行,但如果需要,可以独立回滚。设置 `Isolation.REPEATABLE_READ` 确保此方法读取的数据在整个事务中保持一致。 ```java @Transactional(propagation = Propagation.NESTED, isolation = Isolation.REPEATABLE_READ) public void updateEnrollments(UUID courseId) { - // Log the start of the enrollment update process + // 记录更新注册的开始 logAction("Update Enrollments", "Start"); try { - // Implementation to update enrollments + // 更新注册的实现 // ... - // Log successful update + // 记录成功的更新 logAction("Update Enrollments", "Success"); } catch (Exception e) { - // Log failure + // 记录失败 logAction("Update Enrollments", "Failure: " + e.getMessage()); throw e; } @@ -63,4 +63,4 @@ This part aims to explore the use of nested transactions and non-transactional o --- -# [NEXT: Tasks](../../lab-work.md) \ No newline at end of file +# [下一步:任务](../../lab-work.md) \ No newline at end of file diff --git a/docs/cn/transactions/practice/lessons/transactional-logging.md b/docs/cn/transactions/practice/lessons/transactional-logging.md index 31c3719..f4ca60d 100644 --- a/docs/cn/transactions/practice/lessons/transactional-logging.md +++ b/docs/cn/transactions/practice/lessons/transactional-logging.md @@ -1,16 +1,16 @@ -# Lesson 3: Enhancing Transactional Methods with Detailed Logging +# 第三课:通过详细日志增强事务方法 -## Goal +## 目标 -This part aims to integrate detailed logging for each transactional operation, ensuring actions are logged with their outcomes. +本部分旨在为每个事务操作集成详细的日志记录,确保操作及其结果被记录。 -## Steps +## 步骤 -1. **Implementing the Logging Method** +1. **实现日志记录方法** - **Scenario**: Before enhancing transactional methods with logging, we need to implement a method to handle logging independently of the main transaction. This ensures that logging occurs reliably, regardless of the outcome of the main transaction. + **场景**:在增强事务方法的日志记录之前,我们需要实现一个方法来独立处理日志记录,以确保无论主事务的结果如何,日志都能可靠地记录。 - **Implement `logAction` Method**: Create a method to log actions independently, ensuring accurate tracking of transaction outcomes. We use `Propagation.REQUIRES_NEW` to execute the logging operation in a separate transaction, making it independent of any ongoing transactions and guaranteeing its completion even if the main transaction fails. + **实现 `logAction` 方法**:创建一个方法来独立记录操作,确保准确跟踪事务结果。我们使用 `Propagation.REQUIRES_NEW` 在单独的事务中执行日志记录操作,使其独立于任何正在进行的事务,并确保即使主事务失败,也能完成日志记录。 ```java @Transactional(propagation = Propagation.REQUIRES_NEW) @@ -20,80 +20,80 @@ This part aims to integrate detailed logging for each transactional operation, e } ``` -2. **Logging Enrollment of a Student in a Course** +2. **记录学生注册课程** - **Scenario**: As a university administrator, you need to log the enrollment of a student in a course to keep track of successful enrollments and any potential failures. + **场景**:作为大学管理员,您需要记录学生注册课程的情况,以便跟踪成功的注册和任何潜在的失败。 - **Enhance `enrollStudentInCourse` Method**: Modify the method to log the action's success or failure. + **增强 `enrollStudentInCourse` 方法**:修改方法以记录操作的成功或失败。 ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) public void enrollStudentInCourse(UUID studentId, UUID courseId) { - // Log the start of the enrollment process + // 记录注册过程的开始 logAction("Enroll Student", "Start"); try { - // Implementation to enroll the student in the course + // 注册学生到课程的实现 // ... - // Log successful enrollment + // 记录成功的注册 logAction("Enroll Student", "Success"); } catch (Exception e) { - // Log failure + // 记录失败 logAction("Enroll Student", "Failure: " + e.getMessage()); throw e; } } ``` -3. **Logging Retrieval of Students for a Course** +3. **记录检索课程的学生** - **Scenario**: To maintain an audit trail of course-related activities, you need to log the retrieval of students for a course and ensure that the logging occurs even in case of exceptions. + **场景**:为了维护与课程相关的活动的审计轨迹,您需要记录检索课程的学生,并确保即使发生异常,日志记录也会发生。 - **Enhance `getStudentsForCourse` Method**: Modify the method to log the action's success or failure. + **增强 `getStudentsForCourse` 方法**:修改方法以记录操作的成功或失败。 ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public List getStudentsForCourse(UUID courseId) { - // Log the start of retrieving students for the course + // 记录检索课程学生的开始 logAction("Retrieve Students for Course", "Start"); try { - // Implementation to retrieve students for the course + // 检索课程学生的实现 // ... - // Log successful retrieval + // 记录成功的检索 logAction("Retrieve Students for Course", "Success"); return students; } catch (Exception e) { - // Log failure + // 记录失败 logAction("Retrieve Students for Course", "Failure: " + e.getMessage()); throw e; } } ``` -4. **Logging Addition of a New Course** +4. **记录添加新课程** - **Scenario**: When adding a new course, it's essential to log the outcome of the operation to track the success or failure of the addition. + **场景**:当添加新课程时,记录操作的结果是至关重要的,以跟踪添加的成功或失败。 - **Enhance `addNewCourse` Method**: Modify the method to log the action's success or failure. + **增强 `addNewCourse` 方法**:修改方法以记录操作的成功或失败。 ```java @Transactional(propagation = Propagation.NOT_SUPPORTED) public Course addNewCourse(String title) { - // Log the start of adding a new course + // 记录添加新课程的开始 logAction("Add New Course", "Start"); try { - // Implementation to add a new course + // 添加新课程的实现 // ... - // Log successful addition + // 记录成功的添加 logAction("Add New Course", "Success"); return savedCourse; } catch (Exception e) { - // Log failure + // 记录失败 logAction("Add New Course", "Failure: " + e.getMessage()); throw e; } @@ -102,4 +102,4 @@ This part aims to integrate detailed logging for each transactional operation, e --- -# [NEXT: Implementing Nested Transactions and Non-Transactional Operations](nested-and-non-transactional-operations.md) +# [下一步:实现嵌套事务和非事务操作](nested-and-non-transactional-operations.md) \ No newline at end of file From 04cdaf02c9128ed8a2cc4c18dda92606d5e5e77c Mon Sep 17 00:00:00 2001 From: kmsoln Date: Fri, 24 May 2024 20:48:23 +0300 Subject: [PATCH 28/40] [Master] Added Chinese files for JMeter --- docs/cn/jmeter/lab-work.md | 37 +++++++------- .../adding-listeners-and-running-tests.md | 38 +++++++-------- .../jmeter/lessons/analyzing-test-results.md | 24 +++++----- .../configuring-and-using-the-proxy-server.md | 28 +++++------ ...iguring-browser-to-use-the-proxy-server.md | 21 ++++---- .../lessons/creating-a-test-scenario.md | 48 +++++++++---------- .../jmeter/lessons/executing-load-testing.md | 36 +++++++------- docs/cn/jmeter/lessons/first.md | 0 .../introduction-to-jmeter-and-basic-setup.md | 36 +++++++------- .../lessons/organizing-recorded-requests.md | 37 +++++++------- .../lessons/parameterizing-http-requests.md | 18 +++---- .../recording-and-managing-http-requests.md | 27 +++++------ docs/cn/jmeter/lessons/second.md | 0 .../setting-up-http-test-script-recorder.md | 37 +++++++------- docs/cn/jmeter/lessons/third.md | 1 - 15 files changed, 192 insertions(+), 196 deletions(-) delete mode 100644 docs/cn/jmeter/lessons/first.md delete mode 100644 docs/cn/jmeter/lessons/second.md delete mode 100644 docs/cn/jmeter/lessons/third.md diff --git a/docs/cn/jmeter/lab-work.md b/docs/cn/jmeter/lab-work.md index e7cb1cb..7d9debd 100644 --- a/docs/cn/jmeter/lab-work.md +++ b/docs/cn/jmeter/lab-work.md @@ -1,26 +1,23 @@ -# JMeter Lab Work +# JMeter实验室任务 -Welcome to the JMeter Lab Work! The goal of this series of tasks is to help you practice and master JMeter, a powerful tool for performance testing and measuring the performance of web applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of using JMeter for load testing, recording, and analyzing HTTP requests. +欢迎来到JMeter实验室!这一系列任务的目标是帮助您练习和掌握JMeter,这是一种用于性能测试和测量Web应用程序性能的强大工具。无论您是初学者还是希望提升技能,这些实践任务都将引导您了解JMeter在负载测试、录制和分析HTTP请求方面的各个方面。 -## Goal of the Lab Work +## 实验室任务的目标 -The primary goal of this lab work is to provide you with practical experience and proficiency in using JMeter for performance testing. JMeter is widely utilized for testing the performance of web applications and services, and through these tasks, you will gain valuable insights into its configuration, scripting, recording, and analysis features. +本实验室的主要目标是为您提供在性能测试中使用JMeter的实际经验和熟练度。JMeter被广泛用于测试Web应用程序和服务的性能,通过这些任务,您将获得有关其配置、脚本编写、录制和分析功能的宝贵见解。 -## Practice Tasks +## 实践任务 -- [Lesson 1: Introduction to JMeter and Basic Setup](lessons/introduction-to-jmeter-and-basic-setup.md) -- [Lesson 2: Setting Up HTTP(S) Test Script Recorder](lessons/setting-up-http-test-script-recorder.md) -- [Lesson 3: Configuring and Using the Proxy Server](lessons/configuring-and-using-the-proxy-server.md) -- [Lesson 4: Configuring Browser to Use the Proxy Server](lessons/configuring-browser-to-use-the-proxy-server.md) -- [Lesson 5: Recording and Managing HTTP Requests](lessons/recording-and-managing-http-requests.md) -- [Lesson 6: Organizing Recorded Requests](lessons/organizing-recorded-requests.md) -- [Lesson 7: Creating a Test Scenario](lessons/creating-a-test-scenario.md) -- [Lesson 8: Parameterizing HTTP Requests](lessons/parameterizing-http-requests.md) -- [Lesson 9: Adding Listeners and Running Tests](lessons/adding-listeners-and-running-tests.md) -- [Lesson 10: Executing Load Testing](lessons/executing-load-testing.md) -- [Lesson 11: Analyzing Test Results](lessons/analyzing-test-results.md) +- [第1课:JMeter简介和基本设置](lessons/introduction-to-jmeter-and-basic-setup.md) +- [第2课:设置HTTP(S)测试脚本记录器](lessons/setting-up-http-test-script-recorder.md) +- [第3课:配置和使用代理服务器](lessons/configuring-and-using-the-proxy-server.md) +- [第4课:配置浏览器使用代理服务器](lessons/configuring-browser-to-use-the-proxy-server.md) +- [第5课:录制和管理HTTP请求](lessons/recording-and-managing-http-requests.md) +- [第6课:组织录制的请求](lessons/organizing-recorded-requests.md) +- [第7课:创建测试方案](lessons/creating-a-test-scenario.md) +- [第8课:给HTTP请求参数化](lessons/parameterizing-http-requests.md) +- [第9课:添加监听器和运行测试](lessons/adding-listeners-and-running-tests.md) +- [第10课:执行负载测试](lessons/executing-load-testing.md) +- [第11课:分析测试结果](lessons/analyzing-test-results.md) -## Lab Work Tasks - -idk :D - \ No newline at end of file +## 实验室任务 \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md b/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md index de68c1a..bf55e98 100644 --- a/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md +++ b/docs/cn/jmeter/lessons/adding-listeners-and-running-tests.md @@ -1,28 +1,28 @@ -# Lesson 9: Adding Listeners and Running Tests +# 第9课:添加监听器并运行测试 -## Goal -The goal of this lesson is to add listeners to view test results and to run the test scenarios in JMeter. +## 目标 +本课的目标是向JMeter中添加监听器以查看测试结果,并运行测试方案。 -## Steps +## 步骤 -### 9.1. Adding a Listener -1. **View Results Tree** - - Right-click on the **Thread Group**. - - Select **Add > Listener > View Results Tree**. +### 9.1 添加监听器 +1. **查看结果树** + - 在 **线程组** 上右键单击。 + - 选择 **添加 > 监听器 > 查看结果树**。 -### 9.2. Saving the Test Plan -1. **Saving** - - Click on the **Test Plan** node. - - Go to **File > Save Test Plan as**. - - Choose a location, enter a filename, and save the test plan. +### 9.2 保存测试计划 +1. **保存** + - 单击 **测试计划** 节点。 + - 转到 **文件 > 另存为**。 + - 选择一个位置,输入文件名,并保存测试计划。 -### 9.3. Running the Test Scenario -1. **Execution** - - Click **Run > Start** to begin the test. +### 9.3 运行测试方案 +1. **执行** + - 单击 **运行 > 开始** 开始测试。
![run-test-scenraio-button.png](../../../srcs/jmeter/run-test-scenraio-button.png) - - View the results in the **View Results Tree** listener. - - Ensure there are no errors in the test results. + - 在 **查看结果树** 监听器中查看结果。 + - 确保测试结果中没有错误。 --- -# [Next: Executing Load Testing](executing-load-testing.md) +# [下一步:执行负载测试](executing-load-testing.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/analyzing-test-results.md b/docs/cn/jmeter/lessons/analyzing-test-results.md index 17ce637..8a8d053 100644 --- a/docs/cn/jmeter/lessons/analyzing-test-results.md +++ b/docs/cn/jmeter/lessons/analyzing-test-results.md @@ -1,19 +1,19 @@ -# Lesson 11: Analyzing Test Results +# 第11课:分析测试结果 -## Goal -The goal of this lesson is to analyze test results using electronic spreadsheets and to prepare for subsequent test runs in JMeter. +## 目标 +本课的目标是使用电子表格分析测试结果,并为后续在JMeter中进行测试准备。 -## Steps +## 步骤 -### 11.1. Utilizing Electronic Spreadsheets -1. **Exporting and Analyzing Data** - - Export the results from the **Aggregate Report** listener to a CSV file. - - Use a spreadsheet application (e.g., Excel) to analyze the average response times and other metrics. +### 11.1 利用电子表格 +1. **导出和分析数据** + - 从 **聚合报告** 监听器中将结果导出到CSV文件。 + - 使用电子表格应用程序(例如Excel)分析平均响应时间和其他指标。 -### 11.2. Clearing Statistics for Subsequent Runs -1. **Clearing Data** - - Before running a new test, clear the previous results by selecting **Run > Clear All**. +### 11.2 为后续运行清除统计信息 +1. **清除数据** + - 在运行新测试之前,通过选择 **运行 > 清除所有** 来清除先前的结果。 --- -# [Next: Tasks](../lab-work.md) \ No newline at end of file +# [下一步:任务](../lab-work.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md b/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md index 00f6a33..c438c5c 100644 --- a/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md +++ b/docs/cn/jmeter/lessons/configuring-and-using-the-proxy-server.md @@ -1,19 +1,19 @@ -# Lesson 3: Configuring and Using the Proxy Server +# 第3课:配置和使用代理服务器 -## Goal -The goal of this lesson is to configure the Proxy Server in JMeter and demonstrate how to use it for recording HTTP(S) requests. +## 目标 +本课的目标是在JMeter中配置代理服务器,并演示如何将其用于记录HTTP(S)请求。 -## Steps +## 步骤 -### 3.1. Configuring the Proxy Server -1. **Setting Port and URL Patterns** - - In the **HTTP(S) Test Script Recorder** window, set the **Port** field to `9090`. - - In the **URL Patterns to Exclude** section, click **Add** and enter patterns such as `.*\.gif`, `.*\.js`, and `.*\.css`. -
![setting-port-and-url-pattern.png](../../../srcs/jmeter/setting-port-and-url-pattern.png) -### 3.2. Starting the Proxy Server -1. **Starting Recording** - - Click the **Start** button at the bottom of the **HTTP(S) Test Script Recorder** window. -
![start-recording-button.png](../../../srcs/jmeter/start-recording-button.png) +### 3.1. 配置代理服务器 +1. **设置端口和URL模式** + - 在 **HTTP(S)测试脚本录制器** 窗口中,将 **端口** 字段设置为 `9090`。 + - 在 **排除的URL模式** 部分,点击 **添加**,输入诸如 `.*\.gif`、`.*\.js` 和 `.*\.css` 等模式。 +
![setting-port-and-url-pattern.png](../../../srcs/jmeter/setting-port-and-url-pattern.png) +### 3.2. 启动代理服务器 +1. **开始录制** + - 点击 **HTTP(S)测试脚本录制器** 窗口底部的 **开始** 按钮。 +
![start-recording-button.png](../../../srcs/jmeter/start-recording-button.png) --- -# [Next: Recording and Managing HTTP Requests](recording-and-managing-http-requests.md) +# [下一步:记录和管理HTTP请求](recording-and-managing-http-requests.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md b/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md index 977b400..a3901e4 100644 --- a/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md +++ b/docs/cn/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md @@ -1,17 +1,16 @@ -# Lesson 4: Configuring Browser to Use the Proxy Server +# 第4课:配置浏览器使用代理服务器 -## Goal -The goal of this lesson is to configure your browser to use the Proxy Server set up in JMeter for recording HTTP(S) requests. +## 目标 +本课的目标是配置您的浏览器以使用在JMeter中设置的代理服务器来记录HTTP(S)请求。 -## Steps +## 步骤 -### 4.1. Configuring Browser Settings -1. **Setting Up Proxy in Browser** - - Open your browser settings and navigate to the proxy settings. - - Set the proxy server address to `localhost` and the port to `9090`. - - Save the settings and restart the browser if necessary. +### 4.1. 配置浏览器设置 +1. **在浏览器中设置代理** + - 打开浏览器设置,并导航到代理设置。 + - 将代理服务器地址设置为 `localhost`,端口设置为 `9090`。 + - 保存设置,如果需要,重新启动浏览器。 --- -# [Next: Organizing Recorded Requests](organizing-recorded-requests.md) - +# [下一步:整理记录的请求](organizing-recorded-requests.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/creating-a-test-scenario.md b/docs/cn/jmeter/lessons/creating-a-test-scenario.md index 0ec5dfd..abbfe07 100644 --- a/docs/cn/jmeter/lessons/creating-a-test-scenario.md +++ b/docs/cn/jmeter/lessons/creating-a-test-scenario.md @@ -1,30 +1,30 @@ -# Lesson 7: Creating a Test Scenario +# 第7课:创建测试场景 -## Goal -The goal of this lesson is to create a test scenario by organizing recorded requests and adding dynamic value extraction in JMeter. +## 目标 +本课的目标是通过整理记录的请求并在JMeter中添加动态值提取来创建一个测试场景。 -## Steps +## 步骤 -### 7.1. Adding a Simple Controller -1. **Organizing Requests** - - Right-click on the **Thread Group**. -
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) - - Select **Add > Logic Controller > Simple Controller**. -
![new-simple-controller-button.png](../../../srcs/jmeter/new-simple-controller-button.png) - - Rename the Simple Controller to match the function you are testing. - - Drag and drop all recorded HTTP requests from the **Recording Controller** to the **Simple Controller**. +### 7.1. 添加简单控制器 +1. **整理请求** + - 右键单击 **线程组**。 +
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) + - 选择 **添加 > 逻辑控制器 > 简单控制器**。 +
![new-simple-controller-button.png](../../../srcs/jmeter/new-simple-controller-button.png) + - 将所有记录的HTTP请求从 **Recording Controller** 拖放到 **Simple Controller** 中。 + +### 7.2. 添加正则表达式提取器 +1. **动态值提取** + - 右键单击需要动态值的HTTP请求(例如,`javax.faces.ViewState`)。 + - 选择 **添加 > 后置处理器 > 正则表达式提取器**。 +
![new-regular-expression-button.png](../../../srcs/jmeter/new-regular-expression-button.png) + - 配置提取器: + - **引用名称:** `jsfViewState` + - **正则表达式:** `![regular-expression-extractor-fields.png](../../../srcs/jmeter/regular-expression-extractor-fields.png) -### 7.2. Adding a Regular Expression Extractor -1. **Dynamic Value Extraction** - - Right-click on the HTTP request that requires a dynamic value (e.g., `javax.faces.ViewState`). - - Select **Add > Post Processors > Regular Expression Extractor**. -
![new-regular-expression-button.png](../../../srcs/jmeter/new-regular-expression-button.png) - - Configure the extractor: - - **Reference Name:** `jsfViewState` - - **Regular Expression:** `![regular-expression-extractor-fields.png](../../../srcs/jmeter/regular-expression-extractor-fields.png) --- -# [Next: Parameterizing HTTP Requests](parameterizing-http-requests.md) +# [下一步:给HTTP请求参数化](parameterizing-http-requests.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/executing-load-testing.md b/docs/cn/jmeter/lessons/executing-load-testing.md index 165d7e3..c7d2f2e 100644 --- a/docs/cn/jmeter/lessons/executing-load-testing.md +++ b/docs/cn/jmeter/lessons/executing-load-testing.md @@ -1,26 +1,26 @@ -# Lesson 10: Executing Load Testing +# 第10课:执行负载测试 -## Goal -The goal of this lesson is to configure and execute load testing in JMeter. +## 目标 +本课的目标是在JMeter中配置和执行负载测试。 -## Steps +## 步骤 -### 10.1. Adjusting Thread Settings -1. **Load Testing Configuration** - - Click on the **Thread Group**. - - Set the **Number of Threads** (users), **Ramp-Up Period** (seconds), and **Loop Count** as needed for your load test. +### 10.1. 调整线程设置 +1. **负载测试配置** + - 单击 **线程组**。 + - 根据负载测试的需求,设置 **线程数**(用户)、**Ramp-Up 周期**(秒)和 **循环次数**。 -### 10.2. Adding an Aggregate Report Listener -1. **Summary Report** - - Right-click on the **Simple Controller**. - - Select **Add > Listener > Aggregate Report**. - - Disable the **View Results Tree** listener to improve performance during load testing. +### 10.2. 添加汇总报告监听器 +1. **汇总报告** + - 右键单击 **简单控制器**。 + - 选择 **添加 > 监听器 > 汇总报告**。 + - 禁用 **查看结果树** 监听器,以提高负载测试期间的性能。 -### 10.3. Running the Load Test -1. **Execution** - - Click **Run > Start** to begin the load test. - - View the summarized results in the **Aggregate Report** listener. +### 10.3. 运行负载测试 +1. **执行** + - 单击 **运行 > 启动** 开始执行负载测试。 + - 在 **汇总报告** 监听器中查看总结的结果。 --- -# [Next: Analyzing Test Results](analyzing-test-results.md) \ No newline at end of file +# [下一步:分析测试结果](analyzing-test-results.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/first.md b/docs/cn/jmeter/lessons/first.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md b/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md index 241ab1e..e66b2ae 100644 --- a/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md +++ b/docs/cn/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md @@ -1,27 +1,27 @@ -# Lesson 1: Introduction to JMeter and Basic Setup +# 第1课:介绍JMeter和基本设置 -## Goal -The goal of this lesson is to introduce JMeter and guide you through the basic setup process, including starting JMeter and adding a Thread Group to your Test Plan. +## 目标 +本课的目标是介绍JMeter,并指导您完成基本设置过程,包括启动JMeter和向测试计划添加线程组。 -## Steps +## 步骤 -### 1.1. Starting JMeter +### 1.1. 启动JMeter ![jmeter-site.png](../../../srcs/jmeter/site.png) -1. **Download and Install JMeter** - - Visit the [official JMeter website](https://jmeter.apache.org/download_jmeter.cgi) and download the latest version. - - Extract the downloaded archive. - - Navigate to the `bin` directory and start JMeter by running the `jmeter.bat` file (Windows) or `jmeter.sh` (macOS/Linux). +1. **下载并安装JMeter** + - 访问[官方JMeter网站](https://jmeter.apache.org/download_jmeter.cgi)并下载最新版本。 + - 解压下载的存档文件。 + - 进入 `bin` 目录,并通过运行 `jmeter.bat` 文件(Windows)或 `jmeter.sh`(macOS/Linux)启动JMeter。 -### 1.2. Adding a Thread Group +### 1.2. 添加线程组 ![interface.png](../../../srcs/jmeter/interface.png) -1. **Creating a Test Plan** - - Open JMeter. - - Right-click on the **Test Plan** node. -
![test-plan.png](../../../srcs/jmeter/test-plan.png) - - - Select **Add > Threads (Users) > Thread Group**. -
![test-plan.png](../../../srcs/jmeter/thread-group.png) +1. **创建测试计划** + - 打开JMeter。 + - 右键单击 **测试计划** 节点。 +
![test-plan.png](../../../srcs/jmeter/test-plan.png) + + - 选择 **添加 > 线程(用户) > 线程组**。 +
![test-plan.png](../../../srcs/jmeter/thread-group.png) --- -# [Next: Setting Up HTTP Test Script Recorder](setting-up-http-test-script-recorder.md) +# [下一步:设置HTTP测试脚本记录器](setting-up-http-test-script-recorder.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/organizing-recorded-requests.md b/docs/cn/jmeter/lessons/organizing-recorded-requests.md index a914890..e2ec5fe 100644 --- a/docs/cn/jmeter/lessons/organizing-recorded-requests.md +++ b/docs/cn/jmeter/lessons/organizing-recorded-requests.md @@ -1,22 +1,23 @@ -# Lesson 6: Organizing Recorded Requests +# 第6课:组织记录的请求 -## Goal -The goal of this lesson is to organize the recorded HTTP requests in JMeter for better management and test execution. +## 目标 +本课的目标是在JMeter中组织记录的HTTP请求,以便更好地管理和执行测试。 -## Steps +## 步骤 -### 6.1. Disabling the Recording Controller -1. **Disabling** - - Right-click on the **Recording Controller** in JMeter. -
![recording-controller-button.png](../../../srcs/jmeter/recording-controller-button.png) - - Select **Disable** to stop capturing further requests. -
![disable-element.png](../../../srcs/jmeter/disable-element.png) -### 6.2. Adding an HTTP Cookie Manager -1. **Session Management** - - Right-click on the **Thread Group**. -
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) - - Select **Add > Config Element > HTTP Cookie Manager**. -
![new-http-cookie-manager-button.png](../../../srcs/jmeter/new-http-cookie-manager-button.png) ---- +### 6.1. 禁用记录控制器 +1. **禁用** + - 在JMeter中右键单击 **Recording Controller**。 +
![recording-controller-button.png](../../../srcs/jmeter/recording-controller-button.png) + - 选择 **Disable** 以停止捕获进一步的请求。 +
![disable-element.png](../../../srcs/jmeter/disable-element.png) +### 6.2. 添加HTTP Cookie管理器 +1. **会话管理** + - 在 **线程组** 上右键单击。 +
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) + - 选择 **添加 > 配置元件 > HTTP Cookie管理器**。 +
![new-http-cookie-manager-button.png](../../../srcs/jmeter/new-http-cookie-manager-button.png) -# [Next: Creating a Test Scenario](creating-a-test-scenario.md) +--- + +# [下一步:创建测试方案](creating-a-test-scenario.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/parameterizing-http-requests.md b/docs/cn/jmeter/lessons/parameterizing-http-requests.md index a2daa62..10c3bcd 100644 --- a/docs/cn/jmeter/lessons/parameterizing-http-requests.md +++ b/docs/cn/jmeter/lessons/parameterizing-http-requests.md @@ -1,15 +1,15 @@ -# Lesson 8: Parameterizing HTTP Requests +# 第8课:对HTTP请求进行参数化 -## Goal -The goal of this lesson is to parameterize HTTP requests in JMeter using extracted dynamic values. +## 目标 +本课的目标是使用提取的动态值在JMeter中对HTTP请求进行参数化。 -## Steps +## 步骤 -### 8.1. Modifying HTTP Requests -1. **Using Extracted Values** - - In each HTTP request that uses the parameter `javax.faces.ViewState`, replace the value with `${jsfViewState}`. - - Ensure the **Encode** checkbox is selected if needed. +### 8.1. 修改HTTP请求 +1. **使用提取的值** + - 在每个使用参数 `javax.faces.ViewState` 的HTTP请求中,将其值替换为 `${jsfViewState}`。 + - 如有必要,请确保选中 **Encode** 复选框。 --- -# [Next: Adding Listeners and Running Tests](adding-listeners-and-running-tests.md) +# [下一步:添加监听器并运行测试](adding-listeners-and-running-tests.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md b/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md index d67bc0a..6cbbe43 100644 --- a/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md +++ b/docs/cn/jmeter/lessons/recording-and-managing-http-requests.md @@ -1,21 +1,20 @@ -# Lesson 5: Recording and Managing HTTP Requests +# 第5课:记录和管理HTTP请求 -## Goal -The goal of this lesson is to record HTTP requests made by navigating through a web application and manage the recorded requests in JMeter. +## 目标 +本课的目标是通过浏览Web应用程序记录HTTP请求,并在JMeter中管理记录的请求。 -## Steps +## 步骤 -### 5.1. Recording HTTP Requests -1. **Navigating Through the Application** - - Navigate through your web application as you normally would. The HTTP requests will be recorded by JMeter. +### 5.1. 记录HTTP请求 +1. **浏览应用程序** + - 以通常的方式浏览您的Web应用程序。JMeter将记录HTTP请求。 -### 5.2. Stopping the Recording -1. **Stopping Proxy Server** - - Return to JMeter and click the **Stop** button in the **HTTP(S) Test Script Recorder** window. -
![stop-recording-button.png](../../../srcs/jmeter/stop-recording-button.png) - - Disable the proxy settings in your browser to revert to direct internet access. +### 5.2. 停止录制 +1. **停止代理服务器** + - 返回到JMeter,并在**HTTP(S) Test Script Recorder**窗口中单击**停止**按钮。 +
![stop-recording-button.png](../../../srcs/jmeter/stop-recording-button.png) + - 在浏览器中禁用代理设置,以恢复直接的互联网访问。 --- -# [Next: Organizing Recorded Requests](organizing-recorded-requests.md) - +# [下一步:组织记录的请求](organizing-recorded-requests.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/second.md b/docs/cn/jmeter/lessons/second.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md b/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md index 008f569..017ba14 100644 --- a/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md +++ b/docs/cn/jmeter/lessons/setting-up-http-test-script-recorder.md @@ -1,24 +1,25 @@ -# Lesson 2: Setting Up HTTP(S) Test Script Recorder +# 第2课:设置HTTP(S)测试脚本记录器 -## Goal -The goal of this lesson is to guide you through setting up the HTTP(S) Test Script Recorder in JMeter, including adding a Recording Controller and configuring a Proxy Server. +## 目标 +本课的目标是指导您在JMeter中设置HTTP(S)测试脚本记录器,包括添加Recording Controller和配置Proxy服务器。 -## Steps +## 步骤 -### 2.1. Adding a Recording Controller -1. **Adding to Thread Group** - - Right-click on the **Thread Group**. -
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) - - - Select **Add > Logic Controller > Recording Controller**. -
![recording-controller-button.png](../../../srcs/jmeter/recording-controller-button.png) +### 2.1. 添加Recording Controller +1. **添加到线程组** + - 右键单击**线程组**。 +
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) + + - 选择**添加 > 逻辑控制器 > Recording Controller**。 +
![recording-controller-button.png](../../../srcs/jmeter/recording-controller-button.png) + +### 2.2. 添加Proxy服务器 +1. **配置代理** + - 右键单击**工作台**节点。 +
![test-plan.png](../../../srcs/jmeter/test-plan.png) + - 选择**添加 > 非测试元件 > HTTP(S)测试脚本记录器**。 +
![test-script-recorder.png](../../../srcs/jmeter/test-script-recorder.png) -### 2.2. Adding a Proxy Server -1. **Configuring Proxy** - - Right-click on the **Workbench** node. -
![test-plan.png](../../../srcs/jmeter/test-plan.png) - - Select **Add > Non-Test Elements > HTTP(S) Test Script Recorder**. -
![test-script-recorder.png](../../../srcs/jmeter/test-script-recorder.png) --- -# [Next: Configuring and Using the Proxy Server](configuring-and-using-the-proxy-server.md) +# [下一步:配置和使用代理服务器](configuring-and-using-the-proxy-server.md) \ No newline at end of file diff --git a/docs/cn/jmeter/lessons/third.md b/docs/cn/jmeter/lessons/third.md deleted file mode 100644 index 945c9b4..0000000 --- a/docs/cn/jmeter/lessons/third.md +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file From d901f7e2d557c3d3a7081bd28ccaa3e6aba6de11 Mon Sep 17 00:00:00 2001 From: Nokrosis Date: Tue, 28 May 2024 00:19:05 +0300 Subject: [PATCH 29/40] A little changes --- docs/ru/jmeter/lab-work.md | 4 ++-- docs/ru/jpa/lab-work.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/ru/jmeter/lab-work.md b/docs/ru/jmeter/lab-work.md index 3cef715..d346ff7 100644 --- a/docs/ru/jmeter/lab-work.md +++ b/docs/ru/jmeter/lab-work.md @@ -1,10 +1,10 @@ # Практические задания лабораторной работы по JMeter -Добро пожаловать в лабораторную работу по JMeter! Цель этой серии задач - помочь вам практиковаться и освоить JMeter, мощный инструмент для тестирования производительности и измерения производительности веб-приложений. Независимо от того, являетесь ли вы начинающим или хотите улучшить свои навыки, эти практические задания помогут вам ознакомиться с различными аспектами использования JMeter для нагрузочного тестирования, записи и анализа HTTP-запросов. +Добро пожаловать в лабораторную работу по JMeter! Цель этой серии задач - помочь вам практиковаться и освоить JMeter, полезный инструмент для тестирования и измерения производительности веб-приложений. Независимо от того, являетесь ли вы начинающим или хотите улучшить свои навыки, эти практические задания помогут вам ознакомиться с различными аспектами использования JMeter для нагрузочного тестирования, записи и анализа HTTP-запросов. ## Цель лабораторной работы -Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство в использовании JMeter для тестирования производительности. JMeter широко используется для тестирования производительности веб-приложений и сервисов, и благодаря этим задачам вы получите ценные знания о его настройке, написании сценариев, записи и анализе функций. +Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство в использовании JMeter для тестирования производительности. JMeter широко используется для теста веб-приложений и сервисов, и благодаря этим задачам вы получите ценные знания о его настройке, написании сценариев, записи и анализе функций. ## Практические задания diff --git a/docs/ru/jpa/lab-work.md b/docs/ru/jpa/lab-work.md index 49c1dfc..6066c18 100644 --- a/docs/ru/jpa/lab-work.md +++ b/docs/ru/jpa/lab-work.md @@ -34,7 +34,7 @@ ## Задачи лабораторной работы -1. Настройте зависимости базы данных для PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. +1. Настройте зависимости базы данных для PostgreSQL, MySQL, Oracle и Microsoft SQL Server. 2. Реализуйте следующую схему сущностей и отношений: ![img.png](../../srcs/jpa/task-er-diagram.png) From 08a498ad6cbaa7f393567a23fff64bbf8122211f Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 3 Jun 2024 10:37:45 +0300 Subject: [PATCH 30/40] [Master] HUGE UPDATE --- README-CN.md | 5 +- README-EN.md | 2 + README.md | 2 + docs/cn/jpa/practice/dependencies/jpa.md | 26 +++- .../authorize-client-authenticated.md | 54 ++++++++ .../practice/authorize-client-authority.md | 55 ++++++++ .../practice/authorize-client-role.md | 55 ++++++++ .../practice/configure-thymeleaf-security.md | 2 +- docs/cn/thymeleaf/lab-work.md | 2 +- docs/en/jpa/practice/dependencies/jpa.md | 124 ++++++++++++++++++ .../authorize-client-authenticated.md | 54 ++++++++ .../practice/authorize-client-authority.md | 55 ++++++++ .../practice/authorize-client-role.md | 55 ++++++++ .../practice/configure-thymeleaf-security.md | 2 +- docs/en/thymeleaf/lab-work.md | 2 +- .../authorize-client-authenticated.md | 54 ++++++++ .../practice/authorize-client-authority.md | 55 ++++++++ .../practice/authorize-client-role.md | 55 ++++++++ docs/ru/thymeleaf/lab-work.md | 2 +- docs/srcs/thymeleaf/signup.png | Bin 0 -> 16682 bytes 20 files changed, 646 insertions(+), 15 deletions(-) create mode 100644 docs/ru/springsecurity/practice/authorize-client-authenticated.md create mode 100644 docs/ru/springsecurity/practice/authorize-client-authority.md create mode 100644 docs/ru/springsecurity/practice/authorize-client-role.md create mode 100644 docs/srcs/thymeleaf/signup.png diff --git a/README-CN.md b/README-CN.md index b6cb997..a6dae9b 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,3 +1,5 @@ +[English](README-EN.md) | 中文 | [Русский](README.md) + ## 使用Java进行Web开发的教程 欢迎使用Spring框架进行Java Web开发的教程!这些结构化的教程旨在提供全面的指导,涵盖Java Web开发的各个方面,侧重于Spring框架。每个教程都精心设计,重点介绍特定的概念和方法,确保对Web开发原理的牢固理解。 @@ -24,6 +26,3 @@ JMeter系列教程提供了使用JMeter进行负载测试和性能分析的完整指南。参与者将学习如何设置JMeter、记录HTTP请求、创建和执行测试场景,以及分析测试结果。 ---- - -translate to Chinese language \ No newline at end of file diff --git a/README-EN.md b/README-EN.md index 9d4b067..7fc6839 100644 --- a/README-EN.md +++ b/README-EN.md @@ -1,3 +1,5 @@ +English | [中文](README-CN.md) | [Русский](README.md) + ## Java Web Development Tutorials Welcome to the tutorials on Java web development utilizing the Spring framework! These structured tutorials aim to provide comprehensive guidance on various aspects of Java web development through the lens of the Spring framework. Each tutorial is meticulously designed to focus on specific concepts and methodologies, facilitating a robust understanding of web development principles. diff --git a/README.md b/README.md index a6d0176..a488b95 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[English](README-EN.md) | [中文](README-CN.md) | Русский + ## Учебные пособия по веб-разработке на Java Добро пожаловать на учебные пособия по веб-разработке на Java с использованием фреймворка Spring! Эти структурированные учебные пособия направлены на предоставление всестороннего руководства по различным аспектам веб-разработки на Java через призму фреймворка Spring. Каждое учебное пособие тщательно разработано для акцентирования на конкретных концепциях и методологиях, обеспечивая крепкое понимание принципов веб-разработки. diff --git a/docs/cn/jpa/practice/dependencies/jpa.md b/docs/cn/jpa/practice/dependencies/jpa.md index 9d45963..744c104 100644 --- a/docs/cn/jpa/practice/dependencies/jpa.md +++ b/docs/cn/jpa/practice/dependencies/jpa.md @@ -1,12 +1,12 @@ # JPA:设置依赖项 -## 简介 +## 介绍 -本指南专注于为具有JPA(Java Persistence API)的Spring Boot项目设置依赖项。它涵盖了包括Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项的必要步骤。 +本指南重点介绍了如何为具有JPA(Java持久性API)的Spring Boot项目设置依赖项。它涵盖了包含Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项所需的必要步骤。 ## 目标 -本指南的目标是提供清晰的说明,以便设置Spring Boot和JPA的必要依赖项,特别关注Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项。 +本指南的目标是为Spring Boot和JPA设置必要依赖项,具体重点放在Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项上,并提供清晰的说明。 ## 设置依赖项 @@ -29,11 +29,11 @@ implementation "org.springframework.boot:spring-boot-starter-jdbc"
``` -此依赖项提供了基于JDBC的数据访问的自动配置。 +此依赖项为基于JDBC的数据访问提供了自动配置。 ### Spring Boot Starter Data JPA -要在Spring Boot应用程序中包含对JPA(Java Persistence API)的支持: +要在Spring Boot应用程序中包含对JPA(Java持久性API)的支持: #### Gradle @@ -50,8 +50,20 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" ``` -此依赖项简化了JPA存储库的设置,并为Hibernate提供了默认配置。 +此依赖项简化了设置基于JPA的存储库,并为Hibernate提供了默认配置。 + +### 为Spring WebMVC进行附加配置 + +如果您使用Spring WebMVC,则需要添加额外的配置来设置与持久性相关的bean和属性。 + +#### 创建持久性配置类 + +在`com.example.config`包中创建一个名为`PersistenceConfig`的新类: + +```java +// 这里是java代码,因此不需要翻译 +``` --- -# [下一步:实体创建](../creation/create-entity.md) \ No newline at end of file +# [下一步:创建实体](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-client-authenticated.md b/docs/cn/springsecurity/practice/authorize-client-authenticated.md index e69de29..dd3b7a8 100644 --- a/docs/cn/springsecurity/practice/authorize-client-authenticated.md +++ b/docs/cn/springsecurity/practice/authorize-client-authenticated.md @@ -0,0 +1,54 @@ +# 客户端授权认证用户(客户端) + +这项任务概述了如何使用Thymeleaf在客户端视图中根据用户的认证状态授权用户。通过根据用户是否已经认证来显示或隐藏元素,您可以控制特定功能或操作的可见性。 + +## 目标 + +在Thymeleaf视图中根据用户的认证状态控制与添加和删除学生相关的元素的可见性。 + +## 步骤 + +1. **更新Thymeleaf模板:** + + 修改Thymeleaf模板以根据用户的认证状态有条件地显示元素。 + + ```html + + + + 学生管理 + + +

学生管理

+ + + + + + + + +
+

欢迎使用学生管理系统。在这里您可以管理学生记录。

+
+ + + ``` + + 在此模板中: + - 使用`th:if="${#authorization.expression('isAuthenticated()')}"`语句仅在用户已认证时条件显示“添加学生”和“删除学生”按钮。 + +## 解释 + +- **Thymeleaf安全方言**:`#authorization`对象是Thymeleaf安全方言的一部分,它将Spring Security与Thymeleaf集成在一起。 +- **条件显示**:使用`th:if`属性根据用户的认证状态有条件地显示或隐藏元素。 + +通过按照这些步骤,您可以根据用户是否已认证来控制Thymeleaf视图中元素的可见性,确保只有经过认证的用户才能看到和与特定功能进行交互。 + +--- + +# [下一个任务:按角色授权](authorize-client-role.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-client-authority.md b/docs/cn/springsecurity/practice/authorize-client-authority.md index e69de29..a465bb4 100644 --- a/docs/cn/springsecurity/practice/authorize-client-authority.md +++ b/docs/cn/springsecurity/practice/authorize-client-authority.md @@ -0,0 +1,55 @@ +# 根据权限授权用户(客户端) + +本任务概述了如何使用Thymeleaf在客户端视图中根据用户的权限授权用户。通过根据用户权限显示或隐藏元素,您可以控制特定功能或操作的可见性。 + +## 目标 + +在Thymeleaf视图中根据用户的权限控制与添加和删除学生相关的元素的可见性。 + +## 步骤 + +1. **更新Thymeleaf模板:** + + 修改Thymeleaf模板以根据用户的权限有条件地显示元素。 + + ```html + + + + 学生管理 + + +

学生管理

+ + + + + + + + +
+

欢迎使用学生管理系统。在这里您可以管理学生记录。

+
+ + + ``` + + 在此模板中: + - 使用`th:if="${#authorization.expression('hasAuthority(''WRITE'')')}"`语句仅在用户具有`WRITE`权限时条件显示“添加学生”按钮。 + - 同样,使用`th:if="${#authorization.expression('hasAuthority(''DELETE'')')}"`语句仅在用户具有`DELETE`权限时条件显示“删除学生”按钮。 + +## 解释 + +- **Thymeleaf安全方言**:`#authorization`对象是Thymeleaf安全方言的一部分,它将Spring Security与Thymeleaf集成在一起。 +- **条件显示**:使用`th:if`属性根据用户的权限有条件地显示或隐藏元素。 + +通过按照这些步骤,您可以根据用户的权限控制Thymeleaf视图中元素的可见性,确保只有授权用户才能看到和与特定功能进行交互。 + +--- + +# [NEXT TASK: Lab Tasks](../lab-work.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/authorize-client-role.md b/docs/cn/springsecurity/practice/authorize-client-role.md index e69de29..9e2126e 100644 --- a/docs/cn/springsecurity/practice/authorize-client-role.md +++ b/docs/cn/springsecurity/practice/authorize-client-role.md @@ -0,0 +1,55 @@ +# 基于角色授权用户(客户端) + +本任务概述了如何在客户端视图中根据用户的角色对用户进行授权,使用Thymeleaf来实现。通过根据用户角色显示或隐藏元素,您可以控制特定功能或操作的可见性。 + +## 目标 + +在Thymeleaf视图中根据用户的角色控制与添加和删除学生相关的元素的可见性。 + +## 步骤 + +1. **更新Thymeleaf模板:** + + 修改Thymeleaf模板以根据用户的角色有条件地显示元素。 + + ```html + + + + 学生管理 + + +

学生管理

+ + + + + + + + +
+

欢迎使用学生管理系统。在这里您可以管理学生记录。

+
+ + + ``` + + 在此模板中: + - 使用`th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}"`语句仅在用户具有`ROLE_ADMIN`角色时条件显示“添加学生”按钮。 + - 同样,使用`th:if="${#authorization.expression('hasRole(''ROLE_MANAGER'')')}"`语句仅在用户具有`ROLE_MANAGER`角色时条件显示“删除学生”按钮。 + +## 解释 + +- **Thymeleaf安全方言**:`#authorization`对象是Thymeleaf安全方言的一部分,它将Spring Security与Thymeleaf集成在一起。 +- **条件显示**:使用`th:if`属性根据用户的角色有条件地显示或隐藏元素。 + +通过按照这些步骤,您可以根据用户的角色控制Thymeleaf视图中元素的可见性,确保只有授权用户才能看到和与特定功能进行交互。 + +--- + +# [下一个任务:根据权限授权用户](authorize-client-authority.md) \ No newline at end of file diff --git a/docs/cn/springsecurity/practice/configure-thymeleaf-security.md b/docs/cn/springsecurity/practice/configure-thymeleaf-security.md index 93d4188..fb406d1 100644 --- a/docs/cn/springsecurity/practice/configure-thymeleaf-security.md +++ b/docs/cn/springsecurity/practice/configure-thymeleaf-security.md @@ -27,4 +27,4 @@ --- -[下一任务:]() \ No newline at end of file +# [下一个任务:为用户创建基本实现](base-implementation-user.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/lab-work.md b/docs/cn/thymeleaf/lab-work.md index 840fa78..aba3d11 100644 --- a/docs/cn/thymeleaf/lab-work.md +++ b/docs/cn/thymeleaf/lab-work.md @@ -46,7 +46,7 @@ ![login-page.png](../../srcs/thymeleaf/login-page.png) - ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + ![signup.png](../../srcs/thymeleaf/signup.png) 4. **任务 4:验证登录和注册操作** diff --git a/docs/en/jpa/practice/dependencies/jpa.md b/docs/en/jpa/practice/dependencies/jpa.md index ec67ad5..6a63d36 100644 --- a/docs/en/jpa/practice/dependencies/jpa.md +++ b/docs/en/jpa/practice/dependencies/jpa.md @@ -52,6 +52,130 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" This dependency simplifies the setup of JPA-based repositories and provides default configurations for Hibernate. +### Additional Configuration for Spring WebMVC + +If you are using Spring WebMVC, you need to add additional configuration to set up persistence-related beans and properties. + +#### Create a Persistence Configuration Class + +Create a new class named `PersistenceConfig` in the `com.example.config` package: + +```java +package com.example.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +/** + * Configuration class for setting up persistence-related beans and properties. + * + *

+ * This class configures the data source, entity manager factory, and transaction manager for JPA. + * It reads database connection properties from an external properties file. + *

+ */ +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "com.example.repository") +@PropertySource({"classpath:application.properties"}) +public class PersistenceConfig { + + @Value("${spring.datasource.driver}") + private String dbDriver; + + @Value("${spring.datasource.url}") + private String dbUrl; + + @Value("${spring.datasource.username}") + private String dbUsername; + + @Value("${spring.datasource.password}") + private String dbPassword; + + @Value("${spring.jpa.properties.hibernate.dialect}") + private String hibernateDialect; + + @Value("${spring.jpa.properties.hibernate.show_sql}") + private boolean hibernateShowSql; + + @Value("${spring.jpa.hibernate.ddl-auto}") + private String hibernateHbm2ddlAuto; + + /** + * Bean definition for the DataSource. + * + *

+ * This method sets up the data source using the properties defined in the application.properties file. + *

+ * + * @return DataSource bean + */ + @Bean + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(dbDriver); + dataSource.setUrl(dbUrl); + dataSource.setUsername(dbUsername); + dataSource.setPassword(dbPassword); + return dataSource; + } + + /** + * Bean definition for the EntityManagerFactory. + * + *

+ * This method sets up the entity manager factory using the configured data source and Hibernate properties. + *

+ * + * @param dataSource the data source bean + * @return EntityManagerFactory bean + */ + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource); + em.setPackagesToScan("com.example.entity"); + + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + vendorAdapter.setDatabasePlatform(hibernateDialect); + vendorAdapter.setShowSql(hibernateShowSql); + vendorAdapter.setGenerateDdl("update".equalsIgnoreCase(hibernateHbm2ddlAuto)); + em.setJpaVendorAdapter(vendorAdapter); + + return em; + } + + /** + * Bean definition for the Spring Transaction Manager. + * + *

+ * This method sets up the transaction manager for JPA using the configured entity manager factory. + *

+ * + * @param entityManagerFactory the entity manager factory bean + * @return TransactionManager bean + */ + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory); + return txManager; + } +} +``` + --- # [Next: Entity Creation](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/authorize-client-authenticated.md b/docs/en/springsecurity/practice/authorize-client-authenticated.md index e69de29..5905399 100644 --- a/docs/en/springsecurity/practice/authorize-client-authenticated.md +++ b/docs/en/springsecurity/practice/authorize-client-authenticated.md @@ -0,0 +1,54 @@ +# Authorize Authenticated Users (Client Side) + +This task outlines the process of authorizing users based on their authentication status in the client-side view using Thymeleaf. By displaying or hiding elements based on whether the user is authenticated, you can control the visibility of specific functionalities or actions. + +## Goal + +Control the visibility of elements related to adding and removing students based on whether the user is authenticated in the Thymeleaf views. + +## Steps + +1. **Update Thymeleaf Templates:** + + Modify the Thymeleaf templates to conditionally display elements based on the user's authentication status. + + ```html + + + + Student Management + + +

Student Management

+ + + + + + + + +
+

Welcome to the student management system. Here you can manage student records.

+
+ + + ``` + + In this template: + - The `th:if="${#authorization.expression('isAuthenticated()')}"` statement is used to conditionally display the "Add Student" and "Remove Student" buttons only if the user is authenticated. + +## Explanation + +- **Thymeleaf Security Dialect**: The `#authorization` object is part of the Thymeleaf Security Dialect, which integrates Spring Security with Thymeleaf. +- **Conditional Display**: The `th:if` attribute is used to conditionally display or hide elements based on the user's authentication status. + +By following these steps, you can control the visibility of elements in your Thymeleaf views based on whether the user is authenticated, ensuring that only authenticated users can see and interact with specific functionalities. + +--- + +# [NEXT TASK: Authorize by Role](authorize-client-role.md) diff --git a/docs/en/springsecurity/practice/authorize-client-authority.md b/docs/en/springsecurity/practice/authorize-client-authority.md index e69de29..cb36a1d 100644 --- a/docs/en/springsecurity/practice/authorize-client-authority.md +++ b/docs/en/springsecurity/practice/authorize-client-authority.md @@ -0,0 +1,55 @@ +# Authorize by Authority (Client Side) + +This task outlines the process of authorizing users based on their authorities in the client-side view using Thymeleaf. By displaying or hiding elements based on user authorities, you can control the visibility of specific functionalities or actions. + +## Goal + +Control the visibility of elements related to adding and removing students based on the user's authorities in the Thymeleaf views. + +## Steps + +1. **Update Thymeleaf Templates:** + + Modify the Thymeleaf templates to conditionally display elements based on the user's authorities. + + ```html + + + + Student Management + + +

Student Management

+ + + + + + + + +
+

Welcome to the student management system. Here you can manage student records.

+
+ + + ``` + + In this template: + - The `th:if="${#authorization.expression('hasAuthority(''WRITE'')')}"` statement is used to conditionally display the "Add Student" button only if the user has the `WRITE` authority. + - Similarly, the `th:if="${#authorization.expression('hasAuthority(''DELETE'')')}"` statement is used to conditionally display the "Remove Student" button only if the user has the `DELETE` authority. + +## Explanation + +- **Thymeleaf Security Dialect**: The `#authorization` object is part of the Thymeleaf Security Dialect, which integrates Spring Security with Thymeleaf. +- **Conditional Display**: The `th:if` attribute is used to conditionally display or hide elements based on the user's authorities. + +By following these steps, you can control the visibility of elements in your Thymeleaf views based on user authorities, ensuring that only authorized users can see and interact with specific functionalities. + +--- + +# [NEXT TASK: Lab Tasks](../lab-work.md) diff --git a/docs/en/springsecurity/practice/authorize-client-role.md b/docs/en/springsecurity/practice/authorize-client-role.md index e69de29..639933a 100644 --- a/docs/en/springsecurity/practice/authorize-client-role.md +++ b/docs/en/springsecurity/practice/authorize-client-role.md @@ -0,0 +1,55 @@ +# Authorize by Role (Client Side) + +This task outlines the process of authorizing users based on their roles in the client-side view using Thymeleaf. By displaying or hiding elements based on user roles, you can control the visibility of specific functionalities or actions. + +## Goal + +Control the visibility of elements related to adding and removing students based on the user's roles in the Thymeleaf views. + +## Steps + +1. **Update Thymeleaf Templates:** + + Modify the Thymeleaf templates to conditionally display elements based on the user's roles. + + ```html + + + + Student Management + + +

Student Management

+ + + + + + + + +
+

Welcome to the student management system. Here you can manage student records.

+
+ + + ``` + + In this template: + - The `th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}"` statement is used to conditionally display the "Add Student" button only if the user has the `ROLE_ADMIN` role. + - Similarly, the `th:if="${#authorization.expression('hasRole(''ROLE_MANAGER'')')}"` statement is used to conditionally display the "Remove Student" button only if the user has the `ROLE_MANAGER` role. + +## Explanation + +- **Thymeleaf Security Dialect**: The `#authorization` object is part of the Thymeleaf Security Dialect, which integrates Spring Security with Thymeleaf. +- **Conditional Display**: The `th:if` attribute is used to conditionally display or hide elements based on the user's roles. + +By following these steps, you can control the visibility of elements in your Thymeleaf views based on user roles, ensuring that only authorized users can see and interact with specific functionalities. + +--- + +# [NEXT TASK: Authorize by Authority](authorize-client-authority.md) diff --git a/docs/en/springsecurity/practice/configure-thymeleaf-security.md b/docs/en/springsecurity/practice/configure-thymeleaf-security.md index 2f87ae3..efb4cd7 100644 --- a/docs/en/springsecurity/practice/configure-thymeleaf-security.md +++ b/docs/en/springsecurity/practice/configure-thymeleaf-security.md @@ -27,4 +27,4 @@ The goal of this task is to integrate Thymeleaf with Spring Security, enabling t --- -[NEXT TASK:]() +# [NEXT TASK: Create a Base Implementation for User](base-implementation-user.md) diff --git a/docs/en/thymeleaf/lab-work.md b/docs/en/thymeleaf/lab-work.md index 8872e1b..60ed23c 100644 --- a/docs/en/thymeleaf/lab-work.md +++ b/docs/en/thymeleaf/lab-work.md @@ -46,7 +46,7 @@ The primary goal of this lab work is to provide you with practical experience an ![login-page.png](../../srcs/thymeleaf/login-page.png) - ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + ![signup.png](../../srcs/thymeleaf/signup.png) 4. **Task 4: Validate Login and Register Actions** diff --git a/docs/ru/springsecurity/practice/authorize-client-authenticated.md b/docs/ru/springsecurity/practice/authorize-client-authenticated.md new file mode 100644 index 0000000..2fb7c91 --- /dev/null +++ b/docs/ru/springsecurity/practice/authorize-client-authenticated.md @@ -0,0 +1,54 @@ +# Авторизация аутентифицированных пользователей (на клиентской стороне) + +Этот файл описывает процесс авторизации пользователей на основе их статуса аутентификации на клиентской стороне с использованием Thymeleaf. Путем отображения или скрытия элементов в представлении в зависимости от статуса аутентификации пользователя можно контролировать видимость определенных функциональностей или действий. + +## Цель + +Контролировать видимость элементов, связанных с добавлением и удалением студентов, в зависимости от статуса аутентификации пользователя в представлениях Thymeleaf. + +## Шаги + +1. **Обновление шаблонов Thymeleaf:** + + Измените шаблоны Thymeleaf для условного отображения элементов в зависимости от статуса аутентификации пользователя. + + ```html + + + + Управление студентами + + +

Управление студентами

+ + + + + + + + +
+

Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.

+
+ + + ``` + + В этом шаблоне: + - Используется выражение `th:if="${#authorization.expression('isAuthenticated()')}"`, чтобы условно отображать кнопки "Добавить студента" и "Удалить студента" только если пользователь аутентифицирован. + +## Объяснение + +- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf. +- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов в зависимости от статуса аутентификации пользователя. + +Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от статуса аутентификации пользователя, обеспечивая, что только аутентифицированные пользователи могут видеть и взаимодействовать с определенными функциональностями. + +--- + +# [СЛЕДУЮЩАЯ ЗАДАЧА: Авторизация по ролям](authorize-client-role.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/authorize-client-authority.md b/docs/ru/springsecurity/practice/authorize-client-authority.md new file mode 100644 index 0000000..24188cd --- /dev/null +++ b/docs/ru/springsecurity/practice/authorize-client-authority.md @@ -0,0 +1,55 @@ +# Авторизация по авторитету (клиентская сторона) + +Это задание описывает процесс авторизации пользователей на клиентской стороне веб-интерфейса с использованием Thymeleaf. Путем отображения или скрытия элементов на основе авторитетов пользователя вы можете контролировать видимость определенных функций или действий. + +## Цель + +Контроль видимости элементов, связанных с добавлением и удалением студентов, в зависимости от авторитетов пользователя в представлениях Thymeleaf. + +## Шаги + +1. **Обновление шаблонов Thymeleaf:** + + Измените шаблоны Thymeleaf, чтобы условно отображать элементы в зависимости от авторитетов пользователя. + + ```html + + + + Управление студентами + + +

Управление студентами

+ + + + + + + + +
+

Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.

+
+ + + ``` + + В этом шаблоне: + - Используется оператор `th:if="${#authorization.expression('hasAuthority(''WRITE'')')}"`, чтобы условно отображать кнопку "Добавить студента" только в том случае, если у пользователя есть авторитет `WRITE`. + - Аналогично, оператор `th:if="${#authorization.expression('hasAuthority(''DELETE'')')}"` используется для условного отображения кнопки "Удалить студента" только в том случае, если у пользователя есть авторитет `DELETE`. + +## Объяснение + +- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf. +- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов на основе авторитетов пользователя. + +Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от авторитетов пользователей, гарантируя, что только авторизованные пользователи могут видеть и взаимодействовать с определенными функциями. + +--- + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Лабораторные задания](../lab-work.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/authorize-client-role.md b/docs/ru/springsecurity/practice/authorize-client-role.md new file mode 100644 index 0000000..ca031bb --- /dev/null +++ b/docs/ru/springsecurity/practice/authorize-client-role.md @@ -0,0 +1,55 @@ +# Авторизация по ролям (клиентская сторона) + +Это задание описывает процесс авторизации пользователей на клиентской стороне веб-интерфейса с использованием Thymeleaf. Путем отображения или скрытия элементов на основе ролей пользователя можно контролировать видимость определенных функций или действий. + +## Цель + +Контроль видимости элементов, связанных с добавлением и удалением студентов, в зависимости от ролей пользователя в представлениях Thymeleaf. + +## Шаги + +1. **Обновление шаблонов Thymeleaf:** + + Измените шаблоны Thymeleaf, чтобы условно отображать элементы в зависимости от ролей пользователя. + + ```html + + + + Управление студентами + + +

Управление студентами

+ + + + + + + + +
+

Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.

+
+ + + ``` + + В этом шаблоне: + - Используется оператор `th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}"`, чтобы условно отображать кнопку "Добавить студента" только в том случае, если у пользователя есть роль `ROLE_ADMIN`. + - Аналогично, оператор `th:if="${#authorization.expression('hasRole(''ROLE_MANAGER'')')}"` используется для условного отображения кнопки "Удалить студента" только в том случае, если у пользователя есть роль `ROLE_MANAGER`. + +## Объяснение + +- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf. +- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов на основе ролей пользователя. + +Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от ролей пользователей, гарантируя, что только авторизованные пользователи могут видеть и взаимодействовать с определенными функциями. + +--- + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по авторитету](authorize-client-authority.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md index e531959..c06272a 100644 --- a/docs/ru/thymeleaf/lab-work.md +++ b/docs/ru/thymeleaf/lab-work.md @@ -47,7 +47,7 @@ ![login-page.png](../../srcs/thymeleaf/login-page.png) - ![signup-page.png](../../srcs/thymeleaf/signup-page.png) + ![signup.png](../../srcs/thymeleaf/signup.png) 4. **Задача 4: Валидация действий входа и регистрации** diff --git a/docs/srcs/thymeleaf/signup.png b/docs/srcs/thymeleaf/signup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0c7640094a2fc1abeb4ad69d0e79a4f53d8675 GIT binary patch literal 16682 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 Fe*o#t>p}nk literal 0 HcmV?d00001 From 1fc98bebd53c19e3ae410e93f5853c3c0eefc884 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 3 Jun 2024 10:40:23 +0300 Subject: [PATCH 31/40] [Master] HUGE UPDATE --- docs/cn/jpa/practice/dependencies/jpa.md | 140 ++++++++++++++++++++--- docs/ru/jpa/practice/dependencies/jpa.md | 138 +++++++++++++++++++++- 2 files changed, 259 insertions(+), 19 deletions(-) diff --git a/docs/cn/jpa/practice/dependencies/jpa.md b/docs/cn/jpa/practice/dependencies/jpa.md index 744c104..6f1667e 100644 --- a/docs/cn/jpa/practice/dependencies/jpa.md +++ b/docs/cn/jpa/practice/dependencies/jpa.md @@ -1,18 +1,18 @@ -# JPA:设置依赖项 +# JPA:设置依赖关系 ## 介绍 -本指南重点介绍了如何为具有JPA(Java持久性API)的Spring Boot项目设置依赖项。它涵盖了包含Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项所需的必要步骤。 +本指南侧重于为具有 JPA(Java Persistence API)的 Spring Boot 项目设置依赖关系。它涵盖了包括 Spring Boot Starter JDBC 和 Spring Boot Starter Data JPA 依赖项的必要步骤。 ## 目标 -本指南的目标是为Spring Boot和JPA设置必要依赖项,具体重点放在Spring Boot Starter JDBC和Spring Boot Starter Data JPA依赖项上,并提供清晰的说明。 +本指南的目标是为 Spring Boot 和 JPA 设置必要的依赖关系,并特别关注 Spring Boot Starter JDBC 和 Spring Boot Starter Data JPA 依赖项。 -## 设置依赖项 +## 设置依赖关系 ### Spring Boot Starter JDBC -要在Spring Boot应用程序中启用JDBC支持: +要在 Spring Boot 应用程序中启用 JDBC 支持: #### Gradle @@ -29,11 +29,11 @@ implementation "org.springframework.boot:spring-boot-starter-jdbc" ``` -此依赖项为基于JDBC的数据访问提供了自动配置。 +此依赖项为基于 JDBC 的数据访问提供了自动配置。 ### Spring Boot Starter Data JPA -要在Spring Boot应用程序中包含对JPA(Java持久性API)的支持: +要在 Spring Boot 应用程序中包含对 JPA(Java Persistence API)的支持: #### Gradle @@ -50,20 +50,134 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" ``` -此依赖项简化了设置基于JPA的存储库,并为Hibernate提供了默认配置。 +此依赖项简化了基于 JPA 的存储库的设置,并为 Hibernate 提供了默认配置。 -### 为Spring WebMVC进行附加配置 +### Spring WebMVC 的附加配置 -如果您使用Spring WebMVC,则需要添加额外的配置来设置与持久性相关的bean和属性。 +如果您使用 Spring WebMVC,则需要添加额外的配置以设置与持久性相关的 bean 和属性。 #### 创建持久性配置类 -在`com.example.config`包中创建一个名为`PersistenceConfig`的新类: +在 `com.example.config` 包中创建一个名为 `PersistenceConfig` 的新类: ```java -// 这里是java代码,因此不需要翻译 +package com.example.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +/** + * 用于设置与持久性相关的 bean 和属性的配置类。 + * + *

+ * 该类配置了用于 JPA 的数据源、实体管理器工厂和事务管理器。 + * 它从外部属性文件中读取数据库连接属性。 + *

+ */ +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "com.example.repository") +@PropertySource({"classpath:application.properties"}) +public class PersistenceConfig { + + @Value("${spring.datasource.driver}") + private String dbDriver; + + @Value("${spring.datasource.url}") + private String dbUrl; + + @Value("${spring.datasource.username}") + private String dbUsername; + + @Value("${spring.datasource.password}") + private String dbPassword; + + @Value("${spring.jpa.properties.hibernate.dialect}") + private String hibernateDialect; + + @Value("${spring.jpa.properties.hibernate.show_sql}") + private boolean hibernateShowSql; + + @Value("${spring.jpa.hibernate.ddl-auto}") + private String hibernateHbm2ddlAuto; + + /** + * 数据源的 Bean 定义。 + * + *

+ * 此方法使用在 application.properties 文件中定义的属性设置数据源。 + *

+ * + * @return DataSource bean + */ + @Bean + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(dbDriver); + dataSource.setUrl(dbUrl); + dataSource.setUsername(dbUsername); + dataSource.setPassword(dbPassword); + return dataSource; + } + + /** + * EntityManagerFactory 的 Bean 定义。 + * + *

+ * 此方法使用配置的数据源和 Hibernate 属性设置实体管理器工厂。 + *

+ * + * @param dataSource 数据源 bean + * @return EntityManagerFactory bean + */ + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource); + em.setPackagesToScan("com.example.entity"); + + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + vendorAdapter.setDatabasePlatform(hibernateDialect); + vendorAdapter.setShowSql(hibernate + +ShowSql); + vendorAdapter.setGenerateDdl("update".equalsIgnoreCase(hibernateHbm2ddlAuto)); + em.setJpaVendorAdapter(vendorAdapter); + + return em; + } + + /** + * Spring 事务管理器的 Bean 定义。 + * + *

+ * 此方法使用配置的实体管理器工厂设置 JPA 的事务管理器。 + *

+ * + * @param entityManagerFactory 实体管理器工厂 bean + * @return 事务管理器 bean + */ + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory); + return txManager; + } +} ``` --- -# [下一步:创建实体](../creation/create-entity.md) \ No newline at end of file +# [下一步:实体创建](../creation/create-entity.md) \ No newline at end of file diff --git a/docs/ru/jpa/practice/dependencies/jpa.md b/docs/ru/jpa/practice/dependencies/jpa.md index 0247303..4f68d7a 100644 --- a/docs/ru/jpa/practice/dependencies/jpa.md +++ b/docs/ru/jpa/practice/dependencies/jpa.md @@ -1,18 +1,18 @@ -# JPA: Настройка зависимостей +# Настройка зависимостей JPA ## Введение -Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с JPA (Java Persistence API). Оно охватывает необходимые шаги по включению зависимостей Spring Boot Starter JDBC и Spring Boot Starter Data JPA. +Это руководство сосредоточено на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги для включения зависимостей Spring Boot Starter JDBC и Spring Boot Starter Data JPA. ## Цель -Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особым упором на зависимости Spring Boot Starter JDBC и Spring Boot Starter Data JPA. +Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с акцентом на зависимостях Spring Boot Starter JDBC и Spring Boot Starter Data JPA. ## Настройка зависимостей ### Spring Boot Starter JDBC -Чтобы включить поддержку JDBC в вашем приложении Spring Boot: +Для включения поддержки JDBC в вашем приложении Spring Boot: #### Gradle @@ -29,7 +29,7 @@ implementation "org.springframework.boot:spring-boot-starter-jdbc" ``` -Эта зависимость обеспечивает автоматическую конфигурацию для доступа к данным на основе JDBC. +Эта зависимость обеспечивает автоконфигурацию для доступа к данным на основе JDBC. ### Spring Boot Starter Data JPA @@ -52,6 +52,132 @@ implementation "org.springframework.boot:spring-boot-starter-data-jpa" Эта зависимость упрощает настройку репозиториев на основе JPA и предоставляет конфигурации по умолчанию для Hibernate. +### Дополнительная конфигурация для Spring WebMVC + +Если вы используете Spring WebMVC, вам необходимо добавить дополнительную конфигурацию для настройки бинов и свойств, связанных с сохранением состояния. + +#### Создание класса конфигурации Persistence + +Создайте новый класс с именем `PersistenceConfig` в пакете `com.example.config`: + +```java +package com.example.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +/** + * Класс конфигурации для настройки бинов и свойств, связанных с сохранением состояния. + * + *

+ * Этот класс настраивает источник данных, фабрику менеджеров сущностей и менеджер транзакций для JPA. + * Он считывает свойства подключения к базе данных из внешнего файла свойств. + *

+ */ +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "com.example.repository") +@PropertySource({"classpath:application.properties"}) +public class PersistenceConfig { + + @Value("${spring.datasource.driver}") + private String dbDriver; + + @Value("${spring.datasource.url}") + private String dbUrl; + + @Value("${spring.datasource.username}") + private String dbUsername; + + @Value("${spring.datasource.password}") + private String dbPassword; + + @Value("${spring.jpa.properties.hibernate.dialect}") + private String hibernateDialect; + + @Value("${spring.jpa.properties.hibernate.show_sql}") + private boolean hibernateShowSql; + + @Value("${spring.jpa.hibernate.ddl-auto}") + private String hibernateHbm2ddlAuto; + + /** + * Определение бина DataSource. + * + *

+ * Этот метод настраивает источник данных, используя свойства, определенные в файле application.properties. + *

+ * + * @return Бин DataSource + */ + @Bean + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(dbDriver); + dataSource.setUrl(dbUrl); + dataSource.setUsername(dbUsername); + dataSource.setPassword(dbPassword); + return dataSource; + } + + /** + * Определение бина EntityManagerFactory. + * + *

+ * Этот метод настраивает фабрику менеджеров сущност + +ей с использованием настроенного источника данных и свойств Hibernate. + *

+ * + * @param dataSource бин источника данных + * @return Бин EntityManagerFactory + */ + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource); + em.setPackagesToScan("com.example.entity"); + + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + vendorAdapter.setDatabasePlatform(hibernateDialect); + vendorAdapter.setShowSql(hibernateShowSql); + vendorAdapter.setGenerateDdl("update".equalsIgnoreCase(hibernateHbm2ddlAuto)); + em.setJpaVendorAdapter(vendorAdapter); + + return em; + } + + /** + * Определение бина TransactionManager Spring. + * + *

+ * Этот метод настраивает менеджер транзакций для JPA с использованием настроенной фабрики менеджеров сущностей. + *

+ * + * @param entityManagerFactory бин фабрики менеджеров сущностей + * @return Бин TransactionManager + */ + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory); + return txManager; + } +} +``` + --- -[Далее: Создание сущностей](../creation/create-entity.md) +# [Следующий: Создание сущностей](../creation/create-entity.md) \ No newline at end of file From 3334ba21fad721faf391384bc358703ae508efd3 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 3 Jun 2024 22:15:07 +0300 Subject: [PATCH 32/40] [Master] HUGEST UPDATE EVER --- docs/cn/jmeter/lab-work.md | 3 + docs/cn/jpa/lab-work.md | 2 + docs/cn/springsecurity/lab-work.md | 2 + docs/cn/thymeleaf/lab-work.md | 2 + .../thymeleaf/practice/configure-thymeleaf.md | 84 +++--- .../thymeleaf/practice/create-first-view.md | 50 ++-- docs/cn/thymeleaf/practice/form-handling.md | 146 +++++----- docs/cn/thymeleaf/practice/forms.md | 166 ++++++------ .../practice/fragments-and-layouts.md | 250 +++++++++--------- docs/cn/thymeleaf/practice/iteration.md | 42 ++- docs/cn/thymeleaf/practice/literals.md | 56 ++-- docs/cn/thymeleaf/practice/validation.md | 154 ++++++----- .../practice/variables-and-controller.md | 48 ++-- .../practice/working-with-variables.md | 90 +++---- docs/cn/transactions/lab-work.md | 3 + docs/en/jmeter/lab-work.md | 3 + docs/en/jpa/lab-work.md | 3 + docs/en/springsecurity/lab-work.md | 3 + .../practice/add-dummy-users.md | 2 +- .../practice/authorize-client-authority.md | 2 +- .../authorize-server-authenticated.md | 2 +- .../practice/authorize-server-authority.md | 2 +- .../practice/configure-spring-security.md | 2 +- .../practice/custom-login-form.md | 2 +- .../practice/setup-server-authorization.md | 2 +- docs/en/springsecurity/tasks.md | 13 - docs/en/thymeleaf/lab-work.md | 3 + .../thymeleaf/practice/configure-thymeleaf.md | 4 +- .../thymeleaf/practice/create-first-view.md | 4 - docs/en/thymeleaf/practice/form-handling.md | 4 +- docs/en/thymeleaf/practice/forms.md | 4 +- .../practice/fragments-and-layouts.md | 4 +- docs/en/thymeleaf/practice/iteration.md | 4 +- docs/en/thymeleaf/practice/literals.md | 4 +- docs/en/thymeleaf/practice/validation.md | 4 +- .../practice/variables-and-controller.md | 4 +- .../practice/working-with-variables.md | 6 +- docs/en/transactions/lab-work.md | 3 + .../lessons/basic-transactional-operations.md | 2 +- .../lessons/entities-and-repositories.md | 2 +- docs/ru/jmeter/lab-work.md | 3 + docs/ru/jpa/lab-work.md | 2 + docs/ru/springsecurity/lab-work.md | 2 + .../practice/authorize-client-authority.md | 2 +- .../authorize-server-authenticated.md | 4 +- .../practice/authorize-server-authority.md | 4 +- .../practice/authorize-server-role.md | 4 +- .../practice/base-implementation-user.md | 4 +- .../practice/configure-spring-security.md | 4 +- .../practice/configure-thymeleaf-security.md | 5 +- .../practice/create-identity-to-users.md | 4 +- .../practice/custom-login-form.md | 4 +- .../practice/password-encryption.md | 4 +- docs/ru/thymeleaf/lab-work.md | 3 + .../thymeleaf/practice/configure-thymeleaf.md | 4 - .../thymeleaf/practice/create-first-view.md | 4 - docs/ru/thymeleaf/practice/form-handling.md | 4 +- docs/ru/thymeleaf/practice/forms.md | 4 +- .../practice/fragments-and-layouts.md | 4 +- docs/ru/thymeleaf/practice/iteration.md | 4 +- docs/ru/thymeleaf/practice/literals.md | 4 +- docs/ru/thymeleaf/practice/validation.md | 4 +- .../practice/variables-and-controller.md | 4 +- .../practice/working-with-variables.md | 6 +- docs/ru/transactions/lab-work.md | 5 +- .../ru/transactions/practice/configuration.md | 2 +- .../lessons/basic-transactional-operations.md | 2 +- .../lessons/entities-and-repositories.md | 4 + ...nested-and-non-transactional-operations.md | 4 +- 69 files changed, 623 insertions(+), 671 deletions(-) delete mode 100644 docs/en/springsecurity/tasks.md diff --git a/docs/cn/jmeter/lab-work.md b/docs/cn/jmeter/lab-work.md index 7d9debd..3a0b510 100644 --- a/docs/cn/jmeter/lab-work.md +++ b/docs/cn/jmeter/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/jmeter/lab-work.md) | 中文 | [Русский](../../ru/jmeter/lab-work.md) + + # JMeter实验室任务 欢迎来到JMeter实验室!这一系列任务的目标是帮助您练习和掌握JMeter,这是一种用于性能测试和测量Web应用程序性能的强大工具。无论您是初学者还是希望提升技能,这些实践任务都将引导您了解JMeter在负载测试、录制和分析HTTP请求方面的各个方面。 diff --git a/docs/cn/jpa/lab-work.md b/docs/cn/jpa/lab-work.md index bec5b47..4a0d0d3 100644 --- a/docs/cn/jpa/lab-work.md +++ b/docs/cn/jpa/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/jpa/lab-work.md) | 中文 | [Русский](../../ru/jpa/lab-work.md) + # 实验任务: JPA (Java Persistence API) 欢迎来到 Spring Boot with JPA 实验任务!在这个实验中,您将练习与使用 Spring Boot 和 JPA (Java Persistence API) 相关的各种任务。 diff --git a/docs/cn/springsecurity/lab-work.md b/docs/cn/springsecurity/lab-work.md index 79557f9..1830a34 100644 --- a/docs/cn/springsecurity/lab-work.md +++ b/docs/cn/springsecurity/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/springsecurity/lab-work.md) | 中文 | [Русский](../../ru/springsecurity/lab-work.md) + # Spring Security 实验任务 欢迎来到 Spring Security 实验任务系列!本系列任务旨在帮助您实践并熟悉 Spring Security,从而建立一个足够的启动项目。无论您是初学者还是希望提升技能,这些动手任务将引导您完成在 Spring 应用中集成安全性的各个方面。 diff --git a/docs/cn/thymeleaf/lab-work.md b/docs/cn/thymeleaf/lab-work.md index aba3d11..7180982 100644 --- a/docs/cn/thymeleaf/lab-work.md +++ b/docs/cn/thymeleaf/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/thymeleaf/lab-work.md) | 中文 | [Русский](../../ru/thymeleaf/lab-work.md) + # Thymeleaf 实验任务 欢迎来到 Thymeleaf 实验任务系列!本系列任务旨在帮助您实践和掌握 Thymeleaf,这是一种强大的 Java 应用模板引擎。无论您是初学者还是希望提升技能,这些动手任务将引导您完成在 Spring 应用中集成 Thymeleaf 的各个方面。 diff --git a/docs/cn/thymeleaf/practice/configure-thymeleaf.md b/docs/cn/thymeleaf/practice/configure-thymeleaf.md index 2c016c4..53d7c4c 100644 --- a/docs/cn/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/cn/thymeleaf/practice/configure-thymeleaf.md @@ -1,16 +1,16 @@ -# Configure Thymeleaf in Spring +# 在Spring中配置Thymeleaf -**Description:** +**描述:** -This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. +此任务涉及在Spring应用程序中设置Thymeleaf,实现模板引擎与Web开发的无缝集成。 -## **Steps:** +## 步骤: -1. **Create Thymeleaf Configuration Class:** - - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. - - Extend the class with `WebMvcConfigurer`. +1. **创建Thymeleaf配置类:** + - 在您的Spring项目中,创建一个带有 `@Configuration` 注解的新Java类。我们建议将此类放置在 `config` 包中。 + - 将该类扩展为 `WebMvcConfigurer`。 - Example: + 示例: ```java package edu.labs.thymeleaf.config; @@ -20,100 +20,96 @@ This task involves setting up Thymeleaf within a Spring application, enabling se @Configuration public class WebMvcConfig implements WebMvcConfigurer { - // Configuration code goes here + // 配置代码放在这里 } ``` - Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. + 将配置类放置在 `config` 包中有助于组织,并确保项目结构清晰。根据项目的结构调整包名称。 -2. **Configure Thymeleaf Template Resolver:** - - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. - - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. +2. **配置Thymeleaf模板解析器:** + - 定义一个带有 `@Bean` 注解的方法,以配置Thymeleaf模板解析器。 + - 使用 `ClassLoaderTemplateResolver`,设置前缀、后缀、模板模式和字符编码。 ```java @Bean public ClassLoaderTemplateResolver templateResolver() { - // Create a ClassLoaderTemplateResolver bean + // 创建一个 ClassLoaderTemplateResolver bean ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - // Set the path where Thymeleaf will find templates + // 设置Thymeleaf查找模板的路径 templateResolver.setPrefix("/templates/"); - // Set the file extension for templates + // 设置模板的文件扩展名 templateResolver.setSuffix(".html"); - // Set the template mode to HTML + // 设置模板模式为HTML templateResolver.setTemplateMode(TemplateMode.HTML); - // Set the character encoding for templates + // 设置模板的字符编码 templateResolver.setCharacterEncoding("UTF-8"); - // Return the configured template resolver bean + // 返回配置的模板解析器bean return templateResolver; } ``` - -3. **Configure Message Source:** - - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. - - Set the default encoding. + +3. **配置消息源:** + - 添加一个带有 `@Bean` 注解的方法,使用 `ReloadableResourceBundleMessageSource` 配置消息源。 + - 设置默认编码。 ```java @Bean public MessageSource messageSource() { - // Create a ReloadableResourceBundleMessageSource bean + // 创建一个 ReloadableResourceBundleMessageSource bean ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - // Set the default encoding for messages + // 设置消息的默认编码 messageSource.setDefaultEncoding("UTF-8"); - // Return the configured message source bean + // 返回配置的消息源bean return messageSource; } ``` -4. **Configure Thymeleaf View Resolver:** - - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. - - Set the template engine. +4. **配置Thymeleaf视图解析器:** + - 创建一个带有 `@Bean` 注解的方法,以配置Thymeleaf视图解析器。 + - 设置模板引擎。 ```java @Bean public ViewResolver thymeleafViewResolver() { - // Create a ThymeleafViewResolver bean + // 创建一个 ThymeleafViewResolver bean ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - // Set the template engine for the view resolver + // 设置视图解析器的模板引擎 resolver.setTemplateEngine(templateEngine()); - // Return the configured ThymeleafViewResolver bean + // 返回配置的 ThymeleafViewResolver bean return resolver; } ``` -5. **Configure Thymeleaf Template Engine:** - - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. - - Set the template resolver and template engine message source. +5. **配置Thymeleaf模板引擎:** + - 实现一个带有 `@Bean` 注解的方法,以配置Thymeleaf模板引擎。 + - 设置模板解析器和模板引擎消息源。 ```java @Bean public SpringTemplateEngine templateEngine() { - // Create a SpringTemplateEngine bean + // 创建一个 SpringTemplateEngine bean SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - // Set the template resolver for the template engine + // 为模板引擎设置模板解析器 templateEngine.setTemplateResolver(templateResolver()); - // Set the template engine message source + // 设置模板引擎消息源 templateEngine.setTemplateEngineMessageSource(messageSource()); - // Return the configured SpringTemplateEngine bean + // 返回配置的 SpringTemplateEngine bean return templateEngine; } ``` --- -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). - -# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file +# [下一步任务:*创建第一个视图*](create-first-view.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/create-first-view.md b/docs/cn/thymeleaf/practice/create-first-view.md index 30577eb..03d9eea 100644 --- a/docs/cn/thymeleaf/practice/create-first-view.md +++ b/docs/cn/thymeleaf/practice/create-first-view.md @@ -1,17 +1,17 @@ -# Create First View +# 创建第一个视图 -**Description:** +**描述:** -In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. +在这个任务中,我们将为您的Spring应用程序创建第一个Thymeleaf视图。按照Thymeleaf配置中定义的正确文件路径,并在应用程序中注册视图。 -## **Steps:** +## **步骤:** -1. **Create the View File:** - - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. - - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. +1. **创建视图文件:** + - 导航到Thymeleaf配置中指定的目录,该目录是模板的前缀。 + - 默认情况下,配置的前缀是 `/templates/`。因此,请在此目录中创建您的Thymeleaf视图文件。 ```plaintext - Project Directory + 项目目录 └── src └── main └── resources @@ -20,44 +20,40 @@ In this task, we'll create the first Thymeleaf view for your Spring application. └── first.html ``` - Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. + 确保视图文件的命名合适(例如,`first.html`)。`/templates/` 目录对于Thymeleaf正确定位和处理您的模板非常重要。 -2. **Register the View in Configuration Class:** - - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). - - Add the following method to register the Thymeleaf view: +2. **在配置类中注册视图:** + - 打开设置Thymeleaf的配置类(例如,`WebMvcConfig`)。 + - 添加以下方法以注册Thymeleaf视图: ```java public void addViewControllers(ViewControllerRegistry registry) { - // First View + // 第一个视图 registry.addViewController("/first").setViewName("practice/first"); } ``` - This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. + 此方法将 URL 路径 `/first` 映射到名为 "practice/first" 的 Thymeleaf 视图。根据项目结构调整路径。 -3. **Test the View:** - - Run your Spring application. - - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. +3. **测试视图:** + - 运行您的Spring应用程序。 + - 打开Web浏览器,导航到 `http://localhost:8080/first`。您应该看到渲染的Thymeleaf视图。 -4. **Optional: Configure Redirect from Root Path:** - - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: +4. **可选: 配置从根路径的重定向:** + - 要将第一个视图设置为默认页面,您可以在 `addViewControllers` 方法中添加从根路径 ("/") 到第一个视图路径的重定向: ```java public void addViewControllers(ViewControllerRegistry registry) { - // First View + // 第一个视图 registry.addViewController("/first").setViewName("practice/first"); - // Redirect from root path to the first view + // 从根路径重定向到第一个视图 registry.addRedirectViewController("/", "/first"); } ``` - Now, visiting `http://localhost:8080/` will automatically redirect to the first view. + 现在,访问 `http://localhost:8080/` 将自动重定向到第一个视图。 --- -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - -# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file +# [下一个任务: *使用变量*](working-with-variables.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/form-handling.md b/docs/cn/thymeleaf/practice/form-handling.md index c7b6b7b..bfd1b23 100644 --- a/docs/cn/thymeleaf/practice/form-handling.md +++ b/docs/cn/thymeleaf/practice/form-handling.md @@ -1,74 +1,72 @@ -# Form Handling - -**Description:** - -In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. - -**Steps:** - -1. **Show Form View (PracticeController):** - - - Open the `PracticeController` class and add a method to show the form view: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Other methods... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Explanation: - - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. - - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. - - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. - -2. **Handle Form Submission (PracticeController):** - - - Add a method in `PracticeController` to handle form submissions: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Explanation: - - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. - - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. - - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). - -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. - -# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file +# 表单处理 + +**描述:** + +在这个续集中,我们将专注于处理表单提交并使用 `PracticeController` 渲染视图。这涉及在显示视图时将模型传递给视图,并实现处理表单提交的逻辑。 + +**步骤:** + +1. **显示表单视图(PracticeController):** + + - 打开 `PracticeController` 类并添加一个方法来显示表单视图: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.GetMapping; + + @Controller + public class PracticeController { + + // 其他方法... + + @GetMapping("/third") + public String showAddStudentForm(Model model) { + model.addAttribute("model", new StudentModel()); + return "practice/third"; + } + } + ``` + + - 解释: + - `@GetMapping("/addStudentForm")`: 这个注解将方法映射到处理 `/addStudentForm` 端点的 GET 请求。 + - `showAddStudentForm(Model model)`: 这个方法接受一个 `Model` 参数,向其添加一个新的 `StudentModel`,并返回视图名称(在这种情况下为 `"thirdView"`)。更新以反映视图的正确命名。 + - `Model` 被填充了一个新的 `StudentModel` 实例,该实例将用于绑定表单字段。 + +2. **处理表单提交(PracticeController):** + + - 在 `PracticeController` 中添加一个方法来处理表单提交: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // 其他方法... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + students.add(model); + + return "redirect:/third"; + } + } + ``` + + - 解释: + - `@PostMapping("/addStudent")`: 这个注解将方法映射到处理 `/addStudent` 端点的 POST 请求。 + - `addStudent(@ModelAttribute("model") StudentModel model)`: 这个方法从表单提交中获取 `model` 属性(`@ModelAttribute`),并处理它。表单数据会自动绑定到 `model` 对象。 + - 此方法内的逻辑将学生添加到 `students` 列表中。在实际情况下,您通常会将学生保存到数据库或执行其他必要的操作。 + - `return "redirect:/third";`: 此行将用户重定向回表单视图(`/third`)。 + +--- + +# [下一个任务: *查询参数和验证*](validation.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/forms.md b/docs/cn/thymeleaf/practice/forms.md index 3876c1d..54c312e 100644 --- a/docs/cn/thymeleaf/practice/forms.md +++ b/docs/cn/thymeleaf/practice/forms.md @@ -1,120 +1,118 @@ -# Forms - -**Description:** - -In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. - -**Steps:** - -1. **Create Third View (third.html):** - - - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. - - ```html - - - - - Add Student Form - - -
- Add Student - -
- -

- - -

-
-
- - - ``` - -2. **Configure Form Submission:** - - - In the `form` tag, configure the form submission details: - - ```html -
- ``` - - - Explanation: - - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. - - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. - - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. - - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. - -3. **Pass the 'id' Field:** - - - In the form, locate the section for the `id` field: - - ```html - -

- - -

- ``` - - - Explanation: - - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. - - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. - -4. **Repeat these steps:** - - - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. - - There is code example: +# 表单 + +**描述:** + +在这个任务中,您将创建一个名为 `third.html` 的新的 Thymeleaf 视图,并在 `PracticeController` 中实现表单处理逻辑。该表单允许用户添加具有特定详细信息的新学生,控制器将处理表单提交。 + +**步骤:** + +1. **创建第三个视图(third.html):** + + - 在 `/src/main/resources/templates/practice` 目录中创建一个名为 `third.html` 的新的 Thymeleaf 视图文件。 + + ```html + + + + + 添加学生表单 + + +
+ 添加学生 + + + +

+ + +

+ +
+ + + ``` + +2. **配置表单提交:** + + - 在 `form` 标签中配置表单提交详情: + + ```html +
+ ``` + + - 解释: + - `action="#"`: 此属性指定表单数据在提交时将发送到的 URL。`#` 表示表单将提交到其来源的相同 URL。 + - `th:action="@{/addStudent}"`: 这个 Thymeleaf 属性根据 Thymeleaf 表达式动态设置表单动作。`@{/addStudent}` 为 `/addStudent` 端点生成绝对 URL。 + - `th:object="${model}"`: 此属性将表单与后备对象(`model`)关联起来。Thymeleaf 使用此对象在表单提交和渲染过程中将表单字段绑定到属性。 + - `method="post"`: 此属性指定将表单数据发送到服务器时使用的 HTTP 方法。它设置为 `post`,表示表单数据将在请求体中发送。 + +3. **传递 'id' 字段:** + + - 在表单中,找到 `id` 字段的部分: + + ```html + +

+ + +

+ ``` + + - 解释: + - `th:field="*{id}"`: 此 Thymeleaf 属性将输入字段绑定到 `model` 对象的 `id` 属性。它确保在表单提交时将输入字段中输入的值设置为 `id` 属性。 + - `id="id"` 和 `name="id"`: 这些属性为输入字段提供标识符。 + +4. **重复这些步骤:** + + - 对于每个剩余字段(`firstName`、`sureName`、`isGraduated` 和 `mark`),重复这些步骤。确保根据需要更新 `label`、`id`、`name` 和 `th:field` 属性。 + - 这里是代码示例: ```html - Add Student Form + 添加学生表单
- Add Student + 添加学生 - +

- +

- +

- +

- +

- - + +
``` -## Result -Your view should look like that: +## 结果 +您的视图应如下所示: ![third-view.png](../../../srcs/thymeleaf/third-view.png) -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. +--- -# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file +# [下一个任务: *表单处理*](form-handling.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/fragments-and-layouts.md b/docs/cn/thymeleaf/practice/fragments-and-layouts.md index b3e2f8e..99f4dca 100644 --- a/docs/cn/thymeleaf/practice/fragments-and-layouts.md +++ b/docs/cn/thymeleaf/practice/fragments-and-layouts.md @@ -1,130 +1,128 @@ -# Fragments and Layouts - -**Description:** - -In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. - -## **Steps:** - -1. **Update `first.html` with a Fragment:** - - - Open the `first.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
-

This is the information section of the first view.

-
- - - - ``` - -2. **Update `second.html` with a Fragment:** - - - Open the `second.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `` inside the `` tag: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Update `third.html` with a Fragment:** - - - Open the `third.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
- -
-
- - - - ``` - -4. **Create `fourth.html` with Fragments Usage:** - - - Create a new file named `fourth.html` in the `practice` directory. - - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Explanation: - - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. - - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. - -## Result -Your view should look like that: +# 片段和布局 + +**描述:** + +在这一部分中,我们将实现 Thymeleaf 片段和布局。我们将更新现有视图以包含片段,然后创建一个新的视图来利用这些片段。 + +## **步骤:** + +1. **在 `first.html` 中添加一个片段:** + + - 打开 `practice` 目录中的 `first.html` 文件。 + - 在 `` 标签内的 `
` 中添加 `th:fragment` 属性: + + ```html + + + + + + + +
+

这是第一个视图的信息部分。

+
+ + + + ``` + +2. **在 `second.html` 中添加一个片段:** + + - 打开 `practice` 目录中的 `second.html` 文件。 + - 在 `` 标签内的 `` 中添加 `th:fragment` 属性: + + ```html + + + + + + + +
+ + + + + + + + + + + + + +
IdFirstNameSecondNameGraduatedMarkDiploma Type
+ + + + ``` + +3. **在 `third.html` 中添加一个片段:** + + - 打开 `practice` 目录中的 `third.html` 文件。 + - 在 `` 标签内的 `
` 中添加 `th:fragment` 属性: + + ```html + + + + + + + +
+ 添加学生 + +
+

学生添加成功!

+
+ +
+ +
+
+ + + + ``` + +4. **创建一个带有片段的 `fourth.html` :** + + - 在 `practice` 目录中创建一个名为 `fourth.html` 的新文件。 + - 使用 `th:insert` 和 `th:replace` 属性来包含其他视图中的片段: + + ```html + + + + + + + +
+ + +
+ + +
+ + + + ``` + + - 解释: + - `th:insert` 用于将指定片段(`info` 和 `add-student-form`)的内容包含在 `fourth.html` 文件中。 + - `th:replace` 用于在 `fourth.html` 文件中替换指定片段(`students-table`)的内容。 + +## 结果 +您的视图应如下所示: ![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) -**Conclusion:** +--- -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. - -# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file +# 恭喜! 您已完成所有任务。现在让我们转到 **[实验室任务](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/iteration.md b/docs/cn/thymeleaf/practice/iteration.md index 9f8cc3a..df49b7b 100644 --- a/docs/cn/thymeleaf/practice/iteration.md +++ b/docs/cn/thymeleaf/practice/iteration.md @@ -1,13 +1,13 @@ -# Iteration +# 迭代 -**Description:** +**描述:** -In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. +在这个任务中,您将通过在`models/`包中创建一个`StudentModel`类并在`PracticeController`中填充学生列表来探索Thymeleaf中的迭代概念。目标是将学生列表传递给`secondView`,并渲染显示学生详细信息的表格。 -**Steps:** +**步骤:** -1. **Create StudentModel:** - - In the `models/` package, create a `StudentModel` class with the following attributes: +1. **创建 StudentModel:** + - 在 `models/` 包中创建一个 `StudentModel` 类,具有以下属性: ```java public class StudentModel { @@ -21,8 +21,8 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating } ``` -2. **Populate List of Students in PracticeController:** - - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: +2. **在 PracticeController 中填充学生列表:** + - 在 `PracticeController` 类中,创建一个 `StudentModel` 列表并用假的学生详情填充它: ```java @Controller @@ -41,8 +41,8 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating } ``` -3. **Pass Students to secondView:** - - In the `secondView` method of the `PracticeController`, add the list of students to the model. +3. **将学生传递给 secondView:** + - 在 `PracticeController` 的 `secondView` 方法中,将学生列表添加到模型中。 ```java @Controller @@ -58,11 +58,11 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating } ``` -4. **Render Students Table in second.html:** - - Open the `second.html` Thymeleaf view file. +4. **在 second.html 中渲染学生表:** + - 打开 `second.html` Thymeleaf 视图文件。 -5. **Render Table Header:** - - Add the table header section within the `` tag: +5. **渲染表头:** + - 在 `` 标签内添加表头部分: ```html @@ -79,8 +79,8 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating
``` -6. **Render Table Body with Iteration:** - - Add the table body section within the `` tag and iterate over the list of students to render each row: +6. **使用迭代渲染表体:** + - 在 `` 标签内添加表体部分,并对学生列表进行迭代以渲染每一行: ```html @@ -95,13 +95,11 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating ``` -## Result -Your page should look like that: +## 结果 +您的页面应如下所示: ![second-view.png](../../../srcs/thymeleaf/second-view.png) -**Conclusion:** +--- -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. - -# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file +# [下一个任务:*字面值*](literals.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/literals.md b/docs/cn/thymeleaf/practice/literals.md index f77ca7b..6e6b025 100644 --- a/docs/cn/thymeleaf/practice/literals.md +++ b/docs/cn/thymeleaf/practice/literals.md @@ -1,55 +1,53 @@ -# Literals +# 字面值 -**Description:** +**描述:** -In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. +在这个任务中,您将通过在 `second.html` Thymeleaf 视图中引入字面值来增强视图,以根据特定条件显示修改后的值。字面值包括将常量值添加到 `id`,在“Graduated”字段中显示“是”或“否”,以及为“Mark”和“Diploma Type”字段提供描述性标签。 -**Steps:** +**步骤:** -1. **Update students-table Fragment in second.html:** - - Open the `second.html` Thymeleaf view file. +1. **更新 second.html 中的 students-table 片段:** + - 打开 `second.html` Thymeleaf 视图文件。 -2. **Enhance Literal for Student Id:** - - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. +2. **增强学生 ID 的字面值:** + - 修改 `id` 字段的表达式,将常量值(例如 100000)添加到实际学生 ID。 ```html ``` -3. **Enhance Literal for Graduated Field:** - - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. +3. **增强 Graduated 字段的字面值:** + - 更新“Graduated”字段的表达式,如果学生毕业,则显示“是”,否则显示“否”。 ```html - + ``` -4. **Enhance Literal for Mark Field:** - - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. +4. **增强 Mark 字段的字面值:** + - 添加条件表达式,根据学生的分数显示“Mark”字段的描述性标签。 ```html - Good - Very Good - Excellent - Not Passed + 良好 + 很好 + 优秀 + 未通过 ``` -5. **Add Literal for Diploma Type Field:** - - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. +5. **为 Diploma Type 字段添加字面值:** + - 添加条件表达式,根据学生的分数和毕业状态显示“Diploma Type”字段的描述性标签。 ```html - Blue - Blue - Red - No Diploma + 蓝色 + 蓝色 + 红色 + 无毕业证书 ``` -## Result -Your view should look like that: +## 结果 +您的页面应如下所示: ![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) -**Conclusion:** +--- -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. - -# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file +# [下一个任务:*表单*](forms.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/validation.md b/docs/cn/thymeleaf/practice/validation.md index 283fba4..844a27f 100644 --- a/docs/cn/thymeleaf/practice/validation.md +++ b/docs/cn/thymeleaf/practice/validation.md @@ -1,85 +1,83 @@ -# Query Parameter and Validation - -**Description:** - -In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. - -**Steps:** - -1. **Adapt the View (thirdView.html):** - - - Open the `third.html` file and add sections to display both success and error messages: - - ```html - - - - - - - - -
-

Student Added Successfully!

-
- -
-

Error:

-
- - - - - ``` - - - Explanation: - - The `
` checks if the query parameter `error` is present in the URL. - - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. - -2. **Handle Form Submission with Additional Validation (PracticeController):** - - - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Result -Your view should look like that: +# 查询参数和验证 + +**描述:** + +在这个继续中,我们将探讨使用查询参数在视图中显示处理表单提交后的消息。这涉及调整 `thirdView` 来根据查询参数显示成功和错误消息。 + +**步骤:** + +1. **调整视图(thirdView.html):** + + - 打开 `third.html` 文件,并添加显示成功和错误消息的部分: + + ```html + + + + + + + + +
+

学生添加成功!

+
+ +
+

错误:

+
+ + + + + ``` + + - 说明: + - `
` 检查URL中是否存在查询参数 `error`。 + - 如果参数存在,则以红色显示来自 `${param.error}` 的错误消息。 + +2. **处理表单提交并进行额外验证(PracticeController):** + + - 更新 `PracticeController` 中的 `addStudent` 方法,使用 `if-else` 结构包含对学生分数的额外验证: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // 其他方法... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + // 额外验证: 检查分数是否超过5分。 + if (model.getMark() > 5) { + // 如果分数超过5分,重定向并显示错误消息。 + return "redirect:/third?error=分数不能超过5分"; + } else { + students.add(model); + + return "redirect:/third?addedStudent=true"; + } + } + } + ``` + +## 结果 +您的视图应如下所示: ![third-view-error.png](../../../srcs/thymeleaf/third-view-success.png) ![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. +--- -# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file +# [下一个任务: *片段和布局*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/variables-and-controller.md b/docs/cn/thymeleaf/practice/variables-and-controller.md index ca4ad12..bcc52f7 100644 --- a/docs/cn/thymeleaf/practice/variables-and-controller.md +++ b/docs/cn/thymeleaf/practice/variables-and-controller.md @@ -1,16 +1,16 @@ -# Variables and Controller +# 变量和控制器 -**Description:** +**描述:** -In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. +在这个任务中,你将创建一个名为 `second.html` 的新的 Thymeleaf 视图,并探索从控制器传递变量到视图的概念。我们将不再在视图中定义标题为局部变量,而是通过控制器传递。 -**Steps:** +**步骤:** -1. **Create the New View File:** - - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. +1. **创建新的视图文件:** + - 在 `/src/main/resources/templates/` 目录中创建一个名为 `second.html` 的新的 Thymeleaf 视图文件。 ```plaintext - Project Directory + 项目目录 └── src └── main └── resources @@ -19,8 +19,8 @@ In this task, you will create a new Thymeleaf view named `second.html` and explo └── second.html ``` -2. **Define the Controller:** - - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. +2. **定义控制器:** + - 在你的控制器类(例如 `PracticeController`)中,定义一个方法,将其映射到与新视图关联的 URL 路径。将所需的变量(例如 `title`)传递到模型中。 ```java @Controller @@ -28,40 +28,38 @@ In this task, you will create a new Thymeleaf view named `second.html` and explo @GetMapping("/second") public String secondView(Model model) { - // Pass variables to the view - model.addAttribute("title", "Second Page"); + // 将变量传递到视图 + model.addAttribute("title", "第二页"); - // Return the view name + // 返回视图名称 return "practice/second"; } } ``` - This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. + 此控制器方法将映射到 URL 路径 `/second`,并将变量 `title` 的值设置为 "第二页" 传递给 Thymeleaf 视图。 -3. **Update the View to Use Controller-Passed Variable:** - - Open the `second.html` Thymeleaf view file. - - Use the `title` variable passed from the controller in the `

` tag. +3. **更新视图以使用控制器传递的变量:** + - 打开 `second.html` Thymeleaf 视图文件。 + - 在 `

` 标签中使用从控制器传递的 `title` 变量。 ```html - Title + 标题 -

Welcome to the Second Page

- - Go Back to Home +

欢迎来到第二页

+ + 返回首页 ``` - The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. + `th:text="${title}"` 表达式检索从控制器传递的 `title` 变量的值。 -**Conclusion:** +--- -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task - -# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file +# [下一个任务: *迭代*](iteration.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/working-with-variables.md b/docs/cn/thymeleaf/practice/working-with-variables.md index 43ea184..43044a6 100644 --- a/docs/cn/thymeleaf/practice/working-with-variables.md +++ b/docs/cn/thymeleaf/practice/working-with-variables.md @@ -1,27 +1,27 @@ -# Working with variables +# 处理变量 -**Description:** +**描述:** -In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. +在这个任务中,你将探索和利用 Thymeleaf 视图中的不同类型的局部变量,在你的 Spring 应用程序中。这些包括在视图本身中定义的变量,从控制器传递的变量,本地化的属性文件中定义的变量,以及在 Thymeleaf 配置类中定义的静态变量。 -## **Steps:** +## **步骤:** -1. **Define Local Variables in Thymeleaf View:** - - Open your Thymeleaf view file (e.g., `first.html`). - - Explore the usage of local variables defined directly within the view. - - In the example code provided: +1. **在 Thymeleaf 视图中定义局部变量:** + - 打开你的 Thymeleaf 视图文件(例如 `first.html`)。 + - 探索直接在视图中定义的局部变量的使用。 + - 在提供的示例代码中: ```html - + - Title + 标题 ``` - The local variable `title` is defined within the `` section of the HTML. + 局部变量 `title` 是在 HTML 的 `` 部分内定义的。 -2. **Localization Variables from Properties File:** - - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: +2. **从属性文件中获取本地化变量:** + - 查看 Thymeleaf 配置类中 `MessageSource` bean 的配置: ```java @Bean @@ -33,35 +33,35 @@ In this task, you will explore and utilize different types of local variables in return messageSource; } ``` - - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: + - 在路径 `/src/main/resources/local/` 下创建一个 `practice.properties` 文件,并添加以下内容: - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Note on `{0}`:** - - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. + ```properties + student.name=我的名字 + student.group=PRE-121 + message.welcome=欢迎,{0} + message.info=你的小组是: {0} + ``` + **关于 `{0}` 的说明:** + - 本地化消息中的符号 `{0}` 表示一个占位符变量。当消息被渲染时,占位符 `{0}` 会被提供的实际值替换。例如,在消息 `欢迎,{0}` 中,`{0}` 将被变量的实际值替换,比如一个名字。 - - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. - - In the example code provided: + - 使用 `#{}` 语法在 Thymeleaf 视图中探索本地化变量的用法。 + - 在提供的示例代码中: - ```html -

-

- ``` + ```html +

+

+ ``` - The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. + 变量 `student.name`,`student.group`,`message.welcome` 和 `message.info` 都实现了这个想法。 -3. **Static Variables in Thymeleaf Configuration Class:** - - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: +3. **在 Thymeleaf 配置类中添加静态变量:** + - 在你的 Thymeleaf 配置类中,使用 `addStaticVariable` 方法添加静态变量: ```java @Bean public ViewResolver thymeleafViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); + resolver.addStaticVariable("projectName", "练习任务"); resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); resolver.setTemplateEngine(templateEngine()); @@ -69,24 +69,20 @@ In this task, you will explore and utilize different types of local variables in } ``` - - Access these static variables in the Thymeleaf view using the `#vars` syntax. - - In the example code provided: + - 使用 `#vars` 语法在 Thymeleaf 视图中访问这些静态变量。 + - 在提供的示例代码中: - ```html -

Project Name

-

Current Date and Time

- ``` - -## Result - -now your page should look like that: + ```html +

项目名称

+

当前日期和时间

+ ``` -![first-view.png](../../../srcs/thymeleaf/first-view.png) +## 结果 -**Conclusion:** +现在你的页面应该如下所示: -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. +![first-view.png](../../../srcs/thymeleaf/first-view.png) -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. +--- -# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file +# [下一个任务: *变量和控制器*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/cn/transactions/lab-work.md b/docs/cn/transactions/lab-work.md index 0f1c1a1..08b3d32 100644 --- a/docs/cn/transactions/lab-work.md +++ b/docs/cn/transactions/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/transactions/lab-work.md) | 中文 | [Русский](../../ru/transactions/lab-work.md) + + # 事务实验任务 欢迎来到事务实验任务!这一系列任务的目标是帮助您练习并掌握在Spring应用程序中管理事务。无论您是初学者还是希望提升技能,这些实践任务都将引导您探索事务管理的各个方面,包括传播、隔离级别、嵌套事务等。 diff --git a/docs/en/jmeter/lab-work.md b/docs/en/jmeter/lab-work.md index 7758ec7..df0e63a 100644 --- a/docs/en/jmeter/lab-work.md +++ b/docs/en/jmeter/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/jmeter/lab-work.md) | [Русский](../../ru/jmeter/lab-work.md) + + # JMeter Lab Work Welcome to the JMeter Lab Work! The goal of this series of tasks is to help you practice and master JMeter, a powerful tool for performance testing and measuring the performance of web applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of using JMeter for load testing, recording, and analyzing HTTP requests. diff --git a/docs/en/jpa/lab-work.md b/docs/en/jpa/lab-work.md index c30081a..22c8282 100644 --- a/docs/en/jpa/lab-work.md +++ b/docs/en/jpa/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/jpa/lab-work.md) | [Русский](../../ru/jpa/lab-work.md) + + # Lab Work: JPA (Java Persistence API) Welcome to the Spring Boot with JPA Lab Work! In this lab work, you will practice various tasks related to setting up a Spring Boot project with JPA (Java Persistence API). diff --git a/docs/en/springsecurity/lab-work.md b/docs/en/springsecurity/lab-work.md index 245d193..5c795fd 100644 --- a/docs/en/springsecurity/lab-work.md +++ b/docs/en/springsecurity/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/springsecurity/lab-work.md) | [Русский](../../ru/springsecurity/lab-work.md) + + # Spring Security Lab Work Welcome to the Spring Security Lab Work! The goal of this series of tasks is to help you practice and get know to Spring Security, and make an enough startup project. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of security integration in a Spring application. diff --git a/docs/en/springsecurity/practice/add-dummy-users.md b/docs/en/springsecurity/practice/add-dummy-users.md index 5d8d81b..de6300e 100644 --- a/docs/en/springsecurity/practice/add-dummy-users.md +++ b/docs/en/springsecurity/practice/add-dummy-users.md @@ -61,4 +61,4 @@ Update the `CustomUserDetailsService` class to include a method for adding dummy --- -# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file +# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) diff --git a/docs/en/springsecurity/practice/authorize-client-authority.md b/docs/en/springsecurity/practice/authorize-client-authority.md index cb36a1d..cf24bc7 100644 --- a/docs/en/springsecurity/practice/authorize-client-authority.md +++ b/docs/en/springsecurity/practice/authorize-client-authority.md @@ -52,4 +52,4 @@ By following these steps, you can control the visibility of elements in your Thy --- -# [NEXT TASK: Lab Tasks](../lab-work.md) +# [NEXT TASK: Custom Login Form](custom-login-form.md) diff --git a/docs/en/springsecurity/practice/authorize-server-authenticated.md b/docs/en/springsecurity/practice/authorize-server-authenticated.md index ef1e7a4..5b9cd1b 100644 --- a/docs/en/springsecurity/practice/authorize-server-authenticated.md +++ b/docs/en/springsecurity/practice/authorize-server-authenticated.md @@ -35,4 +35,4 @@ Authorize access to the `/second` path only for authenticated users while allowi --- -# [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file +# [NEXT TASK: Authorize by Role](authorize-server-role.md) diff --git a/docs/en/springsecurity/practice/authorize-server-authority.md b/docs/en/springsecurity/practice/authorize-server-authority.md index d0abdeb..8484252 100644 --- a/docs/en/springsecurity/practice/authorize-server-authority.md +++ b/docs/en/springsecurity/practice/authorize-server-authority.md @@ -36,4 +36,4 @@ Authorize access to the `/addStudent` path for users with the `WRITE` authority --- -# [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file +# [NEXT TASK: Configure Thymeleaf Security](configure-thymeleaf-security.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/configure-spring-security.md b/docs/en/springsecurity/practice/configure-spring-security.md index c6bcf19..29a4e40 100644 --- a/docs/en/springsecurity/practice/configure-spring-security.md +++ b/docs/en/springsecurity/practice/configure-spring-security.md @@ -77,4 +77,4 @@ The goal of this task is to integrate Spring Security into your existing project --- -# [Next Task: Create a Base Implementation for User](base-implementation-user.md) +# [Next Task: Authorize Authenticated Users](authorize-client-authenticated.md) diff --git a/docs/en/springsecurity/practice/custom-login-form.md b/docs/en/springsecurity/practice/custom-login-form.md index 720cec9..fb8132c 100644 --- a/docs/en/springsecurity/practice/custom-login-form.md +++ b/docs/en/springsecurity/practice/custom-login-form.md @@ -37,4 +37,4 @@ Activate the custom login form page that has already been created in specific pa --- -# [TASKS](../lab-work.md) +# [NEXT: TASKS](../lab-work.md) diff --git a/docs/en/springsecurity/practice/setup-server-authorization.md b/docs/en/springsecurity/practice/setup-server-authorization.md index 68cd220..5c23912 100644 --- a/docs/en/springsecurity/practice/setup-server-authorization.md +++ b/docs/en/springsecurity/practice/setup-server-authorization.md @@ -38,4 +38,4 @@ Configure authorization rules to restrict or allow access to various paths and e --- -# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file +# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) diff --git a/docs/en/springsecurity/tasks.md b/docs/en/springsecurity/tasks.md deleted file mode 100644 index 52f7231..0000000 --- a/docs/en/springsecurity/tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -- Setup and Configuration -- base implementation to user -- password hashing algorithms -- add dummy users ( password hashing) -- create identity to users -- - -## TASKS -- create allowed paths -- create authenticated paths ( form-based ) -- create admin page ( role based ) -- hide and show content in depends on authorities and role. -- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file diff --git a/docs/en/thymeleaf/lab-work.md b/docs/en/thymeleaf/lab-work.md index 60ed23c..ae50042 100644 --- a/docs/en/thymeleaf/lab-work.md +++ b/docs/en/thymeleaf/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/thymeleaf/lab-work.md) | [Русский](../../ru/thymeleaf/lab-work.md) + + # Thymeleaf Lab Work Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. diff --git a/docs/en/thymeleaf/practice/configure-thymeleaf.md b/docs/en/thymeleaf/practice/configure-thymeleaf.md index 2c016c4..0bb9809 100644 --- a/docs/en/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/en/thymeleaf/practice/configure-thymeleaf.md @@ -112,8 +112,6 @@ This task involves setting up Thymeleaf within a Spring application, enabling se --- -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). +--- # [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/create-first-view.md b/docs/en/thymeleaf/practice/create-first-view.md index 30577eb..710d029 100644 --- a/docs/en/thymeleaf/practice/create-first-view.md +++ b/docs/en/thymeleaf/practice/create-first-view.md @@ -56,8 +56,4 @@ In this task, we'll create the first Thymeleaf view for your Spring application. --- -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - # [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/form-handling.md b/docs/en/thymeleaf/practice/form-handling.md index c7b6b7b..c9ff294 100644 --- a/docs/en/thymeleaf/practice/form-handling.md +++ b/docs/en/thymeleaf/practice/form-handling.md @@ -67,8 +67,6 @@ In this continuation, we will focus on handling form submissions and rendering t - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. +--- # [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/forms.md b/docs/en/thymeleaf/practice/forms.md index 3876c1d..10d76be 100644 --- a/docs/en/thymeleaf/practice/forms.md +++ b/docs/en/thymeleaf/practice/forms.md @@ -113,8 +113,6 @@ Your view should look like that: ![third-view.png](../../../srcs/thymeleaf/third-view.png) -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. +--- # [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/fragments-and-layouts.md b/docs/en/thymeleaf/practice/fragments-and-layouts.md index b3e2f8e..16651f7 100644 --- a/docs/en/thymeleaf/practice/fragments-and-layouts.md +++ b/docs/en/thymeleaf/practice/fragments-and-layouts.md @@ -123,8 +123,6 @@ Your view should look like that: ![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) -**Conclusion:** - -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. +--- # Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/iteration.md b/docs/en/thymeleaf/practice/iteration.md index 9f8cc3a..8d37079 100644 --- a/docs/en/thymeleaf/practice/iteration.md +++ b/docs/en/thymeleaf/practice/iteration.md @@ -100,8 +100,6 @@ Your page should look like that: ![second-view.png](../../../srcs/thymeleaf/second-view.png) -**Conclusion:** - -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. +--- # [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/literals.md b/docs/en/thymeleaf/practice/literals.md index f77ca7b..0841931 100644 --- a/docs/en/thymeleaf/practice/literals.md +++ b/docs/en/thymeleaf/practice/literals.md @@ -48,8 +48,6 @@ Your view should look like that: ![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) -**Conclusion:** - -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. +--- # [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/validation.md b/docs/en/thymeleaf/practice/validation.md index 283fba4..00de7cb 100644 --- a/docs/en/thymeleaf/practice/validation.md +++ b/docs/en/thymeleaf/practice/validation.md @@ -78,8 +78,6 @@ Your view should look like that: ![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. +--- # [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/variables-and-controller.md b/docs/en/thymeleaf/practice/variables-and-controller.md index ca4ad12..1c2c04b 100644 --- a/docs/en/thymeleaf/practice/variables-and-controller.md +++ b/docs/en/thymeleaf/practice/variables-and-controller.md @@ -60,8 +60,6 @@ In this task, you will create a new Thymeleaf view named `second.html` and explo The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. -**Conclusion:** - -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task +--- # [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/working-with-variables.md b/docs/en/thymeleaf/practice/working-with-variables.md index 43ea184..21cbacd 100644 --- a/docs/en/thymeleaf/practice/working-with-variables.md +++ b/docs/en/thymeleaf/practice/working-with-variables.md @@ -83,10 +83,6 @@ now your page should look like that: ![first-view.png](../../../srcs/thymeleaf/first-view.png) -**Conclusion:** - -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. - -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. +--- # [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/en/transactions/lab-work.md b/docs/en/transactions/lab-work.md index 081cbda..82457d6 100644 --- a/docs/en/transactions/lab-work.md +++ b/docs/en/transactions/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/transactions/lab-work.md) | [Русский](../../ru/transactions/lab-work.md) + + # Transactions Lab Work Welcome to the Transactions Lab Work! The goal of this series of tasks is to help you practice and master transaction management in a Spring application. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of transaction management, including propagation, isolation levels, nested transactions, and more. diff --git a/docs/en/transactions/practice/lessons/basic-transactional-operations.md b/docs/en/transactions/practice/lessons/basic-transactional-operations.md index ab80146..63d6589 100644 --- a/docs/en/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/en/transactions/practice/lessons/basic-transactional-operations.md @@ -47,4 +47,4 @@ This part aims to introduce simple yet important transactional methods for enrol --- -# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file +# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) diff --git a/docs/en/transactions/practice/lessons/entities-and-repositories.md b/docs/en/transactions/practice/lessons/entities-and-repositories.md index a8ef935..783f47f 100644 --- a/docs/en/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/en/transactions/practice/lessons/entities-and-repositories.md @@ -35,4 +35,4 @@ The goal of this task is to define the core entities (Student, Course, Enrollmen --- -# [NEXT: Implementing Basic Transactional Operations](basic-transactional-operations.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ: Реализация базовых транзакционных операций](basic-transactional-operations.md) \ No newline at end of file diff --git a/docs/ru/jmeter/lab-work.md b/docs/ru/jmeter/lab-work.md index d346ff7..ebc73c5 100644 --- a/docs/ru/jmeter/lab-work.md +++ b/docs/ru/jmeter/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/jmeter/lab-work.md) | [中文](../../cn/jmeter/lab-work.md) | Русский + + # Практические задания лабораторной работы по JMeter Добро пожаловать в лабораторную работу по JMeter! Цель этой серии задач - помочь вам практиковаться и освоить JMeter, полезный инструмент для тестирования и измерения производительности веб-приложений. Независимо от того, являетесь ли вы начинающим или хотите улучшить свои навыки, эти практические задания помогут вам ознакомиться с различными аспектами использования JMeter для нагрузочного тестирования, записи и анализа HTTP-запросов. diff --git a/docs/ru/jpa/lab-work.md b/docs/ru/jpa/lab-work.md index 6066c18..14ec71b 100644 --- a/docs/ru/jpa/lab-work.md +++ b/docs/ru/jpa/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/jmeter/lab-work.md) | [中文](../../cn/jmeter/lab-work.md) | Русский + # Лабораторная работа: JPA (Java Persistence API) Добро пожаловать на лабораторную работу по Spring Boot с JPA! В этой лабораторной работе вы попрактикуетесь в различных задачах, связанных с настройкой проекта Spring Boot с JPA (Java Persistence API). diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md index f4554d7..e94a2bc 100644 --- a/docs/ru/springsecurity/lab-work.md +++ b/docs/ru/springsecurity/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/springsecurity/lab-work.md) | [中文](../../cn/springsecurity/lab-work.md) | Русский + # Лабораторные работы по Spring Security Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам практиковаться и познакомиться с Spring Security, а также создать достаточно полноценный проект. Будь вы начинающим или стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring. diff --git a/docs/ru/springsecurity/practice/authorize-client-authority.md b/docs/ru/springsecurity/practice/authorize-client-authority.md index 24188cd..f4a6842 100644 --- a/docs/ru/springsecurity/practice/authorize-client-authority.md +++ b/docs/ru/springsecurity/practice/authorize-client-authority.md @@ -52,4 +52,4 @@ --- -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Лабораторные задания](../lab-work.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Пользовательская форма входа](custom-login-form.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/authorize-server-authenticated.md b/docs/ru/springsecurity/practice/authorize-server-authenticated.md index 93f418e..61c8b67 100644 --- a/docs/ru/springsecurity/practice/authorize-server-authenticated.md +++ b/docs/ru/springsecurity/practice/authorize-server-authenticated.md @@ -33,6 +33,6 @@ - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации. - Заявление `.requestMatchers("/second").authenticated()` указывает, что доступ к пути `/second` должен быть ограничен только для аутентифицированных пользователей. -## Заключение +--- -Вы успешно настроили авторизацию для разрешения доступа к пути `/second` только для аутентифицированных пользователей. Путем требования аутентификации для этого пути. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по роли](authorize-server-role.md) diff --git a/docs/ru/springsecurity/practice/authorize-server-authority.md b/docs/ru/springsecurity/practice/authorize-server-authority.md index d6f7346..2040e86 100644 --- a/docs/ru/springsecurity/practice/authorize-server-authority.md +++ b/docs/ru/springsecurity/practice/authorize-server-authority.md @@ -34,6 +34,6 @@ - Заявление `.requestMatchers("/addStudent").hasAuthority("WRITE")` указывает, что доступ к пути `/addStudent` должен быть ограничен для пользователей с правами `WRITE`. - Аналогично, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` ограничивает доступ к пути `/removeStudent` для пользователей с правами `DELETE`. -## Заключение +--- -Вы успешно настроили контроль доступа на основе прав для путей `/addStudent` и `/removeStudent` в вашем приложении. Присваивая конкретные права пользователям, вы можете контролировать доступ к различным функциональностям или действиям на основе их разрешений. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Настройка безопасности Thymeleaf](configure-thymeleaf-security.md) diff --git a/docs/ru/springsecurity/practice/authorize-server-role.md b/docs/ru/springsecurity/practice/authorize-server-role.md index 6b6ff73..ce374bc 100644 --- a/docs/ru/springsecurity/practice/authorize-server-role.md +++ b/docs/ru/springsecurity/practice/authorize-server-role.md @@ -34,6 +34,6 @@ - Заявление `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` указывает, что доступ к пути `/third` должен быть ограничен для пользователей с авторитетом `ROLE_MODERATOR`. - Аналогично, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` ограничивает доступ к пути `/fourth` для пользователей с авторитетом `ROLE_ADMIN`. -## Заключение +--- -Вы успешно настроили контроль доступа на основе ролей для путей `/third` и `/fourth` в вашем приложении. Присваивая конкретные роли пользователям, вы можете контролировать доступ к различным частям вашего приложения на основе их разрешений. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по полномочию](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/base-implementation-user.md b/docs/ru/springsecurity/practice/base-implementation-user.md index 83c9688..694a173 100644 --- a/docs/ru/springsecurity/practice/base-implementation-user.md +++ b/docs/ru/springsecurity/practice/base-implementation-user.md @@ -181,6 +181,6 @@ src Эта структура папок показывает, где создать класс `CustomUserDetailsService` и интерфейс `UsersRepository` в вашем проекте. Организация ваших классов таким образом помогает поддерживать чистый и структурированный код. -## Заключение +--- -Поздравляю! Вы успешно создали базовую реализацию для управления пользователями в вашем приложении. С UserDetails, UsersRepository и UserDetailsService вы можете аутентифицировать пользователей, управлять их данными и выполнять операции, связанные с пользователями, эффективно. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/configure-spring-security.md b/docs/ru/springsecurity/practice/configure-spring-security.md index f556b3f..c5306e8 100644 --- a/docs/ru/springsecurity/practice/configure-spring-security.md +++ b/docs/ru/springsecurity/practice/configure-spring-security.md @@ -74,6 +74,6 @@ } ``` -## Заключение +--- -Поздравляем! Вы успешно настроили Spring Security в своем проекте. Ваше приложение теперь обладает надежными средствами безопасности для защиты от несанкционированного доступа и обеспечения конфиденциальности и целостности данных пользователей. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md index 78960e2..0e0cc51 100644 --- a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md +++ b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md @@ -25,5 +25,6 @@ ``` -## Заключение -После добавления зависимости Thymeleaf будет настроен для работы с Spring Security, предоставляя дополнительные функции и утилиты для интеграции функциональности, связанной с безопасностью, в ваше веб-приложение. Не забудьте синхронизировать ваш проект, чтобы загрузить зависимость и сделать ее доступной для использования. +--- + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базовую реализацию для пользователя](base-implementation-user.md) diff --git a/docs/ru/springsecurity/practice/create-identity-to-users.md b/docs/ru/springsecurity/practice/create-identity-to-users.md index e96f03c..fc0880a 100644 --- a/docs/ru/springsecurity/practice/create-identity-to-users.md +++ b/docs/ru/springsecurity/practice/create-identity-to-users.md @@ -56,6 +56,6 @@ - Полномочия представлены объектами `SimpleGrantedAuthority` и добавляются в профили пользователей соответственно. - Кроме того, мы устанавливаем роль для каждого пользователя, чтобы в дальнейшем использовать контроль доступа на основе ролей. -## Заключение +--- -Вы успешно улучшили профили пользователей в вашем приложении, назначив роли и полномочия фиктивным пользователям. Определив их идентификацию и разрешения на доступ, теперь вы можете контролировать действия и функциональность, доступные каждому пользователю в приложении. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базу для авторизации на сервере](setup-server-authorization.md) diff --git a/docs/ru/springsecurity/practice/custom-login-form.md b/docs/ru/springsecurity/practice/custom-login-form.md index c9a9681..e7e6d64 100644 --- a/docs/ru/springsecurity/practice/custom-login-form.md +++ b/docs/ru/springsecurity/practice/custom-login-form.md @@ -35,6 +35,6 @@ - Оператор `.loginPage("/custom-login-page")` указывает URL пользовательской страницы входа. - Вы можете добавить дополнительные конфигурации для настройки поведения формы входа, такие как установка URL для успешного или неудачного входа, определение имен полей формы и т. д. -## Заключение +--- -Вы успешно активировали пользовательскую страницу формы входа для аутентификации в вашем приложении. Пользователи теперь могут получить доступ к пользовательской странице входа, чтобы безопасно войти и аутентифицироваться в системе. +# [СЛЕДУЮЩЕЕ: ЗАДАНИЯ](../lab-work.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/password-encryption.md b/docs/ru/springsecurity/practice/password-encryption.md index 30633f9..97a78d4 100644 --- a/docs/ru/springsecurity/practice/password-encryption.md +++ b/docs/ru/springsecurity/practice/password-encryption.md @@ -77,6 +77,6 @@ Этот метод принимает объект CustomUserDetails, представляющий пользователя для регистрации. Он шифрует пароль пользователя с использованием бина BCryptPasswordEncoder, а затем сохраняет пользователя в базе данных. -## Заключение +--- -Поздравляем! Вы успешно настроили шифрование паролей с использованием BCryptPasswordEncoder в вашем приложении, использующем Spring Security. Шифрование паролей повышает безопасность аутентификации пользователей и защищает конфиденциальные данные пользователей. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Добавить тестовых пользователей](add-dummy-users.md) diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md index c06272a..bb75ed8 100644 --- a/docs/ru/thymeleaf/lab-work.md +++ b/docs/ru/thymeleaf/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/thymeleaf/lab-work.md) | [中文](../../cn/thymeleaf/lab-work.md) | Русский + + # Лабораторная работа по Thymeleaf Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md index f767e45..f6025db 100644 --- a/docs/ru/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md @@ -112,8 +112,4 @@ --- -**Заключение:** - -Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html). - # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/create-first-view.md b/docs/ru/thymeleaf/practice/create-first-view.md index a2ed7b7..c9527d3 100644 --- a/docs/ru/thymeleaf/practice/create-first-view.md +++ b/docs/ru/thymeleaf/practice/create-first-view.md @@ -56,8 +56,4 @@ --- -**Вывод:** - -Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf. - # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/form-handling.md b/docs/ru/thymeleaf/practice/form-handling.md index 607eba6..a9eec58 100644 --- a/docs/ru/thymeleaf/practice/form-handling.md +++ b/docs/ru/thymeleaf/practice/form-handling.md @@ -67,8 +67,6 @@ - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия. - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`). -**Заключение:** - -Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/forms.md b/docs/ru/thymeleaf/practice/forms.md index 0d185da..3ace17c 100644 --- a/docs/ru/thymeleaf/practice/forms.md +++ b/docs/ru/thymeleaf/practice/forms.md @@ -113,8 +113,6 @@ ![third-view.png](../../../srcs/thymeleaf/third-view.png) -**Заключение:** - -Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/fragments-and-layouts.md b/docs/ru/thymeleaf/practice/fragments-and-layouts.md index dc9f2ef..ff464c4 100644 --- a/docs/ru/thymeleaf/practice/fragments-and-layouts.md +++ b/docs/ru/thymeleaf/practice/fragments-and-layouts.md @@ -123,8 +123,6 @@ ![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) -**Заключение:** - -Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`. +--- # Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)** diff --git a/docs/ru/thymeleaf/practice/iteration.md b/docs/ru/thymeleaf/practice/iteration.md index 9f7803b..847c1d2 100644 --- a/docs/ru/thymeleaf/practice/iteration.md +++ b/docs/ru/thymeleaf/practice/iteration.md @@ -100,8 +100,6 @@ ![second-view.png](../../../srcs/thymeleaf/second-view.png) -**Заключение:** - -Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md) diff --git a/docs/ru/thymeleaf/practice/literals.md b/docs/ru/thymeleaf/practice/literals.md index ee0af4c..b78b317 100644 --- a/docs/ru/thymeleaf/practice/literals.md +++ b/docs/ru/thymeleaf/practice/literals.md @@ -48,8 +48,6 @@ ![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) -**Заключение:** - -Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md) diff --git a/docs/ru/thymeleaf/practice/validation.md b/docs/ru/thymeleaf/practice/validation.md index 43f2e41..4ba6276 100644 --- a/docs/ru/thymeleaf/practice/validation.md +++ b/docs/ru/thymeleaf/practice/validation.md @@ -78,8 +78,6 @@ ![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) -**Заключение:** - -Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md) diff --git a/docs/ru/thymeleaf/practice/variables-and-controller.md b/docs/ru/thymeleaf/practice/variables-and-controller.md index b4a2d9f..a8902d8 100644 --- a/docs/ru/thymeleaf/practice/variables-and-controller.md +++ b/docs/ru/thymeleaf/practice/variables-and-controller.md @@ -60,8 +60,6 @@ Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера. -**Заключение:** - -Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md) diff --git a/docs/ru/thymeleaf/practice/working-with-variables.md b/docs/ru/thymeleaf/practice/working-with-variables.md index 47a0281..715422c 100644 --- a/docs/ru/thymeleaf/practice/working-with-variables.md +++ b/docs/ru/thymeleaf/practice/working-with-variables.md @@ -83,10 +83,6 @@ ![first-view.png](../../../srcs/thymeleaf/first-view.png) -**Заключение:** - -Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring. - -Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md) diff --git a/docs/ru/transactions/lab-work.md b/docs/ru/transactions/lab-work.md index 7bf0987..f4bf786 100644 --- a/docs/ru/transactions/lab-work.md +++ b/docs/ru/transactions/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/transactions/lab-work.md) | [中文](../../cn/transactions/lab-work.md) | Русский + + # Transactions Lab Work Добро пожаловать в лабораторную работу по транзакциям! Цель этой серии задач - помочь вам практиковать и овладеть управлением транзакциями в приложении на Spring. Независимо от вашего уровня - будь то начинающий или опытный разработчик, эти практические задачи помогут вам освоить различные аспекты управления транзакциями, включая распространение, уровни изоляции, вложенные транзакции и многое другое. @@ -51,5 +54,3 @@ - **Выполнение операции без транзакции** - **Задача:** Реализуйте метод для операций, не требующих транзакционного контекста, таких как некритические задачи или журналирование. - **Распространение:** Нет - ---- \ No newline at end of file diff --git a/docs/ru/transactions/practice/configuration.md b/docs/ru/transactions/practice/configuration.md index 8a07a1d..ea0a3a0 100644 --- a/docs/ru/transactions/practice/configuration.md +++ b/docs/ru/transactions/practice/configuration.md @@ -37,4 +37,4 @@ public class DemoApplication { ``` --- -# [Далее: Создание сущностей и репозиториев](lessons/first.md) \ No newline at end of file +# [Далее: Создание сущностей и репозиториев](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md index 5bf0633..08014f1 100644 --- a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md @@ -47,4 +47,4 @@ --- -# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ: Улучшение транзакционных методов с подробным логированием](transactional-logging.md) diff --git a/docs/ru/transactions/practice/lessons/entities-and-repositories.md b/docs/ru/transactions/practice/lessons/entities-and-repositories.md index 9656087..5504fd4 100644 --- a/docs/ru/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/ru/transactions/practice/lessons/entities-and-repositories.md @@ -33,3 +33,7 @@ Если у вас уже есть репозитории для сущностей, перейдите к следующему шагу. В противном случае повторите описанный выше шаг для репозиториев оставшихся сущностей (Course, Enrollment, Log). +--- + +# [СЛЕДУЮЩЕЕ: Реализация базовых транзакционных операций](basic-transactional-operations.md) + diff --git a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md index 4e93059..5a76ce9 100644 --- a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md +++ b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md @@ -63,6 +63,4 @@ --- -# [ДАЛЕЕ: З - -[ДАЛЕЕ: Задания](../../lab-work.md) \ No newline at end of file +# [ДАЛЕЕ: Задания](../../lab-work.md) From 4090c431f590e40221b519373285717a6f6578fd Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 3 Jun 2024 22:15:07 +0300 Subject: [PATCH 33/40] [Master] HUGEST UPDATE EVER --- docs/cn/jmeter/lab-work.md | 3 + docs/cn/jpa/lab-work.md | 2 + docs/cn/springsecurity/lab-work.md | 2 + docs/cn/thymeleaf/lab-work.md | 5 +- .../thymeleaf/practice/configure-thymeleaf.md | 84 +++--- .../thymeleaf/practice/create-first-view.md | 50 ++-- docs/cn/thymeleaf/practice/form-handling.md | 146 +++++----- docs/cn/thymeleaf/practice/forms.md | 166 ++++++------ .../practice/fragments-and-layouts.md | 250 +++++++++--------- docs/cn/thymeleaf/practice/iteration.md | 42 ++- docs/cn/thymeleaf/practice/literals.md | 56 ++-- docs/cn/thymeleaf/practice/validation.md | 154 ++++++----- .../practice/variables-and-controller.md | 48 ++-- .../practice/working-with-variables.md | 90 +++---- docs/cn/transactions/lab-work.md | 3 + docs/en/jmeter/lab-work.md | 3 + docs/en/jpa/lab-work.md | 3 + docs/en/springsecurity/lab-work.md | 3 + .../practice/add-dummy-users.md | 2 +- .../practice/authorize-client-authority.md | 2 +- .../authorize-server-authenticated.md | 2 +- .../practice/authorize-server-authority.md | 2 +- .../practice/configure-spring-security.md | 2 +- .../practice/custom-login-form.md | 2 +- .../practice/setup-server-authorization.md | 2 +- docs/en/springsecurity/tasks.md | 13 - docs/en/thymeleaf/lab-work.md | 5 +- .../thymeleaf/practice/configure-thymeleaf.md | 4 +- .../thymeleaf/practice/create-first-view.md | 4 - docs/en/thymeleaf/practice/form-handling.md | 4 +- docs/en/thymeleaf/practice/forms.md | 4 +- .../practice/fragments-and-layouts.md | 4 +- docs/en/thymeleaf/practice/iteration.md | 4 +- docs/en/thymeleaf/practice/literals.md | 4 +- docs/en/thymeleaf/practice/validation.md | 4 +- .../practice/variables-and-controller.md | 4 +- .../practice/working-with-variables.md | 6 +- docs/en/transactions/lab-work.md | 3 + .../lessons/basic-transactional-operations.md | 2 +- .../lessons/entities-and-repositories.md | 2 +- docs/ru/jmeter/lab-work.md | 3 + docs/ru/jpa/lab-work.md | 2 + docs/ru/springsecurity/lab-work.md | 2 + .../practice/authorize-client-authority.md | 2 +- .../authorize-server-authenticated.md | 4 +- .../practice/authorize-server-authority.md | 4 +- .../practice/authorize-server-role.md | 4 +- .../practice/base-implementation-user.md | 4 +- .../practice/configure-spring-security.md | 4 +- .../practice/configure-thymeleaf-security.md | 5 +- .../practice/create-identity-to-users.md | 4 +- .../practice/custom-login-form.md | 4 +- .../practice/password-encryption.md | 4 +- docs/ru/thymeleaf/lab-work.md | 6 +- .../thymeleaf/practice/configure-thymeleaf.md | 4 - .../thymeleaf/practice/create-first-view.md | 4 - docs/ru/thymeleaf/practice/form-handling.md | 4 +- docs/ru/thymeleaf/practice/forms.md | 4 +- .../practice/fragments-and-layouts.md | 4 +- docs/ru/thymeleaf/practice/iteration.md | 4 +- docs/ru/thymeleaf/practice/literals.md | 4 +- docs/ru/thymeleaf/practice/validation.md | 4 +- .../practice/variables-and-controller.md | 4 +- .../practice/working-with-variables.md | 6 +- docs/ru/transactions/lab-work.md | 5 +- .../ru/transactions/practice/configuration.md | 2 +- .../lessons/basic-transactional-operations.md | 2 +- .../lessons/entities-and-repositories.md | 4 + ...nested-and-non-transactional-operations.md | 4 +- 69 files changed, 623 insertions(+), 679 deletions(-) delete mode 100644 docs/en/springsecurity/tasks.md diff --git a/docs/cn/jmeter/lab-work.md b/docs/cn/jmeter/lab-work.md index 7d9debd..3a0b510 100644 --- a/docs/cn/jmeter/lab-work.md +++ b/docs/cn/jmeter/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/jmeter/lab-work.md) | 中文 | [Русский](../../ru/jmeter/lab-work.md) + + # JMeter实验室任务 欢迎来到JMeter实验室!这一系列任务的目标是帮助您练习和掌握JMeter,这是一种用于性能测试和测量Web应用程序性能的强大工具。无论您是初学者还是希望提升技能,这些实践任务都将引导您了解JMeter在负载测试、录制和分析HTTP请求方面的各个方面。 diff --git a/docs/cn/jpa/lab-work.md b/docs/cn/jpa/lab-work.md index bec5b47..4a0d0d3 100644 --- a/docs/cn/jpa/lab-work.md +++ b/docs/cn/jpa/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/jpa/lab-work.md) | 中文 | [Русский](../../ru/jpa/lab-work.md) + # 实验任务: JPA (Java Persistence API) 欢迎来到 Spring Boot with JPA 实验任务!在这个实验中,您将练习与使用 Spring Boot 和 JPA (Java Persistence API) 相关的各种任务。 diff --git a/docs/cn/springsecurity/lab-work.md b/docs/cn/springsecurity/lab-work.md index 79557f9..1830a34 100644 --- a/docs/cn/springsecurity/lab-work.md +++ b/docs/cn/springsecurity/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/springsecurity/lab-work.md) | 中文 | [Русский](../../ru/springsecurity/lab-work.md) + # Spring Security 实验任务 欢迎来到 Spring Security 实验任务系列!本系列任务旨在帮助您实践并熟悉 Spring Security,从而建立一个足够的启动项目。无论您是初学者还是希望提升技能,这些动手任务将引导您完成在 Spring 应用中集成安全性的各个方面。 diff --git a/docs/cn/thymeleaf/lab-work.md b/docs/cn/thymeleaf/lab-work.md index aba3d11..f800371 100644 --- a/docs/cn/thymeleaf/lab-work.md +++ b/docs/cn/thymeleaf/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/thymeleaf/lab-work.md) | 中文 | [Русский](../../ru/thymeleaf/lab-work.md) + # Thymeleaf 实验任务 欢迎来到 Thymeleaf 实验任务系列!本系列任务旨在帮助您实践和掌握 Thymeleaf,这是一种强大的 Java 应用模板引擎。无论您是初学者还是希望提升技能,这些动手任务将引导您完成在 Spring 应用中集成 Thymeleaf 的各个方面。 @@ -68,6 +70,3 @@ ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) -请随时探索并按照自己的节奏完成这些任务。每个任务都旨在进一步提升您在 Thymeleaf 和网页开发方面的技能。如果您有任何问题或需要帮助,请随时联系。 - -祝您编程愉快! \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/configure-thymeleaf.md b/docs/cn/thymeleaf/practice/configure-thymeleaf.md index 2c016c4..53d7c4c 100644 --- a/docs/cn/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/cn/thymeleaf/practice/configure-thymeleaf.md @@ -1,16 +1,16 @@ -# Configure Thymeleaf in Spring +# 在Spring中配置Thymeleaf -**Description:** +**描述:** -This task involves setting up Thymeleaf within a Spring application, enabling seamless integration of the template engine for web development. +此任务涉及在Spring应用程序中设置Thymeleaf,实现模板引擎与Web开发的无缝集成。 -## **Steps:** +## 步骤: -1. **Create Thymeleaf Configuration Class:** - - In your Spring project, create a new Java class annotated with `@Configuration`. We recommend placing this class in the `config` package. - - Extend the class with `WebMvcConfigurer`. +1. **创建Thymeleaf配置类:** + - 在您的Spring项目中,创建一个带有 `@Configuration` 注解的新Java类。我们建议将此类放置在 `config` 包中。 + - 将该类扩展为 `WebMvcConfigurer`。 - Example: + 示例: ```java package edu.labs.thymeleaf.config; @@ -20,100 +20,96 @@ This task involves setting up Thymeleaf within a Spring application, enabling se @Configuration public class WebMvcConfig implements WebMvcConfigurer { - // Configuration code goes here + // 配置代码放在这里 } ``` - Placing the configuration class in the `config` package enhances organization and ensures a clear structure in your project. Adjust the package name based on your project's structure. + 将配置类放置在 `config` 包中有助于组织,并确保项目结构清晰。根据项目的结构调整包名称。 -2. **Configure Thymeleaf Template Resolver:** - - Define a method annotated with `@Bean` to configure the Thymeleaf template resolver. - - Use `ClassLoaderTemplateResolver` and set the prefix, suffix, template mode, and character encoding. +2. **配置Thymeleaf模板解析器:** + - 定义一个带有 `@Bean` 注解的方法,以配置Thymeleaf模板解析器。 + - 使用 `ClassLoaderTemplateResolver`,设置前缀、后缀、模板模式和字符编码。 ```java @Bean public ClassLoaderTemplateResolver templateResolver() { - // Create a ClassLoaderTemplateResolver bean + // 创建一个 ClassLoaderTemplateResolver bean ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - // Set the path where Thymeleaf will find templates + // 设置Thymeleaf查找模板的路径 templateResolver.setPrefix("/templates/"); - // Set the file extension for templates + // 设置模板的文件扩展名 templateResolver.setSuffix(".html"); - // Set the template mode to HTML + // 设置模板模式为HTML templateResolver.setTemplateMode(TemplateMode.HTML); - // Set the character encoding for templates + // 设置模板的字符编码 templateResolver.setCharacterEncoding("UTF-8"); - // Return the configured template resolver bean + // 返回配置的模板解析器bean return templateResolver; } ``` - -3. **Configure Message Source:** - - Add a method annotated with `@Bean` to configure the message source using `ReloadableResourceBundleMessageSource`. - - Set the default encoding. + +3. **配置消息源:** + - 添加一个带有 `@Bean` 注解的方法,使用 `ReloadableResourceBundleMessageSource` 配置消息源。 + - 设置默认编码。 ```java @Bean public MessageSource messageSource() { - // Create a ReloadableResourceBundleMessageSource bean + // 创建一个 ReloadableResourceBundleMessageSource bean ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - // Set the default encoding for messages + // 设置消息的默认编码 messageSource.setDefaultEncoding("UTF-8"); - // Return the configured message source bean + // 返回配置的消息源bean return messageSource; } ``` -4. **Configure Thymeleaf View Resolver:** - - Create a method annotated with `@Bean` to configure the Thymeleaf view resolver. - - Set the template engine. +4. **配置Thymeleaf视图解析器:** + - 创建一个带有 `@Bean` 注解的方法,以配置Thymeleaf视图解析器。 + - 设置模板引擎。 ```java @Bean public ViewResolver thymeleafViewResolver() { - // Create a ThymeleafViewResolver bean + // 创建一个 ThymeleafViewResolver bean ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - // Set the template engine for the view resolver + // 设置视图解析器的模板引擎 resolver.setTemplateEngine(templateEngine()); - // Return the configured ThymeleafViewResolver bean + // 返回配置的 ThymeleafViewResolver bean return resolver; } ``` -5. **Configure Thymeleaf Template Engine:** - - Implement a method annotated with `@Bean` to configure the Thymeleaf template engine. - - Set the template resolver and template engine message source. +5. **配置Thymeleaf模板引擎:** + - 实现一个带有 `@Bean` 注解的方法,以配置Thymeleaf模板引擎。 + - 设置模板解析器和模板引擎消息源。 ```java @Bean public SpringTemplateEngine templateEngine() { - // Create a SpringTemplateEngine bean + // 创建一个 SpringTemplateEngine bean SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - // Set the template resolver for the template engine + // 为模板引擎设置模板解析器 templateEngine.setTemplateResolver(templateResolver()); - // Set the template engine message source + // 设置模板引擎消息源 templateEngine.setTemplateEngineMessageSource(messageSource()); - // Return the configured SpringTemplateEngine bean + // 返回配置的 SpringTemplateEngine bean return templateEngine; } ``` --- -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). - -# [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file +# [下一步任务:*创建第一个视图*](create-first-view.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/create-first-view.md b/docs/cn/thymeleaf/practice/create-first-view.md index 30577eb..03d9eea 100644 --- a/docs/cn/thymeleaf/practice/create-first-view.md +++ b/docs/cn/thymeleaf/practice/create-first-view.md @@ -1,17 +1,17 @@ -# Create First View +# 创建第一个视图 -**Description:** +**描述:** -In this task, we'll create the first Thymeleaf view for your Spring application. Follow the correct file path as defined in the Thymeleaf configuration and register the view in the application. +在这个任务中,我们将为您的Spring应用程序创建第一个Thymeleaf视图。按照Thymeleaf配置中定义的正确文件路径,并在应用程序中注册视图。 -## **Steps:** +## **步骤:** -1. **Create the View File:** - - Navigate to the directory specified in the Thymeleaf configuration as the prefix for templates. - - By default, the configured prefix is `/templates/`. Therefore, create your Thymeleaf view file within this directory. +1. **创建视图文件:** + - 导航到Thymeleaf配置中指定的目录,该目录是模板的前缀。 + - 默认情况下,配置的前缀是 `/templates/`。因此,请在此目录中创建您的Thymeleaf视图文件。 ```plaintext - Project Directory + 项目目录 └── src └── main └── resources @@ -20,44 +20,40 @@ In this task, we'll create the first Thymeleaf view for your Spring application. └── first.html ``` - Ensure the view file is named appropriately (e.g., `first.html`). The `/templates/` directory is crucial for Thymeleaf to locate and process your templates correctly. + 确保视图文件的命名合适(例如,`first.html`)。`/templates/` 目录对于Thymeleaf正确定位和处理您的模板非常重要。 -2. **Register the View in Configuration Class:** - - Open the configuration class where you set up Thymeleaf (e.g., `WebMvcConfig`). - - Add the following method to register the Thymeleaf view: +2. **在配置类中注册视图:** + - 打开设置Thymeleaf的配置类(例如,`WebMvcConfig`)。 + - 添加以下方法以注册Thymeleaf视图: ```java public void addViewControllers(ViewControllerRegistry registry) { - // First View + // 第一个视图 registry.addViewController("/first").setViewName("practice/first"); } ``` - This method maps the URL path `/first` to the Thymeleaf view named "practice/first". Adjust the path accordingly based on your project structure. + 此方法将 URL 路径 `/first` 映射到名为 "practice/first" 的 Thymeleaf 视图。根据项目结构调整路径。 -3. **Test the View:** - - Run your Spring application. - - Open a web browser and navigate to `http://localhost:8080/first`. You should see the rendered Thymeleaf view. +3. **测试视图:** + - 运行您的Spring应用程序。 + - 打开Web浏览器,导航到 `http://localhost:8080/first`。您应该看到渲染的Thymeleaf视图。 -4. **Optional: Configure Redirect from Root Path:** - - To set the first view as the default page, you can add a redirect from the root path ("/") to the path of the first view in the `addViewControllers` method: +4. **可选: 配置从根路径的重定向:** + - 要将第一个视图设置为默认页面,您可以在 `addViewControllers` 方法中添加从根路径 ("/") 到第一个视图路径的重定向: ```java public void addViewControllers(ViewControllerRegistry registry) { - // First View + // 第一个视图 registry.addViewController("/first").setViewName("practice/first"); - // Redirect from root path to the first view + // 从根路径重定向到第一个视图 registry.addRedirectViewController("/", "/first"); } ``` - Now, visiting `http://localhost:8080/` will automatically redirect to the first view. + 现在,访问 `http://localhost:8080/` 将自动重定向到第一个视图。 --- -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - -# [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file +# [下一个任务: *使用变量*](working-with-variables.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/form-handling.md b/docs/cn/thymeleaf/practice/form-handling.md index c7b6b7b..bfd1b23 100644 --- a/docs/cn/thymeleaf/practice/form-handling.md +++ b/docs/cn/thymeleaf/practice/form-handling.md @@ -1,74 +1,72 @@ -# Form Handling - -**Description:** - -In this continuation, we will focus on handling form submissions and rendering the view using the `PracticeController`. This involves passing the model to the view when displaying it and implementing the logic to handle form submissions. - -**Steps:** - -1. **Show Form View (PracticeController):** - - - Open the `PracticeController` class and add a method to show the form view: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.GetMapping; - - @Controller - public class PracticeController { - - // Other methods... - - @GetMapping("/third") - public String showAddStudentForm(Model model) { - model.addAttribute("model", new StudentModel()); - return "practice/third"; - } - } - ``` - - - Explanation: - - `@GetMapping("/addStudentForm")`: This annotation maps the method to handle GET requests for the `/addStudentForm` endpoint. - - `showAddStudentForm(Model model)`: This method takes a `Model` parameter, adds a new `StudentModel` to it, and returns the view name (`"thirdView"` in this case). Updated to reflect the correct naming of the view. - - The `Model` is populated with a new `StudentModel` instance, which will be used to bind form fields. - -2. **Handle Form Submission (PracticeController):** - - - Add a method in `PracticeController` to handle form submissions: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - students.add(model); - - return "redirect:/third"; - } - } - ``` - - - Explanation: - - `@PostMapping("/addStudent")`: This annotation maps the method to handle POST requests for the `/addStudent` endpoint. - - `addStudent(@ModelAttribute("model") StudentModel model)`: This method takes the `model` attribute from the form submission (`@ModelAttribute`) and processes it. The form data is automatically bound to the `model` object. - - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). - -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. - -# [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file +# 表单处理 + +**描述:** + +在这个续集中,我们将专注于处理表单提交并使用 `PracticeController` 渲染视图。这涉及在显示视图时将模型传递给视图,并实现处理表单提交的逻辑。 + +**步骤:** + +1. **显示表单视图(PracticeController):** + + - 打开 `PracticeController` 类并添加一个方法来显示表单视图: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.GetMapping; + + @Controller + public class PracticeController { + + // 其他方法... + + @GetMapping("/third") + public String showAddStudentForm(Model model) { + model.addAttribute("model", new StudentModel()); + return "practice/third"; + } + } + ``` + + - 解释: + - `@GetMapping("/addStudentForm")`: 这个注解将方法映射到处理 `/addStudentForm` 端点的 GET 请求。 + - `showAddStudentForm(Model model)`: 这个方法接受一个 `Model` 参数,向其添加一个新的 `StudentModel`,并返回视图名称(在这种情况下为 `"thirdView"`)。更新以反映视图的正确命名。 + - `Model` 被填充了一个新的 `StudentModel` 实例,该实例将用于绑定表单字段。 + +2. **处理表单提交(PracticeController):** + + - 在 `PracticeController` 中添加一个方法来处理表单提交: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // 其他方法... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + students.add(model); + + return "redirect:/third"; + } + } + ``` + + - 解释: + - `@PostMapping("/addStudent")`: 这个注解将方法映射到处理 `/addStudent` 端点的 POST 请求。 + - `addStudent(@ModelAttribute("model") StudentModel model)`: 这个方法从表单提交中获取 `model` 属性(`@ModelAttribute`),并处理它。表单数据会自动绑定到 `model` 对象。 + - 此方法内的逻辑将学生添加到 `students` 列表中。在实际情况下,您通常会将学生保存到数据库或执行其他必要的操作。 + - `return "redirect:/third";`: 此行将用户重定向回表单视图(`/third`)。 + +--- + +# [下一个任务: *查询参数和验证*](validation.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/forms.md b/docs/cn/thymeleaf/practice/forms.md index 3876c1d..54c312e 100644 --- a/docs/cn/thymeleaf/practice/forms.md +++ b/docs/cn/thymeleaf/practice/forms.md @@ -1,120 +1,118 @@ -# Forms - -**Description:** - -In this task, you will create a new Thymeleaf view named `third.html` and implement form handling logic in the `PracticeController`. The form allows users to add a new student with specific details, and the controller will process the form submission. - -**Steps:** - -1. **Create Third View (third.html):** - - - Create a new Thymeleaf view file named `third.html` in the `/src/main/resources/templates/practice` directory. - - ```html - - - - - Add Student Form - - -
- Add Student - -
- -

- - -

-
-
- - - ``` - -2. **Configure Form Submission:** - - - In the `form` tag, configure the form submission details: - - ```html -
- ``` - - - Explanation: - - `action="#"`: This attribute specifies the URL to which the form data will be sent upon submission. `#` indicates the form will be submitted to the same URL it originated from. - - `th:action="@{/addStudent}"`: This Thymeleaf attribute dynamically sets the form action based on the Thymeleaf expression. `@{/addStudent}` generates the absolute URL for the `/addStudent` endpoint. - - `th:object="${model}"`: This attribute associates the form with a backing object (`model`). Thymeleaf uses this object to bind form fields to properties during form submission and rendering. - - `method="post"`: This attribute specifies the HTTP method used when sending form data to the server. It's set to `post`, indicating that the form data will be sent in the request body. - -3. **Pass the 'id' Field:** - - - In the form, locate the section for the `id` field: - - ```html - -

- - -

- ``` - - - Explanation: - - `th:field="*{id}"`: This Thymeleaf attribute binds the input field to the `id` property of the `model` object. It ensures that the value entered in the input field will be set to the `id` property when the form is submitted. - - `id="id"` and `name="id"`: These attributes provide identifiers for the input field. - -4. **Repeat these steps:** - - - Repeat these steps for each remaining field (`firstName`, `sureName`, `isGraduated`, and `mark`). Ensure that you update the `label`, `id`, `name`, and `th:field` attributes accordingly. - - There is code example: +# 表单 + +**描述:** + +在这个任务中,您将创建一个名为 `third.html` 的新的 Thymeleaf 视图,并在 `PracticeController` 中实现表单处理逻辑。该表单允许用户添加具有特定详细信息的新学生,控制器将处理表单提交。 + +**步骤:** + +1. **创建第三个视图(third.html):** + + - 在 `/src/main/resources/templates/practice` 目录中创建一个名为 `third.html` 的新的 Thymeleaf 视图文件。 + + ```html + + + + + 添加学生表单 + + +
+ 添加学生 + + + +

+ + +

+ +
+ + + ``` + +2. **配置表单提交:** + + - 在 `form` 标签中配置表单提交详情: + + ```html +
+ ``` + + - 解释: + - `action="#"`: 此属性指定表单数据在提交时将发送到的 URL。`#` 表示表单将提交到其来源的相同 URL。 + - `th:action="@{/addStudent}"`: 这个 Thymeleaf 属性根据 Thymeleaf 表达式动态设置表单动作。`@{/addStudent}` 为 `/addStudent` 端点生成绝对 URL。 + - `th:object="${model}"`: 此属性将表单与后备对象(`model`)关联起来。Thymeleaf 使用此对象在表单提交和渲染过程中将表单字段绑定到属性。 + - `method="post"`: 此属性指定将表单数据发送到服务器时使用的 HTTP 方法。它设置为 `post`,表示表单数据将在请求体中发送。 + +3. **传递 'id' 字段:** + + - 在表单中,找到 `id` 字段的部分: + + ```html + +

+ + +

+ ``` + + - 解释: + - `th:field="*{id}"`: 此 Thymeleaf 属性将输入字段绑定到 `model` 对象的 `id` 属性。它确保在表单提交时将输入字段中输入的值设置为 `id` 属性。 + - `id="id"` 和 `name="id"`: 这些属性为输入字段提供标识符。 + +4. **重复这些步骤:** + + - 对于每个剩余字段(`firstName`、`sureName`、`isGraduated` 和 `mark`),重复这些步骤。确保根据需要更新 `label`、`id`、`name` 和 `th:field` 属性。 + - 这里是代码示例: ```html - Add Student Form + 添加学生表单
- Add Student + 添加学生 - +

- +

- +

- +

- +

- - + +
``` -## Result -Your view should look like that: +## 结果 +您的视图应如下所示: ![third-view.png](../../../srcs/thymeleaf/third-view.png) -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. +--- -# [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file +# [下一个任务: *表单处理*](form-handling.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/fragments-and-layouts.md b/docs/cn/thymeleaf/practice/fragments-and-layouts.md index b3e2f8e..99f4dca 100644 --- a/docs/cn/thymeleaf/practice/fragments-and-layouts.md +++ b/docs/cn/thymeleaf/practice/fragments-and-layouts.md @@ -1,130 +1,128 @@ -# Fragments and Layouts - -**Description:** - -In this section, we will implement Thymeleaf fragments and layouts. We'll update existing views to include fragments, and then create a new view that utilizes these fragments. - -## **Steps:** - -1. **Update `first.html` with a Fragment:** - - - Open the `first.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
-

This is the information section of the first view.

-
- - - - ``` - -2. **Update `second.html` with a Fragment:** - - - Open the `second.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `` inside the `` tag: - - ```html - - - - - - - -
- - - - - - - - - - - - - -
IdFirstNameSecondNameGraduatedMarkDiploma Type
- - - - ``` - -3. **Update `third.html` with a Fragment:** - - - Open the `third.html` file in the `practice` directory. - - Add the `th:fragment` attribute to the `
` inside the `` tag: - - ```html - - - - - - - -
- Add Student - -
-

Student Added Successfully!

-
- -
- -
-
- - - - ``` - -4. **Create `fourth.html` with Fragments Usage:** - - - Create a new file named `fourth.html` in the `practice` directory. - - Use the `th:insert` and `th:replace` attributes to include the fragments from other views: - - ```html - - - - - - - -
- - -
- - -
- - - - ``` - - - Explanation: - - `th:insert` is used to include the content of the specified fragment (`info` and `add-student-form`) in the `fourth.html` file. - - `th:replace` is used to replace the content of the specified fragment (`students-table`) in the `fourth.html` file. - -## Result -Your view should look like that: +# 片段和布局 + +**描述:** + +在这一部分中,我们将实现 Thymeleaf 片段和布局。我们将更新现有视图以包含片段,然后创建一个新的视图来利用这些片段。 + +## **步骤:** + +1. **在 `first.html` 中添加一个片段:** + + - 打开 `practice` 目录中的 `first.html` 文件。 + - 在 `` 标签内的 `
` 中添加 `th:fragment` 属性: + + ```html + + + + + + + +
+

这是第一个视图的信息部分。

+
+ + + + ``` + +2. **在 `second.html` 中添加一个片段:** + + - 打开 `practice` 目录中的 `second.html` 文件。 + - 在 `` 标签内的 `` 中添加 `th:fragment` 属性: + + ```html + + + + + + + +
+ + + + + + + + + + + + + +
IdFirstNameSecondNameGraduatedMarkDiploma Type
+ + + + ``` + +3. **在 `third.html` 中添加一个片段:** + + - 打开 `practice` 目录中的 `third.html` 文件。 + - 在 `` 标签内的 `
` 中添加 `th:fragment` 属性: + + ```html + + + + + + + +
+ 添加学生 + +
+

学生添加成功!

+
+ +
+ +
+
+ + + + ``` + +4. **创建一个带有片段的 `fourth.html` :** + + - 在 `practice` 目录中创建一个名为 `fourth.html` 的新文件。 + - 使用 `th:insert` 和 `th:replace` 属性来包含其他视图中的片段: + + ```html + + + + + + + +
+ + +
+ + +
+ + + + ``` + + - 解释: + - `th:insert` 用于将指定片段(`info` 和 `add-student-form`)的内容包含在 `fourth.html` 文件中。 + - `th:replace` 用于在 `fourth.html` 文件中替换指定片段(`students-table`)的内容。 + +## 结果 +您的视图应如下所示: ![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) -**Conclusion:** +--- -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. - -# Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file +# 恭喜! 您已完成所有任务。现在让我们转到 **[实验室任务](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/iteration.md b/docs/cn/thymeleaf/practice/iteration.md index 9f8cc3a..df49b7b 100644 --- a/docs/cn/thymeleaf/practice/iteration.md +++ b/docs/cn/thymeleaf/practice/iteration.md @@ -1,13 +1,13 @@ -# Iteration +# 迭代 -**Description:** +**描述:** -In this task, you will explore the concept of iteration in Thymeleaf by creating a `StudentModel` class in the `models/` package and populating a list of students in the `PracticeController`. The goal is to pass the list of students to the `secondView` and render a table displaying the student details. +在这个任务中,您将通过在`models/`包中创建一个`StudentModel`类并在`PracticeController`中填充学生列表来探索Thymeleaf中的迭代概念。目标是将学生列表传递给`secondView`,并渲染显示学生详细信息的表格。 -**Steps:** +**步骤:** -1. **Create StudentModel:** - - In the `models/` package, create a `StudentModel` class with the following attributes: +1. **创建 StudentModel:** + - 在 `models/` 包中创建一个 `StudentModel` 类,具有以下属性: ```java public class StudentModel { @@ -21,8 +21,8 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating } ``` -2. **Populate List of Students in PracticeController:** - - In the `PracticeController` class, create a list of `StudentModel` and populate it with fake student details: +2. **在 PracticeController 中填充学生列表:** + - 在 `PracticeController` 类中,创建一个 `StudentModel` 列表并用假的学生详情填充它: ```java @Controller @@ -41,8 +41,8 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating } ``` -3. **Pass Students to secondView:** - - In the `secondView` method of the `PracticeController`, add the list of students to the model. +3. **将学生传递给 secondView:** + - 在 `PracticeController` 的 `secondView` 方法中,将学生列表添加到模型中。 ```java @Controller @@ -58,11 +58,11 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating } ``` -4. **Render Students Table in second.html:** - - Open the `second.html` Thymeleaf view file. +4. **在 second.html 中渲染学生表:** + - 打开 `second.html` Thymeleaf 视图文件。 -5. **Render Table Header:** - - Add the table header section within the `` tag: +5. **渲染表头:** + - 在 `` 标签内添加表头部分: ```html @@ -79,8 +79,8 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating
``` -6. **Render Table Body with Iteration:** - - Add the table body section within the `` tag and iterate over the list of students to render each row: +6. **使用迭代渲染表体:** + - 在 `` 标签内添加表体部分,并对学生列表进行迭代以渲染每一行: ```html @@ -95,13 +95,11 @@ In this task, you will explore the concept of iteration in Thymeleaf by creating ``` -## Result -Your page should look like that: +## 结果 +您的页面应如下所示: ![second-view.png](../../../srcs/thymeleaf/second-view.png) -**Conclusion:** +--- -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. - -# [NEXT TASK: *Literals*](literals.md) \ No newline at end of file +# [下一个任务:*字面值*](literals.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/literals.md b/docs/cn/thymeleaf/practice/literals.md index f77ca7b..6e6b025 100644 --- a/docs/cn/thymeleaf/practice/literals.md +++ b/docs/cn/thymeleaf/practice/literals.md @@ -1,55 +1,53 @@ -# Literals +# 字面值 -**Description:** +**描述:** -In this task, you will enhance the `second.html` Thymeleaf view by incorporating literals to display modified values based on certain conditions. The literals include adding a constant value to the `id`, displaying "Yes" or "No" for the "Graduated" field, and providing descriptive labels for the "Mark" and "Diploma Type" fields. +在这个任务中,您将通过在 `second.html` Thymeleaf 视图中引入字面值来增强视图,以根据特定条件显示修改后的值。字面值包括将常量值添加到 `id`,在“Graduated”字段中显示“是”或“否”,以及为“Mark”和“Diploma Type”字段提供描述性标签。 -**Steps:** +**步骤:** -1. **Update students-table Fragment in second.html:** - - Open the `second.html` Thymeleaf view file. +1. **更新 second.html 中的 students-table 片段:** + - 打开 `second.html` Thymeleaf 视图文件。 -2. **Enhance Literal for Student Id:** - - Modify the expression for the `id` field to add a constant value (e.g., 100000) to the actual student id. +2. **增强学生 ID 的字面值:** + - 修改 `id` 字段的表达式,将常量值(例如 100000)添加到实际学生 ID。 ```html ``` -3. **Enhance Literal for Graduated Field:** - - Update the expression for the "Graduated" field to display "Yes" if the student is graduated, and "No" otherwise. +3. **增强 Graduated 字段的字面值:** + - 更新“Graduated”字段的表达式,如果学生毕业,则显示“是”,否则显示“否”。 ```html - + ``` -4. **Enhance Literal for Mark Field:** - - Add conditional expressions to display descriptive labels for the "Mark" field based on the student's mark. +4. **增强 Mark 字段的字面值:** + - 添加条件表达式,根据学生的分数显示“Mark”字段的描述性标签。 ```html - Good - Very Good - Excellent - Not Passed + 良好 + 很好 + 优秀 + 未通过 ``` -5. **Add Literal for Diploma Type Field:** - - Add conditional expressions to display descriptive labels for the "Diploma Type" field based on the student's mark and graduation status. +5. **为 Diploma Type 字段添加字面值:** + - 添加条件表达式,根据学生的分数和毕业状态显示“Diploma Type”字段的描述性标签。 ```html - Blue - Blue - Red - No Diploma + 蓝色 + 蓝色 + 红色 + 无毕业证书 ``` -## Result -Your view should look like that: +## 结果 +您的页面应如下所示: ![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) -**Conclusion:** +--- -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. - -# [NEXT TASK: *Forms*](forms.md) \ No newline at end of file +# [下一个任务:*表单*](forms.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/validation.md b/docs/cn/thymeleaf/practice/validation.md index 283fba4..844a27f 100644 --- a/docs/cn/thymeleaf/practice/validation.md +++ b/docs/cn/thymeleaf/practice/validation.md @@ -1,85 +1,83 @@ -# Query Parameter and Validation - -**Description:** - -In this continuation, we will explore using query parameters to display messages in the view after handling form submissions. This involves adapting the `thirdView` to show both success and error messages based on query parameters. - -**Steps:** - -1. **Adapt the View (thirdView.html):** - - - Open the `third.html` file and add sections to display both success and error messages: - - ```html - - - - - - - - -
-

Student Added Successfully!

-
- -
-

Error:

-
- - - - - ``` - - - Explanation: - - The `
` checks if the query parameter `error` is present in the URL. - - If the parameter is present, it displays an error message in red, retrieved from `${param.error}`. - -2. **Handle Form Submission with Additional Validation (PracticeController):** - - - Update the `addStudent` method in `PracticeController` to include additional validation for the student's mark using an `if-else` structure: - - ```java - import org.springframework.stereotype.Controller; - import org.springframework.ui.Model; - import org.springframework.web.bind.annotation.*; - - import java.util.ArrayList; - import java.util.List; - - @Controller - public class PracticeController { - - private final List students = new ArrayList<>(); - - // Other methods... - - @PostMapping("/addStudent") - public String addStudent(@ModelAttribute("model") StudentModel model) { - // Additional validation: Check if the mark is more than 5. - if (model.getMark() > 5) { - // If the mark is more than 5, redirect with an error message. - return "redirect:/third?error=Mark should not be more than 5"; - } else { - students.add(model); - - return "redirect:/third?addedStudent=true"; - } - } - } - ``` - -## Result -Your view should look like that: +# 查询参数和验证 + +**描述:** + +在这个继续中,我们将探讨使用查询参数在视图中显示处理表单提交后的消息。这涉及调整 `thirdView` 来根据查询参数显示成功和错误消息。 + +**步骤:** + +1. **调整视图(thirdView.html):** + + - 打开 `third.html` 文件,并添加显示成功和错误消息的部分: + + ```html + + + + + + + + +
+

学生添加成功!

+
+ +
+

错误:

+
+ + + + + ``` + + - 说明: + - `
` 检查URL中是否存在查询参数 `error`。 + - 如果参数存在,则以红色显示来自 `${param.error}` 的错误消息。 + +2. **处理表单提交并进行额外验证(PracticeController):** + + - 更新 `PracticeController` 中的 `addStudent` 方法,使用 `if-else` 结构包含对学生分数的额外验证: + + ```java + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.*; + + import java.util.ArrayList; + import java.util.List; + + @Controller + public class PracticeController { + + private final List students = new ArrayList<>(); + + // 其他方法... + + @PostMapping("/addStudent") + public String addStudent(@ModelAttribute("model") StudentModel model) { + // 额外验证: 检查分数是否超过5分。 + if (model.getMark() > 5) { + // 如果分数超过5分,重定向并显示错误消息。 + return "redirect:/third?error=分数不能超过5分"; + } else { + students.add(model); + + return "redirect:/third?addedStudent=true"; + } + } + } + ``` + +## 结果 +您的视图应如下所示: ![third-view-error.png](../../../srcs/thymeleaf/third-view-success.png) ![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. +--- -# [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file +# [下一个任务: *片段和布局*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/variables-and-controller.md b/docs/cn/thymeleaf/practice/variables-and-controller.md index ca4ad12..bcc52f7 100644 --- a/docs/cn/thymeleaf/practice/variables-and-controller.md +++ b/docs/cn/thymeleaf/practice/variables-and-controller.md @@ -1,16 +1,16 @@ -# Variables and Controller +# 变量和控制器 -**Description:** +**描述:** -In this task, you will create a new Thymeleaf view named `second.html` and explore the concept of passing variables from the controller to the view. Instead of defining the title as a local variable in the view, we will pass it through the controller. +在这个任务中,你将创建一个名为 `second.html` 的新的 Thymeleaf 视图,并探索从控制器传递变量到视图的概念。我们将不再在视图中定义标题为局部变量,而是通过控制器传递。 -**Steps:** +**步骤:** -1. **Create the New View File:** - - Create a new Thymeleaf view file named `second.html` in the `/src/main/resources/templates/` directory. +1. **创建新的视图文件:** + - 在 `/src/main/resources/templates/` 目录中创建一个名为 `second.html` 的新的 Thymeleaf 视图文件。 ```plaintext - Project Directory + 项目目录 └── src └── main └── resources @@ -19,8 +19,8 @@ In this task, you will create a new Thymeleaf view named `second.html` and explo └── second.html ``` -2. **Define the Controller:** - - In your controller class (e.g., `PracticeController`), define a method that maps to the URL path associated with the new view. Pass the desired variable (e.g., `title`) to the model. +2. **定义控制器:** + - 在你的控制器类(例如 `PracticeController`)中,定义一个方法,将其映射到与新视图关联的 URL 路径。将所需的变量(例如 `title`)传递到模型中。 ```java @Controller @@ -28,40 +28,38 @@ In this task, you will create a new Thymeleaf view named `second.html` and explo @GetMapping("/second") public String secondView(Model model) { - // Pass variables to the view - model.addAttribute("title", "Second Page"); + // 将变量传递到视图 + model.addAttribute("title", "第二页"); - // Return the view name + // 返回视图名称 return "practice/second"; } } ``` - This controller method maps to the URL path `/second` and passes the variable `title` with the value "Second Page" to the Thymeleaf view. + 此控制器方法将映射到 URL 路径 `/second`,并将变量 `title` 的值设置为 "第二页" 传递给 Thymeleaf 视图。 -3. **Update the View to Use Controller-Passed Variable:** - - Open the `second.html` Thymeleaf view file. - - Use the `title` variable passed from the controller in the `

` tag. +3. **更新视图以使用控制器传递的变量:** + - 打开 `second.html` Thymeleaf 视图文件。 + - 在 `

` 标签中使用从控制器传递的 `title` 变量。 ```html - Title + 标题 -

Welcome to the Second Page

- - Go Back to Home +

欢迎来到第二页

+ + 返回首页 ``` - The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. + `th:text="${title}"` 表达式检索从控制器传递的 `title` 变量的值。 -**Conclusion:** +--- -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task - -# [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file +# [下一个任务: *迭代*](iteration.md) \ No newline at end of file diff --git a/docs/cn/thymeleaf/practice/working-with-variables.md b/docs/cn/thymeleaf/practice/working-with-variables.md index 43ea184..43044a6 100644 --- a/docs/cn/thymeleaf/practice/working-with-variables.md +++ b/docs/cn/thymeleaf/practice/working-with-variables.md @@ -1,27 +1,27 @@ -# Working with variables +# 处理变量 -**Description:** +**描述:** -In this task, you will explore and utilize different types of local variables in Thymeleaf within your Spring application's views. These include variables defined within the view itself, variables passed from the controller, variables defined in a properties file for localization, and static variables defined in the Thymeleaf configuration class. +在这个任务中,你将探索和利用 Thymeleaf 视图中的不同类型的局部变量,在你的 Spring 应用程序中。这些包括在视图本身中定义的变量,从控制器传递的变量,本地化的属性文件中定义的变量,以及在 Thymeleaf 配置类中定义的静态变量。 -## **Steps:** +## **步骤:** -1. **Define Local Variables in Thymeleaf View:** - - Open your Thymeleaf view file (e.g., `first.html`). - - Explore the usage of local variables defined directly within the view. - - In the example code provided: +1. **在 Thymeleaf 视图中定义局部变量:** + - 打开你的 Thymeleaf 视图文件(例如 `first.html`)。 + - 探索直接在视图中定义的局部变量的使用。 + - 在提供的示例代码中: ```html - + - Title + 标题 ``` - The local variable `title` is defined within the `` section of the HTML. + 局部变量 `title` 是在 HTML 的 `` 部分内定义的。 -2. **Localization Variables from Properties File:** - - Review the configuration of the `MessageSource` bean in your Thymeleaf configuration class: +2. **从属性文件中获取本地化变量:** + - 查看 Thymeleaf 配置类中 `MessageSource` bean 的配置: ```java @Bean @@ -33,35 +33,35 @@ In this task, you will explore and utilize different types of local variables in return messageSource; } ``` - - Create a `practice.properties` file in the path `/src/main/resources/local/` and add the following content: + - 在路径 `/src/main/resources/local/` 下创建一个 `practice.properties` 文件,并添加以下内容: - ```properties - student.name=MyName - student.group=PRE-121 - message.welcome=Welcome, {0} - message.info=Your Group is: {0} - ``` - **Note on `{0}`:** - - The notation `{0}` in localization messages represents a placeholder for a variable. When the message is rendered, the placeholder `{0}` is replaced with the actual value provided in the message. For example, in the message `Welcome, {0}`, `{0}` will be replaced with the value of the variable, such as a name. + ```properties + student.name=我的名字 + student.group=PRE-121 + message.welcome=欢迎,{0} + message.info=你的小组是: {0} + ``` + **关于 `{0}` 的说明:** + - 本地化消息中的符号 `{0}` 表示一个占位符变量。当消息被渲染时,占位符 `{0}` 会被提供的实际值替换。例如,在消息 `欢迎,{0}` 中,`{0}` 将被变量的实际值替换,比如一个名字。 - - Explore the usage of localized variables in the Thymeleaf view using the `#{}` syntax. - - In the example code provided: + - 使用 `#{}` 语法在 Thymeleaf 视图中探索本地化变量的用法。 + - 在提供的示例代码中: - ```html -

-

- ``` + ```html +

+

+ ``` - The variables `student.name`, `student.group`, `message.welcome` and `message.info` are all implementing this idea. + 变量 `student.name`,`student.group`,`message.welcome` 和 `message.info` 都实现了这个想法。 -3. **Static Variables in Thymeleaf Configuration Class:** - - In your Thymeleaf configuration class, add static variables using the `addStaticVariable` method: +3. **在 Thymeleaf 配置类中添加静态变量:** + - 在你的 Thymeleaf 配置类中,使用 `addStaticVariable` 方法添加静态变量: ```java @Bean public ViewResolver thymeleafViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.addStaticVariable("projectName", "Practice Tasks"); + resolver.addStaticVariable("projectName", "练习任务"); resolver.addStaticVariable("currentDateTime", LocalDateTime.now()); resolver.setTemplateEngine(templateEngine()); @@ -69,24 +69,20 @@ In this task, you will explore and utilize different types of local variables in } ``` - - Access these static variables in the Thymeleaf view using the `#vars` syntax. - - In the example code provided: + - 使用 `#vars` 语法在 Thymeleaf 视图中访问这些静态变量。 + - 在提供的示例代码中: - ```html -

Project Name

-

Current Date and Time

- ``` - -## Result - -now your page should look like that: + ```html +

项目名称

+

当前日期和时间

+ ``` -![first-view.png](../../../srcs/thymeleaf/first-view.png) +## 结果 -**Conclusion:** +现在你的页面应该如下所示: -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. +![first-view.png](../../../srcs/thymeleaf/first-view.png) -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. +--- -# [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file +# [下一个任务: *变量和控制器*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/cn/transactions/lab-work.md b/docs/cn/transactions/lab-work.md index 0f1c1a1..08b3d32 100644 --- a/docs/cn/transactions/lab-work.md +++ b/docs/cn/transactions/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/transactions/lab-work.md) | 中文 | [Русский](../../ru/transactions/lab-work.md) + + # 事务实验任务 欢迎来到事务实验任务!这一系列任务的目标是帮助您练习并掌握在Spring应用程序中管理事务。无论您是初学者还是希望提升技能,这些实践任务都将引导您探索事务管理的各个方面,包括传播、隔离级别、嵌套事务等。 diff --git a/docs/en/jmeter/lab-work.md b/docs/en/jmeter/lab-work.md index 7758ec7..df0e63a 100644 --- a/docs/en/jmeter/lab-work.md +++ b/docs/en/jmeter/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/jmeter/lab-work.md) | [Русский](../../ru/jmeter/lab-work.md) + + # JMeter Lab Work Welcome to the JMeter Lab Work! The goal of this series of tasks is to help you practice and master JMeter, a powerful tool for performance testing and measuring the performance of web applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of using JMeter for load testing, recording, and analyzing HTTP requests. diff --git a/docs/en/jpa/lab-work.md b/docs/en/jpa/lab-work.md index c30081a..22c8282 100644 --- a/docs/en/jpa/lab-work.md +++ b/docs/en/jpa/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/jpa/lab-work.md) | [Русский](../../ru/jpa/lab-work.md) + + # Lab Work: JPA (Java Persistence API) Welcome to the Spring Boot with JPA Lab Work! In this lab work, you will practice various tasks related to setting up a Spring Boot project with JPA (Java Persistence API). diff --git a/docs/en/springsecurity/lab-work.md b/docs/en/springsecurity/lab-work.md index 245d193..5c795fd 100644 --- a/docs/en/springsecurity/lab-work.md +++ b/docs/en/springsecurity/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/springsecurity/lab-work.md) | [Русский](../../ru/springsecurity/lab-work.md) + + # Spring Security Lab Work Welcome to the Spring Security Lab Work! The goal of this series of tasks is to help you practice and get know to Spring Security, and make an enough startup project. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of security integration in a Spring application. diff --git a/docs/en/springsecurity/practice/add-dummy-users.md b/docs/en/springsecurity/practice/add-dummy-users.md index 5d8d81b..de6300e 100644 --- a/docs/en/springsecurity/practice/add-dummy-users.md +++ b/docs/en/springsecurity/practice/add-dummy-users.md @@ -61,4 +61,4 @@ Update the `CustomUserDetailsService` class to include a method for adding dummy --- -# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) \ No newline at end of file +# [NEXT TASK: Create Identity to Users](create-identity-to-users.md) diff --git a/docs/en/springsecurity/practice/authorize-client-authority.md b/docs/en/springsecurity/practice/authorize-client-authority.md index cb36a1d..cf24bc7 100644 --- a/docs/en/springsecurity/practice/authorize-client-authority.md +++ b/docs/en/springsecurity/practice/authorize-client-authority.md @@ -52,4 +52,4 @@ By following these steps, you can control the visibility of elements in your Thy --- -# [NEXT TASK: Lab Tasks](../lab-work.md) +# [NEXT TASK: Custom Login Form](custom-login-form.md) diff --git a/docs/en/springsecurity/practice/authorize-server-authenticated.md b/docs/en/springsecurity/practice/authorize-server-authenticated.md index ef1e7a4..5b9cd1b 100644 --- a/docs/en/springsecurity/practice/authorize-server-authenticated.md +++ b/docs/en/springsecurity/practice/authorize-server-authenticated.md @@ -35,4 +35,4 @@ Authorize access to the `/second` path only for authenticated users while allowi --- -# [NEXT TASK: Authorize by Role](authorize-server-role.md) \ No newline at end of file +# [NEXT TASK: Authorize by Role](authorize-server-role.md) diff --git a/docs/en/springsecurity/practice/authorize-server-authority.md b/docs/en/springsecurity/practice/authorize-server-authority.md index d0abdeb..8484252 100644 --- a/docs/en/springsecurity/practice/authorize-server-authority.md +++ b/docs/en/springsecurity/practice/authorize-server-authority.md @@ -36,4 +36,4 @@ Authorize access to the `/addStudent` path for users with the `WRITE` authority --- -# [NEXT TASK: Custom Login Form](custom-login-form.md) \ No newline at end of file +# [NEXT TASK: Configure Thymeleaf Security](configure-thymeleaf-security.md) \ No newline at end of file diff --git a/docs/en/springsecurity/practice/configure-spring-security.md b/docs/en/springsecurity/practice/configure-spring-security.md index c6bcf19..29a4e40 100644 --- a/docs/en/springsecurity/practice/configure-spring-security.md +++ b/docs/en/springsecurity/practice/configure-spring-security.md @@ -77,4 +77,4 @@ The goal of this task is to integrate Spring Security into your existing project --- -# [Next Task: Create a Base Implementation for User](base-implementation-user.md) +# [Next Task: Authorize Authenticated Users](authorize-client-authenticated.md) diff --git a/docs/en/springsecurity/practice/custom-login-form.md b/docs/en/springsecurity/practice/custom-login-form.md index 720cec9..fb8132c 100644 --- a/docs/en/springsecurity/practice/custom-login-form.md +++ b/docs/en/springsecurity/practice/custom-login-form.md @@ -37,4 +37,4 @@ Activate the custom login form page that has already been created in specific pa --- -# [TASKS](../lab-work.md) +# [NEXT: TASKS](../lab-work.md) diff --git a/docs/en/springsecurity/practice/setup-server-authorization.md b/docs/en/springsecurity/practice/setup-server-authorization.md index 68cd220..5c23912 100644 --- a/docs/en/springsecurity/practice/setup-server-authorization.md +++ b/docs/en/springsecurity/practice/setup-server-authorization.md @@ -38,4 +38,4 @@ Configure authorization rules to restrict or allow access to various paths and e --- -# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) \ No newline at end of file +# [NEXT TASK: Authorize Authenticated Users](authorize-server-authenticated.md) diff --git a/docs/en/springsecurity/tasks.md b/docs/en/springsecurity/tasks.md deleted file mode 100644 index 52f7231..0000000 --- a/docs/en/springsecurity/tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -- Setup and Configuration -- base implementation to user -- password hashing algorithms -- add dummy users ( password hashing) -- create identity to users -- - -## TASKS -- create allowed paths -- create authenticated paths ( form-based ) -- create admin page ( role based ) -- hide and show content in depends on authorities and role. -- photo of tree of roles and controllers that will access this in both sides ( client, server ) \ No newline at end of file diff --git a/docs/en/thymeleaf/lab-work.md b/docs/en/thymeleaf/lab-work.md index 60ed23c..f548e74 100644 --- a/docs/en/thymeleaf/lab-work.md +++ b/docs/en/thymeleaf/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/thymeleaf/lab-work.md) | [Русский](../../ru/thymeleaf/lab-work.md) + + # Thymeleaf Lab Work Welcome to the Thymeleaf Lab Work! The goal of this series of tasks is to help you practice and master Thymeleaf, a powerful template engine for Java applications. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of Thymeleaf integration in a Spring application. @@ -68,6 +71,4 @@ The primary goal of this lab work is to provide you with practical experience an ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) -Feel free to explore and complete these tasks at your own pace. Each task is designed to further enhance your skills in Thymeleaf and web development. If you have any questions or need assistance, feel free to reach out. -Happy coding! diff --git a/docs/en/thymeleaf/practice/configure-thymeleaf.md b/docs/en/thymeleaf/practice/configure-thymeleaf.md index 2c016c4..0bb9809 100644 --- a/docs/en/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/en/thymeleaf/practice/configure-thymeleaf.md @@ -112,8 +112,6 @@ This task involves setting up Thymeleaf within a Spring application, enabling se --- -**Conclusion:** - -Congratulations! You have successfully configured Thymeleaf in your Spring application. This setup allows for seamless integration of Thymeleaf templates, providing a powerful tool for dynamic web content. If you want to delve deeper into Thymeleaf configuration or explore advanced features, feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html). +--- # [NEXT TASK: *Create First View*](create-first-view.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/create-first-view.md b/docs/en/thymeleaf/practice/create-first-view.md index 30577eb..710d029 100644 --- a/docs/en/thymeleaf/practice/create-first-view.md +++ b/docs/en/thymeleaf/practice/create-first-view.md @@ -56,8 +56,4 @@ In this task, we'll create the first Thymeleaf view for your Spring application. --- -**Conclusion:** - -You have successfully created and registered your first Thymeleaf view. Ensure you follow the correct file path as defined in the Thymeleaf configuration. - # [NEXT TASK: *Working With Variables*](working-with-variables.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/form-handling.md b/docs/en/thymeleaf/practice/form-handling.md index c7b6b7b..c9ff294 100644 --- a/docs/en/thymeleaf/practice/form-handling.md +++ b/docs/en/thymeleaf/practice/form-handling.md @@ -67,8 +67,6 @@ In this continuation, we will focus on handling form submissions and rendering t - The logic inside this method adds the student to the `students` list. In a real-world scenario, you would typically save the student to a database or perform other necessary actions. - `return "redirect:/third";`: This line redirects the user back to the form view (`/third`). -**Conclusion:** - -You have successfully implemented form handling in Thymeleaf, including showing the form view and handling form submissions in the `PracticeController`. Users can navigate to the form, submit student details. +--- # [NEXT TASK: *Query Parameter and Validation*](validation.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/forms.md b/docs/en/thymeleaf/practice/forms.md index 3876c1d..10d76be 100644 --- a/docs/en/thymeleaf/practice/forms.md +++ b/docs/en/thymeleaf/practice/forms.md @@ -113,8 +113,6 @@ Your view should look like that: ![third-view.png](../../../srcs/thymeleaf/third-view.png) -**Conclusion:** - -You have successfully set up the form in `third.html` and passed each field to the `PracticeController` using Thymeleaf's form binding. +--- # [NEXT TASK: *Form Handling*](form-handling.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/fragments-and-layouts.md b/docs/en/thymeleaf/practice/fragments-and-layouts.md index b3e2f8e..16651f7 100644 --- a/docs/en/thymeleaf/practice/fragments-and-layouts.md +++ b/docs/en/thymeleaf/practice/fragments-and-layouts.md @@ -123,8 +123,6 @@ Your view should look like that: ![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) -**Conclusion:** - -You have successfully implemented Thymeleaf fragments and layouts. The fragments are now correctly marked with `th:fragment` attributes inside the respective views, enabling their usage in the `fourth.html` layout. +--- # Congratulations ! you completed all tasks. now let's move to **[Lab work tasks](../lab-work.md#lab-work-tasks)** \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/iteration.md b/docs/en/thymeleaf/practice/iteration.md index 9f8cc3a..8d37079 100644 --- a/docs/en/thymeleaf/practice/iteration.md +++ b/docs/en/thymeleaf/practice/iteration.md @@ -100,8 +100,6 @@ Your page should look like that: ![second-view.png](../../../srcs/thymeleaf/second-view.png) -**Conclusion:** - -You have successfully implemented iteration in Thymeleaf by creating a list of `StudentModel` objects, passing it to the `secondView`, and rendering a table of students in the `second.html` view. This approach allows you to dynamically display data in tables based on the provided model. +--- # [NEXT TASK: *Literals*](literals.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/literals.md b/docs/en/thymeleaf/practice/literals.md index f77ca7b..0841931 100644 --- a/docs/en/thymeleaf/practice/literals.md +++ b/docs/en/thymeleaf/practice/literals.md @@ -48,8 +48,6 @@ Your view should look like that: ![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) -**Conclusion:** - -You have successfully enhanced the `second.html` Thymeleaf view by incorporating literals to modify the displayed values based on certain conditions. This approach allows you to provide more descriptive and dynamic content in your views. +--- # [NEXT TASK: *Forms*](forms.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/validation.md b/docs/en/thymeleaf/practice/validation.md index 283fba4..00de7cb 100644 --- a/docs/en/thymeleaf/practice/validation.md +++ b/docs/en/thymeleaf/practice/validation.md @@ -78,8 +78,6 @@ Your view should look like that: ![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) -**Conclusion:** - -You have successfully adapted the `third` to display both success and error messages based on query parameters. This provides a more comprehensive feedback mechanism for users interacting with the form. +--- # [NEXT TASK: *Fragments and Layouts*](fragments-and-layouts.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/variables-and-controller.md b/docs/en/thymeleaf/practice/variables-and-controller.md index ca4ad12..1c2c04b 100644 --- a/docs/en/thymeleaf/practice/variables-and-controller.md +++ b/docs/en/thymeleaf/practice/variables-and-controller.md @@ -60,8 +60,6 @@ In this task, you will create a new Thymeleaf view named `second.html` and explo The `th:text="${title}"` expression retrieves the value of the `title` variable passed from the controller. -**Conclusion:** - -You have successfully created a new Thymeleaf view (`second.html`) and explored the process of passing variables from the controller to the view. This approach allows for dynamic content generation based on controller logic. Feel free to extend this concept to pass more variables and customize your views further. Now let's continue to the task +--- # [NEXT TASK: *Iteration*](iteration.md) \ No newline at end of file diff --git a/docs/en/thymeleaf/practice/working-with-variables.md b/docs/en/thymeleaf/practice/working-with-variables.md index 43ea184..21cbacd 100644 --- a/docs/en/thymeleaf/practice/working-with-variables.md +++ b/docs/en/thymeleaf/practice/working-with-variables.md @@ -83,10 +83,6 @@ now your page should look like that: ![first-view.png](../../../srcs/thymeleaf/first-view.png) -**Conclusion:** - -You have successfully explored and implemented various types of local variables in Thymeleaf. Experiment with different scenarios and understand how these variables contribute to dynamic and localized content in your Spring application. - -Feel free to refer to the [Thymeleaf Documentation](https://www.thymeleaf.org/documentation.html) for more details and advanced features. +--- # [NEXT TASK: *Variables And Controller*](variables-and-controller.md) \ No newline at end of file diff --git a/docs/en/transactions/lab-work.md b/docs/en/transactions/lab-work.md index 081cbda..82457d6 100644 --- a/docs/en/transactions/lab-work.md +++ b/docs/en/transactions/lab-work.md @@ -1,3 +1,6 @@ +English | [中文](../../cn/transactions/lab-work.md) | [Русский](../../ru/transactions/lab-work.md) + + # Transactions Lab Work Welcome to the Transactions Lab Work! The goal of this series of tasks is to help you practice and master transaction management in a Spring application. Whether you're a beginner or looking to enhance your skills, these hands-on tasks will guide you through various aspects of transaction management, including propagation, isolation levels, nested transactions, and more. diff --git a/docs/en/transactions/practice/lessons/basic-transactional-operations.md b/docs/en/transactions/practice/lessons/basic-transactional-operations.md index ab80146..63d6589 100644 --- a/docs/en/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/en/transactions/practice/lessons/basic-transactional-operations.md @@ -47,4 +47,4 @@ This part aims to introduce simple yet important transactional methods for enrol --- -# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file +# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) diff --git a/docs/en/transactions/practice/lessons/entities-and-repositories.md b/docs/en/transactions/practice/lessons/entities-and-repositories.md index a8ef935..783f47f 100644 --- a/docs/en/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/en/transactions/practice/lessons/entities-and-repositories.md @@ -35,4 +35,4 @@ The goal of this task is to define the core entities (Student, Course, Enrollmen --- -# [NEXT: Implementing Basic Transactional Operations](basic-transactional-operations.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ: Реализация базовых транзакционных операций](basic-transactional-operations.md) \ No newline at end of file diff --git a/docs/ru/jmeter/lab-work.md b/docs/ru/jmeter/lab-work.md index d346ff7..ebc73c5 100644 --- a/docs/ru/jmeter/lab-work.md +++ b/docs/ru/jmeter/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/jmeter/lab-work.md) | [中文](../../cn/jmeter/lab-work.md) | Русский + + # Практические задания лабораторной работы по JMeter Добро пожаловать в лабораторную работу по JMeter! Цель этой серии задач - помочь вам практиковаться и освоить JMeter, полезный инструмент для тестирования и измерения производительности веб-приложений. Независимо от того, являетесь ли вы начинающим или хотите улучшить свои навыки, эти практические задания помогут вам ознакомиться с различными аспектами использования JMeter для нагрузочного тестирования, записи и анализа HTTP-запросов. diff --git a/docs/ru/jpa/lab-work.md b/docs/ru/jpa/lab-work.md index 6066c18..14ec71b 100644 --- a/docs/ru/jpa/lab-work.md +++ b/docs/ru/jpa/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/jmeter/lab-work.md) | [中文](../../cn/jmeter/lab-work.md) | Русский + # Лабораторная работа: JPA (Java Persistence API) Добро пожаловать на лабораторную работу по Spring Boot с JPA! В этой лабораторной работе вы попрактикуетесь в различных задачах, связанных с настройкой проекта Spring Boot с JPA (Java Persistence API). diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md index f4554d7..e94a2bc 100644 --- a/docs/ru/springsecurity/lab-work.md +++ b/docs/ru/springsecurity/lab-work.md @@ -1,3 +1,5 @@ +[English](../../en/springsecurity/lab-work.md) | [中文](../../cn/springsecurity/lab-work.md) | Русский + # Лабораторные работы по Spring Security Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам практиковаться и познакомиться с Spring Security, а также создать достаточно полноценный проект. Будь вы начинающим или стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring. diff --git a/docs/ru/springsecurity/practice/authorize-client-authority.md b/docs/ru/springsecurity/practice/authorize-client-authority.md index 24188cd..f4a6842 100644 --- a/docs/ru/springsecurity/practice/authorize-client-authority.md +++ b/docs/ru/springsecurity/practice/authorize-client-authority.md @@ -52,4 +52,4 @@ --- -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Лабораторные задания](../lab-work.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Пользовательская форма входа](custom-login-form.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/authorize-server-authenticated.md b/docs/ru/springsecurity/practice/authorize-server-authenticated.md index 93f418e..61c8b67 100644 --- a/docs/ru/springsecurity/practice/authorize-server-authenticated.md +++ b/docs/ru/springsecurity/practice/authorize-server-authenticated.md @@ -33,6 +33,6 @@ - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации. - Заявление `.requestMatchers("/second").authenticated()` указывает, что доступ к пути `/second` должен быть ограничен только для аутентифицированных пользователей. -## Заключение +--- -Вы успешно настроили авторизацию для разрешения доступа к пути `/second` только для аутентифицированных пользователей. Путем требования аутентификации для этого пути. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по роли](authorize-server-role.md) diff --git a/docs/ru/springsecurity/practice/authorize-server-authority.md b/docs/ru/springsecurity/practice/authorize-server-authority.md index d6f7346..2040e86 100644 --- a/docs/ru/springsecurity/practice/authorize-server-authority.md +++ b/docs/ru/springsecurity/practice/authorize-server-authority.md @@ -34,6 +34,6 @@ - Заявление `.requestMatchers("/addStudent").hasAuthority("WRITE")` указывает, что доступ к пути `/addStudent` должен быть ограничен для пользователей с правами `WRITE`. - Аналогично, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` ограничивает доступ к пути `/removeStudent` для пользователей с правами `DELETE`. -## Заключение +--- -Вы успешно настроили контроль доступа на основе прав для путей `/addStudent` и `/removeStudent` в вашем приложении. Присваивая конкретные права пользователям, вы можете контролировать доступ к различным функциональностям или действиям на основе их разрешений. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Настройка безопасности Thymeleaf](configure-thymeleaf-security.md) diff --git a/docs/ru/springsecurity/practice/authorize-server-role.md b/docs/ru/springsecurity/practice/authorize-server-role.md index 6b6ff73..ce374bc 100644 --- a/docs/ru/springsecurity/practice/authorize-server-role.md +++ b/docs/ru/springsecurity/practice/authorize-server-role.md @@ -34,6 +34,6 @@ - Заявление `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` указывает, что доступ к пути `/third` должен быть ограничен для пользователей с авторитетом `ROLE_MODERATOR`. - Аналогично, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` ограничивает доступ к пути `/fourth` для пользователей с авторитетом `ROLE_ADMIN`. -## Заключение +--- -Вы успешно настроили контроль доступа на основе ролей для путей `/third` и `/fourth` в вашем приложении. Присваивая конкретные роли пользователям, вы можете контролировать доступ к различным частям вашего приложения на основе их разрешений. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по полномочию](authorize-server-authority.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/base-implementation-user.md b/docs/ru/springsecurity/practice/base-implementation-user.md index 83c9688..694a173 100644 --- a/docs/ru/springsecurity/practice/base-implementation-user.md +++ b/docs/ru/springsecurity/practice/base-implementation-user.md @@ -181,6 +181,6 @@ src Эта структура папок показывает, где создать класс `CustomUserDetailsService` и интерфейс `UsersRepository` в вашем проекте. Организация ваших классов таким образом помогает поддерживать чистый и структурированный код. -## Заключение +--- -Поздравляю! Вы успешно создали базовую реализацию для управления пользователями в вашем приложении. С UserDetails, UsersRepository и UserDetailsService вы можете аутентифицировать пользователей, управлять их данными и выполнять операции, связанные с пользователями, эффективно. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/configure-spring-security.md b/docs/ru/springsecurity/practice/configure-spring-security.md index f556b3f..c5306e8 100644 --- a/docs/ru/springsecurity/practice/configure-spring-security.md +++ b/docs/ru/springsecurity/practice/configure-spring-security.md @@ -74,6 +74,6 @@ } ``` -## Заключение +--- -Поздравляем! Вы успешно настроили Spring Security в своем проекте. Ваше приложение теперь обладает надежными средствами безопасности для защиты от несанкционированного доступа и обеспечения конфиденциальности и целостности данных пользователей. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md index 78960e2..0e0cc51 100644 --- a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md +++ b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md @@ -25,5 +25,6 @@ ``` -## Заключение -После добавления зависимости Thymeleaf будет настроен для работы с Spring Security, предоставляя дополнительные функции и утилиты для интеграции функциональности, связанной с безопасностью, в ваше веб-приложение. Не забудьте синхронизировать ваш проект, чтобы загрузить зависимость и сделать ее доступной для использования. +--- + +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базовую реализацию для пользователя](base-implementation-user.md) diff --git a/docs/ru/springsecurity/practice/create-identity-to-users.md b/docs/ru/springsecurity/practice/create-identity-to-users.md index e96f03c..fc0880a 100644 --- a/docs/ru/springsecurity/practice/create-identity-to-users.md +++ b/docs/ru/springsecurity/practice/create-identity-to-users.md @@ -56,6 +56,6 @@ - Полномочия представлены объектами `SimpleGrantedAuthority` и добавляются в профили пользователей соответственно. - Кроме того, мы устанавливаем роль для каждого пользователя, чтобы в дальнейшем использовать контроль доступа на основе ролей. -## Заключение +--- -Вы успешно улучшили профили пользователей в вашем приложении, назначив роли и полномочия фиктивным пользователям. Определив их идентификацию и разрешения на доступ, теперь вы можете контролировать действия и функциональность, доступные каждому пользователю в приложении. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базу для авторизации на сервере](setup-server-authorization.md) diff --git a/docs/ru/springsecurity/practice/custom-login-form.md b/docs/ru/springsecurity/practice/custom-login-form.md index c9a9681..e7e6d64 100644 --- a/docs/ru/springsecurity/practice/custom-login-form.md +++ b/docs/ru/springsecurity/practice/custom-login-form.md @@ -35,6 +35,6 @@ - Оператор `.loginPage("/custom-login-page")` указывает URL пользовательской страницы входа. - Вы можете добавить дополнительные конфигурации для настройки поведения формы входа, такие как установка URL для успешного или неудачного входа, определение имен полей формы и т. д. -## Заключение +--- -Вы успешно активировали пользовательскую страницу формы входа для аутентификации в вашем приложении. Пользователи теперь могут получить доступ к пользовательской странице входа, чтобы безопасно войти и аутентифицироваться в системе. +# [СЛЕДУЮЩЕЕ: ЗАДАНИЯ](../lab-work.md) \ No newline at end of file diff --git a/docs/ru/springsecurity/practice/password-encryption.md b/docs/ru/springsecurity/practice/password-encryption.md index 30633f9..97a78d4 100644 --- a/docs/ru/springsecurity/practice/password-encryption.md +++ b/docs/ru/springsecurity/practice/password-encryption.md @@ -77,6 +77,6 @@ Этот метод принимает объект CustomUserDetails, представляющий пользователя для регистрации. Он шифрует пароль пользователя с использованием бина BCryptPasswordEncoder, а затем сохраняет пользователя в базе данных. -## Заключение +--- -Поздравляем! Вы успешно настроили шифрование паролей с использованием BCryptPasswordEncoder в вашем приложении, использующем Spring Security. Шифрование паролей повышает безопасность аутентификации пользователей и защищает конфиденциальные данные пользователей. +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Добавить тестовых пользователей](add-dummy-users.md) diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md index c06272a..46eb4b7 100644 --- a/docs/ru/thymeleaf/lab-work.md +++ b/docs/ru/thymeleaf/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/thymeleaf/lab-work.md) | [中文](../../cn/thymeleaf/lab-work.md) | Русский + + # Лабораторная работа по Thymeleaf Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. @@ -69,6 +72,3 @@ ![modify-user-page.png](../../srcs/thymeleaf/modify-user-page.png) -Не стесняйтесь исследовать и выполнять эти задачи в своем собственном темпе. Каждая задача разработана для дополнительного развития ваших навыков в Thymeleaf и веб-разработке. Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться. - -Счастливого кодирования! \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md index f767e45..f6025db 100644 --- a/docs/ru/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md @@ -112,8 +112,4 @@ --- -**Заключение:** - -Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html). - # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/create-first-view.md b/docs/ru/thymeleaf/practice/create-first-view.md index a2ed7b7..c9527d3 100644 --- a/docs/ru/thymeleaf/practice/create-first-view.md +++ b/docs/ru/thymeleaf/practice/create-first-view.md @@ -56,8 +56,4 @@ --- -**Вывод:** - -Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf. - # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/form-handling.md b/docs/ru/thymeleaf/practice/form-handling.md index 607eba6..a9eec58 100644 --- a/docs/ru/thymeleaf/practice/form-handling.md +++ b/docs/ru/thymeleaf/practice/form-handling.md @@ -67,8 +67,6 @@ - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия. - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`). -**Заключение:** - -Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/forms.md b/docs/ru/thymeleaf/practice/forms.md index 0d185da..3ace17c 100644 --- a/docs/ru/thymeleaf/practice/forms.md +++ b/docs/ru/thymeleaf/practice/forms.md @@ -113,8 +113,6 @@ ![third-view.png](../../../srcs/thymeleaf/third-view.png) -**Заключение:** - -Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md) \ No newline at end of file diff --git a/docs/ru/thymeleaf/practice/fragments-and-layouts.md b/docs/ru/thymeleaf/practice/fragments-and-layouts.md index dc9f2ef..ff464c4 100644 --- a/docs/ru/thymeleaf/practice/fragments-and-layouts.md +++ b/docs/ru/thymeleaf/practice/fragments-and-layouts.md @@ -123,8 +123,6 @@ ![fourth-view.png](../../../srcs/thymeleaf/fourth-view.png) -**Заключение:** - -Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`. +--- # Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)** diff --git a/docs/ru/thymeleaf/practice/iteration.md b/docs/ru/thymeleaf/practice/iteration.md index 9f7803b..847c1d2 100644 --- a/docs/ru/thymeleaf/practice/iteration.md +++ b/docs/ru/thymeleaf/practice/iteration.md @@ -100,8 +100,6 @@ ![second-view.png](../../../srcs/thymeleaf/second-view.png) -**Заключение:** - -Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md) diff --git a/docs/ru/thymeleaf/practice/literals.md b/docs/ru/thymeleaf/practice/literals.md index ee0af4c..b78b317 100644 --- a/docs/ru/thymeleaf/practice/literals.md +++ b/docs/ru/thymeleaf/practice/literals.md @@ -48,8 +48,6 @@ ![second-view-enhanced.png](../../../srcs/thymeleaf/second-view-enhanced.png) -**Заключение:** - -Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md) diff --git a/docs/ru/thymeleaf/practice/validation.md b/docs/ru/thymeleaf/practice/validation.md index 43f2e41..4ba6276 100644 --- a/docs/ru/thymeleaf/practice/validation.md +++ b/docs/ru/thymeleaf/practice/validation.md @@ -78,8 +78,6 @@ ![third-view-error.png](../../../srcs/thymeleaf/third-view-error.png) -**Заключение:** - -Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md) diff --git a/docs/ru/thymeleaf/practice/variables-and-controller.md b/docs/ru/thymeleaf/practice/variables-and-controller.md index b4a2d9f..a8902d8 100644 --- a/docs/ru/thymeleaf/practice/variables-and-controller.md +++ b/docs/ru/thymeleaf/practice/variables-and-controller.md @@ -60,8 +60,6 @@ Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера. -**Заключение:** - -Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md) diff --git a/docs/ru/thymeleaf/practice/working-with-variables.md b/docs/ru/thymeleaf/practice/working-with-variables.md index 47a0281..715422c 100644 --- a/docs/ru/thymeleaf/practice/working-with-variables.md +++ b/docs/ru/thymeleaf/practice/working-with-variables.md @@ -83,10 +83,6 @@ ![first-view.png](../../../srcs/thymeleaf/first-view.png) -**Заключение:** - -Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring. - -Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций. +--- # [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md) diff --git a/docs/ru/transactions/lab-work.md b/docs/ru/transactions/lab-work.md index 7bf0987..f4bf786 100644 --- a/docs/ru/transactions/lab-work.md +++ b/docs/ru/transactions/lab-work.md @@ -1,3 +1,6 @@ +[English](../../en/transactions/lab-work.md) | [中文](../../cn/transactions/lab-work.md) | Русский + + # Transactions Lab Work Добро пожаловать в лабораторную работу по транзакциям! Цель этой серии задач - помочь вам практиковать и овладеть управлением транзакциями в приложении на Spring. Независимо от вашего уровня - будь то начинающий или опытный разработчик, эти практические задачи помогут вам освоить различные аспекты управления транзакциями, включая распространение, уровни изоляции, вложенные транзакции и многое другое. @@ -51,5 +54,3 @@ - **Выполнение операции без транзакции** - **Задача:** Реализуйте метод для операций, не требующих транзакционного контекста, таких как некритические задачи или журналирование. - **Распространение:** Нет - ---- \ No newline at end of file diff --git a/docs/ru/transactions/practice/configuration.md b/docs/ru/transactions/practice/configuration.md index 8a07a1d..ea0a3a0 100644 --- a/docs/ru/transactions/practice/configuration.md +++ b/docs/ru/transactions/practice/configuration.md @@ -37,4 +37,4 @@ public class DemoApplication { ``` --- -# [Далее: Создание сущностей и репозиториев](lessons/first.md) \ No newline at end of file +# [Далее: Создание сущностей и репозиториев](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md index 5bf0633..08014f1 100644 --- a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md @@ -47,4 +47,4 @@ --- -# [NEXT: Enhancing Transactional Methods with Detailed Logging](transactional-logging.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ: Улучшение транзакционных методов с подробным логированием](transactional-logging.md) diff --git a/docs/ru/transactions/practice/lessons/entities-and-repositories.md b/docs/ru/transactions/practice/lessons/entities-and-repositories.md index 9656087..5504fd4 100644 --- a/docs/ru/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/ru/transactions/practice/lessons/entities-and-repositories.md @@ -33,3 +33,7 @@ Если у вас уже есть репозитории для сущностей, перейдите к следующему шагу. В противном случае повторите описанный выше шаг для репозиториев оставшихся сущностей (Course, Enrollment, Log). +--- + +# [СЛЕДУЮЩЕЕ: Реализация базовых транзакционных операций](basic-transactional-operations.md) + diff --git a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md index 4e93059..5a76ce9 100644 --- a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md +++ b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md @@ -63,6 +63,4 @@ --- -# [ДАЛЕЕ: З - -[ДАЛЕЕ: Задания](../../lab-work.md) \ No newline at end of file +# [ДАЛЕЕ: Задания](../../lab-work.md) From 38931f4ce3871fffca4470d697ba045ea6f0e04e Mon Sep 17 00:00:00 2001 From: Nokrosis Date: Mon, 3 Jun 2024 22:37:24 +0300 Subject: [PATCH 34/40] JMeter little changes --- .../ru/jmeter/lessons/configuring-and-using-the-proxy-server.md | 2 +- .../lessons/configuring-browser-to-use-the-proxy-server.md | 2 +- docs/ru/jmeter/lessons/creating-a-test-scenario.md | 2 +- .../ru/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/ru/jmeter/lessons/configuring-and-using-the-proxy-server.md b/docs/ru/jmeter/lessons/configuring-and-using-the-proxy-server.md index 587af69..87d96a8 100644 --- a/docs/ru/jmeter/lessons/configuring-and-using-the-proxy-server.md +++ b/docs/ru/jmeter/lessons/configuring-and-using-the-proxy-server.md @@ -18,4 +18,4 @@ --- -# [Далее: Запись и управление HTTP-запросами](recording-and-managing-http-requests.md) \ No newline at end of file +# [Далее: Настройка браузера для использования прокси-сервера](configuring-browser-to-use-the-proxy-server.md) \ No newline at end of file diff --git a/docs/ru/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md b/docs/ru/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md index ff370dc..979ff73 100644 --- a/docs/ru/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md +++ b/docs/ru/jmeter/lessons/configuring-browser-to-use-the-proxy-server.md @@ -13,4 +13,4 @@ --- -# [Далее: Организация записанных запросов](organizing-recorded-requests.md) \ No newline at end of file +# [Далее: Запись и управление HTTP-запросами](recording-and-managing-http-requests.md) \ No newline at end of file diff --git a/docs/ru/jmeter/lessons/creating-a-test-scenario.md b/docs/ru/jmeter/lessons/creating-a-test-scenario.md index 86fbecc..91cb5f8 100644 --- a/docs/ru/jmeter/lessons/creating-a-test-scenario.md +++ b/docs/ru/jmeter/lessons/creating-a-test-scenario.md @@ -7,7 +7,7 @@ #### 7.1. Добавление простого контроллера 1. **Организация запросов** - - Щелкните правой кнопкой мыши на **Группе потоков**. + - Щелкните правой кнопкой мыши по **Группе потоков**.
![thread-group-icon.png](../../../srcs/jmeter/thread-group-icon.png) - Выберите **Добавить > Логический контроллер > Простой контроллер**.
![new-simple-controller-button.png](../../../srcs/jmeter/new-simple-controller-button.png) diff --git a/docs/ru/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md b/docs/ru/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md index 9fca176..969a924 100644 --- a/docs/ru/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md +++ b/docs/ru/jmeter/lessons/introduction-to-jmeter-and-basic-setup.md @@ -1,7 +1,7 @@ ## Урок 1: Введение в JMeter и базовая настройка ### Цель -Цель этого урока - познакомить вас с JMeter и провести вас через процесс базовой настройки, включая запуск JMeter и добавление группы потоков в ваш план тестирования. +Цель этого урока - познакомить вас с JMeter и провести через процесс базовой настройки, включая запуск JMeter и добавление группы потоков в ваш план тестирования. ### Шаги From 3d46146da813ad6f6ce72ac0df005b17ef74d50a Mon Sep 17 00:00:00 2001 From: Denis <87702433+BeBr0@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:38:13 +0300 Subject: [PATCH 35/40] Update lab-work.md Make text more russian --- docs/ru/thymeleaf/lab-work.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md index 46eb4b7..dd9bd8e 100644 --- a/docs/ru/thymeleaf/lab-work.md +++ b/docs/ru/thymeleaf/lab-work.md @@ -3,11 +3,11 @@ # Лабораторная работа по Thymeleaf -Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring. +Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf - шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложении Spring. ## Цель лабораторной работы -Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство использования Thymeleaf в среде Spring. Thymeleaf широко используется для серверного рендеринга в веб-разработке, и через эти задачи вы получите ценные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом. +Цель этой лабораторной работы - помочь вам изучить Thymeleaf в среде Spring на практике. Thymeleaf широко используется для серверного рендеринга в веб-разработке. Прорешав эти задания, вы получите полезные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом. ## Практические задачи @@ -27,8 +27,8 @@ 1. **Задача 1: Создание HTML-макета с фрагментами** - - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, head и подвал. - - Соберите эти фрагменты в один HTML-файл, чтобы создать полный макет. + - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, header и подвал. + - Соберите эти фрагменты в один HTML-файл, чтобы создать полноценный макет веб страницы. - Например: ![layout.png](../../srcs/thymeleaf/layout.png) @@ -44,7 +44,7 @@ 3. **Задача 3: Создание форм входа и регистрации** - - Разработайте и реализуйте формы входа и регистрации для аутентификации пользователей. + - Создайте формы входа и регистрации для аутентификации пользователей. - Используйте привязку модели Thymeleaf для обработки данных формы. - Например: @@ -65,7 +65,7 @@ - Разработайте страницу "Пользователи", отображающую таблицу пользователей. - Реализуйте итерацию для динамического заполнения таблицы данными пользователей. - - Предоставьте функциональность удаления или изменения записей пользователя со страницы. + - Реализуйте функциональность для удаления или изменения записей пользователя на странице. - Например: ![users-page.png](../../srcs/thymeleaf/users-page.png) From 9e91f5f5f5e178b0ac9b0a24ebb30ed403b77347 Mon Sep 17 00:00:00 2001 From: Denis <87702433+BeBr0@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:45:13 +0300 Subject: [PATCH 36/40] Update configure-thymeleaf.md Make text more russian --- docs/ru/thymeleaf/practice/configure-thymeleaf.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md index f6025db..1031ed8 100644 --- a/docs/ru/thymeleaf/practice/configure-thymeleaf.md +++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md @@ -2,7 +2,7 @@ **Описание:** -Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения беспроблемной интеграции шаблонного движка для веб-разработки. +Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения легкой интеграции шаблонного движка для веб-разработки. ## **Шаги:** @@ -24,10 +24,10 @@ } ``` - Размещение класса конфигурации в пакете `config` повышает организованность и обеспечивает четкую структуру в вашем проекте. Скорректируйте имя пакета в зависимости от структуры вашего проекта. + Размещение класса конфигурации в пакете `config` помогает правильно структурировать ваш код. Скорректируйте имя пэкеджа в зависимости от структуры вашего проекта. 2. **Настройте Разрешитель Шаблонов Thymeleaf:** - - Определите метод, аннотированный `@Bean`, для конфигурации разрешителя шаблонов Thymeleaf. + - Создайте метод с аннотацией `@Bean` для конфигурации шаблонизатора Thymeleaf. - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов. ```java @@ -72,7 +72,7 @@ ``` 4. **Настройте Разрешитель Представлений Thymeleaf:** - - Создайте метод, аннотированный `@Bean`, для настройки разрешителя представлений Thymeleaf. + - Создайте метод, аннотированный `@Bean`, для настройки Thymeleaf. - Установите шаблонный движок. ```java @@ -112,4 +112,4 @@ --- -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md) From a2e32cc5c466181396f51432444e5386e20c3b9a Mon Sep 17 00:00:00 2001 From: Denis <87702433+BeBr0@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:52:45 +0300 Subject: [PATCH 37/40] Update lab-work.md Make text more russian --- docs/ru/springsecurity/lab-work.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md index e94a2bc..2166b50 100644 --- a/docs/ru/springsecurity/lab-work.md +++ b/docs/ru/springsecurity/lab-work.md @@ -2,11 +2,11 @@ # Лабораторные работы по Spring Security -Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам практиковаться и познакомиться с Spring Security, а также создать достаточно полноценный проект. Будь вы начинающим или стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring. +Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам на практике познакомиться с Spring Security, а также создать почти полноценный проект. Если вы начинающий или просто стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring. ## Цель лабораторных работ -Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего проекта, и через эти задачи вы получите ценные знания о его конфигурации, аутентификации, авторизации и многом другом. +Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего приложения, и через эти задачи вы получите полезные знания о конфигурации, аутентификации, авторизации и многом другом. ## Задачи практики @@ -36,7 +36,7 @@ Определение различных пользовательских ролей (Менеджер, Учитель, Студент) и их соответствующих полномочий. ### Задача 3: Настройка Безопасности в Контроллерах -Защита конечных точек с использованием контроля доступа на основе ролей. +Защита путей приложения (endpoins) с использованием контроля доступа на основе ролей. #### Детали реализации **Роль Менеджера**: @@ -59,4 +59,4 @@ Ограничение доступа к элементам пользовательского интерфейса на основе ролей пользователей. ### Задача 5: Тестирование Контроля Доступа на Основе Ролей -Убедитесь, что конечные точки и элементы пользовательского интерфейса правильно защищены. \ No newline at end of file +Убедитесь, что enpoints и элементы пользовательского интерфейса правильно защищены. From f0e95651afa4b726ce5b00cb737c1f9cb638c81d Mon Sep 17 00:00:00 2001 From: Denis <87702433+BeBr0@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:56:18 +0300 Subject: [PATCH 38/40] Update configure-spring-security.md Make text more russian --- docs/ru/springsecurity/practice/configure-spring-security.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ru/springsecurity/practice/configure-spring-security.md b/docs/ru/springsecurity/practice/configure-spring-security.md index c5306e8..4ef55f5 100644 --- a/docs/ru/springsecurity/practice/configure-spring-security.md +++ b/docs/ru/springsecurity/practice/configure-spring-security.md @@ -33,7 +33,7 @@ 2. **Создание класса конфигурации безопасности** - Создайте новый класс Java с именем `WebSecurityConfig` в структуре исходных файлов вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`. + Создайте новый Java класс с именем `WebSecurityConfig` в структуре вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`. Структура папок вашего проекта должна выглядеть примерно так: @@ -76,4 +76,4 @@ --- -# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md) \ No newline at end of file +# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md) From 853dedb696cd2c90857544ca3df63a465fab9a44 Mon Sep 17 00:00:00 2001 From: Nokrosis Date: Mon, 3 Jun 2024 23:00:16 +0300 Subject: [PATCH 39/40] Transactions changes for present --- docs/ru/transactions/lab-work.md | 10 +++++----- docs/ru/transactions/practice/configuration.md | 6 +++--- .../lessons/basic-transactional-operations.md | 8 ++++---- .../lessons/entities-and-repositories.md | 4 ++-- .../nested-and-non-transactional-operations.md | 2 +- .../practice/lessons/transactional-logging.md | 16 ++++++++-------- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/ru/transactions/lab-work.md b/docs/ru/transactions/lab-work.md index f4bf786..78a97ec 100644 --- a/docs/ru/transactions/lab-work.md +++ b/docs/ru/transactions/lab-work.md @@ -1,13 +1,13 @@ [English](../../en/transactions/lab-work.md) | [中文](../../cn/transactions/lab-work.md) | Русский -# Transactions Lab Work +# Лабораторная работа по Транзакциям -Добро пожаловать в лабораторную работу по транзакциям! Цель этой серии задач - помочь вам практиковать и овладеть управлением транзакциями в приложении на Spring. Независимо от вашего уровня - будь то начинающий или опытный разработчик, эти практические задачи помогут вам освоить различные аспекты управления транзакциями, включая распространение, уровни изоляции, вложенные транзакции и многое другое. +Добро пожаловать в лабораторную работу по транзакциям! Цель этих задач - помочь вам овладеть управлением транзакциями в приложении на Spring. Независимо от вашего уровня - будь то начинающий или опытный разработчик, эти практические задачи помогут вам освоить различные аспекты управления транзакциями, включая распространение, уровни изоляции, вложенные транзакции и многое другое. ## Цель лабораторной работы -Основная цель этой лабораторной работы - предоставить вам практический опыт и навыки в управлении транзакциями в среде Spring. Через эти задачи вы получите ценные знания о настройке транзакций, обработке различных типов распространения, реализации вложенных транзакций и обеспечении целостности данных в ваших приложениях. +Основная цель этой лабораторной работы - предоставить вам практический опыт и навыки в управлении транзакциями. Через эти задачи вы получите ценные знания о настройке транзакций, обработке различных типов распространения, реализации вложенных транзакций и обеспечении целостности данных в ваших приложениях. ## Задачи практики @@ -37,7 +37,7 @@ - **Изоляция:** READ_COMMITTED - **Добавление нового мероприятия** - - **Задача:** Реализуйте метод для добавления нового мероприятия. Эта операция должна выполняться без транзакционных гарантий, чтобы избежать ненужных накладных расходов на транзакции. + - **Задача:** Реализуйте метод для добавления нового мероприятия. Эта операция должна выполняться без транзакционных гарантий, чтобы избежать ненужных затрат на транзакции. - **Распространение:** NOT_SUPPORTED - **Обновление деталей мероприятия и регистраций с вложенными транзакциями** @@ -52,5 +52,5 @@ - **Изоляция:** REPEATABLE_READ - **Выполнение операции без транзакции** - - **Задача:** Реализуйте метод для операций, не требующих транзакционного контекста, таких как некритические задачи или журналирование. + - **Задача:** Реализуйте метод для операций, не требующих транзакционного контекста, например обычные операции или логгирование. - **Распространение:** Нет diff --git a/docs/ru/transactions/practice/configuration.md b/docs/ru/transactions/practice/configuration.md index ea0a3a0..1bcfde5 100644 --- a/docs/ru/transactions/practice/configuration.md +++ b/docs/ru/transactions/practice/configuration.md @@ -6,15 +6,15 @@ ## Цель -Цель данного руководства - продемонстрировать, как настроить управление транзакциями в приложении Spring Boot, что позволит управлять транзакциями базы данных. +Цель данного руководства - продемонстрировать, как настроить управление транзакциями, что позволит при помощи транзакций взаимодействовать с базой данных. ## Настройка управления транзакциями -Для включения управления транзакциями в вашем проекте Spring Boot выполните следующие шаги: +Для включения управления транзакциями в вашем проекте выполните следующие шаги: 1. Добавьте необходимые зависимости в ваш файл `pom.xml` или `build.gradle`. Убедитесь, что у вас есть зависимости для Spring Boot, Spring Data JPA и любого используемого вами драйвера базы данных (например, H2, MySQL, PostgreSQL). -2. Настройте управление транзакциями в вашем приложении Spring Boot. Это можно сделать, аннотируя ваш главный класс приложения с помощью `@EnableTransactionManagement`. +2. Настройте управление транзакциями в вашем приложении. Это можно сделать, аннотируя ваш главный класс приложения с помощью `@EnableTransactionManagement`. ### Пример (Java Config): diff --git a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md index 08014f1..5439b83 100644 --- a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md +++ b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md @@ -8,9 +8,9 @@ 1. **Зачисление студента на курс** - **Сценарий**: В качестве администратора университета вам необходимо зачислить студента на курс. Это действие должно быть гладким и гарантировать целостность данных, даже если происходит несколько зачислений одновременно или возникают проблемы с базой данных. + **Сценарий**: В качестве администратора университета вам необходимо зачислить студента на курс. Это действие должно быть не должно вызвать проблем и гарантировать целостность данных, даже если происходит несколько зачислений одновременно или возникают проблемы с базой данных. - **Реализация метода `enrollStudentInCourse`**: Создайте метод для зачисления студента на курс. Обеспечьте, чтобы этот процесс был транзакционным, что означает, что это как единый пакетный процесс, гарантирующий, что все происходит правильно вместе. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковой не существует. Кроме того, мы устанавливаем `Isolation.SERIALIZABLE`, чтобы гарантировать, что даже если есть параллельные транзакции, они не взаимодействуют друг с другом, сохраняя целостность данных. + **Реализация метода `enrollStudentInCourse`**: Создайте метод для зачисления студента на курс. Обеспечьте, чтобы этот процесс был транзакционным, что означает, что это как единый пакетный процесс, гарантирующий, что весь процесс единый. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковой не существует. Кроме того, мы устанавливаем `Isolation.SERIALIZABLE`, чтобы гарантировать, что даже если есть параллельные транзакции, они не мешают друг другу, сохраняя целостность данных. ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) @@ -21,7 +21,7 @@ 2. **Получение списка студентов для курса** - **Сценарий**: Чтобы создать список группы для курса, вам необходимо получить список студентов, которые зачислены на него. Эта операция должна гарантировать, что вы всегда получаете точное представление базы данных, даже если происходят другие действия одновременно. + **Сценарий**: Чтобы создать список группы для курса, вам необходимо получить список студентов, которые зачислены на него. Эта операция должна гарантировать, что вы всегда получаете точные данные базы данных, даже если происходят другие действия одновременно. **Реализация метода `getStudentsForCourse`**: Разработайте метод для извлечения студентов для определенного курса. Он должен гарантировать, что данные, которые вы извлекаете, согласованы, независимо от любых текущих транзакций. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковая не существует. Мы устанавливаем `Isolation.READ_COMMITTED`, чтобы гарантировать, что данные, которые мы извлекаем, зафиксированы и видны другим транзакциям, поддерживая последовательность. @@ -34,7 +34,7 @@ 3. **Добавление нового курса** - **Сценарий**: Новый курс готовится к введению в учебный план. При добавлении его в систему вы хотите убедиться, что это действие не мешает ничему другому, происходящему в системе, сохраняя свою независимость. + **Сценарий**: Новый курс готовится к новому учебному году. При добавлении нового курса в систему вы хотите убедиться, что это действие не мешает ничему другому, происходящему в системе, сохраняя свою независимость. **Реализация метода `addNewCourse`**: Создайте метод для добавления нового курса в систему. Убедитесь, что этот процесс не запутывается с другими текущими транзакциями. Мы используем `Propagation.NOT_SUPPORTED`, чтобы убедиться, что этот метод не участвует в какой-либо текущей транзакции, обеспечивая его автономность и избегая потенциальных конфликтов с другими операциями. diff --git a/docs/ru/transactions/practice/lessons/entities-and-repositories.md b/docs/ru/transactions/practice/lessons/entities-and-repositories.md index 5504fd4..9c2e951 100644 --- a/docs/ru/transactions/practice/lessons/entities-and-repositories.md +++ b/docs/ru/transactions/practice/lessons/entities-and-repositories.md @@ -15,7 +15,7 @@ - Enrollment (Зачисление) - Log (Лог) - Обеспечьте наличие необходимых атрибутов в каждом классе сущности, как показано на ER-диаграмме. + Обеспечьте наличие необходимых атрибутов в каждом классе, как показано на ER-диаграмме. 2. **Создайте репозитории для сущностей.** @@ -31,7 +31,7 @@ } ``` - Если у вас уже есть репозитории для сущностей, перейдите к следующему шагу. В противном случае повторите описанный выше шаг для репозиториев оставшихся сущностей (Course, Enrollment, Log). + Если у вас уже есть репозитории, перейдите к следующему шагу. В противном случае повторите описанный выше шаг для репозиториев оставшихся сущностей (Course, Enrollment, Log). --- diff --git a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md index 5a76ce9..c6473e0 100644 --- a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md +++ b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md @@ -35,7 +35,7 @@ } ``` -2. **Обновление зачислений независимо** +2. **Независимое обновление зачислений** **Сценарий**: Некоторые административные задачи могут потребовать обновления зачислений независимо от обновлений курса. Эта операция должна поддерживать целостность данных, позволяя при этом отдельное транзакционное управление. diff --git a/docs/ru/transactions/practice/lessons/transactional-logging.md b/docs/ru/transactions/practice/lessons/transactional-logging.md index 0a4fff2..c55423b 100644 --- a/docs/ru/transactions/practice/lessons/transactional-logging.md +++ b/docs/ru/transactions/practice/lessons/transactional-logging.md @@ -1,16 +1,16 @@ -## Урок 3: Дополнение транзакционных методов подробным журналированием +## Урок 3: Дополнение транзакционных методов логгированием ## Цель -Этот раздел направлен на интеграцию подробного журналирования для каждой транзакционной операции, обеспечивая запись действий с их результатами. +Этот раздел направлен на интеграцию логгирования для каждой транзакционной операции, обеспечивая запись действий с их результатами. ## Шаги -1. **Реализация метода журналирования** +1. **Реализация метода журналирования(логгирования)** - **Сценарий**: Прежде чем улучшать транзакционные методы с помощью журналирования, нам нужно реализовать метод для обработки журналирования независимо от основной транзакции. Это гарантирует, что журналирование происходит надежно, независимо от результата основной транзакции. + **Сценарий**: Прежде чем улучшать транзакционные методы с помощью журналирования, нам нужно реализовать метод для обработки журналирования независимо от основной транзакции. Это гарантирует, что логгирование происходит надежно, независимо от результата основной транзакции. - **Реализация метода `logAction`**: Создайте метод для независимого журналирования действий, обеспечивая точное отслеживание результатов транзакции. Мы используем `Propagation.REQUIRES_NEW`, чтобы выполнить операцию журналирования в отдельной транзакции, делая ее независимой от любых текущих транзакций и гарантируя ее завершение даже в случае сбоя основной транзакции. + **Реализация метода `logAction`**: Создайте метод для независимого записывания действий, обеспечивая точное отслеживание результатов транзакции. Мы используем `Propagation.REQUIRES_NEW`, чтобы выполнить операцию логгирования в отдельной транзакции, делая ее независимой от любых текущих транзакций и гарантируя ее завершение даже в случае сбоя основной транзакции. ```java @Transactional(propagation = Propagation.REQUIRES_NEW) @@ -20,7 +20,7 @@ } ``` -2. **Журналирование зачисления студента на курс** +2. **Логгирование зачисления студента на курс** **Сценарий**: В качестве администратора университета вам необходимо зарегистрировать зачисление студента на курс для отслеживания успешных зачислений и возможных ошибок. @@ -46,7 +46,7 @@ } ``` -3. **Журналирование получения списка студентов для курса** +3. **Запись получения списка студентов для курса** **Сценарий**: Для поддержания аудита активностей, связанных с курсом, вам необходимо зарегистрировать получение списка студентов для курса и гарантировать, что журналирование происходит даже в случае исключений. @@ -73,7 +73,7 @@ } ``` -4. **Журналирование добавления нового курса** +4. **Запись добавления нового курса** **Сценарий**: При добавлении нового курса важно зарегистрировать результат операции для отслеживания успешного или неудачного добавления. From 1f36689fdfc49769d46322abcf5b9dad7b9cc8f7 Mon Sep 17 00:00:00 2001 From: kmsoln Date: Mon, 3 Jun 2024 23:20:55 +0300 Subject: [PATCH 40/40] [Master] SOME MISSED STUFF --- .../cn/transactions/practice/configuration.md | 55 +++++++++++++++++-- .../en/transactions/practice/configuration.md | 45 +++++++++++++++ .../ru/transactions/practice/configuration.md | 55 +++++++++++++++++-- 3 files changed, 145 insertions(+), 10 deletions(-) diff --git a/docs/cn/transactions/practice/configuration.md b/docs/cn/transactions/practice/configuration.md index 390555e..104e814 100644 --- a/docs/cn/transactions/practice/configuration.md +++ b/docs/cn/transactions/practice/configuration.md @@ -2,19 +2,19 @@ ## 简介 -本指南专注于在Spring Boot项目中设置事务管理。它提供了逐步说明,以启用事务管理并配置事务属性。 +本指南专注于在Spring Boot项目中设置事务管理。它提供了启用事务管理和配置事务属性的逐步说明。 ## 目标 -本指南的目标是演示如何在Spring Boot应用程序中配置事务管理,以便管理数据库事务。 +本指南的目标是演示如何在Spring Boot应用程序中配置事务管理,从而实现对数据库事务的管理。 ## 事务管理设置 要在Spring Boot项目中启用事务管理,请按照以下步骤操作: -1. 在您的 `pom.xml` 或 `build.gradle` 文件中添加必要的依赖项。确保您拥有Spring Boot、Spring Data JPA以及您正在使用的任何数据库驱动程序的依赖项(例如,H2、MySQL、PostgreSQL)。 +1. 在您的 `pom.xml` 或 `build.gradle` 文件中添加必要的依赖项。确保您具有Spring Boot、Spring Data JPA以及您正在使用的任何数据库驱动程序的依赖项(例如,H2、MySQL、PostgreSQL)。 -2. 在您的Spring Boot应用程序中配置事务管理。您可以通过在主应用程序类上添加 `@EnableTransactionManagement` 注解来实现这一点。 +2. 在您的Spring Boot应用程序中配置事务管理。您可以通过在主应用程序类上注释 `@EnableTransactionManagement` 来实现这一点。 ### 示例(Java配置): @@ -35,6 +35,51 @@ public class DemoApplication { } ``` + +3. 如果您使用的是Spring Web MVC,则需要将以下内容添加到您的配置文件中以设置事务管理器: + +### 示例(XML配置): + +```xml + + + +``` + +### 示例(Java配置): + +```java +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.persistence.EntityManagerFactory; + +@Configuration +public class TransactionConfig { + + /** + * Spring事务管理器的Bean定义。 + * + *

+ * 此方法使用配置的实体管理器工厂设置JPA的事务管理器。 + *

+ * + * @param entityManagerFactory 实体管理器工厂bean + * @return 事务管理器bean + */ + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory); + return txManager; + } +} +``` + +通过按照这些步骤操作,您将在Spring Boot应用程序中启用事务管理,从而有效地管理数据库事务。 + --- -# [下一步: 创建实体和存储库](lessons/entities-and-repositories.md) \ No newline at end of file +# [下一步:创建实体和存储库](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/en/transactions/practice/configuration.md b/docs/en/transactions/practice/configuration.md index 03ac8a4..3bcf85a 100644 --- a/docs/en/transactions/practice/configuration.md +++ b/docs/en/transactions/practice/configuration.md @@ -35,6 +35,51 @@ public class DemoApplication { } ``` + +3. If you are using Spring Web MVC, you need to add the following to your configuration files to set up the transaction manager: + +### Example (XML Config): + +```xml + + + +``` + +### Example (Java Config): + +```java +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.persistence.EntityManagerFactory; + +@Configuration +public class TransactionConfig { + + /** + * Bean definition for the Spring Transaction Manager. + * + *

+ * This method sets up the transaction manager for JPA using the configured entity manager factory. + *

+ * + * @param entityManagerFactory the entity manager factory bean + * @return TransactionManager bean + */ + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory); + return txManager; + } +} +``` + +By following these steps, you will have transaction management enabled in your Spring Boot application, allowing you to manage database transactions effectively. + --- # [Next: Create the Entities and Repositories](lessons/entities-and-repositories.md) \ No newline at end of file diff --git a/docs/ru/transactions/practice/configuration.md b/docs/ru/transactions/practice/configuration.md index ea0a3a0..d511378 100644 --- a/docs/ru/transactions/practice/configuration.md +++ b/docs/ru/transactions/practice/configuration.md @@ -2,19 +2,19 @@ ## Введение -Это руководство посвящено настройке управления транзакциями в проекте Spring Boot. В нем представлены пошаговые инструкции по включению управления транзакциями и конфигурации атрибутов транзакций. +Это руководство посвящено настройке управления транзакциями в проекте Spring Boot. Он предоставляет пошаговые инструкции по включению управления транзакциями и настройке атрибутов транзакций. ## Цель -Цель данного руководства - продемонстрировать, как настроить управление транзакциями в приложении Spring Boot, что позволит управлять транзакциями базы данных. +Цель этого руководства - продемонстрировать, как настроить управление транзакциями в приложении Spring Boot, позволяя управлять транзакциями базы данных. ## Настройка управления транзакциями -Для включения управления транзакциями в вашем проекте Spring Boot выполните следующие шаги: +Чтобы включить управление транзакциями в вашем проекте Spring Boot, выполните следующие шаги: -1. Добавьте необходимые зависимости в ваш файл `pom.xml` или `build.gradle`. Убедитесь, что у вас есть зависимости для Spring Boot, Spring Data JPA и любого используемого вами драйвера базы данных (например, H2, MySQL, PostgreSQL). +1. Добавьте необходимые зависимости в ваш файл `pom.xml` или `build.gradle`. Убедитесь, что у вас есть зависимости для Spring Boot, Spring Data JPA и любого драйвера базы данных, который вы используете (например, H2, MySQL, PostgreSQL). -2. Настройте управление транзакциями в вашем приложении Spring Boot. Это можно сделать, аннотируя ваш главный класс приложения с помощью `@EnableTransactionManagement`. +2. Настройте управление транзакциями в вашем приложении Spring Boot. Вы можете сделать это, аннотировав ваш класс основного приложения аннотацией `@EnableTransactionManagement`. ### Пример (Java Config): @@ -35,6 +35,51 @@ public class DemoApplication { } ``` + +3. Если вы используете Spring Web MVC, вам необходимо добавить следующее в ваши файлы конфигурации для настройки менеджера транзакций: + +### Пример (XML Config): + +```xml + + + +``` + +### Пример (Java Config): + +```java +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.persistence.EntityManagerFactory; + +@Configuration +public class TransactionConfig { + + /** + * Определение бина для Spring Transaction Manager. + * + *

+ * Этот метод настраивает менеджер транзакций для JPA с использованием настроенной фабрики сущностей. + *

+ * + * @param entityManagerFactory бин фабрики сущностей + * @return бин TransactionManager + */ + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory); + return txManager; + } +} +``` + +Следуя этим шагам, вы сможете включить управление транзакциями в вашем приложении Spring Boot, что позволит вам эффективно управлять транзакциями базы данных. + --- # [Далее: Создание сущностей и репозиториев](lessons/entities-and-repositories.md) \ No newline at end of file