几天来我一直在尝试在基于VBScript (ASP Classic)的系统上实现前端控制器。我来自ASP。. NET MVC和Java背景,其中MVC实现比较常见,并且主要由现有框架完成。然而,在VBScript上,在这方面几乎没有做任何事情,所以这就是我试图自己做的原因。我用这篇文章作为如何实现它的指南。
一开始我认为我需要为每个请求定义一些常量参数,所以我创建了3:
class_command 'which command responsible to execute the correct class handler
action 'which method of the class handler to execute
action_params 'which parameters the action will need
接下来,我定义了一个通用控制器处理程序来处理请求:
Public Function Controller_Handler(action_params)
它的任务是提取常数参数(class_command
, action
, action_params
)并处理任何错误(稍后我将添加一个过滤器来处理它),这些错误可能像缺少常数参数或身份验证问题。
但很快我意识到一个问题:处理程序如何知道调用哪个命令,因为请求是一个字符串?我不能简单地使用反射将其转换为类,因为VBScript(我认为)没有反射库或内置功能。
所以我想我可以这样创建一个Switch Case
:
Select action_Params.Item("action_params")
Case "command_A"
' Call Command A
Case "command_B"
' Call Command_B
.
.
.
Case "Command_X"
' And so on
End Select
但是这是一种程序化的方式。接下来,我想创建一个XML文件来映射所有的命令和其他东西。
所以我的问题是:考虑到VBScript的限制,这是实现前端控制器模式的好方法吗?如果没有,你能提供一个指导(希望有一些例子,即使是一个简单的),我该怎么做?
从经典到。net/mvc,我可以分享我在经典asp中所做的尽可能接近地模仿这种行为,而不会使它成为太多的维护问题。
-
使用URL重写IIS是我的
routes
。我通常只做一个路由和直接/重写所有入站请求到一个controller.asp
页面来简化事情,而不是在我的URL重写设置中直接有一堆规则和控制器重定向,以维护它更容易(对我来说)。 -
在
controllers.asp
中使用Request.ServerVariables("HTTP_X-ORIGINAL-URL")
,您可以获取输入的实际URL,它返回类似…/real/url
-
在
controllers.asp
中使用Server.Execute("view1.asp")
根据输入的url以编程方式调用视图 我有一个名为
routes.asp
的类文件,它包含在每个模型/类文件中,并帮助我收集URL属性oRoute.GetPath_FirstDirectory()
等。然后,模型/类文件使用这些数据来创建视图可以使用的属性值。在每个模型/类中使用CLASS_INITIALIZE
从路由/url填充自己,或者也可以直接在视图中完成。在各自的视图中,我使用
<!--#include file="class.asp"-->
包括我的类/模型文件(如果甚至需要),然后简单地打开Set Model = new cModelClass
来初始化并开始在视图中使用它。我没有在controllers.asp
中包含类,因为当使用Server.Execute()
到视图时,视图不会从controllers.asp
继承任何变量。所以我直接在视图中设置了include
错误处理可以在多个级别,但理想情况下,它在controllers.asp
。具体的错误处理通常是在实际的模型/类CLASS_INITIALIZE
,以避免在控制器中重复使用类,因为它已经在视图中初始化了。
这并不完全是。net mvc中的内容,但这是我想到的最好的方式,对我来说也是最容易维护的。也许其他人有其他的实现,但这是我的,完全基于我的经验。到目前为止,一切都很顺利。