欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JSP中session的简单应用——以购物车为例

程序员文章站 2024-03-20 13:17:16
...

题目

编写两个页面,一个显示一些历史图书的名称和价格,一个显示一些计算机书名的名称和价格。每本书后面都有一个链接——购买,单击该链接,能够将该书本加到购物车;每个页面上都有链接,单击该链接,将该图书从购物车删除。

解题思路

难点在于点击链接后发送请求,这不同于传统的表单,我们需要在链接后面直接加上请求的数据,并且去获取。

解题步骤

1. 设计两个图书页面

1.1页面1——历史图书价格(Login.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>历史图书</title>
</head>

<body>
《梦回大清》¥39.99<br>
《梦回大唐》¥49.99<br>
购物车中的书有:
</body>
</html>

1.2页面2——计算机图书价格(login2.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>历史图书</title>
</head>

<body>
《梦回Java》¥39.99<br>
《梦回Python》¥49.99<br>
购物车中的书有:
</body>
</html>

2.获取购买信息,存入session中

<%
	ArrayList books=(ArrayList)session.getAttribute("books");
	if(books==null)
	{
		books=new ArrayList();
		session.setAttribute("books",books);
	}
	String bookname=request.getParameter("bookname");
	if(bookname!=null){
	bookname=new String(bookname.getBytes("ISO-8859-1"),"utf-8"); 
 	books.add(bookname);
 	session.setAttribute("books",books);
	}
%>

这里的bookname会在下文给出出处。

这里需要注意一点,为了防止session丢失,在检测到请求session为null的时候,我们才会去创建一个ArrayList。
还有一点,因为图书的名字可能是中文,所以要记得要使用 bookname=new String(bookname.getBytes("ISO-8859-1"),"utf-8"); 转换一下编码方式,这里的utf-8是我原先的JSP编码格式,大家可以把这里换成自己的,比如gb2312之类的。

3. 购买超链接的设计方式

在超链接的URL后方添加一个问号,填上需要传递的信息,就可以默认使用get方法传值。

<a href="Login.jsp?bookname=梦回大清">购买</a><br>

以此为模板,上文提到的bookname的来源就是这里,JSP代码会检测到bookname,然后利用session添加书籍名称。

4.添加删除超链接的设计方式

和第三步基本一致,因为购物车中每一个商品都有顺序,所以在删除的时候,只需要传递这件商品所处位置的下标,就可以准确的将其删除。这样不会导致重复书名的商品被删除。

<a href="Login.jsp?delete=<%=i%> ">删除</a>

这里的i在循环中给出。

5.完整代码

5.1 页面1——历史图书价格(Login.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>历史图书</title>
</head>

<body>
《梦回大清》¥39.99<a href="Login.jsp?bookname=梦回大清">购买</a><br>
《梦回大唐》¥49.99<a href="Login.jsp?bookname=梦回大唐">购买</a><br>
<%
	
	ArrayList books=(ArrayList)session.getAttribute("books");
	
	if(books==null)
	{
		books=new ArrayList();
		session.setAttribute("books",books);
	}
	String bookname=request.getParameter("bookname");
	if(bookname!=null){
	bookname=new String(bookname.getBytes("ISO-8859-1"),"utf-8"); 
 	books.add(bookname);
 	session.setAttribute("books",books);
	}
	String delete=request.getParameter("delete");
	if(delete!=null){
		int i=Integer.parseInt(delete);
		books.remove(i);
		session.setAttribute("books",books);
	}
%>
购物车中的书有:<br>
<%
		int i=0;
	for( i=0;i<books.size();i++)
	{
	%>
		<a href="Login.jsp?delete=<%=i%> ">删除</a>
		
		 <%out.println(books.get(i)+"<br>");}
		%>

</body>
</html>

5.2 页面2——计算机图书价格(login2.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>

<meta charset="UTF-8">
<title>计算机图书</title>
</head>
<body>
《梦回Java》¥39.99<a href="login2.jsp?bookname=梦回Java">购买</a><br>
《梦回Python》¥49.99<a href="login2.jsp?bookname=梦回Python">购买</a><br>
<%
	
	ArrayList books=(ArrayList)session.getAttribute("books");
	
	if(books==null)
	{
		books=new ArrayList();
		session.setAttribute("books",books);
	}
	String bookname=request.getParameter("bookname");
	if(bookname!=null){
	bookname=new String(bookname.getBytes("ISO-8859-1"),"utf-8"); 
 	books.add(bookname);
 	session.setAttribute("books",books);
	}
	String delete=request.getParameter("delete");
	if(delete!=null){
		int i=Integer.parseInt(delete);
		books.remove(i);
		session.setAttribute("books",books);
	}
%>
购物车中的书有:<br>
<%
		int i=0;
	for( i=0;i<books.size();i++)
	{
	%>
		<a href="Login.jsp?delete=<%=i%> ">删除</a>
		
		 <%out.println(books.get(i)+"<br>");}
		%>

</body>
</html>

奇怪的是,点击了“购买”或者“删除”的时候,的确是可以成功传递所需要的值的,但是如果此时刷新了页面,**请求会继续被发送 **,这个问题尚未解决,但基本满足了题目要求。