标签:
为什么要与Servlet解耦?有时在Controller中要使用Request和Response对象,却又不想使用Servlet Api。思路是:创建线程安全的对象封装Request和Reponse,提供一系列常用的Servlet Api即可。
添加一个ServletHelper。
package org.smart.framework.helper; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Servlet 助手类 * * @author huangyong * @since 1.0.0 */ public final class ServletHelper { private static final Logger LOGGER = LoggerFactory.getLogger(ServletHelper.class); private static final ThreadLocal<ServletHelper> SERVLET_HELPER_HOLDER = new ThreadLocal<ServletHelper>(); private HttpServletRequest request; private HttpServletResponse response; private ServletHelper(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; } /** * 初始化 */ public static void init(HttpServletRequest request, HttpServletResponse response) { SERVLET_HELPER_HOLDER.set(new ServletHelper(request, response)); } /** * 销毁 */ public static void destroy() { SERVLET_HELPER_HOLDER.remove(); } /** * 获取 Request 对象 */ private static HttpServletRequest getRequest() { return SERVLET_HELPER_HOLDER.get().request; } /** * 获取 Response 对象 */ private static HttpServletResponse getResponse() { return SERVLET_HELPER_HOLDER.get().response; } /** * 获取 Session 对象 */ private static HttpSession getSession() { return getRequest().getSession(); } /** * 获取 ServletContext 对象 */ private static ServletContext getServletContext() { return getRequest().getServletContext(); } /** * 将属性放入 Request 中 */ public static void setRequestAttribute(String key, Object value) { getRequest().setAttribute(key, value); } /** * 从 Request 中获取属性 */ @SuppressWarnings("unchecked") public static <T> T getRequestAttribute(String key) { return (T) getRequest().getAttribute(key); } /** * 从 Request 中移除属性 */ public static void remoteRequestAttribute(String key) { getRequest().removeAttribute(key); } /** * 发送重定向响应 */ public static void sendRedirect(String location) { try { getResponse().sendRedirect(getRequest().getContextPath() + location); } catch (IOException e) { LOGGER.error("redirect failure", e); } } /** * 将属性放入 Session 中 */ public static void setSessionAttribute(String key, Object value) { getSession().setAttribute(key, value); } /** * 从 Session 中获取属性 */ @SuppressWarnings("unchecked") public static <T> T getSessionAttribute(String key) { return (T) getRequest().getSession().getAttribute(key); } /** * 从 Session 中移除属性 */ public static void removeSessionAttribute(String key) { getRequest().getSession().removeAttribute(key); } /** * 使 Session 失效 */ public static void invalidateSession() { getRequest().getSession().invalidate(); } }
然后在DispatcherServlet中init这个ServletHelper就可以了,代码见上章。如此,每次操作的时候都会把Request和Response封装到ServletHelper中。就可以调用了。
标签:
原文地址:http://www.cnblogs.com/olapforever/p/5205779.html