65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (23投票s)

2011 年 4 月 27 日

CPOL

11分钟阅读

viewsIcon

146899

本文将比较 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 面试题及答案

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

感谢 Vishwa

特别感谢 Mr Vishwanathan Narayanan,他为我提供了 J2EE 方面的输入,否则我将无法取得相同的成就。

© . All rights reserved.