Как отобразить элемент MySQL в проекте Spring Boot с Thymeleaf? - PullRequest
0 голосов
/ 02 мая 2020

Я пишу небольшое веб-приложение для обучения с использованием Spring Boot и Thymeleaf. Поэтому у меня есть 2 MySQL таблицы, которые я использую, Transcription и First_Language. Если я нажму на указанную кнопку c указанного элемента c в моем индексе. Страница html, которая является страницей внешнего интерфейса моего объекта first_language, я хочу распечатать элемент Transcription.Name. Однако я не являюсь уверен, как это сделать. Моя идея состояла в том, чтобы я дал контроллер first_language, FirstLanguageController, репозитории First_Language, а также Transcription. В моей таблице транскрипции MySql есть внешний ключ, ссылающийся на идентификатор первичного ключа First_Language. Поэтому я использую метод findByID () в TranscriptionRepository, чтобы найти эквивалентные идентификаторы в First_Language и Transcription. Кажется, что мой метод находит элемент в таблице транскрипций, но не возвращает его успешно. Моя главная страница интерфейса выглядит следующим образом:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>Users</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
      integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
      crossorigin="anonymous"
    />
    <link
      rel="stylesheet"
      href="https://use.fontawesome.com/releases/v5.4.1/css/all.css"
      integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz"
      crossorigin="anonymous"
    />
    <link rel="stylesheet" href="../css/shards.min.css" />
  </head>
  <body>
    <div th:switch="${users}" class="container my-5">
      <div class="row">
        <div class="col-md-6">
          <h2 th:case="null">No users yet!</h2>
          <div th:case="*">
            <h2 class="my-5">Search for Users by Name</h2>
            <form action="#" method="get" th:action="@{/search}">
              <input
                type="text"
                class="form-control"
                id="department"
                name="department"
                th:value="${department}"
                placeholder="Department"
              />
              <tr>
                Search for User by department
              </tr>
              <div class="row">
                <div class="col-md-6 mt-5">
                  <input
                    type="submit"
                    class="btn btn-primary"
                    value="Search Users"
                  />
                </div>
              </div>
            </form>
            <p class="my-5">
            <a href="/signup" class="btn btn-primary"
              ><i class="fas fa-user-plus ml-2"></i
            ></a>
            </p>
                <h2 class="my-5">Dictionary</h2>
                <table class="table table-striped table-responsive-md">
                    <thead>
                    <tr>
                        <th>Russian Name</th>
                        <th>Type of Word</th>
                        <th>Knowledge Transcription</th>
                        <th>Knowledge German Word</th>
                        <th>Change</th>
                        <th>Delete</th>
                        <th>Show Transcription</th>
                    </tr>
                    </thead>
                    <tbody>

                    <tr th:each="user : ${users}">
                        <td th:text="${user.name}"></td>
                        <td th:text="${user.department}"></td>                  
                        <td th:text="${user.knowledge_transcription}"></td>
                        <td th:text="${user.knowledge_gerword}"></td>
                  <td>
                    <a
                      th:href="@{/edit/{id}(id=${user.id})}"
                      class="btn btn-primary"
                      ><i class="fas fa-user-edit ml-2"></i
                    ></a>
                  </td>
                  <td>
                    <a
                      th:href="@{/delete/{id}(id=${user.id})}"
                      class="btn btn-primary"
                      ><i class="fas fa-user-times ml-2"></i
                    ></a>
                  </td>
                  <td>

                    <form method="get" th:action="@{/showTranscription/{id}(id=${user.id})}" th:object="${transctiption}">
    ^               <input class="form-control"
                    type="text"
                    th:name="name"
                    th:value="${transcription}"/>


                      <div class="col-md-6 mt-5">
                        <input
                          type="submit"
                          class="btn btn-primary"
                          value="Show transcription"
                        />
                      </div>

                  </form>
                  </td>

                    </tr>


                    </tbody>
                </table>
            </div>


        </div>
    </div>
</div>


</body>
</html>


Я полагаю, у меня ошибка в методе формы, который должен активировать метод showTranscription. Мой контроллер выглядит следующим образом:

package com.alexander.mainstuff.controllers;

import com.alexander.mainstuff.entities.First_language;
import com.alexander.mainstuff.entities.Transcription;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.persistence.Entity;
import javax.validation.Valid;
import java.util.List;
import com.alexander.mainstuff.repositories.FirstLanguageRepository;
import com.alexander.mainstuff.repositories.TranscriptionRepository;

@Controller
public class FirstLanguageController {

    private final FirstLanguageRepository userRepository;
    private final TranscriptionRepository transcriptionRepository;

    @Autowired
    public FirstLanguageController(FirstLanguageRepository userRepository, TranscriptionRepository transcriptionRepository) {
        this.userRepository = userRepository;
        this.transcriptionRepository = transcriptionRepository;
    }

    @GetMapping("/signup")
    public String showSignUpForm(  @ModelAttribute("user") First_language user) {
        return "add-user";
    }

    @PostMapping("/adduser")
    public String addUser(@Valid @ModelAttribute("user") First_language user, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return "add-user";
        }
        userRepository.save(user);
        model.addAttribute("users", userRepository.findAll());
        return  "redirect:/";
    }

    @GetMapping("/")
    public String showIndex(Model model) {
        model.addAttribute("users", userRepository.findAll());
        return "index";
    }

    @GetMapping("/edit/{id}")
    public String showUpdateForm(@PathVariable("id") long id, Model model) {
        First_language user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
        model.addAttribute("user", user);
        return "update-user";
    }

    @GetMapping("/search")
    public String searchUser(@RequestParam (name = "department", required = false) String department, Model model) {
        if (department == null || department.isEmpty()) {
            model.addAttribute("users", userRepository.findAll());
        } else {
            model.addAttribute("users", userRepository.findByDepartment(department));
        }
        model.addAttribute("department", department);
        return "index";
    }

    @GetMapping("/showTranscription/{id}")
    public String findTranscription(@PathVariable("id") long id_trans , Model model) {
        Transcription trans = transcriptionRepository.findById(id_trans).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id_trans));
        String trans_name = trans.getName();
        model.addAttribute("transcript", trans_name);
        return "index";
    }

    @PostMapping("/update/{id}")
    public String updateUser(@PathVariable("id") long id, @Valid First_language user, BindingResult result, Model model) {
        if (result.hasErrors()) {
            user.setId(id);
            return "update-user";
        }

        userRepository.save(user);
        model.addAttribute("users", userRepository.findAll());
        return "index";
    }

    @GetMapping("/delete/{id}")
    public String deleteUser(@PathVariable("id") long id, Model model) {
        System.out.println("ID:" + id);
        First_language user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
        userRepository.delete(user);
        model.addAttribute("users", userRepository.findAll());
        return "index";
    }



}

Мои сущности Transcription и First_Language следующие:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.alexander.mainstuff.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotBlank;

@Entity
public class Transcription {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private long id_first;
    private long id_german;

    private String name;
    private int knowledge_transcription;
    private int knowledge_gerword;

    public Transcription() {}

    public Transcription(long id, long id_first, long id_german, String name, int knowledge_transcription, int knowledge_gerword) {
        this.id = id;
        this.id_first = id_first;
        this.id_german = id_german;
        this.name = name;
        this.knowledge_transcription = knowledge_transcription;
        this.knowledge_gerword = knowledge_gerword;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getId_first() {
        return id_first;
    }

    public void setId_first(long id_first) {
        this.id_first = id_first;
    }

    public long getId_german() {
        return id_german;
    }

    public void setId_german(long id_german) {
        this.id_german = id_german;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getKnowledge_transcription() {
        return knowledge_transcription;
    }

    public void setKnowledge_transcription(int knowledge_transcription) {
        this.knowledge_transcription = knowledge_transcription;
    }

    public int getKnowledge_gerword() {
        return knowledge_gerword;
    }

    public void setKnowledge_gerword(int knowledge_gerword) {
        this.knowledge_gerword = knowledge_gerword;
    }

    @Override
    public String toString() {
        return "Transcription{" + "id=" + id + ", id_first=" + id_first + ", id_german=" + id_german + ", name=" + name + ", knowledge_transcription=" + knowledge_transcription + ", knowledge_gerword=" + knowledge_gerword + '}';
    }


}

package com.alexander.mainstuff.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotBlank;

@Entity
public class First_language {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;


    @GeneratedValue(strategy = GenerationType.AUTO)
    private long idsecond;


    @GeneratedValue(strategy = GenerationType.AUTO)
    private long idtrans;


    @NotBlank(message = "Wwedite russkoye slovo")
    private String name;


    @NotBlank(message = "Wwedite tip slova")
    private String department;

    private int knowledge_transcription;
    private int knowledge_gerword;


    public First_language() {}

    public First_language(long id, long idsecond, long idtrans, String name, String department, int knowledge_transcription, int knowledge_gerword) {
        this.id = id;
        this.idsecond = idsecond;
        this.idtrans = idtrans;
        this.name = name;
        this.department = department;
        this.knowledge_transcription = knowledge_transcription;
        this.knowledge_gerword = knowledge_gerword;
    }

    @Override
    public String toString() {
        return "First_language{" + "id=" + id + ", idsecond=" + idsecond + ", idtrans=" + idtrans + ", name=" + name + ", department=" + department + ", knowledge_transcription=" + knowledge_transcription + ", knowledge_gerword=" + knowledge_gerword + '}';
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getIdsecond() {
        return idsecond;
    }

    public void setIdsecond(long idsecond) {
        this.idsecond = idsecond;
    }

    public long getIdtrans() {
        return idtrans;
    }

    public void setIdtrans(long idtrans) {
        this.idtrans = idtrans;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public int getKnowledge_transcription() {
        return knowledge_transcription;
    }

    public void setKnowledge_transcription(int knowledge_transcription) {
        this.knowledge_transcription = knowledge_transcription;
    }

    public int getKnowledge_gerword() {
        return knowledge_gerword;
    }

    public void setKnowledge_gerword(int knowledge_gerword) {
        this.knowledge_gerword = knowledge_gerword;
    }




}


Итак, в конце я хочу распечатать поле транскрипции. имя в текстовом поле в индексе. html, рядом с кнопкой, с которой я запускаю метод showTranscription (). Вместо этого он возвращает мне индекс моей страницы. html и написан большими "нет записей". Так выглядит index. html, если в моей таблице MYSql first_language нет записей. Тем не менее, это не может быть правдой, потому что моя таблица впоследствии все еще не пуста. У кого-нибудь есть идеи, как решить мою проблему?

...