【问题标题】:MVC Architecture UnderstandingMVC架构理解
【发布时间】:2015-01-09 02:52:03
【问题描述】:

有了所有的教程,我设法让控制器显示了一个视图。但是,我不明白如何允许用户使用 MVC 浏览网站。对服务器的每个请求都必须通过控制器?如果每个请求都必须通过控制器,我应该如何让控制器定义它应该将请求转发到的响应类型。

编辑:我正在做一个学校项目,要求我将当前不可重用的代码转换为 MVC 模式,但我不了解不同视图的导航部分。如何从一个视图到另一个视图。例如,导航栏元素应该指向控制器还是视图?

【问题讨论】:

  • “定义响应类型”是什么意思?
  • 嘿@Ophitect 你可能想看看Why should I use an MVC pattern?;
  • 假设我定义了我的登录控制器,登录控制器处理登录表单并将用户重定向到一个视图,成功或错误。视图 1 是 success.jsp 视图 2 是 product.jsp 我现在在视图 1 中。我应该如何导航到视图 2?
  • @Ophitect 您只需使用带有另一个控制器期望的 url 的链接......控制器首先出现,它的工作是做任何你书呆子要做的事情并将你重定向到一个视图..
  • 如果导航是指通过超链接导航,那么答案与 MVC 关系不大。一旦页面被提供,请求就结束了。 Web MVC 与常规 MVC 稍有不同,在常规 MVC 中,您通过修改视图的状态来响应事件(Web MVC 中的视图和控制器层大部分时间都是无状态的)。如果你想重定向用户,那应该发生在控制器中,而不是视图中。视图只负责输出的外观(理论上)。

标签: java jsp servlets model-view-controller


【解决方案1】:

控制器首先出现,它与模型通信并将您发送到您想要的视图。

因此,根据您的需要,在视图中,只需将一些链接与映射到您想要的控制器中的 url 放在一起...

【讨论】:

    【解决方案2】:

    简短的回答是所有动作都“指向”控制器,并带有一个参数告诉它应该是什么动作,以及任何其他必要的参数。

    假设您有一个简单的注册表单。您可能有以下两个操作:showRegistration 和 Register。 MVC 并非特定于网络,但我将提供该上下文中的示例(基于您的 cmets)。这两个操作将指向您的控制器(比如 index.jsp),其 URL 如下所示:/index.jsp?act=showRegistration 和 /index.jsp?act=Register。

    然后,您的控制器将对不同的操作具有不同的逻辑(您可以自己通过多种方式执行此操作,或者使用一些框架为您执行此切换逻辑)。最终,控制器中的逻辑将归结为如下内容:

    if showRegistration:
        model.getCountries //to populate a dropdown maybe
        view.showRegistrationForm
    if Register:
        model.validateRegistrationForm
        if not valid
            view.showRegistrationNotValid
        else 
            model.createUser
            if userCreated
                view.showSuccess
            else
                view.showCouldNotCreate
    

    这个想法是控制器使用可重用的模型和视图组件构建完整的操作。您可以在许多不同的地方使用相同的model.getCountries,从而重用检索国家列表的逻辑。

    在实践中,泛化模型和视图操作需要付出不小的努力。我见过许多项目陷入混乱,其中包含数百个为单一目的而创建且仅使用一次的组件,并且许多组件本质上是重复的,因为开发人员不知道已经存在类似的组件,或者需要稍微不同的逻辑并且确实不想费心修改旧代码。

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 2013-01-24
      • 2013-04-22
      • 1970-01-01
      • 2012-04-24
      • 2016-01-05
      • 2011-12-30
      • 2021-05-04
      相关资源
      最近更新 更多