session实现购物车

12 篇文章 0 订阅
12 篇文章 0 订阅

1、是什么? session 可以存储会话级变量,基于其实现购物车;

2、为什么? session是会话级变量,可以吧多次请求的数据串联起来,放到会话里; 

3、怎么做? 

【荔枝】转自 张孝祥

登录页面,前端 

<base href="http://localhost:8080/myweb2/logon.html">
<form action="session/cart/LogonServlet" method="post">
	用户名:<input type="text" name="name"><br>
	<input type="submit" value="登录1">
</form>

 登录后端, 存储登录信息到session, 并转发请求; 


// 登录servlet, 请求转发 , 登录信息存储到 session 
public class LogonServlet extends HttpServlet
{
	public void service(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/html;charset=gb2312");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession();
		//设置session超时间隔为120秒,以便测试超时的情况
		session.setMaxInactiveInterval(120);
		String sessionName = (String)session.getAttribute("name");
		//如果是一个已登录用户,则将请求转发给显示课程的Servlet
		if(sessionName != null)
		{
			RequestDispatcher rd = 
				request.getRequestDispatcher("CoursesServlet");
			rd.forward(request,response); // 请求转发 
			return;
		}
		
		String paramName = request.getParameter("name");
		if(paramName == null || paramName.trim().equals(""))
		{
			out.println("请传递用户名!<br>");
			RequestDispatcher rd = 
				request.getRequestDispatcher("../logon.html");
			rd.include(request,response); // 请求转发 
		}
		else
		{
			session.setAttribute("name",paramName); // 存储登录信息 
			RequestDispatcher rd = 
				request.getRequestDispatcher("CoursesServlet");
			rd.forward(request,response);
		}
	}
}

购物车逻辑servlet,  CoursesServlet 


// 购物车逻辑 
public class CoursesServlet extends HttpServlet
{
	public void service(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/html;charset=gb2312");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession();
		String sessionName = (String)session.getAttribute("name");
		/*如果用户没有登录,sessionName为null,或者上次访问后的空闲时间
		超过了session的限制,getSession方法返回的是一个新Session对象,
		sessionName也为null*/
		if(sessionName == null)
		{
			/*因为下面是在同一个WEB应用程序内部跳转,最好是采用forward
			方法进行请求转发,这里仅仅是为了复习sendRedirect方法*/
			response.sendRedirect("../logon.html");
			return;
		}
		
		String courseSelect = request.getParameter("course");
		if(courseSelect != null)
		{
			Vector vCourses = (Vector)session.getAttribute("courses");
			if(vCourses == null)
			{
				vCourses = new Vector();
				vCourses.add(courseSelect);
				session.setAttribute("courses",vCourses);
			}
			else
			{
				if(vCourses.contains(courseSelect))
				{
					out.println(sessionName + ",你以前选择过了" + 
							courseSelect + "<hr>");
				}
				else
				{
					/*vCourses是指向Session中的一个属性对象的引用,
					对vCourses的操作直接影响那个属性对象,不用再将
					vCourses重新增加进Session中*/					
					vCourses.add(courseSelect);
				}
			}
		}
		
		String [] courses = {"c","c++","vc++","java","jsp"};
		out.println(sessionName + ",请选择你要选修的课程:<br>");
		for(int i=0; i<courses.length; i++)
		{
			//对参数中的特殊字符应进行URL编码,这里的请求路径是 CourseServlet 自己本身 
			out.println(courses[i] + 
				"&nbsp;&nbsp;&nbsp;&nbsp;<a href='CoursesServlet?course=" + 
				URLEncoder.encode(courses[i],"gb2312") + "'>选修</a><br>");
		}
		out.println("<hr>");
		
		Vector vCourses = (Vector)session.getAttribute("courses");
		out.println(sessionName + ",你已经选择了下面的课程:<br>");
		if(vCourses != null)
		{
			for(Enumeration e=vCourses.elements();e.hasMoreElements();)
			{
				out.println((String)e.nextElement() + "<br>");
			}
		}
	}
}

 

4、访问效果 

步骤1, 进入 logon.html , 输入用户名,登录 

步骤2, 点击选修链接,模拟添加到购物车;

5、补充, 为啥要进行 URL 编码; 

CoursesServlet类倒数25行 为啥要进行URL编码, 参见 URLEncode 介绍, 

http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

 简单来说吧,  URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址"http://www.abc.com",但是没有希腊字母的网址"http://www.aβγ.com"(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定。这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致"URL编码"成为了一个混乱的领域。

为了避免以上URL编码混乱, URL编码规范应运而生。 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值