就我个人的理解,有如下几点:
1. 目前web设计要采用MVC的结构进行,在不使用任何框架的情况下,javabean充当M,jsp充当V,servlet充当业务控制器C
2. 现在的J2EE很多实用SSH的结构,抛开H,这里只请教2个S,即spring3.0和struts2.1
3. spring是一个实现了MVC结构的框架,struts也是一个实现了MVC的框架
我的问题是:
1. struts作为一个MVC框架,M/V/C的实现分别是什么?我个人的理解是:
a) V 由Jsp负责实现,还可以通过struts的jsp标签等方式访问action的属性
b) C 由Action负责实现,action作为业务控制器,完成业务分流的作用
那么M呢?模型由谁来实现?是普通的javabean吗?请大侠指教。
spring的M、V、C又分别指代什么?
2. servlet、filter、listerner、interceptor是什么关系?同一层级还是包含的关系?
我个人的理解是servlet是一种技术概念,而filter、listerner、interceptor这些都是一些特殊的servlet,包括struts的本质也是一种特殊的servlet,因为它的本质是一个filter,不知道我这样的理解对不对?是不是使用了struts框架,就很少会为业务逻辑开发具体的servlet了?请大侠指教。
3. 既然spring和struts都实现了MVC框架,那为什么二者经常被组合在一起使用,岂不是功能都重复了吗?是因为二者的侧重点不一样吗?我看到的spring用的最多的是IoC功能,javabean管理和注入等,主要是侧重M的,看到的struts则主要是侧重C,即action完成业务逻辑控制,二者组合使用是因为我上面讲的这种侧重点不同吗?
4. 我在李刚的J2EE 轻量级SSH那本书上(红色封面的那个)提到有MVC层/中间层/持久层这种说法,我想问一下MVC层和中间层有什么区别?具体有哪些实现的技术?
那么M呢?模型由谁来实现?是普通的javabean吗?请大侠指教
你的javabean指的是什么我不清楚。我写过的代码m就是逻辑层的代码(比如拿一个登录模块来说,这里的逻辑是指用户名和密码的验证)。逻辑层会调用到dao层的实例(dao层即数据库操作,比如select 用户名和密码)
1.你的理解和我理解一致。至于M,普通Javabean可以,但是更加面向对象的领域驱动的Model都是封装好了很多业务方法(例如银行账户类里面可能直接封装了转账方法)。直接供C调用。
2.Servlet处理客户端请求。拦截器和过滤器属于AOP概念(个人理解),listenner就是事件监听咯。都是不同思路的解决方法而已。Struts可以看成一个被很多拦截器拦截了的Servlet(如参数获取等等都被拦截处理了。)用了Struts就应该比较少用Servlet了,除非一些Struts完成不了的或者你希望你的效率增加(因为Struts的拦截器太多,肯定影响速度,当然你可以逐个配置)
3.取其精华去其糟粕就能回答你的问题。哪个方面好用就用哪个。PS:Spring还有很重要的部分是AOP
4.暂时没有理解。不过个人建议,培训机构的那些老师,不要太当真。
你的回答非常中肯,也很有针对性,非常感谢
你一次不需要知道那么多。。这样越弄越糊涂。。mvc只是传统的概念,你不需要一定要把什么什么比作M,什么什么比作V,你能明白么,至于interceptor,filter都还是比较高级的主题,用的也很少,你现在基础都很混乱。李刚的那本书只是个工具书,你明白么,象字典一样的工具书。
你说的好糊涂,能简单点描述吗,需要实现什么
网站开发两年,经验不足,结合楼主的问题,谈一下自己的认识,说的不对,请指正。
1.如楼上所言,mvc只是传统的概念,你不需要一定要把什么什么比作M,什么什么比作V。
struts 通过action和xml等的配置,实现了请求的控制,标签等的使用,辅助jsp完成view层的显示。
2.spring更像一个容器,它可以结合其他的框架,如struts和hibernate等,当然他有自己的spring MVC框架也。
spring的核心概念IOC和AOP,IOC是利用反射,实现各层的解耦(如业务层和数据访问层解耦),也就是在xml里去配置的方式实现。AOP也就是面向切面编程,其实也是利用反射(或者是动态代理),来实现一些共通的解耦和复用,如日志,校验,权限,事物等共通的东西。
3.servlet包下是java封装好的面向网络编程的一些类和接口。包括servet,filter,listener等。
servlet是java封装好的面向网络编程的接口,我们一般做网站是使用的它的子子类HttpServlet,也就是面向http协议的servlet。用来处理对请求的处理,处理过程需要我们来实现。
filter是sevlet包下的一个接口,是对数据传输过程中的过滤。应用责任链设计模式,请求通过之后,继续传递到下一个链,也就是servlet。
listener是利用观察者设计模式,对servlet中对某些封装好的类(如request,session,context)的对象的动作进行观察,发生变化,做出相应动作。(如session创建和销毁,变更在线人数统计)。
4.spring和struts都是对java提供的servlet进行了封装。
struts的流程:请求通过filter->intercepter->action。
intercepter和action是对servlet的代理,intercetper的执行流程是(【调用前自己的处理】->实际的调用->【调用后自己的处理】,这个实际的调用又会传到下一层的intercepter,也是这个流程,直到最后的实际调用是action。
这样的好处是:action只写一些业务的调用和控制。intercepter来处理一些共通的逻辑(如类型转换,文件上传)等的拦截。 而不用到每个action都重复写一堆相同的操作。逻辑层次更加清晰了。
当我们用所谓的mvc的时候我们其实用的不是三层而是4层,我们把JSP当视图,JSP发送请求,传递给ACTION,action调用业务逻辑的方法,业务逻辑调用DAO层解决问题,一般情况下我们有action包,service包,serviceImpl 包,dao包,daoImpl实现包 ,为了实现高内聚 低耦合,宗旨是JSP只想action发请求,action只调用service也就是业务逻辑(比如你验证用户,就在这里进行计算得到返回值),service只调用dao层次取数据,dao层当然现在都用hibernate来解决也就是用javabean.所谓的模型即是业务逻辑跟数据层的结合。
关于过滤器,拦截器之类的区别这个看书比较好,可意会不可言传的感觉,自己理解了会觉得一目了然、
现在的spring已经不怎么喜欢整合struts2了,因为性能要求越来越高,struts2的ognl与标签在性能上没有好的表现
spring实现代码之间的低耦合,用spring容器管理javabean,struts2的C实现了某种方式的封装,servlet本身就是C,正规的servlet里面是不允许有任何逻辑代码的 只对业务逻辑进行调用,而现在spring mvc实现了此功能
最后一个懒得去看 李刚的疯狂java EE就是shit写的书就是抄的感觉
我来回答下你的第一个问题,是个人看法哈。struts框架的使用,只是取代了web中MVC的C,其他两层是不变的,M依然是javabean.spring的主要功能是依赖注入,他是用来管理srtuts、action、javabean的。