目录

servlet和struts2的区别

servlet和struts2的区别是:1.线程安全;2. 容器依赖;3. 启动;4. 创建;5. 封装数据;6. 重定向。其中,Servlet是单例的(多个请求一个servlet实例),而Struts2是多例的(一个请求一个Action)。

一、servlet和struts2的区别

1.线程安全

Servlet是单例的(多个请求一个servlet实例),而Struts2是多例的(一个请求一个Action)。servlet是单实例,多线程。而struts是多实例,多线程,因此在多用户同时访问的时候,servlet中定义的属性可能会被覆盖掉,而struts2则不会出现这种情况。

2. 容器依赖

servlet需要依赖容器,httprequest,httpresponse必须有容器才能初始化。action完全与容器松耦合,由struts2本身创建httprequest,httpresponse。Servlet从Web容器直接被调用。Action不直接被Web容器调用,而是被Web容器中的Strtus框架调用。

需要把Action看成一个前端的逻辑单元,甚至是独立于Struts框架本身(所以建议在Action中尽量不要使用Struts2的API,比如HttpRequest, ActionContext等等)。Servlet完全是容器相关的,所以从这一点上说,Action更加抽象化了一层。当然如果从MVC模式看的话Struts 1中的Servlet应该算是Controller部分,Action应该看成是Model部分;而在Struts 2中用FilterDispatcher代替了Servlet。

3. 启动

Servlet:servlet要在web.xml配置。Struts:配置过滤器,设置struts入口。

4. 创建

Servlet:继承HttpServlet,重写doGet与doPost方法,添加注解或配置web.xml。Struts:继承ActionSupport,写一个返回值为String而且抛出一个异常的函数,并且要配置struts.xml。

5. 封装数据

Servlet:使用BeanUtils工具通过name封装,BeanUtils.populate(user,request.getParameterMap())。Struts:实现ModelDriven接口,实现getModel方法,返回一个封装数据的对象(必须要先把对象new出来),也是通过name属性进行封装。struts2能够通过默认的拦截器自动获取请求参数,而且能够自动转换成对应的数据类型。前提要求是在对应的action类中 定义对应的属性 而且属性名要与对应的请求参数的key保持一致,并提供set,get方法。主要是set方法。

6. 重定向

Servlet重定向:response.sendRedirect(request.getContextPath() + “/index.html”)。

servlet重定向:<result name=”success” type=”redirect”>/index.html</result>。

延伸阅读:

二、一个请求在Struts2框架中的处理流程

客户端初始化一个指向Servlet容器(例如Tomcat)的(HTTP)请求。

(官网)Struts 使用 Introspection 将 HTTP 参数转换为 JavaBean 属性并从 JavaBean 属性填充 HTML 字段。这种技术使得在 HTML 表单和 JavaBeans 之间“往返”属性变得容易。

struts2框架会创建HttpServletRequest对象和HttpServletResponse对象,所以,在struts2.0中,可以通过ServletActionContext.getRequest()获取request对象。

这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)。

请求发送给 StrutsPrepareAndExecuteFilter。

StrutsPrepareAndExecuteFilter 询问 ActionMapper(Action映射器-包含了name and namespace ): 该请求是否是一个 Struts2 请求(即是否返回一个非空的 ActionMapping 对象)。

若 ActionMapper 认为该请求是一个 Struts2 请求,则 StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy(Action代理,是Xwork和Action的中间层)。

ActionProxy 通过 Configuration Manager (配置管理器)询问框架的配置文件,确定需要调用的 Action 类及 Action 方法。

ActionProxy 创建一个 ActionInvocation ( ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。)的实例,并进行初始化。ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

 ActionInvocation 实例在使用命名模式来调用Action,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

一旦Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果,返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。并调用结果的 execute 方法,渲染结果。在渲染的过程中可以使用Struts2 框架中的标签。在表示的过程中可以使用Struts2框架中继承的标签。

执行各个拦截器 invocation.invoke() 之后的代码。

把结果发送到客户端。

以上就是关于servlet和struts2的区别的内容希望对大家有帮助。

一站式研发项目管理平台 PingCode

一站式研发项目管理平台 PingCode

支持敏捷\瀑布、知识库、迭代计划&跟踪、需求、缺陷、测试管理,同时满足非研发团队的流程规划、项目管理和在线办公需要。