【问题标题】:MVC and jsp what is view?MVC和jsp是什么视图?
【发布时间】:2015-02-05 19:06:28
【问题描述】:

我有以下情况——我有前端控制器,一个控制器,一个模型和几个jsp页面。据我了解,这些 jsp 页面是我的观点。为每个 http 请求控制器选择一个 jsp 页面。

如果我们使用服务到工作模式,那么我们有以下方案:

1) request->
2) front controller-> controller-> model->
3) front-controller-> view ->
4) responce

所以前端控制器呈现视图。因此,控制器必须将一些对象传递给前端控制器,该对象将保留 jsp 文件的名称。所以我的问题,如何命名这个对象的类?看法?但是视图是jsp..

【问题讨论】:

  • 为什么不打开 Spring MVC 源代码并查看它们的实现?首先,看看这里:docs.spring.io/spring/docs/current/javadoc-api/org/…
  • @Ivan 谢谢。我认为解析器是我需要的。我的问题可能看起来很简单,但我从未在使用 JavaEE 时使用过 spring。如果你将我的问题作为“答案”来回答,我会给你赏金。
  • @Ivan 但是它并不完全正确,因为解析器是解析从构造函数 ModelAndView(FILENAME) 获取的视图的类/对象。至少在我见过的例子中。所以你做出答案,如果以后没有更好的我会接受你的答案。
  • @kingkero 关于问题 - MVC 理解视图。感谢您的时间。但是我删除了那个帖子,因为有人反对它。不尊重 - 毫无疑问和我的结论。

标签: java jakarta-ee design-patterns model-view-controller


【解决方案1】:

我认为您最大的困惑是 JSP 与 View。 JSP 是 Spring 支持的众多模板技术之一,其他包括 Velocity、Freemarker、Thymeleaf、Jasper 等。您的控制器通常会返回一个视图名称(或者它可以是一个实际的视图子类对象)。视图解析器接管那里,您可以使用它们的链来呈现不同的视图,如果一个没有您要查找的视图的定义,它会将其传递给链中的下一个解析器。一旦您从 Controller 方法返回的视图被解析为 JSP 视图或 Freemaker 视图或任何其他视图,底层模板技术就会接管并进行实际渲染。

例如,您可以有一个名为“widgets”的视图,它解析为 JSP 模板,然后由 JSP 呈现,另一个名为“widget-reports”的视图由 Japser 呈现并生成 Excel 报告。

总而言之,Spring 的 View 是您从控制器返回的内容与您使用的任何模板技术之间的链接。

【讨论】:

    【解决方案2】:

    在 MVC 设计模式中,M 是 Model,V 是 View,C 是 Controller。
    控制器用作视图和模型的隧道。
    View 是您的 JSP/HTML,无论您使用什么来表示

    在简单 MVC 模式的情况下,您可以使用以下代码从控制器(即 servlet)重定向视图(即 jsp):

    ServletContext context = getServletContext();
    RequestDispatcher dispatcher = context.getRequestDispatcher("/viewPage.jsp");
    dispatcher.forward(request,response);
    

    在 Spring MVC 模式的情况下,您可以使用以下代码从控制器重定向视图:

    ModelAndView modelAndView = new ModelAndView("/viewPage.jsp");
    return modelAndView;
    

    (也可以在 dispatcher-servlet 文件中配置 ViewResolver 并渲染视图内容。)

    【讨论】:

      【解决方案3】:

      我最近自己也经历过这个困境,经过一些试验和错误之后,我得到了以下设计模式的实现

      • 前端控制器处理所有传入请求并委托给所需的控制器。这通常包括以某种方式将传入的 URL 映射到文件路径,但您也可能正在加载一些初始数据或基类,或者设置一些应用程序环境设置。

      • 加载控制器后,在有新请求之前不会再次使用前端控制器。 (为了更好的词)“主”控制器现在加载任何所需的模型类并调用其中的方法来获取任何所需的数据。

      • 模型具有从数据源(即数据库)提取和处理请求数据的方法。除了其他模型和数据库连接之外,它无法访问任何内容。

      • 加载数据后,控制器会加载相关的视图类并将数据“推送”到视图中保存的变量中。

      • View 类本身没有“更高”的逻辑功能,也无法访问 Model 或 Controller 方法。它实际上只是提供通过各种 getSomeVar() 或 renderSomeData() 方法将数据处理成所需输出媒体(即 html)的方法。

      • 最后,Controller 调用 View 的方法来渲染页面,此时 Controller 的工作就完成了。视图将加载必要的模板文件,这些文件将被解释为浏览器生成输出。

      • 模板文件大多是结构 HTML,没有编程逻辑。数据仅通过调用视图中的各种 renderSomething() 方法加载到页面中。

      我的想法是 Controller 应该控制一切!

      【讨论】:

        猜你喜欢
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多