【问题标题】:How to properly define a Controller in Spring MVC compared to a JavaFX Controller与 JavaFX 控制器相比,如何在 Spring MVC 中正确定义控制器
【发布时间】:2021-12-09 21:36:24
【问题描述】:

我很难理解 JavaFX 控制器和 Spring MVC 控制器之间的区别。我来自 JavaFX 背景,我看到了 Spring MVC 控制器与 JavaFX 控制器之间的许多差异,我目前正在使用 Spring MVC。 它们之间有重要的区别,例如,在 JavaFX 中,每个 fxml 视图都有自己的控制器,例如LoginViewController.java 与 loginview.fxml、RegisterViewController.java 和 registerview.fxml。

这是JavaFX中一个简单的待办事项列表的代码,在我的问题中更清楚:

ToDoListViewController.java:

public class ToDoListViewController {

    // private properties tied to the fxml view via @FXML annotation

    private List<TodoItem> todoItems;

    @FXML
    private ListView<TodoItem> todoListView;

    @FXML
    private TextArea itemDetailsTextArea;
    
    // ...

    

    public void initialize() {

       // code to initialize stuff
       // ...
    }


    @FXML
    public void showUpdateItemDialog() {
         //get the item to be updated
        // do stuff to update item
       // ....
    }

}

此控制器与 todolistview.fxml 相关联,我认为这非常简单。

现在在 Spring 中,我看到一些控制器是由视图定向的,而另一些是由路由定向的,这让我有点困惑。我见过这样的控制器:

HomeController.java:(面向视图)

@Controller
public class HomeController {
    
    @RequestMapping("/")
    public String showPage() {
        return "main-menu";
    }

}

CustomerController.java:(面向路由)

@Controller
@RequestMapping("/customer")
public class CustomerController {
    
    private CustomerDAO customerDAO;
    
    public CustomerController(CustomerDAO customerDAO) {
        this.customerDAO = customerDAO;
    }
    
    @RequestMapping("/list")
    public String listCustomers(Model theModel) {
        
        // get the customers from the dao
        
        
        // add the customers to the model
        
        return "list-customers";
    }

    @RequestMapping("/add")
    public String addCustomer() {
        // return the jsp view to add a new customer
        
        return "customer-form";
    }

   // same goes for get by id, update and delete

   //...
}

了解这些差异的最佳方式是什么?在 Spring MVC 中使用哪种方法?面向视图,面向路由?感谢阅读!

【问题讨论】:

  • 不清楚您所说的“按视图定向”或“按路线”是什么意思。 reference documentation 非常清楚提供响应的各种方式。就个人而言,我通常在大多数基于 HTML 的应用程序中最终使用ModelAndView,但这取决于具体情况。 (旁注:使用 Thymeleaf 而不是 JSP。它更友好。)
  • @chrylis-cautiouslyoptimistic- 感谢您的回答!对不起,如果我不清楚!例如,在 Spring MVC 中,第一个控制器 HomeController.java 只是映射主页(main-menu.jsp),就像在 JavaFX 中一样,是一个带有相应控制器的视图。在第二种情况下,它附加到 URI /customer/list,处理不同的视图,如 list-customers.jsp 和 /customer/add,它返回另一个视图 customer-form.jsp。正如我所看到的,它更面向路线,而不是面向视图,我对此感到困惑。对不起,如果我不能更清楚我正在尝试!
  • 啊,好吧,在这种情况下:是的,Spring MVC 调度基于路由(特别是 mappings,它还可以包括其他规则,如参数过滤器或内容类型),你告诉它要渲染什么视图。单个控制器根据不同的条件(例如错误)呈现不同的视图是很常见的,因此在您的响应中提供这些说明。
  • 非常感谢!这对我帮助很大!现在我更好地理解了这些差异!
  • 将 MVC 应用于独立的胖客户端桌面应用程序与将 MVC 应用于 Web 应用程序非常不同,主要是因为 Web 应用程序必须位于 HTTP 请求-响应周期之上.在您对两者都有很多经验之前(当您开始看到它们之间抽象的相似之处时),我建议您将它们视为两个完全不同的想法,并单独学习它们。

标签: java spring spring-mvc javafx model-view-controller


【解决方案1】:

这一切都取决于需求, 例如:

在你的情况下, 如果您想直接访问任何内容(作为主页),您可以使用面向视图的访问。

如果您想要访问类似 CUSTOMERS 的任何内容,那么在您的情况下, 您可以使用视图方向,例如查看客户,您可以只使用“/customerList”创建一个方法,您还将获得所需的结果,但每次对于客户,您都需要对所有内容执行此操作, 相反,您可以做的是 使用路由映射,因为(客户)功能在创建时建立了路由,因此您可以使用路由映射,正如您在第二个示例中发布的那样, 在这种情况下,所有带有“/customer”的请求都将到达那里,然后将到达您想要的确切方法(已写入方法的映射中)。适合端映射,可以用来传递需要的参数id。

所以这一切都取决于一个人正在编写的代码的要求和级别。

【讨论】:

  • 非常感谢您的详细解答!所有 cmets 和您的具体答案解决了我理解 JavaFX 和 Spring MVC 处理 MVC 模式的方式之间的区别的问题!
【解决方案2】:

面向路由是 Spring MVC 中处理端点的好方法。这样可以很好地查看我们的代码,我们的代码看起来更有条理,更容易理解。面向路由的方式还提供了额外的规则,例如参数过滤器和内容类型。

【讨论】:

    猜你喜欢
    • 2013-05-25
    • 2018-05-09
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多