Struts2: (通过过滤器来拦截所有的请求,交友struts2 dispather 处理)
工作流程:
1客户端浏览器发出HTTP请求
2根据web.xml配置,该请求被FilterDispatcher(过滤器调度员)接收
3根据struts.xml配置,找到需要调用的Action类和方法,并通过IOC(控制反转)方式,将值注入给Action
4Action调用业务逻辑组件处理业务逻辑
5Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应的页面
6返回HTTP响应到客户端浏览器
struts2配置过程:
1 <!--配置struts2过滤器-->
3 <!--<filter>标签配置Filter名称,实现类以及初始化的参数。可同时配置多个初始化参数-->
4 <filter>
5 <filter-name>struts2Filter</filter-name>
6 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
7 </filter>
9 <filter-mapping>
11 <filter-name>struts2Filter</filter-name>
13 <url-pattern>/*</url-patten>
14 </filter-mapping>
2:配置struts.xml;在src目录下创建struts.xml文件,这里主要是配置Action。
1 <package name="user" namespace="/user" extends="struts-default">
2 <action name="list" class="action.UserAction" method="list">
3 <result name="success">/list.jsp</result>
4 </action>
5 <action name="add" class="action.UserAction" method="add">
6 <result name="success">/add.jsp</result>
7 </action>
8 <action name="delete" class="action.UserAction" method="delete">
9 <result name="success">/delete.jsp</result>
10 </action>
11 <action name="update" class="action.UserAction" method="update">
12 <result name="success">/update.jsp</result>
13 </action>
14 </package>
SpringMVC:(通过servlet 命名和定制url来交由springmvc处理)
Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。
1.DispatcherServlet:主要负责接受HTTP请求,协调springmvc各个组成部分工作。其主要功能:
1).截获符合特定格式的URL请求。
2).初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
3).初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
2:处理器映射(HandlerMapping):能够完成客户请求到Controller的映射。
3:处理器(控制器Controller):功能和struts2的action功能是一样的,当Controllert处理完用户请求后,则返回ModeAndView给DispatcherServlet前端控制器。
4:视图解析器(ViewResolver):spring提供视图解析器在WEB应用中查找View对象,从而将结果渲染给客户。
SpringMVC配置过程:
1:配置web.xml,主要在配置中设置springmvc-context.xml的路径
1 <servlet>
2 <servlet-name>appServlet</servlet-name>
3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
4 <init-param>
5 <param-name>contextConfigLocation</param-name>
6 <param-value>classpath:META-INF/spring/springmvc-context.xml</param-value>
7 </init-param>
8 <load-on-startup>1</load-on-startup>
9 </servlet>
10 <servlet-mapping>
11 <servlet-name>appServlet</servlet-name>
12 <url-pattern>/</url-pattern>
13 </servlet-mapping>
2:配置spring-context.xml文件,这一部分主要是开启注解功能、配置试图解析器
1 <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
2 <context:component-scan base-package="com.zs" />
3
4 <!-- 这两个类用来启动基于Spring MVC的注解功能,将控制器与方法映射加入到容器中 -->
5 <beans:bean
6 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
7 <beans:bean
8 class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
9
10 <!-- 这个类用于Spring MVC视图解析 -->
11 <beans:bean id="viewResolver"
12 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
13 <beans:property name="prefix" value="/WEB-INF/pages/" />
14 <beans:property name="suffix" value=".jsp" />
15 </beans:bean>
Struts2和SpringMVC的区别:
1:Struts2的核心是基于Filter,即StrutsPreparedAndExcuteFilter。
SpringMVC的核心是基于Servlet,即DispatcherServlet(前端控制器)。
2:Struts2是基于类开发的,传递的参数是通过类的属性传递,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
一个类对应一个request上下文 , 所以每次来了请求就创建一个Action,只能设置为多例模式。
SpringMVC是基于类的方法开发的,一个方法对应一个request上下文 ,也就是一个url对应一个方法,传递的参数是传到类的形参上,即默认为单例模式也可设置为多例模式。
3:拦截器机制不同:SpringMVC是独立的AOP实现的,而Struts2有自己的interceptor机制
Struts2拦截器执行机理如下:
- 整个结构就如同一个堆栈,除了Action以外,堆栈中的其他元素是Interceptor
- Action位于堆栈的底部。由于堆栈"先进后出"的特性,如果我们试图把Action拿出来执行,我们必须首先把位于Action上端的Interceptor拿出来执行。这样,整个执行就形成 了一 个 递归调用
- 每个位于堆栈中的Interceptor,除了需要完成它自身的逻辑,还需要完成一个特殊的执行职责。这个执行职责有3种选择:
- 中止整个执行,直接返回一个字符串作为resultCode
- 通过递归调用负责调用堆栈中下一个Interceptor的执行
- 如果在堆栈内已经不存在任何的Interceptor,调用Action
4.SpringMVC的入口是servlet,而Struts2是filter 。
5、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,
Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便
6、SpringMVC开发效率和性能高于Struts2。
7:Struts2是采用值栈存储请求以及响应数据,OGNL存取数据。
SpringMVC是request来解析请求,然后其内部的getParmater方法来给方法形参赋值,然后在把处理后的数据通过ModeAndView存储,Mode存储数据,View存储返回的页面,再把对象 通过request传输到页面去。
8:Spring MVC和Spring是无缝(无缝:无须数据格式转换,直接访问来自数据源数据格式)的。从这个项目的管理和安全上也比Struts2高;
Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少。