论坛首页 入门技术论坛

MVC系列框架之Struts存在的意义是什么?

浏览 13366 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-10-27   最后修改:2010-10-28
    Struts其实就是MVC的代名词,那么提到MVC就不得不提早期的ModelⅠ。那时候JSP页面中混杂了大量的JAVA Scriptlet脚本语句,为了可维护性考虑,有人提出了ModelⅡ,也即现在的MVC模式。所以可以看出来,MVC的提出是建立在早期JSP页面中混杂了大量的JAVA Script脚本语句的前提之下的。在这种情况下MVC的出现让JSP的世界变得干净许多。

    虽说是MVC框架,其实有人也指出,Struts系的框架只能算是一种伪MVC。为什么这么说呢?因为它没有MVC中的最核心的部分:事件控制,其实Struts看起来更像是一种控制转发框架。那么这种跳转是否是必须的呢?

    自从2005年开始,Ajax开始崭露头角,到现在为止,不谈Ajax已经到了成熟应用的地步,但回头再看MVC,是否可以有另外一种更优雅、清晰的思路来代替早期的ModelⅠ呢?

    先来看一小段代码:
<sky:init method="com.sky.platform.Login.init">
<html>
<head>
<title>${Title}</title>
<script>
Sky.onReady(function(){
	$("btnLogin").on("click", function login(){
		var dc = Form.getData("loginForm");
		Server.sendRequest("com.sky.platform.Login.submit",dc,function(response){
			if(response&&response.Status==0){
				alert(response.Message);
			}
		});
	});
});
</script>
</head>
<body>
<form id="loginForm" method="post" style=" display:block;height:100%;">
<input name="UserName" type="text" />
<input name="Password" type="password" />
<input id="btnLogin" type="button"/>
</form>
</body>
</html>
</sky:init>



    看看这段代码是怎么解决早期Model 1的混乱的

<sky:init method="com.sky.platform.Login.init">

    com.sky.platform.Login类可以看做是这个页面的后台绑定类,其思路来源于Aspx.Net
init方法用来做页面的初始化动作
页面中像这种需要获取的数据就可以这样来实现:
${Title}


    Struts的控制转发很重要的一部分功能就是获取数据放置页面属性范围中,而现在转而用这种方式就可以实现Strtus的获取数据功能。

    有人会问,像列表之类的,你一个${}怎么能够实现呢?答案是:我们可以在前台实现对应的Ajax风格的列表控件,如此之类......

    像表单其他我们也可以通过Ajax直接提交后台绑定类的方法的方式来实现
Server.sendRequest("com.sky.platform.Login.submit",dc,function(response){
			if(response&&response.Status==0){
				alert(response.Message);
			}
		});


    这种编程思想与Struts系MVC框架的本质的区别就是完全抛弃了其需要的控制转发配置,因为Struts用来配置控制转发的文件本身只是为了实现其MVC的功能而存在的,那么现在我们已经有了一种替代的解决方案来解决早期的Model1的混乱局面,那么Struts系MVC框架的控制转发是否还有存在的必要呢?

    其实这个思路的类似解决方案就是JSF,但是JSF并没有像ASPX.Net那样完全使用后台绑定类的概念,其并没有抛弃类Struts的路由导航配置。

    这只是个人观点,欢迎大家讨论、斧正,提出自己的见解!



刚发现两个好贴,附上链接,供大家一起探讨
MVC的迷思: http://www.iteye.com/topic/6284
jsplet:对Model 2模式的批判: http://www.iteye.com/topic/11726
   发表时间:2010-10-27  
depravedangel 写道
    Struts其实就是MVC的代名词,那么提到MVC就不得不提早期的ModelⅠ。那时候JSP页面中混杂了大量的JAVA Script脚本语句,为了可维护性考虑,有人提出了ModelⅡ,也即现在的MVC模式。所以可以看出来,MVC的提出是建立在早期JSP页面中混杂了大量的JAVA Script脚本语句的前提之下的。在这种情况下MVC的出现让JSP的世界变得干净许多。

    虽说是MVC框架,其实有人也指出,Struts系的框架只能算是一种伪MVC。为什么这么说呢?因为它没有MVC中的最核心的部分:事件控制,其实Struts看起来更像是一种控制转发框架。那么这种跳转是否是必须的呢?

    自从2005年开始,Ajax开始崭露头角,到现在为止,不谈Ajax已经到了成熟应用的地步,但回头再看MVC,是否可以有另外一种更优雅、清晰的思路来代替早期的ModelⅠ呢?

    先来看一小段代码:
<sky:init method="com.sky.platform.Login.init">
<html>
<head>
<title>${Title}</title>
<script>
Sky.onReady(function(){
	$("btnLogin").on("click", function login(){
		var dc = Form.getData("loginForm");
		Server.sendRequest("com.sky.platform.Login.submit",dc,function(response){
			if(response&&response.Status==0){
				alert(response.Message);
			}
		});
	});
});
</script>
</head>
<body>
<form id="loginForm" method="post" style=" display:block;height:100%;">
<input name="UserName" type="text" />
<input name="Password" type="password" />
<input id="btnLogin" type="button"/>
</form>
</body>
</html>
</sky:init>



    看看这段代码是怎么解决早期Model 1的混乱的

<sky:init method="com.sky.platform.Login.init">

    com.sky.platform.Login类可以看做是这个页面的后台绑定类,其思路来源于Aspx.Net
init方法用来做页面的初始化动作
页面中像这种需要获取的数据就可以这样来实现:
${Title}


    Struts的控制转发很重要的一部分功能就是获取数据放置页面属性范围中,而现在转而用这种方式就可以实现Strtus的获取数据功能。

    有人会问,像列表之类的,你一个${}怎么能够实现呢?答案是:我们可以在前台实现对应的Ajax风格的列表控件,如此之类......

    像表单其他我们也可以通过Ajax直接提交后台绑定类的方法的方式来实现
Server.sendRequest("com.sky.platform.Login.submit",dc,function(response){
			if(response&&response.Status==0){
				alert(response.Message);
			}
		});


    这种编程思想与Struts系MVC框架的本质的区别就是完全抛弃了其需要的控制转发配置,因为Struts用来配置控制转发的文件本身只是为了实现其MVC的功能而存在的,那么现在我们已经有了一种替代的解决方案来解决早期的Model1的混乱局面,那么Struts系MVC框架的控制转发是否还有存在的必要呢?

    其实这个思路的类似解决方案就是JSF,但是JSF并没有像ASPX.Net那样完全使用后台绑定类的概念,其并没有抛弃类Struts的路由导航配置。

    这只是个人观点,欢迎大家讨论、斧正,提出自己的见解!





私人觉得MVC不能这么理解,我觉得MVC只是一种设计模式,跟具体的实现无关。
其实楼主说的蛮对的,struts就是一个框架用来实现MVC的,它只是指定了哪块是M,哪块是C哪块是V,至于MVC的具体实现还需要我们程序员来搞。
再者我觉得MVC不是用来将java scriptlet从jsp里面分离的,而是用来将业务逻辑从表现层分离出来,也就是Controllor的作用,而Struts的工作就是将这钟分离连接起来,当然没有struts用servlet也是可以实现的。
=====
ps:我这个也可以实现。。。
http://code.google.com/p/mydbutil-01/
0 请登录后投票
   发表时间:2010-10-27  
dwbin 写道

私人觉得MVC不能这么理解,我觉得MVC只是一种设计模式,跟具体的实现无关。
其实楼主说的蛮对的,struts就是一个框架用来实现MVC的,它只是指定了哪块是M,哪块是C哪块是V,至于MVC的具体实现还需要我们程序员来搞。
再者我觉得MVC不是用来将java scriptlet从jsp里面分离的,而是用来将业务逻辑从表现层分离出来,也就是Controllor的作用,而Struts的工作就是将这钟分离连接起来,当然没有struts用servlet也是可以实现的。
=====
ps:我这个也可以实现。。。
http://code.google.com/p/mydbutil-01/

看了您的demo的部分代码:
public class Show {

    public String show() {

        System.out.println("show"); return "/show/wenbin.jsp"; 

    } 

} 

其实您还是的设计还是有跳转的概念在里面
Strtus的设计初衷是将java scriptlet从jsp里面分离出来,从而实现业务逻辑与表现层分离,但是跳转只是为了实现Struts框架本身的目标而附带出来的,或许这么理解是不对的。也可以将Struts理解为本身只关注控制跳转,具体的展现层、业务层它本身并不关注。但是作为MVC的典型的代表,是否每个页面都需要控制层转发一下才可以呢?转发的意义何在?根据不同的业务场景转发,还是权限控制?

单独的为不同的业务场景转发而搞出一个框架出来,我觉得意义不大,这样反而限制了富客户端的发展,将这部分控制交由前台客户端去做可能更加简单高效。

至于权限控制来说,不管是.do、.jsp还是像com.service.init这样一个方法名,其本质都是一个url,页面权限的本质就是对url的控制。跟.do、.jsp还是com.service.init是无关的

引入后台绑定类的概念后,讨论比较多的分层:action层、service层、dao层中的action层就可以去除,完全由service层来当当后台绑定类

大家说的比较多的ASP.NET的开发效率高于JAVA,但这个是事情吗?ASP.NET的开发效率真的会高于JAVA吗?我不这么认为,JAVA EE的开发效率去除事务、集群、分布式等一大堆东西,单是基本的逻辑开发,我认为JAVA跟.NET是不分高下的,因为毕竟C#跟JAVA太相似了。

我们需要的是一个干净简单的前台页面,而不是为跳转而弄的晕头转向。提出这种思路的另外一个理由是:如果页面中有两个表格,一般传统的类Struts的开发方式是:
方案一:从action中获取到两个集合,然后再页面上迭代
方案二:使用前台表格控件,到struts中获取JSON、XML之类的数据

方案一中页面是两个迭代,而方案二采取两个表格控件的方式无疑是优于方案一的,你可以在表格控件上做封装,实现一个通用的组件出来。但方案二无疑是引入了Ajax的概念,但strtus并不是一套天生支持Ajax的框架,我认为Ajax与跳转是两个相悖的概念。基于JSF的实现来看,我们可以让界面专注于其本身的技术发展,而不过多的涉及太多与后台相关的概念,这样不管是RIA还是移动平台的项目,都能很好的适应。

而后台绑定类则用来专注于逻辑,不关心跳转之类。去掉action层,让前台专注于前台技术发展,后台关注与业务逻辑,将跳转(抛开传统的开发方式,拥抱新的开发理念,在RIA中用到掉转的真的很少)交给客户端去处理,这样或许更加合理。
0 请登录后投票
   发表时间:2010-10-27   最后修改:2010-10-28
Strtus的设计初衷是将java scriptlet从jsp里面分离出来,从而实现业务逻辑与表现层分离,

---- 这个初衷是从哪里找来的???离开了java scriptlet之后还是JSP么???



Struts存在的一个意义是,JSP过于强大,强大到既可以表示表现,又可以表示逻辑。JSP这样好不好呢?事物得一分为二来看:


1. 比较JSP和ASP来说,JSP就是ASP的原原本本的抄袭,ASP的本意就是适合小站点的快速开发,对于不少站点来说,MVC的存在基本是脱裤子放屁的事,比如我们公司的某些个站点,就2个页面,后台逻辑很复杂,但前端只显示一个趋势图,如果这样还会想部署struts,简直是脑袋坏掉。

2.对于许多大型网站,美工和代码工有明确分工,这时候MVC才有其存在的意义。
0 请登录后投票
   发表时间:2010-10-27  

  LZ蛮有想法的,投个良好

0 请登录后投票
   发表时间:2010-10-27  
mvc模式快念烂了,现在还有人思考它存在的意义,摆脱发帖前看看这些历史,那些鸟培训真是害人不浅啊!!
0 请登录后投票
   发表时间:2010-10-27  
ajax的引入,的确改变了传统mvc繁琐的开发模式
ZK框架,楼主可以借鉴下
0 请登录后投票
   发表时间:2010-10-28  
Struts的确不是MVC的代名词
1 请登录后投票
   发表时间:2010-10-28   最后修改:2010-10-28
楼主应该是个火影迷哈.  我想使用潘恩对鸣人的话"你只见树木,不见森林啊".
PS:我也在寻找着那片迷失了自我的遗忘森林...
要对MVC有个完整的了解:
首先要了解MVC的历史,还要了解MVC的应用场景,但是最终要了解的是MVC的理念.
这些Google一下全都有的,
简单描述下:
a:MVC最早出现在Smalltalk中,Java Swing控件的设计核心也是MVC,Java Web开发中也使用了MVC,这些使用的是有时间上的先后顺序.
b:MVC的使用场景包括桌面开发与Web开发.
c:MVC的理念?我所了解的它的核心理念其中之一就是要将数据的计算和数据的表示分开, 这里表达的内容之一就是做事是要有条理讲步骤的,  二就是对数据的表示的理解,要看思维的抽象程度:首先要清楚的就是桌面,Web页面只是所看到的实际的一种数据表示形式,但是抽象的数据表示形式存在于一个完整的数据处理流程之中,如:上一个流程节点处理完的数据要交给下一个节点进行处理,那么下一个流程节点相对于上一个流程节点就可以看做是它的表示层. 

要注意对数据的处理,数据的计算,数据的表示这三个词之间的微妙差别.
0 请登录后投票
   发表时间:2010-10-28  
我也一直有疑问,Servlet本身就可以直接实现mvc,为什么还要用struts?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics