J2EE 与 ASP.NET MVC 实现对比,谁是最佳?第一部分






4.27/5 (18投票s)
本文将对比 J2EE 和 ASP.NET 中的 MVC 实现。
J2EE 与 ASP.NET MVC 实现对比,谁是最佳?第一部分
 
目录
那么,日程安排是什么?
本文不适合初学者
不使用框架的整体对比
对比的示例
模型 – J2EE 中的 Javabean 和 ASP.NET 中的 .NET 类
控制器 – J2EE 中的 Servlet 和 ASP.NET 中的 HttpHandler
映射 XML 文件 – J2EE 中的 Web.xml 和 ASP.NET 中的 Web.config
视图 – J2EE 中的 Servlet 和 ASP.NET 中的 HttpHandler
总结最终对比表
源代码
下一步:使用框架进行对比
ASP.NET MVC 面试题和答案
那么,日程安排是什么?
不久前,我与一位 Java 朋友讨论了 asp.net MVC 教程。讨论最终演变成了一场争论,试图证明哪种技术在实现 MVC 方面更好。出于各种原因,我试图证明微软技术是最好的,但是……嗯,啊哈,哦哦。
事实上,这两种技术都有自己做事的方式。所以,我最终写了这篇对比文章,讨论了 J2EE 中 MVC 的实现方式与 ASP.NET 相比的差异。
为了进行充分的对比,我将文章分为两部分。第一部分,我们将对比不使用框架和工具的 MVC 实现。
第二部分,我将对比使用 j2EE struts 和 ASP.NET MVC visual studio 模板的 MVC 实现。
您可以在 questpond.com 上观看我们关于 Model view controller、front controller、intercepting filter、factory patterns 等各种主题的 Java 和 J2EE 设计模式视频。千万不要错过我的 .NET 设计模式视频,其中涵盖了包括 MVC、MVP 和 MVVM 在内的 24 种模式。
 

本文不适合初学者
这篇文章绝对不适合初学者。如果您正在寻找 MVC 基础知识的文章,您可以在 ASP.NET 使用 HttpHandler 实现 MVC 中查看我使用核心 Http Handler 实现 MVC 的文章。
不使用框架的整体对比
因此,正如我们所知,在 MVC 中,第一次请求到达控制器,然后控制器将视图与模型绑定,并将结果发送给最终用户。
模型、视图和控制器构成了 MVC 的三个核心支柱。从 30,000 英尺的高度来看(这个数字让每个架构师都感到满意……),以下是这三个模块在每种技术中的实现方式:
 
| J2ee | ASP.NET | |
| 模型 | 带 setter 和 getter 的简单 Java bean 类。 | 带业务逻辑、setter 和 getter 的简单 .NET 类。 | 
| 控制器 (Controller) | 控制器使用 HttpServlet 类实现。 | 控制器使用 HttpHandler 类实现。 | 
| 视图 | 简单的 JSP 页面。 | 简单的 ASPX 页面。 | 
下面是事物实际外观的简单图示。

 
对比的示例
为了进行 proper 对比,我们采用了一个通用示例。在这个示例中,我们将执行以下操作:
• 当用户访问网站时,他看到的第一页是 Index 页面。因此,如果是 ASP.NET,他将看到 index.aspx 页面;如果是 j2EE,他将看到 index.jsp 页面。
• Index 页面是一个简单的页面,它接受用户名和密码,并将登录命令发送给控制器。
• 一旦控制器收到登录命令,它就会创建模型对象,并检查用户是否正确。
• 如果用户正确,它会将用户发送到欢迎视图页面,否则会将用户重定向到错误视图页面。
 

模型 – J2EE 中的 Javabean 和 ASP.NET 中的 .NET 类
让我们从 MVC 最简单的部分开始,即模型。
对于上面的示例,我们将创建一个名为“User”的简单类,该类将有两个属性:“Username”和“Password”。客户端(目前是控制器)可以设置这两个属性,并调用“IValid”函数来检查用户是否有效。
在 J2EE 中,模型就是 Java bean 类;在 .NET 中,它是一个带 setter 和 getter 的简单类。以下是其示例代码。
 
| J2EE 使用 Javabean 实现的模型 | ASP.NET 使用 .NET 类实现的模型 | 
| public class UserBean 
{
public UserBean() 
{
          this.username="user";
          this.password="pass";
}
public String getPassword() 
{ 
          return password;
}
public void setPassword(String password) 
{
           this.password = password;
}
public String getUsername() 
{
          return username;
}
public void setUsername(String 
username) {
          this.username = username;
}
public boolean IsValid
(String username,String password)
{
return this.username.equals(username)
 && this.password.equals(password);
}
}
 | public class User
{
public string UserName
{
set
{
_strUserName = value;
}
get
{
return _strUserName;
}
}
          public string Password
          {
             set
             {
            	_strPassword = value;
             }
             get
             {
                 return _strPassword;
              }
           }
           public bool IsValid()
          {
      if (_strUserName == "user" 
&& _strPassword == "pass")
             {
                   return true;
             }
              else
             {
                   return false;
             }
         }
   } | 
控制器 – J2EE 中的 Servlet 和 ASP.NET 中的 HttpHandler
下一个重要部分是控制器。控制器构成了 MVC 的核心。
要在 J2EE 中创建控制器,我们需要创建一个继承自 ‘HttpServlet’ 类的类。控制器的逻辑编写在 “processrequest” 方法中。您可以使用 ‘HttpServletRequest’ 类和 ‘HttpServletResponse’ 类访问请求和响应对象。
要在 ASP.NET 中创建控制器,我们需要实现 “IHttpHandler” 类并重写 “processrequest” 方法来编写控制器逻辑。以下是两种技术中控制器实现的简单代码。要访问请求和响应对象,我们需要在 ASP.NET 中使用 context 类,而在 J2EE 中,它作为函数的一部分可用,并带有不同的对象,如以下代码片段所示。
 
| J2EE 使用 Servlet 实现的控制器 | ASP.NET 使用 HttpHandler 实现的控制器 | 
| public class LoginServlet extends 
HttpServlet 
{
protected void 
processRequest(HttpServletRequest 
request, HttpServletResponse response)
throws ServletException, IOException 
{
// In this will go the code for 
// connecting the model to the view.
}
} | public class LoginHandler : 
IHttpHandler,IRequiresSessionState 
{
public void ProcessRequest(HttpContext
 context)
{
// In this will go the code for 
// connecting the model to the view.
}
} | 
在控制器中,我们可以使用以下代码在两种技术中从请求和响应中获取数据。
 
| J2EE 从 JSP 表单获取数据 | 从 .aspx 页面获取数据 | 
| String username = 
(String)request.getParameter("username")
;
String password = 
(String)request.getParameter("password")
;
UserBean model = new UserBean();
 | User obj = new User(); obj.UserName = context.Request.Form["txtUser"].ToString( ); obj.Password = context.Request.Form["txtPassword"].ToString( ); | 
然后,我们调用模型的 “isValid” 函数,并根据用户是否有效重定向到欢迎页面或主页。要在 J2EE 中重定向,我们使用 “RequestDispatcher” 类;要在 ASP.Net 中重定向,我们使用 “response.redirect” 函数。
| J2EE 检查用户是否有效并重定向 | ASP.NET 检查用户是否有效并重定向。 | 
| boolean isValidUser = model.isValid();
if(isValidUser)
{
request.setAttribute("welcome","Welcom
e"+username);
}
else 
nextJsp ="Error.jsp";
RequestDispatcher dispatch = 
request.getRequestDispatcher(nextJsp);
dispatch.forward(request,response);
 | if (obj.IsValid())
{
context.Session["Welcome"] = "welcome " + 
obj.UserName;
 
context.Response.Redirect("Welcome.aspx");
}
else
{
context.Response.Redirect("Error.aspx");
}
 | 
映射 XML 文件 – J2EE 中的 Web.xml 和 ASP.NET 中的 Web.config
既然我们已经创建了控制器,我们就需要将操作或 URL 模式映射到控制器。换句话说,当有人发送“Login”之类的操作或 URL 模式时,我们需要确保它会调用适当的控制器。
在两种技术中,模式/操作到控制器的映射是通过使用配置文件 XML 文件完成的。在 J2EE 中,此配置文件称为“Web.xml”文件;在 ASP.NET 中,它称为“Web.config”。
在 J2EE 的 web.xml 中,我们首先需要映射哪个 URL 模式映射到哪个 servlet。例如,您可以在下面的 web.xml 代码片段中看到,我们将 Login 模式映射到了 LoginServlet servlet 名称。
<servlet-mapping> <servlet-name> LoginServlet </servlet-name> <url-pattern> /Login </url-pattern> </servlet-mapping>
一旦模式与 servlet 名称匹配,我们就可以像下面的代码片段一样,将 servlet 名称与 servlet/控制器类进行映射。
<servlet-name> LoginServlet </servlet-name> <servlet-class> com.questpond.controller.LoginServlet </servlet-class>
在 ASP.NET 中,控制器或处理程序通过 web.config 文件与 URL 模式进行映射。以下是一个简单的 web.config 文件 XML 代码片段,它显示了如何将 Login URL 模式映射到 httphandler ‘Loginhandler’。
<httpHandlers> <add verb="POST" path="Login" type="MVCAspWithoutFramework.LoginHandler"/> </httpHandlers>
以下是两种技术中整体配置文件如下所示。
 
| J2EE Web.XML | ASP.NET Web.config | 
| <servlet-name>LoginServlet</servlet- name> <servlet- class>com.questpond.controller.LoginServlet </servlet-class> </servlet> <servlet-mapping> <servlet- name>LoginServlet</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping> | <httpHandlers> <add verb="POST" path="Login" type="MVCAspWithoutFramework.LoginHan dler"/> </httpHandlers> | 
视图 – J2EE 中的 Servlet 和 ASP.NET 中的 HttpHandler
下一个重要部分是视图。视图就是一个简单的页面,其中包含具有 URL 模式的 action 的 form 标签。
您可以看到 index.jsp 和 index.aspx 如何具有指向 Login URL 模式的操作。然后在 web.xml 和 web.config 文件中,此 URL 模式被映射到相应的控制器。
 
| J2EE 视图 index.jsp | ASP.NET 视图 index.aspx | 
| <form action="Login" method="post"> Username<input type="text" name="username" value="" /> <br/> Password<input type="password" name="password" value="" /> <br/> <input type="submit" value="Submit" /> </form> | <form id="form1" runat="server" action="Login" method=post> <div> <asp:TextBox ID="txtUser" runat="server"></asp:TextBox> <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="Button" /> </div> </form> | 
总结最终对比表
 
	| J2EE | ASP.NET | |
| 模型 | 带 setter 和 getter 的简单 Java bean 类。 | 带业务逻辑、setter 和 getter 的简单 .NET 类。 | 
| 控制器 (Controller) | 控制器使用 HttpServlet 类实现。 | 控制器使用 HttpHandler 类实现。 | 
| 视图 | 简单的 JSP 页面。 | 简单的 ASPX 页面。 | 
源代码
获取 ASP.NET MVC 和 J2EE MVC(无框架)的 源代码。
下一步:使用框架进行对比
本文对比了两种技术在不使用框架时的 MVC 实现。在下一篇文章中,我们将看到在使用框架时 MVC 有何不同。Struts 是 J2EE 中最流行的 MVC 框架,而 Microsoft VS MVC 模板是 Microsoft 中实现 MVC 最常用的方式。
让我们看看谁赢,谁更好……。
ASP.NET 面试题及答案
如需进一步阅读,请观看以下面试准备视频和循序渐进的视频系列。


