作业四:会话管理

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);
    }
}
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值