Servlet——利用Session完成的简单购物车
1.创建登录页面
login.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
<form action="/login" method="post">
姓名:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
<input type="submit" value="登录" />
</form>
</body>
</html>
2.购物页面
buy.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>购买</title>
</head>
<body>
<form action="/buy" method="post">
货品:<select name="product">
<option value="鼠标">鼠标</option>
<option value="光盘">光盘</option>
<option value="手机">手机</option>
</select><br />
数量:<input type="text" name="number" /><br />
<input type="submit" value="购买" />
</form>
</body>
</html>
3.实体类的创建
/day8_shopping_car/src/com/myself/domain/Car.java
package com.myself.domain;
import java.util.ArrayList;
import java.util.List;
/**
* 购物车类,可添加,删除和获取购物车项
* @author Jungor
*
*/
public class Car {
// 用于存放CarItem(购物车项)的list
private List<CarItem> list = new ArrayList<CarItem>();
/**
* 获取购物车中的所有购物车项
* @return 包含所有购物车项的List
*/
public List<CarItem> list() {
return list;
}
/**
* 添加购物车项到购物车
* @param carItem 需要添加的购物车项
*/
public void add(CarItem carItem) {
this.list.add(carItem);
}
/**
* 从购物车中删除购物车项
* @param id 需要删除的购物车项ID
*/
public void remove(String id) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id)) {
list.remove(i);
break;
}
}
}
}
/day8_shopping_car/src/com/myself/domain/CarItem.java
package com.myself.domain;
/**
* 购物车项,包含id,货品名,数量
* @author Jungor
*
*/
public class CarItem {
private String id;
private String product;
private Integer number;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
/day8_shopping_car/src/com/myself/domain/User.java
package com.myself.domain;
/**
* 用户类,用于封装用户登录信息
* @author Jungor
*
*/
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [" + username + ", " + password + "]";
}
}
4.创建Servlet
/day8_shopping_car/src/com/myself/servlet/BuyServlet.java
package com.myself.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.myself.domain.Car;
import com.myself.domain.CarItem;
import com.myself.domain.User;
/**
* 购买时需要的Servlet,可以将一个购物车项添加到购物车
* @author Jungor
*
*/
public class BuyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取打印流
PrintWriter out = response.getWriter();
// 获取货品名称
String product = request.getParameter("product");
Integer number = null; // 数量
try {
// 接收到的是一个String,将其转换为Integer,如果转换失败,则向页面输出提示信息
number = Integer.parseInt(request.getParameter("number"));
} catch (NumberFormatException e) {
out.println("数量非法,<a href='/buy.html'>重新填写</a><br/>");
return;
//e.printStackTrace();
}
// 通过JSESSIONID,获取session对象,如果没有获取到,则新创建一个session对象
HttpSession session = request.getSession();
// 在session中获取user属性的对象
User user = (User) session.getAttribute("user");
// 在session中获取car属性的对象
Car car = (Car) session.getAttribute("car");
// 只有当用户已登录,且货品和数量不为空时,才允许添加项到购物车
if (user != null && product != null && number != null) {
CarItem carItem = new CarItem(); // 创建购物车项
// UUID.randomUUID().toString(),一个随机且不重复的字符串,方便购物车项的查询
carItem.setId(UUID.randomUUID().toString());
carItem.setProduct(product);
carItem.setNumber(number);
// 如果购物车为空,则创建一个购物车,并添加到Session
if (car == null) {
car = new Car();
session.setAttribute("car", car);
}
car.add(carItem);
out.println("购买成功<br/>");
out.println("<a href='/buy.html'>继续购买</a><br/>");
out.println("<a href='/list'>管理列表</a><br/>");
} else {
out.println("<a href='/login.html'>请登录</a><br/>");
}
}
}
/day8_shopping_car/src/com/myself/servlet/DeleteServlet.java
package com.myself.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.myself.domain.Car;
import com.myself.domain.User;
/**
* 删除购物加中的购物车项
* @author Jungor
*
*/
public class DeleteServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 获取session,如果使用JSESSIONID没有找到则创建一个
HttpSession session = request.getSession();
// 获取session中属性名为user的对象
User user = (User) session.getAttribute("user");
// 获取session中属性名为car的对象
Car car = (Car) session.getAttribute("car");
// 接收需要删除的购物车项的id
String id = request.getParameter("id");
// 如果用户已登录,则向下执行,否则向页面输出提示信息
if (user != null) {
// 当car对象存在时,才从此购物车中删除购物车项,且转入的id也不为空
if (car != null && id != null && !"".equals(id)) {
car.remove(id);
out.println("删除成功<br/>");
out.println("<a href='/buy.html'>继续购买</a><br/>");
out.println("<a href='/list'>管理列表</a><br/>");
} else {
out.println("也还没车车...");
}
} else {
out.println("还没登录,禁止操作。<a href='/login.html'>返回登录</a>");
}
}
}
/day8_shopping_car/src/com/myself/servlet/ListServlet.java
package com.myself.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.myself.domain.Car;
import com.myself.domain.CarItem;
import com.myself.domain.User;
/**
* 用于显示购物车里面的内容
* @author Jungor
*
*/
public class ListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 获取session,如果使用JSESSIONID没有找到则创建一个
HttpSession session = request.getSession();
// 获取session中属性名为car的对象
Car car = (Car) session.getAttribute("car");
// 获取session中属性名为user的对象
User user = (User) session.getAttribute("user");
// 如果user对象为空,则表示还没登录,要求用户登录后才能进行操作
if (user == null) {
out.println("还没登录。<a href='/login.html'>请登录</a>");
return;
}
out.println("<b>" + user.getUsername() + "</b> 的购物车<br/>");
// 如果car对象为空,表示还没创建购物车,如果不为空,就表示有购物车,可以依次输出其内容
if (car != null) {
for (CarItem carItem : car.list()) {
out.println("商品:" + carItem.getProduct() + " 数量:" + carItem.getNumber() + " <a href='/delete?id=" + carItem.getId() + "'>删除</a>");
out.println("<hr>");
}
} else {
out.println("还没购物车,所以没内容");
}
}
}
/day8_shopping_car/src/com/myself/servlet/LoginServlet.java
package com.myself.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.myself.domain.User;
/**
* 用户登录,将登录信息封装成一个User对象,并添加到Session
* @author Jungor
*
*/
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 接收到的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 获取session,如果使用JSESSIONID没有找到则创建一个
HttpSession session = request.getSession();
// 获取session中属性名为user的对象
User user = (User) session.getAttribute("user");
// 如果user对象为空,用户名和密码不为空,则将登录信息封装为一个User对象,并添加至session中
if (user == null
&& username != null && !"".equals(username)
&& password != null &&!"".equals(password)) {
// 将username和password封装成一个User对象
user = new User();
user.setPassword(password);
user.setUsername(username);
// 将对象添加到session中
session.setAttribute("user", user);
out.println("欢迎回来:<b>" + user.getUsername() + "</b> <a href='/logout'>注销</a><br/>");
out.println("<a href='/buy.html'>购物</a><br/>");
out.println("<a href='/list'>管理购物</a>");
} else if (user != null && username == null && password == null) {
//当user对象不为空,但username和password为空,直接读取session中user对象
out.println("欢迎回来:<b>" + user.getUsername() + "</b> <a href='/logout'>注销</a><br/>");
out.println("<a href='/buy.html'>购物</a><br/>");
out.println("<a href='/list'>管理购物</a>");
}else {
// 当前面条件不满足时,向页面输出提示信息
out.println("<a href='/login.html'>重新登录</a>");
}
}
}
/day8_shopping_car/src/com/myself/servlet/LogoutServlet.java
package com.myself.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.myself.domain.User;
/**
* 用户注销
* @author Jungor
*
*/
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取session
HttpSession session = request.getSession();
// 注销,让session失效,同时清除user和car在session中的对象
session.invalidate();
// 注销后,重定向到登录页面
response.sendRedirect("/login.html");
}
}
5.web.xml注册
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jps</welcome-file> </welcome-file-list> <!-- 用户登录 --> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.myself.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <!-- 将购物车项添加到购物车 --> <servlet> <servlet-name>BuyServlet</servlet-name> <servlet-class>com.myself.servlet.BuyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BuyServlet</servlet-name> <url-pattern>/buy</url-pattern> </servlet-mapping> <!-- 列出购物车项 --> <servlet> <servlet-name>ListServlet</servlet-name> <servlet-class>com.myself.servlet.ListServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ListServlet</servlet-name> <url-pattern>/list</url-pattern> </servlet-mapping> <!-- 删除购物车中的购物车项 --> <servlet> <servlet-name>DeleteServlet</servlet-name> <servlet-class>com.myself.servlet.DeleteServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DeleteServlet</servlet-name> <url-pattern>/delete</url-pattern> </servlet-mapping> <!-- 注销 --> <servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>com.myself.servlet.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping> </web-app>