java - MVC 与 Taglibs,意见/替代方案?

标签 java model-view-controller taglib

我是一名前端开发人员,我发现自己经常在 jsp View 层中工作,并且看到了很多将数据(模型)推送到 View 中的解决方案。最近我遇到了一个将数据拉入 jsp 的 taglib 解决方案,在我看来这更自然和明智。

首先是问题

给定一个页面并将其视为一个单独的实体,MVC 绝对有意义,但是单个页面可能非常复杂,并且很可能会重用其他页面上使用的组件/服务。因此, Controller 也变得相当复杂。

根据我的经验,页面也是可变的,因为客户喜欢在下一次“重新设计”时改变功能或将整个网站翻个底朝天。这通常会导致一个相当乏味的重构项目,其中几乎所有的东西都需要重写。

然后是一致性问题,在一个页面上,数据集作为“列表”放入模型 View ,而在另一个页面上,“列表”可能是抽象的,它作为“特定列表”放入模型 View 。在项目生命周期中保持一致性成为一项乏味的平凡任务,通常会被避免,但这正是纯 MVC 解决方案所发生的事情。

解决方案?

所以在我最近继承的一个项目中,我看到了两种将数据拉入 pageView 的解决方案。第一个使用 jsp:include 来调用 jsp 页面并触发另一个 Controller 是相当丑陋的。

我发现第二个相当优雅,他们使用 taglib 将特定数据集拉入 pageView。 taglib 记录在 TLD 中,使用起来很愉快。突然之间,我可以在多个页面上重用数据,而无需使用 Controller 。

所以在这个项目中,我不得不实现“重新设计”,所有的数据拉取解决方案使我的工作变得容易得多,但是在他们使用数据注入(inject) (MVC) 的地方,这让我很头疼(我'我不是 Java 开发人员)和 Java 开发人员可以帮助解决几乎没有的问题。

此外,如果编写得当,taglibs 可以只写一次,而使用数据注入(inject) (MVC) 可能会成为您经常需要照顾的 child (在 jsp 之上)。

标签库示例

假设我们有具有以下标签定义/实现的 services.tld。
- 获取员工地址
- 获取员工

<services:getEmployees filter="a">
   <!-- loop, get addresses, otherwise if empty list, render nothing -->
</services:getEmployees>

这让我(前端)可以在几乎任何页面上显示员工和他们的地址,让 Java 开发人员腾出时间来处理更重要的任务。该服务可独立于 pageView Controller 进行测试,pageView Controller 变得不那么复杂(例如只处理身份验证和站点范围的功能)并且生活(至少对我而言)似乎更有趣。

我的问题

实际上是多部分的:

1.) 我的推理是废话吗?如果是,为什么以及从什么角度? =P

2.) 有更好的选择吗? (例如,我也使用过瓷砖)。

3.) 您是否在使用上面提到的 taglib 解决方案,您的使用体验如何?

4.) 从 Java 开发人员的角度来看,上述 taglib 解决方案的成本/ yield /风险是什么?

我理解为什么 MVC 使 Java 开发人员变得简单,但根据我的经验(到目前为止)它只是将困难转移到 jsp 层,就像我有时需要为每个页面学习一个单独的 API...哦,而且是作为一名前端开发人员,我确实承认使用 Ajax 和所有这些东西对我来说数据拉取更自然,在我的领域中让所有数据在页面加载时可用是一种反模式......

最佳答案

您清楚地听到过这样的口头禅:在 JSP 中实现业务逻辑是不好的。但是你知道为什么吗?

其中一个原因是技术问题,即提交 HTTP 响应的时间问题。

在基于 MVC 的系统中, Controller 检查参数,决定需要做什么并尝试去做。然后在此基础上设置响应状态代码并拉取要在响应中显示的数据。最后,它选择一个 View (例如 JSP)并将控制权交给 JSP 引擎……提交 HTTP 响应。

如果您尝试在 JSP 中执行所有操作,您会遇到响应为 HTTP 的问题可能会过早提交;即在您的业务逻辑完成确定正确的 HTTP 状态代码是什么的事情之前。


您对 MVC 的不满似乎很大程度上源于您假设 Controller 和 View (JSP) 是由不同的人实现的:即具有不重叠技能集和领域的“前端开发人员”和“Java 开发人员”的责任。我的看法是,您应该只拥有具有在“围栏”两边工作的技能的“开发人员”。事实上,根本不应该有栅栏。

关于java - MVC 与 Taglibs,意见/替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4898952/

相关文章:

java - 使用什么类型的对象来制作带有选择字段的表单?

java - 捕获多个异常并抛出新的异常列表

java - 在 Java 中维护排序的 ArrayList 的最有效方法(速度方面)是什么?

c# - DefaultModelBinder 和继承对象的集合

c++ - 你如何在 ubuntu 上编译 taglib?

java - 正确的 .tld 文件头

java - 在 Struts 1 表单中显示列表

java - Java的PDF库

java - xml中替换字符时如何防止ant构建改变国家字符

javascript - 在 Ember JS 中使用模型作为 View 元素类名