锁定老帖子 主题:springMvc与struts2
精华帖 (14) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-14
最后修改:2011-12-15
1.spring mvc的入门,不要google什么demo了,官方的这个肯定是最好的 http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/ 2.推荐两篇好文,只看spring reference貌似要深入点还是有难度的 深入实战看这个http://elf8848.iteye.com/blog/875830 源码看这个http://huibin.iteye.com/blog/618910 正题: 使用struts2已经这么久了,但springmvc一直是看过,没实战过,顺着mvc的模式对比对比两者,想从以下六个方面来聊下他们的区别 1.拦截起角度 请求拦截处理都是chain方式,使用起来如何呢? 入口一个是fiter,一个是servelt,每个请求进行chain处理,实现方式不太一样,效果类似 struts2 有一个钩子参数hook-->>ActionInvocation public interface Interceptor extends Serializable { /** * Called to let an interceptor clean up any resources it has allocated. */ void destroy(); /** * Called after an interceptor is created, but before any requests are processed using * {@link #intercept(com.opensymphony.xwork2.ActionInvocation) intercept} , giving * the Interceptor a chance to initialize any needed resources. */ void init(); /** * Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the * request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code. * * @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself. * @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}. */ String intercept(ActionInvocation invocation) throws Exception; } spring则划分成了三个方法,就需要分别调用,但却没有一个hook方式 // 这里取出执行链中的 Interceptor进行前处理 if (mappedHandler.getInterceptors() != null ) { for ( int i = 0 ; i < mappedHandler.getInterceptors().length; i++) { HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i]; if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) { triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null ); return ; } interceptorIndex = i; } } //在执行handler之前,用 HandlerAdapter先检查一下handler的合法性:是不是按Spring的要求编写的。 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); // 这里取出执行链中的 Interceptor进行后处理 if (mappedHandler.getInterceptors() != null ) { for ( int i = mappedHandler.getInterceptors().length - 1 ; i >= 0 ; i--) { HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i]; interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv); } } } 配置方面 strus2有package划分,具体类来划分,配置intercepter,还可以有拦截器栈,并且有hook存在,可以调用action上面的信息,这个就可以做到根据action配置的注解之类的进行一些处理 spring配置根据具体处理控制器,或者根据路径来,需要划分清晰的path 这个struts2实用性要比spring好,但struts2的效果spring也是可以的 2.参数处理角度 http的string类型转换成java类型 java类型在处理成具体业务类 两次转换都有些小细节,好听点叫阻抗不匹配,struts2的方式有点重,特殊如类型转换modelDriver方式可以选择,可以做点特殊处理,但比起spring的灵活性,差很多 spring可以选在通过注解注入特定参数,比较繁琐一点,也可以选择strus2的方式,不配置就是自动注入,签名的session级别的处理很好,让sesssion很清晰 这点我觉得spring比struts2好,具体可以参见资料http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 3.视图处理角度 struts2 valuestack以及配套的OGNL很强大,但jstl貌似是主流,ognl附带的调用什么方法,view层总觉得被破坏了 spring通过model方式也是不错,非常灵活,要呈现的东西放入model,只不过需要定义好一些起名字的规则,不象struts2,具体参数是在action里面的 4.异常处理角度 spring的异常可以自己配置,也可以实用他的那个类似<global-exception-mappings> 的东东,也可以有自己写自己的异常处理类 分为全局异常和包异常处理,但是不需要实现框架什么接口,spring则需要实现HandlerExceptionResolver如下 // 这里catch住controller抛出的异常,使用持有的ExceptionResolver处理,当没有配置自己的处理器时,程序会将异常继续往上抛出,最终交给我们的容器处理 catch (Exception ex) { Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); mv = processHandlerException(processedRequest, response, handler, ex); errorView = (mv != null); } } // 当没有配置ExceptionResolver时,异常将到达这里,最终抛出 catch (Exception ex) { // Trigger after-completion for thrown exception. triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); throw ex; } catch (Error err) { ServletException ex = new NestedServletException("Handler processing failed", err); // Trigger after-completion for thrown exception. triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); throw ex; } //异常将会轮流来处理这个 protected ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // Check registered HandlerExceptionResolvers... ModelAndView exMv = null; for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) { exMv = handlerExceptionResolver.resolveException(request, response, handler, ex); if (exMv != null) { break; } } struts2不能获取独特信息,只能搞个异常处理类来配置,但是strusts2的拦截起却给了获取处理流程信息,做异常处理的可能 5.跟spring框架的融合 springMvc与spring一家人,虽然spring是百搭风范,具体:spring test很爽,可以测试action struts2通过插件来整合,解决了创建由spring负责,那么其中的拦截器要用spring容器的东西,怎么办呢? 人家springMvc在入口处就有ApplicationContext,里面的拦截方式应该可以成根据需要配置bean,没测试 具体区别还真不大 6.闲扯--特殊需求扩展满足如何,热门restful跟的如何? struts2有插件可以做restful,这也说明strus2的插件可以做到一些特殊的事情,spring也可以支持restful方式,虽然我们现在做的是互联网项目,还是没转restful,两点,理解不够,转变困难,观望学习中 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-12-14
文章写的不错 长短适中,还有丰富的引文
|
|
返回顶楼 | |
发表时间:2011-12-15
不错 适合初学者!!收藏!
|
|
返回顶楼 | |
发表时间:2011-12-15
我是菜我学习
|
|
返回顶楼 | |
发表时间:2011-12-15
虽然某些观点值得商榷,但是总体来说还是很不错的。
|
|
返回顶楼 | |
发表时间:2011-12-15
总的来说讲得还不错
|
|
返回顶楼 | |
发表时间:2011-12-15
看过了,很受益。正在学习springmvc中
|
|
返回顶楼 | |
发表时间:2011-12-15
恩,学习,springmvc使用中
|
|
返回顶楼 | |
发表时间:2011-12-16
系统的看看相关书籍,总是这么总结对比误人误己。
|
|
返回顶楼 | |
发表时间:2011-12-16
最后修改:2011-12-16
wangbz 写道 系统的看看相关书籍,总是这么总结对比误人误己。
对比只是一个角度思考罢了,如果全是对比,肯定不好 文章里面也有些小分析,不是全文字 在里面推荐了一些文章 并建议看reference 与 源码 如果有深入机会实战当然更好了 |
|
返回顶楼 | |