三大最佳web开发语言的较量2——框架
最后总结一下三家的MVC开发框架,以php的thinkphp框架,javaee的struts框架,asp.net的asp.net MVC为例:
thinkphp,国产,但是个人非常喜欢,轻快,简单上手,开发过程中,只需要导入thinkphp包,然后建立一个index.php的配置文件,利用php文件系统功能自动生成目录和必要文件,自带一个config.php,可以直接配置数据库连接以及其他框架功能,也可以include其他配置文件,分块配置,使用起来没有xml那样的繁琐,使得整个网站的后端语言文件更加统一规范化,而且只需要熟练掌握php即可,配置完成后保存即可生效。
thinkphp对应各个目录,这些都是index.php配置完成后,在浏览器中访问,通过index.php下的配置,将会自动生成webapp,并建立好MVC目录以及文件,而且这些文件之间都是被thinkphp框架关联的,比如在Lib/Action中创建一个IndexAction.class.php(命名必须按照thinkphp规范),Tpl下的Index/目录会被自动关联,必须由开发者建立,否则php报错,然后Action下的php文件作为controller最后通过display("index.html")方法返回Tpl/Index/下的index.html页面给http发送到客户端,而这一切都是通过thinkphp实现的,完全做到了MVC业务的前后端分离,而且不需要在配置XML文件,这样的开发个人觉得是相当高效的!我也是比较喜欢和习惯的。
asp.net MVC,为了公司项目才学的,主要是研究MVC3登场的razer,不如对thinkphp那么的了解,但是总体建站还是摸得着思路了,整个网站的配置通过一个根目录下的“Global.asax”的文件进行配置,与xml文本的语法基本相同,这也为我开发javaee struts2奠定了基础,但是和struts.xml还是有区别的,具体就在于文件的路由,在asax中配置的路由只是提供一个访问规范,但是不精确到每一个方法和返回文件(下面会讲struts2.xml配置文件的不同),相当于只是对访问的url的方法以及url里传递post,get变量,对应到的后端C#类和方法进行了指路,使得用户端的url更加具有亲和力。
比如“http://www.520sunjob.com/SunJob/JobList”
访问了Sunjob/SunJobController.cs下的 public ActionResult JobList这个方法,最后这个方法用“return View(jobListPage)"返回了一个前端/Views/SunJob/JobList.cshtml,做到了MVC前后端分离,controller控制着数据和view,和thinkphp有着异曲同工之妙啊!
另外在asp.net MVC以及java web中Model文件充当着极其重要的业务模型和数据模型角色,尤其是在数据库访问时候,微软有一项新技术,叫做代码先行,利用Model可以自动生成对应的数据结构对象,再没有数据库的情况下由对象生成数据!这就是所谓的数据模型,一切皆是对象的思想(数据库也对象化)!
javaee struts
配置最为麻烦,可以看以下这段struts.xml的代码,这是一个Bookmark的crud小应用的一部分:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> <constant name="struts.configuration.xml.reload" value="true"/> <constant name="struts.i18n.encoding" value="UTF-8"/> <!--配置Convention 插件自动重加载映射 --> <constant name="struts.convention.classes.reload" value="true"/> <!--admin操作--> <package name="BookmarkAdmin" namespace="/admin" extends="struts-default"> <!--登录操作--> <action name="login" class="cslg.cn.controller.UserAction" method="login"> <!--登录成功:重置到list页面--> <result name="success" type="redirect">/admin/list.action</result> <!--登录错误:首页(非重置)--> <result name="error" type="">/index.jsp</result> </action> <!--列出user--> <action name="list" class="cslg.cn.controller.UserAction" method="list"> <result name="list">/WEB-INF/view/admin/list.jsp</result> <result name="error" type="redirect">/index.jsp</result> </action> <!--注销操作--> <action name="logout" class="cslg.cn.controller.UserAction" method="logout"> <result name="logout" type="">/index.jsp</result> </action> </package> </struts>
也许没有学过struts2的乍一看有点摸不着头脑,但是里面配置的是访问controller路由的view,可以看到,package是一个命名空间,然后下面的action对应了controller下的类,例如这一部分配置:
<action name="logout" class="cslg.cn.controller.UserAction" method="logout"> <result name="logout" type="">/index.jsp</result> </action>
访问的类在src下的cslg.cn.controller.UserAction.java,方法是logout,最终 logout不是返回一个前端页面,是返回一个对应的字符串,这里返回的是”logout“这个字符串,然后struts根据xml下的配置,找到标签下的index.jsp(是一个具体物理地址),直接就向客户端发送经过处理的jsp生成的html。
最终访问路径是:×××/admin/logout.action
注意”.action“是struts默认的后缀,可以通过xml改写
所以,如果使用了javaee下的struts框架其实开发相对另外两个框架较慢的原因也就显而易见了,在配置文件,java类文件,前端jsp中不断切换,加上庞大的IDE和编译过程,java本身又是强类型语言,需要判断和转化,另外如果xml配置文件错了,访问就会出错,这样就多了一个出错的理由,对初学者开发进度也是会有不小的影响的吧!