J2EE Struts 2 与 ASP.NET MVC 2 的 MVC 实现比较,谁是最好的?第二部分






4.89/5 (23投票s)
本文将比较 Java 和 ASP.NET 的框架。
那么,日程安排是什么?
如果您是 ASP.NET MVC 和 J2ee Struts 框架的新手
与框架的整体比较
使用模板进行自动化
将数据从控制器传递到视图
现成的文件夹结构
用于智能感知的强类型视图
助手类
URL 自定义和操作映射
URL 验证
安全
最终结论
ASP.NET 面试题及答案
感谢 Vishwa
那么,日程安排是什么?
在我们之前的文章中,我们已经比较了未使用框架的 J2ee 和 ASP.NET 的 MVC 实现;要查看比较,请点击 ASP.NET MVC 和 J2ee MVC,点击此处 ---> 获取更多 MVC 教程。
在当今世界,没有人会在没有框架帮助的情况下实现 MVC。所以无论是 ASP.NET 还是 j2ee,框架支持都是必须的。Struts 2 一直是 J2ee 中最受欢迎的框架,而在 ASP.NET 中,ASP.NET MVC 模板是王者。在本文中,我们将从实现方式以及它们的优点和缺点方面比较这些框架。
在本文中,我们将使用 8 个议程点来比较这两个框架:-
- 自动化
- 在控制器和视图之间传递数据
- URL 自定义
- 安全
- 文件夹结构管理
- 智能感知支持
- HTML 自动化(助手类)。
如果您是 ASP.NET MVC 和 J2ee Struts 框架的新手
如果您不熟悉这些框架,可以观看以下视频以快速上手这两个框架。
点击此处 查看简单的 ASP.NET MVC 视频,展示了“Hello World”。
点击此处 查看简单的 J2EE Struts 视频,通过示例讲解 Struts 2。
与框架的整体比较
在开始之前,这是一个完整的比较表,提供了整体的比较视图。在文章的后续部分,我们将对此进行更详细的讨论。
比较点 | Microsoft MVC 2 模板 | 使用 J2ee 框架(Struts 2)的 MVC |
模板自动化 | 内置于 Visual Studio | 需要使用开源插件,例如 http://mvcwebproject.sourceforge.net |
将数据从控制器传递到视图。 | 引入了新的会话管理技术,如“viewdata”和“tempdata”。 | 固有地使用相同的请求对象,使用相同的请求拦截器。 |
现成的文件夹结构 | MVC 模板为视图、控制器和模型创建了现成的逻辑文件夹结构。 | 没有像 ASP.NET MVC 那样的逻辑文件夹结构,但可以手动创建。 |
用于智能感知的强类型视图 | 支持字符串类型视图,以获得更好的智能感知。 | 通过类型转换实现。 |
助手类 | 助手类 | 标签库 |
URL 自定义和操作映射 | 使用后台代码。 | 使用 Struts 2 XML 文件。 |
URL 验证 | 可以使用正则表达式轻松进行 URL 验证。 | 目前没有内置机制,但可以通过自定义编码实现。 |
安全 | 具有现成的安全属性,可以避免跨站、SQL 注入。 | 目前没有固有功能,但可以通过自定义编码实现。 |
使用模板进行自动化
首先映入我们眼帘的是 Microsoft VS IDE,它有一个漂亮的现成模板,开发人员可以从中开始。在 MVC J2ee 框架中,核心 struts 框架不像 Microsoft MVC 那样拥有一些内在的东西。
话虽如此,但这并不意味着 J2EE 社区落后了;您仍然可以借助开源插件从 http://mvcwebproject.sourceforge.net 获取模板。下面是 MVC Web 项目模板的简单快照。
唯一的区别是它不像 Microsoft MVC 那样是内置的。
结论:- 在用户友好的界面和模板自动化方面,Microsoft 绝对胜出。在 j2ee struts 框架中,我们需要寻找第三方插件来帮助我们实现相同的自动化。
将数据从控制器传递到视图
在 MVC 中,最重要的部分之一是从控制器传输数据到视图。Microsoft MVC 引入了一个名为“ViewData”的新变量,它将帮助我们在控制器和视图之间传输数据,如下面的代码片段所示。
下面的代码片段在控制器中设置数据。
ViewData["CurrentTime"] = DateTime.Now.ToString();
下面的代码片段在视图中显示数据。
J2ee Struts 框架使用 HTTP 请求对象将数据从控制器传递到视图。下面的代码片段使用“setAttribute”函数将简单日期值设置到请求对象中。在 ASP.NET MVC 中,我们无法更改请求对象。
request.setAttribute(“CurrentTime”,new Date());
之后,我们可以使用“getAttribute”显示数据。
结论:- 首先,两种技术都具备传递数据的能力,但 j2ee Struts 框架的思维方式似乎更具说服力。归根结底,视图接收的是 HTTP 请求,所以通过请求对象传递数据比为同一目的创建一个新变量(如 view data)更符合逻辑。
许多 ASP.NET MVC 的爱好者(包括我)也可以有逻辑地争辩说,请求对象是通过使用最终用户发送的数据(即来自浏览器)来创建的。此数据不应在中间被 Web 应用程序代码修改。请求对象仅应允许最终用户使用 POST 和 GET 进行修改。
因此,目前我给它们打平。
现成的文件夹结构
在 ASP.NET MVC 中,模板创建了一个现成的文件夹结构(称为区域),这为开发人员提供了清晰的视图,了解模型、视图和控制器应存储在哪里,如下图所示。
在 j2EE struts 框架中,我们没有像 ASP.NET MVC 那样清晰的文件夹术语。在 J2EE 框架中,控制器和模型位于 Java 资源文件夹中,而视图保存在 Web 内容文件夹中,如下图所示。
说了这么多,您始终可以手动重命名和创建不同的文件夹结构,以获得与 ASP.NET MVC 相同的逻辑表示,只是它不是自动化的。
据我们所知,目前使用任何 J2EE struts 插件都不可能实现上述逻辑结构。
结论:- 在项目管理方面,ASP.NET MVC 具有轻微优势,因为它拥有现成的逻辑文件夹结构,而 J2ee 框架需要我们手动创建。
用于智能感知的强类型视图
在 ASP.NET MVC 中,您可以创建一个强类型视图。换句话说,当您添加一个视图时,您可以选择该视图将连接的模型。
之后,当您进入视图并键入 model 关键字时,您可以以强类型的方式获取对象的属性。
在 Java 中,我们没有强类型视图的概念。如果您愿意,可以将对象设置在 request.getAttribute 中,然后进行类型转换以获取对象的智能感知。
结论:- 这个特性对 ASP.NET 社区来说可能非常令人兴奋,但对我 J2ee 的朋友来说有点令人费解(我认为他们有很多理由是正确的)。强类型视图在 ASP.NET MVC 中的整个目的是为了更好的智能感知,而这可以通过如上图所示的 ViewData 对象进行类型转换来实现。
最大的问题是,开发人员可能会认为模型与视图是绑定的。我们理解意图并非如此,但对话框只是在视觉上暗示了这一点。MVC 的最终目标是将模型与视图分离。
因此,总结一下,这是一个很好的特性,可以从少量代码中获得最大收益,只是它可能会让一些初级 MVC 开发人员感到困惑。为了实现一些小自动化,我希望我们不会在 MVC 的基本原理上产生逻辑混乱。
两者再次获得相同的分数。我没有给 ASP.NET MVC 加分,因为视图的事情更容易混淆,并且可以通过类型转换实现。
助手类
一个好的 MVC 框架总是会提供助手类来为视图创建 HTML 代码。
在 ASP.NET MVC 中,我们有助手类。例如,要在 ASP.NET MVC 中创建简单的 HTML 表单,您可以使用 HTML 助手类,如下面的代码所示。
在 j2ee struts 框架中,我们有标签库,可以帮助我们生成 HTML 代码,就像使用 ASP.NET MVC HTML 助手类一样。
结论:- 两个框架都有 HTML 助手类。让我们不要纠结于哪个库更好,否则我们会偏离主要比较。因此,在这个讨论中,两个框架得分相同。
URL 自定义和操作映射
MVC 涉及操作,这些操作被映射到 URL。作为开发人员,您会希望看到您的 MVC 框架具有自定义和配置 MVC URL 和操作映射的能力。下面是一个简单的表格,解释了为什么开发人员会期望对 MVC URL 进行自定义和配置。
入站 URL | 控制器 (Controller) | 操作 | 描述 |
http://www.questpond.com/LocateProduct | SearchProductController | 搜索 | 此操作将帮助我们获取所有产品。 |
http://www.questpond.com/LocateProduct/100 | SearchProductController | Search(1001) | 此操作将帮助我们获取产品代码为 1001 的所有产品。 |
http://www.questpond.com/Create | MaintainProductController | Create | 此操作将帮助我们创建新产品。 |
http://www.questpond.com/Modify/1001 | MaintainProductController | Modify(1001 | 此操作将帮助我们修改产品代码为 1001 的产品。 |
在 ASP.NET MVC 中,这是通过使用内置的路由机制实现的。为了配置路由,您可以转到 global.asx.cs 代码,并使用 routes 集合将 URL 结构映射到控制器和操作。
routes.MapRoute( "HelloWorld", // Route name "Pages/RegisterAction/{1}", // URL with parameters new { controller = "Register", action = "RegisterAction", id = UrlParameter.Optional }); // Parameter defaults
为了在 J2ee struts 框架中配置 MVC URL,我们可以使用 Struts XML 文件来实现。下面的映射比 ASP.NET MVC 的路由集合更清晰。在 J2ee 框架中,我们可以更好地看到映射,因为它们直接映射到页面名称。
结论:- 在 MVC URL 配置和映射到控制器方面,J2ee Struts 框架绝对胜出,因为它使用 XML 文件进行定义。ASP.NET MVC 框架可以在这方面进行改进。更改映射需要编译代码,这很麻烦。
URL 验证
在 ASP.NET MVC 中,我们可以利用正则表达式(regex)进行 URL 验证,然后再执行操作。例如,下面是一个简单的验证,在调用 customer 操作之前,我们可以检查传递给操作的输入是否为仅包含两位数字的数值。
routes.MapRoute( "View", // Route name "View/ViewCustomer/{id}", // URL with parameters new { controller = "Customer", action = "DisplayCustomer", id = 0 }, new { id = @"\d{1,2}" } );
目前 J2ee struts 框架不支持此功能,但您仍然可以在执行操作后使用一些自定义逻辑进行验证。
结论:- 这绝对是 ASP.NET MVC 的一个优点,因为 MVC URL 可以通过任何方式调用,通过浏览器、通过 URL 等。所以我们希望在 URL 命中控制器之前进行适当的验证。
安全
MVC URL 被映射到操作,并且可以直接调用它们,这意味着它们也容易受到跨站攻击、SQL 注入等攻击。ASP.NET MVC 框架提供了安全属性,我们可以利用这些属性来保护我们的 URL 免受此类攻击。
例如,为了防止伪造攻击和跨站脚本攻击,我们可以使用“HtmLAntiForgeryToken()”,如下面的代码片段所示。
在后续的操作中,您可以检查是否存在任何违规行为。
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int customerid) { }
您还可以通过使用 validate input 属性来标记控制器,以避免 CSS。
[ValidateInput(true)] public class OurController : Controller
对于您不希望调用操作的关键函数,您可以将方法标记为“nonaction”,如下面的代码片段所示。
[NonAction] public void DoPasswordChange(string username, string newpassword) { /* Rest of code unchanged */ }
在 J2ee Struts 框架中,目前我们没有任何内置的安全功能来实现这一点。需要一些自定义代码。
结论:- 这是 ASP.NET MVC 框架安全方面最大的亮点。希望 j2ee struts 框架在未来也能拥有这种内置的安全功能,这将是该框架的一大额外优势。
最终结论
以下是最终结论。ASP.NET MVC 框架在 4 个方面优于 J2ee,而 J2ee 拥有灵活的 XML URL 自定义功能,这在 ASP.NET MVC 中目前不可用。对于所有其他方面,它们保持不变。
我已经尽了我最大的努力来阐述双方的观点,在此过程中,我从未想过我是一名 ASP.NET Microsoft MVP,我应该大力推销 ASP.NET MVC 框架。我尽了最大的努力进行真实的比较,看看哪一个更好。我理解每个开发人员都热爱自己的技术,如果我无意中冒犯了您……非常抱歉。
ASP.NET MVC 面试题及答案
如需进一步阅读,请观看以下面试准备视频和分步视频系列。
- ASP.NET MVC 面试题及答案
- C# 面试问答
- Angular 面试问题及答案
- 逐步学习Azure。
- 逐步学习MVC 5
- MVC Core 分步教程
- SQL Server 分步教程
- ASP.NET 中的Session & Viewstate。
感谢 Vishwa
特别感谢 Mr Vishwanathan Narayanan,他为我提供了 J2EE 方面的输入,否则我将无法取得相同的成就。