电商平台学习笔记(八)——面向接口编程案例分析

情景:

        在实际的项目的开发阶段,我们一般使用的都是本地的Session,即把本机当做服务器,做的是单机测试!但是到了项目的发布阶段时,用的就是远程Session了。或者说,这时候,就需要把原来的Session给替换掉了!那么这时候,我们该怎么样去设计,才能尽可能的不修改源代码呢?

分析:

         显然,远程Session与本地的Session之间没什么区别!所实现的功能也完全一样!而面向接口所强调的恰好是一组方法的抽象集合!实现的是面向对象的多态这一特性!恰好符合这一原则!而且,站在代码角度而言,只需要定义接口,可以通过Spring注入不同的实现类来实现多态!从而可以做到不用修改任何Java代码。

源码:

         SessionProvider接口:
package cn.ilxy.web.session;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
  * 本地session
  * @author: 张荣
  * @date: 2016年3月30日
 */
public interface SessionProvider {
	/**
	 * 往Session里设置值
	 */
	public void setAttribute(HttpServletRequest request , HttpServletResponse response , String name , Serializable value );
	
	/**
	 * 从Session中取值
	 */
	public Serializable getAttibute(HttpServletRequest request , HttpServletResponse response ,String name);
	
	/**
	 * 退出登录
	 */
	public void loginOut(HttpServletRequest request , HttpServletResponse response );
	
	/**
	 * 获取SessionID
	 */
	public String getSessionId(HttpServletRequest request , HttpServletResponse response);
}
             
HttpSessionProvider实现类:

package cn.ilxy.web.session;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
  * 本地Session
  * @author: 张荣
  * @date: 2016年3月30日
 */
public class HttpSessionProvider implements SessionProvider{


	@Override
	public void setAttribute(HttpServletRequest request,  HttpServletResponse response , String name, Serializable value) {
		HttpSession session = request.getSession();				//true如果有返回Session,没有就创建一个Cookie  JSESSIONID
		session.setAttribute(name, value);
	}


	@Override
	public Serializable getAttibute(HttpServletRequest request, HttpServletResponse response ,String name) {
		HttpSession session = request.getSession(false);
		if (session != null) {
			return (Serializable) session.getAttribute(name);
		}
		return  null;
	}


	@Override
	public void loginOut(HttpServletRequest request , HttpServletResponse response) {
		HttpSession session = request.getSession(false);
		if (session != null) {
			session.invalidate();
		}
		//Cookie: JSESSION
		
	}


	@Override
	public String getSessionId(HttpServletRequest request , HttpServletResponse response) {
//		request.getRequestedSessionId();		//http://localhost:8080/html/sstf.shtml?JESSIONID=ewerq235:获取的是URL的SESSIONID
		return request.getSession().getId();
	}
	
}
CacheSessionProvider实现类:
package cn.ilxy.web.session;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.danga.MemCached.MemCachedClient;
/**
  * 远程Session,存放在Memcached缓存服务器中
  * @author: 张荣
  * @date: 2016年4月3日
 */
public class CacheSessionProvider implements SessionProvider{
	
	@Resource
	private MemCachedClient memCachedClient;
	
	private int expiry = 60 * 30;
	
	private static final String JSESSIONID="JSESSIONID";
	
	public void setExpiry(int expiry) {
		this.expiry = expiry;
	}


	@Override
	public void setAttribute(HttpServletRequest request, HttpServletResponse response , String name, Serializable value) {
		Map<String, Serializable> session = new HashMap<String , Serializable>();
		session.put(name, value);
		memCachedClient.set(getSessionId(request , response), session , expiry);
	}


	@Override
	public Serializable getAttibute(HttpServletRequest request, HttpServletResponse response , String name) {
		@SuppressWarnings("unchecked")
		Map<String, Serializable> session = (Map<String, Serializable>) memCachedClient.get(getSessionId(request, response));
		if (session != null) {
			return session.get(name);
		}
		return null;
	}


	@Override
	public void loginOut(HttpServletRequest request , HttpServletResponse response) {
		if (memCachedClient.keyExists(getSessionId(request, response))) {
			memCachedClient.delete(getSessionId(request, response));
			/*
			删除Cookie中的SessionID 
			Cookie cookie = null;
			Cookie[] cookies = request.getCookies();
			for(Cookie c: cookies){
				if (c.getName().equals(getSessionId(request, response))) {
					cookie = c;
					break;
				}
			}
			if (cookie != null) {
				cookie.setMaxAge(0);
				cookie.setPath("/");
			}*/
		}
	}


	@Override
	public String getSessionId(HttpServletRequest request , HttpServletResponse response) {
		Cookie[] cookies = request.getCookies();
		if (cookies != null && cookies.length > 0) {
			for(Cookie cookie : cookies){
				if (JSESSIONID.equals(cookie.getName())) {
					return cookie.getValue();
				}
			}
		}
		
		String sessionId = UUID.randomUUID().toString().replaceAll("-", "");
		Cookie c = new Cookie(JSESSIONID, sessionId);
		c.setDomain("/");
		c.setMaxAge(-1);
		response.addCookie(c);
		
		return sessionId;
	}
}

当项目完成不要发布时,只需要将Spring配置文件中的Bean的Class由原来的路径改成目标的接口实现类就行了!而不需要改动任何Java代码。如下图:


总结:

面向接口编程是面向对象编程的核心和精髓。也需要自己慢慢体会,细细揣摩!而且这种向上转型的使用也是相当的频繁!比如List<Strin> lst = new ArrayList<String>();
Map<String,String> map = new HashMap<String,String>····
思路分享给大家,希望有所启发!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值