简体   繁体   English

Spring 中的重定向页面 使用 Jpa 和 Thymeleaf 引导

[英]Redirect page in Spring Boot with Jpa and Thymeleaf

I am creating a one to many relationship, where Category has many Products.我正在创建一个一对多的关系,其中类别有许多产品。 After listingn all my existing categories,I want to see all the products in a specifc category and to do basic CRUD on those products(from that category).在列出我现有的所有类别后,我想查看特定类别中的所有产品并对这些产品(来自该类别)进行基本的 CRUD。 I find dificulties in redirecting pages in Thymealeaf, most exactly I can't acces the "Add Product" page, using Thymeleaf.我发现在 Thymaleaf 中重定向页面有困难,最确切地说,我无法使用 Thymeleaf 访问“添加产品”页面。

@Entity
@Table(name="category")
public class Category {

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

    @Column
    @NotEmpty(message = "*Please provide a description")
    private String description;

    @OneToMany(mappedBy = "category")
    private Set<Product> products;

    public Category(){}
@Entity
@Table(name="product")
public class Product {

    @Id
    @Column(name="id")
    private String id;

    @Column
    private String name;

    @Column
    private String description;

    @Column
    private float price;

    @Column
    private int discount;

    @Column
    private boolean isInStock;

    @ManyToOne
    @JoinColumn(name="category_id")
    private Category category;

Here is my my way of saving products in Service layer这是我在服务层中保存产品的方式

 public Product save(Product product, long id) {
        Category category = categoryRepository.getById(id);
        if (category != null) {
            product.setId(UUID.randomUUID().toString());
            product.setCategory(category);
            product.setInStock(false);
            return productRepository.save(product);
        } else {
            throw new ResourceNotFoundException("Category not found with id: " + id);
        }
    }

In controller I have:在 controller 我有:

@Autowired
    ProductService productService;

    @GetMapping("/products/{categoryId}")
    public String viewProducts(Model model, @PathVariable("categoryId") long categoryId) {
        List<Product> productsList = productService.findByCategoryId(categoryId);
        model.addAttribute("productsList", productsList);
        model.addAttribute("categoryId",categoryId );
        return "products";

    }
    @GetMapping("/newProduct/{categoryId}")
    public String showAddForm(Model model,@PathVariable("categoryId") long categoryId) {
        Product product = new Product();
        model.addAttribute("product", product);
        return "newProduct";
    }

    @PostMapping("/save/{categoryId}")
    public String addProduct(@ModelAttribute("product") Product product, @PathVariable long categoryId){
        productService.save(product, categoryId);
        return "redirect:products";
    }

Where I am stuck is that I can't redirect from products.html to newProduct.html (that showAddForm method should return) using the path variable categoryId.It redirects me to an error page where if I enter the categoryId by hand in the URL,I finally get to the newProduct.html. Where I am stuck is that I can't redirect from products.html to newProduct.html (that showAddForm method should return) using the path variable categoryId.It redirects me to an error page where if I enter the categoryId by hand in the URL ,我终于找到了新产品。html。 In the products.html, I have:在 products.html 中,我有:

<body>
<div class="container my-2">
    <div class="card">
        <div class="card-body">
       <!-- TODO get category ID from categories  (parameters between HTML)-->
            <div th:switch="${productsList}" class="container my-5">

                <p class="my-5">
                    <a href="/product/newProduct/" class="btn btn-primary">Add product</a>
                </p>
                <div class="col-md-10">
                    <h2 th:case="null">No Products yet!</h2>
                    <div th:case="*">
                        <table class="table table-striped table-responsive-md">
                            <thead>
                            <tr>
                                <th>Name</th>
                                <th>Description</th>
                                <th>Price</th>
                                <th>Discount</th>
                                <th>IsInStock</th>
                                <th>Edit</th>
                                <th>Delete</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr th:each="product : ${productsList}">
                                <td th:text="${product.name}"></td>
                                <td th:text="${product.description}"></td>
                                <td th:text="${product.discount}"></td>
                                <td th:text="${product.price}"></td>
                                <td th:text="${product.isInStock}"></td>
                                <td><a th:href="@{/product/edit/{id}(id=${product.id})}" class="btn btn-primary"></a></td>
                                <td><a th:href="@{/product/delete/{id}(id=${product.id})}" class="btn btn-primary"></a></td>
                            </tr>
                            </tbody>
                        </table>
                    </div>

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

</html>

The issue I see is, your code for showAddForm with the path @GetMapping("/newProduct/{categoryId}") is expecting a catgoryID which is not sent in the above Add product button.我看到的问题是,您的带有路径@GetMapping("/newProduct/{categoryId}")showAddForm代码需要一个 catgoryID,它没有在上面的添加产品按钮中发送。 Since you are passing a categoryId in the line model.addAttribute("categoryId",categoryId );由于您在model.addAttribute("categoryId",categoryId ); you can use this in the href element.您可以在 href 元素中使用它。 Therefore, that link should be something like因此,该链接应该类似于

<p class="my-5">
    <a th:href="@{/product/newProduct(categoryId=${categoryId})}" class="btn btn-primary">Add product</a>
</p>

But since within the method showAddForm categoryID is not used, so you can remove that.但是由于在方法showAddForm中没有使用 categoryID,所以您可以删除它。 And try with something like并尝试使用类似的东西

<p class="my-5">
    <a th:href="@{/product/newProduct}" class="btn btn-primary">Add product</a>
</p>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM