会话管理
1.创建一个名为ShowSessionInfo的Servlet,显示当前客户的会话ID、会话创建时间、最近一次访问会话的时间、该用户访问该Servlet的次数等信息,运行的结果要求如下图所示。
1.ShowSessionInfo
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name = "ShowSessionInfo")
public class ShowSessionInfo extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
HttpSession session = request.getSession(true);
String heading = null;
String info="Information about your session";
Integer accessCount = (Integer) session.getAttribute("accessCount");
if(accessCount==null)
{
accessCount = new Integer(1);
heading = "Welcome,enter this page first time! ";
}
else
{
heading = "Welcome Back! ";
accessCount = accessCount+1;
}
session.setAttribute("accessCount",accessCount);
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println(" <BODY><center>");
out.println("<h2>"+heading + "</h2>" +"<h3>" +info+"</h3>");
out.println("<table border='0'>");
out.println("<tr bgcolor=\"ffad0\"><td><b>Info Type</b><td><b>Value</b>\n");
out.println("<tr><td>ID:<td>"+session.getId()+"\n");
out.println("<tr><td>Create Time:<td>");
out.println(""+new Date(session.getCreationTime())+"\n");
out.println("<tr><td>Time of last access:<td>");
out.println(""+new Date(session.getLastAccessedTime())+"\n");
out.println("<tr><td>Access number:<td>"+accessCount+"\n");
out.println("</table>");
out.println(" </center> </BODY>");
out.println("</HTML>");
}
}
2.使用HttpSession会话对象设计一个GuessNumberServlet.java,实现简单的猜数游戏:
doget()方法显示当前会话的相关信息,产生一个1-100的随机数并保存到session作用域中,显示表单让用户输入所猜数字,表单以post方式提交给该servlet本身进行处理。
dopost()方法中将用户输入的数字和session中保存的随机数进行比较,如果用户猜的结果正确,强制结束会话,通过超链接可以在此请求该Servlet重新开始一轮猜数游戏;如果结果错误,显示错误提示信息和猜数表单,允许用户重新猜数。
1.GuessNumberServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/GuessNumberServlet")
public class GuessNumberServlet extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
int magic = (int)(Math.random()*100);
System.out.print("magic="+magic);
HttpSession session = request.getSession();
// 将随机生成的数存储到会话对象中
session.setAttribute("num",new Integer(magic));
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("我想出一个0到100之间的数,请你猜!");
out.println("<form action='/homework4/GuessNumberServlet' method='post'>");
out.println("<input type='text' name='guess' />");
out.println("<input type='submit' value='确定'/>");
out.println("</form>");
out.println("</body></html>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// 得到用户猜的数
int guess = Integer.parseInt(request.getParameter("guess"));
HttpSession session = request.getSession();
// 从会话对象中取出随机生成的数
int magic = (Integer)session.getAttribute("num");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
if(guess==magic){
session.invalidate(); // 销毁会话对象
out.println("祝贺你,答对了!");
out.println("<a href = '/homework4/GuessNumberServlet'>再猜一次.</a>");
}else if(guess>magic){
out.println("太大了! 请重猜!");
}else{
out.println("太小了! 请重猜!");
}
out.println("<form action='/homework4/GuessNumberServlet' method='post'>");
out.println("<input type='text' name='guess' />");
out.println("<input type='submit' value='确定'/>");
out.println("</form>");
out.println("</body></html>");
}
}
2.
3.
3.使用会话实现购物车,设计并实现三个模型类:
Product类:表示商品信息。
GoodsItem类:用来表示购物车中一种商品。
ShoppingCart类:表示购物车信息,是购物系统中最重要的类,它用来临时存放用户购买的商品(Product)列表信息,购物车对象将被存储到用户的会话对象中。
使用ArrayList对象存放商品信息,设计一个上下文监听器在当前Web应用程序启动时创建该对象。
设计并实现3个JSP页面,
index.jsp用于显示商品信息;
showProduct.jsp用于显示一件商品详细信息;
showCart.jsp用于显示购物车中商品信息,并提供删除一件商品功能。
设计并实现ControllerServlet控制器类,主要处理商品显示、查看购物车、添加商品到购物车等动作:
查看商品详细信息(/showProduct),该动作使用doGet()方法处理。
从购物车中删除一件商品(/deleteItem),该动作使用doGet()方法处理。
向购物车中添加商品动作(/addToCart),该动作由doPost()方法处理。
1.Product类
import java.io.Serializable;
public class Product implements Serializable{
private int id;
private String pname;
private double price;
private int stock;
private String type;
public Product() { }
public Product(int id, String pname, double price, int stock, String type) {
this.id = id;
this.pname = pname;
this.price = price;
this.stock = stock;
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
2.GoodsItem类
import java.io.Serializable;
public class GoodsItem implements Serializable{
private Product product;
private int quantity;
public GoodsItem(Product product) {
this.product=product;
quantity=1;
}
public GoodsItem(Product product,int quantity){
this.product=product;
this.quantity=quantity;
}
public Product getProduct()
{
return product;
}
public void setProduct()
{
this.product=product;
}
public int getQuantity()
{
return quantity;
}
public void setQuantity(int quantity)
{
this.quantity=quantity;
}
}
3.ShoppingCart类
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
public class ShoppingCart {
HashMap<Integer,GoodsItem> items=null;
public ShoppingCart()
{
items=new HashMap<Integer, GoodsItem>();
}
public void add(GoodsItem goodsItem) {
int productid=goodsItem.getProduct().getId();
if(items.containsKey(productid))
{
GoodsItem scitem=(GoodsItem)items.get(productid);
scitem.setQuantity(scitem.getQuantity()+goodsItem.getQuantity());
}else {
items.put(productid, goodsItem);
}
}
public void remove(Integer productid)
{
if(items.containsKey(productid))
{
GoodsItem scitem=(GoodsItem)items.get(productid);
scitem.setQuantity(scitem.getQuantity()-1);
if(scitem.getQuantity()<=0)
items.remove(productid);
}
}
public Collection<GoodsItem>getItems()
{
return items.values();
}
public double getTotal()
{
double amount =0.0;
for(Iterator<GoodsItem>i=getItems().iterator();i.hasNext();)
{
GoodsItem item=(GoodsItem) i.next();
Product product =(Product) item.getProduct();
amount+=item.getQuantity()*product.getPrice();
}
return roundOFF(amount);
}
private double roundOFF(double x)
{
long val=Math.round(x*100);
return val/100.0;
}
public void clear()
{
items.clear();
}
}
4.index.jsp
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>购物系统首页面</title>
</head>
<body>
<center>
<h3>商品列表</h3>
<table>
<tr><td>商品号</td><td>商品名</tr><td>价格</tr><td>库存量</tr><td>类型</tr><td>详细信息</td></tr>
<!-- 从应用作用域中取出productList对象 -->
<% ArrayList<Product> productList=
(ArrayList<Product>)application.getAttribute("productList");
for(Product product:productList){
%>
<tr>
<td><%=product.getId() %></td>
<td><%=product.getPname() %></td>
<td><%=product.getPrice() %></td>
<td><%=product.getStock() %></td>
<td><%=product.getType() %></td>
<td><a href="showProduct>id=<%=product.getId() %>">详细信息</a></td>
</tr>
<%} %>
</table>
<a href="showCart.jsp">查看购物车</a>
</center>
</body>
</html>
5.showProduct.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="homework4.Product" %>
<html>
<head><title>商品信息</title>
<script language="JavaScript" type="text/javascript">
function check(form)
{
var regu= /^[1-9]\d*$/;
if(form.quantity.value=='')
{
alert("数值量不能为空!");
form.quantity.focus();
return false;
}
if(!regu.test(form.quantity.value))
{
alert("必须输入整数");
form.quantity.focus();
return false;
}
}
</script>
</head>
<body>
<center>
<%
Product product =(Product)session.getAttribute("product");
%>
<p>商品详细信息</p>
<form name="myform" mehtod ='post' action='addToCart'>
<input type='hidden' name='id' value='<%=product.getId()%>'/>
<table>
<tr><td>商品名:</td><td><%=product.getPname() %></td></tr>
<tr><td>价格:</td><td><%=product.getPrice() %></td></tr>
<tr><td>库存量:</td><td><%=product.getStock() %></td></tr>
<tr><td>类型:</td><td><%=product.getType() %></td></tr>
<td><input type='submit' value='放入购物车' onclick="return check(this.form)"/></td>
</tr>
<tr><td colspan='2'><a href='index.jsp'>显示商品列表</a></td></tr>
</table>
</form>
</center>
</body>
</html>
6.ProductContextListener
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProductContextListener implements ServletContextListener{
private ServletContext context=null;
public void contextInitilalized(ServletContextEvent sce) {
ArrayList<Product> productList = new ArrayList<Product>();
productList.add(new Product(101,"单反相机",4159.95,10,"家用"));
productList.add(new Product(102,"苹果手机",1199.95,8,"家用"));
productList.add(new Product(103,"笔记本电脑",5129.95,20,"电子"));
productList.add(new Product(104,"平板电脑",1239.95,20,"电子"));
context=sce.getServletContext();
context.setAttribute("productList",productList);
}
public void contextDestoryed(ServletContextEvent sce) {
context = sce.getServletContext();
context.removeAttribute("productList");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
7.ServletContextListener
import java.util.EventListener;
import javax.servlet.ServletContextEvent;
public interface ServletContextListener extends EventListener {
public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServletContextEvent sce);
}
8.ControllerServlet控制器类
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name = "ShoppingCartServlet",urlPatterns = {
"/addToCart,","/showProduct","/deleteItem"})
public class ControllerServlet extends HttpServlet {
ServletContext context;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uri=request.getRequestURI();
if(uri.endsWith("/showProduct"))
{
showProduct(request,response);
}
else if(uri.endsWith("deleteItem")){
deleteItem(request,response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
int productId=0;
int quantity=0;
try {
productId=Integer.parseInt(request.getParameter("id"));
quantity=Integer.parseInt(request.getParameter("quantity"));
}catch(NumberFormatException e) {
System.out.println(e);
}
Product product =getProduct(productId);
if(product !=null&&quantity>=0)
{
GoodsItem goodsItem = new GoodsItem(product,quantity);
HttpSession session = request.getSession();
ShoppingCart cart=(ShoppingCart) session.getAttribute("cart");
if(cart == null)
{
cart = new ShoppingCart();
session.setAttribute("cart",cart);
}
cart.add(goodsItem);
}
}
private void showProduct(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
int productId=0;
try {
productId=Integer.parseInt(request.getParameter("id"));
}catch(NumberFormatException e) {
System.out.println(productId);
}
Product product = getProduct(productId);
if(product != null)
{
HttpSession seesion = request.getSession();
seesion.setAttribute("product",product);
response.sendRedirect("showProduct.jsp");
}else {
}
}
private void deleteItem(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException
{
HttpSession seesion = request.getSession();
ServletContext session = null;
ShoppingCart cart=(ShoppingCart)session.getAttribute("cart");
try {
int id=Integer.parseInt(request.getParameter("id"));
GoodsItem item=null;
for(GoodsItem shopItem: cart.getItems())
{
if(shopItem.getProduct().getId()==id)
{
item=shopItem;
break;
}
}
cart.remove(item.getProduct().getId());
}catch(NumberFormatException e)
{
System.out.println("发生异常:"+e.getMessage());
}
session.setAttribute("cart",cart);
response.sendRedirect("ShowCart.jsp");
}
private Product getProduct(int productId)
{
context = getServletContext();
ArrayList<Product> products=(ArrayList<Product>)context.getAttribute("productList");
for(Product product : products)
{
if(product.getId() == productId) {
return product;
}
}
return null;
}
}
4.编写一个CheckUserServlet
编写一个CheckUserServlet,通过Cookie实现自动登录的功能。当用户以get方式请求该Servlet时,判断来自请求的cookie中是否包含用户的登录名和口令,如果有判断是否合法,如果通过验证显示欢迎信息;否则显示登录表单让用户重新填写用户名和口令,表单提交以post方式请求CheckUserServlet进行处理,如果用户登录成功并且勾选了“自动登录”,则提示登录成功,并向客户端发送cookie信息保存用户名和口令,否则提示登录失败,并在浏览器端显示登录表单让用户重新登录。
1.CheckUserServlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "CheckUserServlet")
public class CheckUserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
if(request.getSession().getAttribute("name")!=null){
out.print("你好:"+request.getSession().getAttribute("name")+"用户登录成功");
}else{
out.print("还没有登录哦");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
System.out.println("SessionId=="+request.getSession().getId());
String name = request.getParameter("name");
//将用户的名称保存到session属性中
request.getSession().setAttribute("name",request.getRemoteAddr()+name);
//登录成功后,保存名称为JSESSIONID的id的cookie,值为session的id
Cookie c = new Cookie("JSESSIONID",request.getSession().getId());
c.setMaxAge(60*100);
c.setPath("/");
response.addCookie(c);
//调用doGet请求
doGet(request,response);
}
}