耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。
解耦就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动。什么是与Servlet API解耦?
为了避免与servlet API耦合在一起,方便Action做单元测试,
Struts2对HttpServletRequest,HttpSession,和ServletContext进行了封装,构造了3个Map对象来替代这三个对象,在Action中可以直接使用HttpServletRequest,HttpSession,ServletContext对应的Map对象来保存和读取数据。
两种解耦方式:
1、 使用Struts2提供的工具类中提供的静态方法,得到对用的封装后对象。
package t;import java.util.Map;import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class ContextAction extends ActionSupport {/*** */private static final long serialVersionUID = 1L;public String test() throws Exception{System.out.println("ContextAction ****** test()");HttpServletRequest requestRequest();request.setAttribute("username","username_request");HttpServletResponse responseResponse();Map sessionMapContext().getSession();sessionMap.put("username", "username_session");ServletContext scServletContext();sc.setAttribute("username", "username_application");return "attr";} }
2、 Action实现ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware四个接口,分别重写对应的set方法,达到操作该4个封装后对象。
package t;import java.util.Map;import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.interceptor.SessionAware; import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;public class Context02Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware{HttpServletRequest request;HttpServletResponse response;ServletContext context;Map<String, Object> sessionMap;private static final long serialVersionUID = 1L;public String test() throws Exception{System.out.println("ContextAction ****** test()");HttpServletRequest requestRequest();request.setAttribute("username","username_request");HttpServletResponse responseResponse();Map sessionMapContext().getSession();sessionMap.put("username", "username_session");ServletContext scServletContext();sc.setAttribute("username", "username_application");return "attr";}public void setSession(Map<String, Object> session) {this.sessionMap=session;}public void setServletContext(ServletContext context) {t=context;}public void setServletResponse(HttpServletResponse response) {sponse=response;}public void setServletRequest(HttpServletRequest request) {quest=request;} }
其他代码:
l context/test.jsp context/success.jsp context/attr.jsp
struts2与servlet的耦合有三种实现方案:
1.ActionContext
在xwork2.jar的com.opensymphony.xwork2.ActionContext中。
这个是最推荐的一种实现。
action不需要实现接口,只需要引入这个目录就可以。
Context().put("zhangsan","helloworld");
只需要一句代码就可以放入response中,页面直接用EL表达式${requestScope.zhangsan}获取。取代了标签
<s:property value="zhangsan"/>
2.servletActionContext
在struts2-core.jar中,org.apache.struts2.ServletActionContext
同样action不需要实现接口,只需要引入这个目录就可以。
HttpServletResponse response = Response();
实现了response对象,然后只需要像往常一样适用
Cookie cookie = new Cookie("username", Username());
3.ServletRequestAware,ServletResponseAware接口实现
首先实现接口,然后实现request或response对象。
package st.action;
转载于:.html
本文发布于:2024-02-03 08:34:48,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170692048849872.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |