论坛首页 Java企业应用论坛

springMvc与struts2

浏览 15102 次
精华帖 (14) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-14   最后修改:2011-12-15
先说点springmvc学习的事,高手跳过这个-->>>
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,两点,理解不够,转变困难,观望学习中




   发表时间:2011-12-14  
文章写的不错 长短适中,还有丰富的引文
0 请登录后投票
   发表时间:2011-12-15  
不错 适合初学者!!收藏!
0 请登录后投票
   发表时间:2011-12-15  
我是菜我学习
0 请登录后投票
   发表时间:2011-12-15  
虽然某些观点值得商榷,但是总体来说还是很不错的。
0 请登录后投票
   发表时间:2011-12-15  
总的来说讲得还不错
0 请登录后投票
   发表时间:2011-12-15  
看过了,很受益。正在学习springmvc中
0 请登录后投票
   发表时间:2011-12-15  
恩,学习,springmvc使用中
0 请登录后投票
   发表时间:2011-12-16  
系统的看看相关书籍,总是这么总结对比误人误己。
0 请登录后投票
   发表时间:2011-12-16   最后修改:2011-12-16
wangbz 写道
系统的看看相关书籍,总是这么总结对比误人误己。


对比只是一个角度思考罢了,如果全是对比,肯定不好 
文章里面也有些小分析,不是全文字
在里面推荐了一些文章
并建议看reference 与 源码 如果有深入机会实战当然更好了
0 请登录后投票
论坛首页 Java企业应用版

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