当前位置: 首页 > 面试题库 >

JSF中MVC的矛盾解释

韩羽
2023-03-14
问题内容

我将开始学习JSF,但是首先我想了解它作为MVC框架的概况。

有很多答案,其中有很多赞扬解释了JSF中的MVC层,但是它们通常是矛盾的。

BalusC的答案: JSFMVC框架中的MVC是什么组件?

在总体架构图中,您自己的JSF代码是 V

M- 业务域/服务层(例如EJB / JPA / DAO)
V- 您的JSF代码
C -FacesServlet

在开发人员图中,体系结构 V 可以如下划分:

M- 实体
V -Facelets / JSP页面
C- 托管bean

Jigar Joshi在同一主题中的答案:

中号 奥德尔将是你的ManagedBean

V iew是jspXHTML(那么您可以在此处容纳各种视图)

ç ontroller会FacesServlet

在这里,关于该问题的另一种观点:

在JSF中,您无需实现控制器。因此,后备bean或任何其他类型的托管bean 都不 是控制器。

另一个不是这次的Stackoverflow:

在JSF中,主控制器始终是FacesServlet。子控制器已合并到各种控制元素标签实现中。您几乎永远不会在JSF中编写控制器代码,因为它们都是预先提供的。因此,您只需要提供View模板(xhtml)和Models(支持bean)。

许多人认为,支持bean的动作逻辑使它们成为Controller。这是不正确的。控制器是其生命中唯一的目的是同步模型和视图的组件。在JSF中,该任务由FacesServlet和控件执行。您可能让Validator和Converters执行辅助功能,但是实际的同步(更新)是JSF核心的一部分。

我知道MVC有很多变体,具体取决于它是桌面应用程序,Web应用程序等。因此,很难定义MVC(尝试找到两个对MVC的解释相同的资源)。

我在这里最关心的是Managed bean。他们是M还是C?显然,托管bean用于从模型层(最高抽象层的模型层-
像BalusC的回答中那样是EJB,JPA和DAO的大体系结构图)检索数据,并存储结果以供视图使用。MVC中的控制器层是负责从视图中处理命令,与模型层进行通信并从模型层检索数据的层。受管bean是否用于与模型层通信?是的,它还使检索到的数据可用于视图。对我而言,它属于控制器层,而不是模型,因为它不包含用于检索数据或数据本身的逻辑,而仅调用适当的模型层方法。

那么,我困惑的根源是什么?任何人都可以一劳永逸地解释这一点,以便JSF初学者很清楚吗?


问题答案:

我在这里最关心的是Managed bean。 他们是M还是C?

人们看起来像这样的人是M:

@ManagedBean
public class Bean {

    private String username; // +getter+setter
    private String password; // +getter+setter

    @Resource
    private DataSource dataSource;

    public void login() {
        try (
            Connection connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement("SELECT * FROM User WHERE username = ? AND password = MD5(?)");
        ) {
            statement.setString(1, username);
            statement.setString(2, password);

            try (ResultSet resultSet = statement.executeQuery()) {
                if (resultSet.next()) {
                    // Login.
                }
            }
        }
    }

    // ...
}

但是,当他们看起来像这样时,他们会认为它们是C:

@ManagedBean
public class Bean {

    private User user // +getter

    @EJB
    private UserService userService;

    public void login() {
        if (userService.find(user) != null) {
            // Login.
        }
    }

    // ...
}

您发现的MVC答案中也提到了这一点:

请注意,一些入门者,甚至某些(非常基础的)教程都将受管Bean中的实体属性混合/复制/展平,这将有效地使控制器成为模型。不用说这是较差的设计(即不是干净的MVC设计)。



 类似资料:
  • 请查看Oracle规范-第5章。 这一行: 拓宽的基元转换不会丢失有关数值的整体大小的信息。 接下来,就在下面两行,这一行说震级信息可能会丢失。 从float到double的非strictfp加宽原语转换可能会丢失有关转换值的总体大小的信息。 这似乎是一个明显的矛盾;这是一个错误吗?

  • 我正在尝试为微服务架构实现安全解决方案。我的身份验证服务器支持OAuth2和OIDC。 我正在尝试弄清楚是否可以在我的微服务之间传递JWT令牌,以避免重复交换不透明令牌来获得用户声明。没有什么(实际的)阻止我做那件事。我可以: 在进行呼叫时,使用我从身份验证服务器获得的JWT(ID令牌)作为承载令牌 每个服务都可以根据身份验证服务器的(缓存的)JWKS验证该令牌,以确保其有效 每个服务都可以在其对

  • 问题内容: 我已经阅读了一些有关Android中的Singleton模式用法及其在保留Context方面的缺点的信息。实际上,当我实现以下代码时: Android Studio向我显示以下警告: 不要将Android上下文类放在静态字段中(对HttpManager的静态引用,其中mContext字段指向Context);这是内存泄漏,并且还会中断即时运行。 但是,我可以在此页面的Android文档

  • 在科尔门定理3.1中说 例如,插入排序的最佳运行时间是big-omega(n ),而插入排序的最差运行时间是Big-oh(n^2).因此,插入排序的运行时间介于大ω(n)和Bigoh(n^2之间 现在我们来看练习3.1-6,它问 证明了一个算法的运行时间是Big-θ(g(n)),如果它的最坏情况运行时间是Big-oh(g(n)),它的最佳情况运行时间是big-omega(g(n)) 我是唯一看到矛

  • nextjs 提到了 React Server Components 使用的优点,并建议对于静态部分尽量使用 React Server Components。但是 React Server Components 是不支持 Context 的,那么就要求带 Context 的组件使用 "use client",而很多组件库使用了 Context 来提供主题设置,往往这个设置都放置在顶层上,这又导致了

  • 问题内容: 我目前正在使用几种不同模式用Java开发一个简单的游戏。我扩展了Game类的主要内容,以将主要逻辑放入其他类中。尽管如此,主要的游戏类别仍然相当庞大。 快速浏览一下我的代码后,其中大部分是Getters和Setters(60%),而游戏逻辑真正需要的其余部分则是Getters和Setters。 Google的一些搜索声称Getters和Setters是邪恶的,而其他一些人则声称它们是良