单元测试在开发中是非常重要的一个环节
程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的
Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常容易了
比如HttpServletRequest对象,它是由Tomcat容器给我们提供的,我们自己产生不出来
若Action中充斥者ServletAPI,哪怕仅一个,那么一般意义上的JUnit单元测试便无法进行
若Action中耦合了ServletAPI,可以采用apache的Cactus对它进行测试,这要稍微麻烦些
另外也可以采用Mock,它本身是模拟的Servlet的API的一些相关的对象
然后用模拟出来的对象代替容器中产生的对象,来实现对应用程序的访问
而Struts2的Action已经脱离了ServletAPI,所以无需这两种方式,便可直接用JUnit测试
Struts2和Struts1.X中关于Action的测试
Struts1.X的Action依赖于ServletAPI,比如HttpServletRequest、HttpServletResponse对象
这些类都是和容器结合的,所以必须启动Tomcat服务器之后才能获得容器里面的对象
所以测试时比较麻烦。而Apache提供了可以捆绑到Eclipse上专门用于独立测试的项目
它为我们模拟了一系列的HttpServlet对象,使用它之后就可以脱离Tomcat独立测试
Struts2的Action不依赖容器,它和容器无关,所以能够脱离容器进行单独测试
换句话说,我们可以直接在Action里面写一个main()方法进行测试,这是没问题的
这在Struts1.X中是不可想象的,它必须要么启动Tomcat然后去测试,要么装插件再进行测试
Struts2没有与任何的Servlet API耦合
这样可以不依赖于Web容器【如Tomcat】轻松测试Action
Struts2为我们提供了三种方式,使得我们可以轻松获得Servlet的API
①ActionContext
②ServletActionContext
③实现特定接口
由于com.opensymphony.xwork2.ActionContext已经与Servlet的API完全解耦了
所以建议首选ActionContext,次之采用ServletActionContext,最不推荐使用接口
第一种com.opensymphony.xwork2.ActionContext类
首先通过ActionContext类的静态getContext()方法获得当前线程相关的一个ActionContext实例
然后就可以通过该实例调用它的众多方法得到Servlet的一些API
public Object get(Object key)方法,就相当于HttpServletRequest.getAttribute()
public void put(Object key, Object value)对应HttpServletRequest.setAttribute()
public Map<String, Object> getParameters()对应HttpServletRequest.getParameterMap()
public Map<String, Object> getSession()方法对应javax.servlet.http.HttpSession
session.put(Object key, Object value)对应Servlet编程中的HttpSession.setAttribute(…)
也就是说,ActionContext能够获得三个Map类型的Request, Session, Application对象
ActionContext有一个好处,就是它已经将底层的Servlet进行了转化,比如它将session转化成Map
这样在测试时,Struts2便可脱离Servlet容器进行单纯的JUnit测试
第二种org.apache.struts2.ServletActionContext类
ServletActionContext.getRequest()对应javax.servlet.http.HttpServletRequest
ServletActionContext.getResponse()对应javax.servlet.http.HttpServletResponse
ServletActionContext.getServletContext()对应javax.servlet.ServletContext
它的方法全都是static的。另外它所获得的ServletContext对象,就相当于Application
因为它的生命周期与Application生命周期是一样的,只要服务器不关闭,就都是有效的
ServletActionContext可以获得和容器绑定的Request, Response, ServletContext对象
这里获得的都不是Map对象,所以在测试的时候,就必须要启动Tomcat服务器
第三种org.apache.struts2.util.ServletContextAware接口
它仅有个void setServletContext(javax.servlet.ServletContext context)方法
通过该方法获得的ServletContext就相当于Application,二者生命周期都是相同的
以及org.apache.struts2.interceptor.ServletRequestAware接口
同样有个void setServletRequest(javax.servlet.http.HttpServletRequest request)方法
以及org.apache.struts2.interceptor.ServletResponseAware接口
同样有个void setServletResponse(javax.servlet.http.HttpServletResponse response)方法
使用方式及示例代码,如下所示
此时需设置一个跟Servlet容器耦合的HttpServletRequest类型的request成员变量
当执行完setServletRequest()方法,成员变量就被它的HttpServletRequest参数赋值了
该方法是由Struts2自动调用的,显然这是一种非常非常典型的依赖注入【DI】
由Struts2自动将容器产生的HttpServletRequest对象set到我们应用中的变量上
这样成员变量request就变成了容器所产生的HttpServletRequest对象了
接下来就可以正常的使用request了,使用方法与在Servlet中的使用方式是一样的
补充org.apache.struts2.interceptor.RequestAware接口
示例代码如下
这里用到了IoC模式,即将三个Map变量初始化的权利交给了调用者,即容器
容器会自动的利用这三个setXxx()方法将三个Map变量的值从外面注入进来
而我们在Action中不需要new出来Map对象,也不需要做任何的初始化操作
然后就可以直接使用request, session, application三个对象了
小结
①与Servlet容器解耦的非IoC方法:com.opensymphony.xwork2.ActionContext类
②与Servlet容器解耦的IoC方法:RequestAware、SessionAware、ApplicationAware接口
③与Servlet容器耦合的非IoC方法:org.apache.struts2.ServletActionContext类
④与Servlet容器耦合的IoC方法:ServletRequestAware、ServletResponseAware接口
分享到:
相关推荐
Struts2是一个强大的MVC框架,它在设计时考虑了组件的解耦,使得Action类不再直接依赖Servlet API,这增强了Action的可测试性。然而,在实际开发中,Web应用程序往往需要利用Servlet API来处理HTTP请求、管理会话...
#### 一、Servlet与Struts框架的结合 在Java Web开发中,Servlet作为标准的Web组件被广泛应用于处理HTTP请求。然而随着应用复杂度的提高,传统的Servlet处理逻辑逐渐难以满足需求,这时就需要引入更为灵活且功能...
而Struts2通过ActionContext和ServletActionContext等工具类,以及各种Aware接口(如ServletRequestAware,ServletResponseAware),提供了与Servlet API解耦的方式,使得Action可以在不直接依赖Web容器的情况下进行...
而Struts2的Action与容器解耦,尽管仍能访问请求和响应,但通过其他机制减少了对Servlet API的直接依赖,增强了可测试性。 测试方面,Struts1的Action由于execute方法直接暴露了Servlet API,测试通常需要依赖容器...
2. **更弱的Servlet API耦合**:Struts2的业务逻辑与Servlet API解耦,这简化了单元测试,因为测试不再依赖于实际的HTTP请求。 3. **更加灵活的配置**:Struts2允许使用注解或XML进行配置,提高了灵活性和可读性。 ...
- **可测试性**:由于Action与Servlet API解耦,可以更容易地进行单元测试。 - **性能优化**:拦截器可以用于缓存、统计等性能优化场景。 总的来说,Struts2通过其拦截器机制提供了更强大的控制能力和灵活性,...
Struts2通过拦截器模式对请求进行处理,并且与Servlet API解耦,使得测试更加方便。 在知识中,我们还应该注意Struts1和Struts2常用到的类。对于Struts1而言,常用的类包括ActionServlet、RequestProcessor、PlugIn...
9. **模型驱动**:理解Struts2的模型驱动模式,使Action类与表单数据解耦。 10. **插件系统**:探究Struts2的插件体系,如何扩展框架功能。 通过阅读这两个版本的API文档,你可以对Struts1.3和Struts2有深入的理解...
1. **ActionServlet**:这是Struts1的核心组件,是一个Servlet,负责处理HTTP请求,并根据配置信息调用相应的Action。 2. **Action**:Action是业务逻辑的载体,处理请求并返回一个表示结果的ActionForward对象。 ...
这样,无需在Action类中直接引用ServletAPI,降低了耦合度,提高了代码的可测试性。 接下来,我们探讨Struts2的动态方法调用(Dynamic Method Invoked,DMI): 动态方法调用是Struts2的一种强大功能,它允许根据...
- Struts2与Servlet容器解耦,通过简单的Maps表示Servlet上下文,可以独立测试Action,降低了对容器的依赖。 4. **测试性**: - Struts1.x的Action由于依赖于Servlet API,测试较为困难,需要第三方工具如Struts ...
然而,随着时间的推移,Struts 1暴露了一些问题,如对表现层技术的支持单一、与Servlet API的深度耦合和侵入式设计等,这限制了它的灵活性和可测试性。 WebWork是一个由社区驱动的框架,它针对Struts 1的不足进行了...
这一过程实现了与Servlet API的解耦,使得我们无需在web.xml中为每个URL配置单独的Servlet,而是通过配置Action和Result来管理请求和响应。 Struts2还支持多种结果类型,比如Redirect、RedirectAction、Stream等,...
- **Struts2与Servlet API** - Struts2的Action不直接处理HTTP请求和响应,而是通过拦截器来间接访问。 - 这种设计减少了Action类对Servlet API的依赖,提高了组件间的解耦,也便于进行单元测试。 #### 表单和...
- **Struts 2**:通过松耦合的设计,Action不再直接依赖于Servlet API。这不仅简化了Action的编写,也使得Action可以在没有Web容器的情况下独立测试,提高了测试效率和便利性。 #### 4. 可测性方面的对比 - **...
4. **Action与Servlet API解耦**:通过使用拦截器(Interceptor),Action的业务逻辑与Servlet API分离,使得代码更易于测试和维护。 5. **易于测试**:由于Action是基于POJO的,因此可以轻松进行单元测试。 6. **...
Action是用户定义的业务逻辑类的代理,它与Servlet API解耦,返回值仅为一个字符串,可以重定向或转发到任何视图。 五、实现Struts2简单Demo 1. 下载Struts2框架的jar包。 2. 创建Web工程,将相关jar包引入到项目中...
在探讨Struts2与Struts1的区别时,我们需深入理解这两个框架的设计理念、架构模式以及它们在实际应用中的表现差异。以下将从多个角度详细分析这两种流行Java Web框架的不同之处。 ### 1. **Action类的区别** #### ...
2. **松耦合**:通过将业务逻辑控制器与Servlet API解耦,Struts2实现了更高级别的松耦合,提高了代码的可维护性和可重用性。 3. **面向接口编程**:Struts2通过定义一系列的接口来规范开发流程,这样做的好处是可以...
- **Struts2** 解耦了Action与Servlet容器,提供了更简单的测试支持,Action可以通过模拟对象独立测试,而不需要实际的HttpServletRequest和HttpServletResponse。 6. **测试能力** - **Struts1.x** 的测试通常...