JSP中session的简单应用——以购物车为例
题目
编写两个页面,一个显示一些历史图书的名称和价格,一个显示一些计算机书名的名称和价格。每本书后面都有一个链接——购买,单击该链接,能够将该书本加到购物车;每个页面上都有链接,单击该链接,将该图书从购物车删除。
解题思路
难点在于点击链接后发送请求,这不同于传统的表单,我们需要在链接后面直接加上请求的数据,并且去获取。
解题步骤
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>
奇怪的是,点击了“购买”或者“删除”的时候,的确是可以成功传递所需要的值的,但是如果此时刷新了页面,**请求会继续被发送 **,这个问题尚未解决,但基本满足了题目要求。
上一篇: 简单购物车实现
下一篇: 购物车逻辑实现 Session缓存