项目需求:
基于MVC模式制作一个购物程序,让学生可以在网页上订购教材。该系统由3个界面组成,运行系统,出现显示所有书本的界面。在这个界面中,标题为“欢迎选购图书”;界面上显示了所有的图书和价格,在每种图书后面有一个“购买”链接。单击“购买”链接,能够显示购买界面。单击图书后面的“购买”链接显示的界面,其中数量是手工输入的。在该界面中输入购买数量,提交,能够将该图书存入购物车。在存入之后可以显示购物车中的所有内容。在每种图书后面有一个“删除”链接,单击该链接,能够将相应内容从购物车中删除。另外,单击“继续买书”链接能够重新到达显示所有书本的页面。
1.首先在index.jsp界面设置,这样进入项目时,只输入项目名后便可以直接进入项目,省略了输入项目后再选择项目名下的子目录。
<jsp:forward page="InitServlet"></jsp:forward>
如下图所示,这样做的好处是可以固定进入项目的先后顺序。
2.index.jsp界面首先跳转到InitServlet.java界面。InitServlet.java界面实例化BookDao类中的对象,通过实例化的对象调用getAllBook()方法得到数据库中的全部数据。
package servlet;
import java.io.IOException;
import java.util.HashMap;
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 com.mysql.fabric.Response;
import dao.BookDao;
@WebServlet("/InitServlet")
public class InitServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BookDao bookDao=new BookDao();
HashMap allBook=null;
try {
allBook=bookDao.getAllBook();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
req.getSession().setAttribute("allBook", allBook);
resp.sendRedirect("showAllBook.jsp");
}
}
3.BookDao.java类连接数据库,对数据库中的数据进行全部查找并返回查询结果,其他类就可以通过调用该类的getAllBook()方法获取全部的查询结果。
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import vo.Book;
public class BookDao {
private Connection conn=null;
private PreparedStatement ps;
private String sql;
private ResultSet rs;
private Book book = null;
private HashMap hashMap;
public Connection initConnection() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
conn=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/access?useUnicode=true&characterEncoding=utf-8","root","123456");
return conn;
}
public HashMap getAllBook() throws Exception{
hashMap=new HashMap();
initConnection();
sql="select * from T_book";
ps=(PreparedStatement) conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
book=new Book();
book.setBookNo(rs.getString("bookNo"));
book.setBookName(rs.getString("bookName"));
book.setBookPrice(rs.getFloat("bookPrice"));
hashMap.put(book.getBookNo(), book);
}
closeConnection();
return hashMap;
}
public void closeConnection() throws SQLException{
conn.close();
}
}
4.BookDao类中的实例化的book对象来源于,实体类Book,该类中的属性,与数据库中的属性一一对应,代码如下
package vo;
public class Book {
private String bookNo;
private String bookName;
private Float bookPrice;
private int bookNumber;
public String getBookNo() {
return bookNo;
}
public void setBookNo(String bookNo) {
this.bookNo = bookNo;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Float getBookPrice() {
return bookPrice;
}
public void setBookPrice(Float bookPrice) {
this.bookPrice = bookPrice;
}
public int getBookNumber() {
return bookNumber;
}
public void setBookNumber(int bookNumber) {
this.bookNumber = bookNumber;
}
@Override
public String toString() {
return "Book [bookNo=" + bookNo + ", bookName=" + bookName + ", bookPrice=" + bookPrice + ", bookNumber="
+ bookNumber + "]";
}
}
4.1数据库中的内容如下
5.现在回到主线,InitServlet.java界面重定向跳转到ShowAllBook.jsp界面。
<%@ page language="java" import="java.util.*" import="vo.Book" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'showAllBook.jsp' starting page</title>
</head>
<body>
欢迎选购图书<br>
<%
HashMap allBook=(HashMap)session.getAttribute("allBook");
%>
<table border="1">
<tr bgcolor="pink">
<td>书本名称</td>
<td>书本价格</td>
<td>购买</td>
</tr>
<%
Set set = allBook.keySet();
Iterator iterator=set.iterator();
while(iterator.hasNext()){
String bookNo=(String)iterator.next();
Book book=(Book)allBook.get(bookNo);
%>
<tr bgcolor="yellow">
<td><%=book.getBookName()%></td>
<td><%=book.getBookPrice() %></td>
<td><a href="buyForm.jsp?bookNo=<%=book.getBookNo() %>">购买</a></td>
</tr>
<%
}
%>
</table>
<a href="showCart.jsp">查看购物车</a>
</body>
</html>
6..当点击购买连接时,跳转到buyForm.jsp,代码如下
<%@ page language="java" import="java.util.*" import="vo.Book" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'buyForm.jsp' starting page</title>
</head>
<body>
<%
String bookNo=request.getParameter("bookNo");
HashMap allBook=(HashMap)session.getAttribute("allBook");
Book book=(Book)allBook.get(bookNo);
// System.out.println("buyForm.jsp测试是够从HashMap中取到了一个对象的数据"+book);//测试是够从HashMap中取到了一个对象的数据
session.setAttribute("buyBook", book);
%>
欢迎购买:<%=book.getBookName() %>
<form action="AddServlet" method="post">
书本价格:<%=book.getBookPrice() %><br>
数量:<input type="text" name="bookNumber">
<input type="submit" value="购买" >
</form>
</body>
</html>
7.点击购买按键时,把数据提交到AddServlet.java界面,该界面获取购买的物品并进行判断,(注意:这里所说的第一次和第二次是同一个对象,也就是购买同一个商品)第一次购买时,直接存入HashMap的books对象中,第二次购买时,先获取第一次添加对象,把第一次添加的数量加上第二次添加的数量,把相加结果重新传给该对象的数量属性,再把该对象添加到books集合中,代码如下
package servlet;
import java.io.IOException;
import java.util.HashMap;
import javax.jms.Session;
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 vo.Book;
@WebServlet("/AddServlet")
public class AddServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
Book buyBook=(Book)req.getSession().getAttribute("buyBook");
String bookNumber=req.getParameter("bookNumber");
int bookIntNumber=Integer.parseInt(bookNumber);
// System.out.println("测试bookIntNumber是否为空:"+bookIntNumber);
HashMap books=(HashMap)req.getSession().getAttribute("books");
// System.out.println("测试books是否为空:"+books);
// System.out.println("测试bookNo的值:"+buyBook.getBookNo());
if(!books.containsKey(buyBook.getBookNo())){
buyBook.setBookNumber(bookIntNumber);
//System.out.println("AddServlet测试是否取到了名称为buyBook的session对象"+buyBook);//测试是否取到了名称为buyBook的session对象
books.put(buyBook.getBookNo(), buyBook);
}else {
Book book=(Book)books.get(buyBook.getBookNo());
//System.out.println("测试book对象的数量:"+book.getBookNumber());
int bookIntNumber1=book.getBookNumber()+bookIntNumber;
buyBook.setBookNumber(bookIntNumber1);
books.put(buyBook.getBookNo(), buyBook);
}
//总钱数增加
Float money=(Float)req.getSession().getAttribute("money");
System.out.println("测试money:"+money);
System.out.println("测试(Float)buyBook.getBookPrice():"+(Float)buyBook.getBookPrice());
System.out.println("测试bookIntNumber:"+bookIntNumber);
money=money+(Float)buyBook.getBookPrice()*bookIntNumber;
System.out.println("AddServlet测试计算是否正确"+money);//测试计算是否正确
req.getSession().setAttribute("money", money);
resp.sendRedirect("showCart.jsp");
}
}
8.AddServlet.java重定向到showCart.jsp界面,代码如下
<%@ page language="java" import="java.util.*" import="vo.Book" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'showCart.jsp' starting page</title>
</head>
<body>
<table border="1" >
<tr bgcolor="pink">
<td>书本名称</td>
<td>书本价格</td>
<td>数量</td>
<td>删除</td>
</tr>
<%
HashMap books=(HashMap)session.getAttribute("books");
Set set=books.keySet();
System.out.println("在showCart.jsp页面测试keySet()会变成什么值:"+set);//测试keySet()会变成什么值
Iterator iterator=set.iterator();
while(iterator.hasNext()){
String bookNo=(String)iterator.next();
Book book=(Book)books.get(bookNo);
%>
<tr bgcolor="yellow">
<td><%=book.getBookName()%></td>
<td><%=book.getBookPrice() %></td>
<td><%=book.getBookNumber() %></td>
<td><a href="RemoveServlet?bookNo=<%=book.getBookNo() %>">删除</a></td>
</tr>
<%
}
%>
</table>
现金总额:<%=session.getAttribute("money") %><hr>
<a href="showAllBook.jsp">继续买书</a>
</body>
</html>
9.点击继续购买,跳回showAllBook.jsp界面,继续选择购买JAVA书,当然也可以购买其他书,当前主要展示重复购买JAVA书本,是否运行正确。
10.当点击删除时,跳转到RemoveServlet.java界面,对当前这条数据全部删除。总金额自动变化。代码如下
package servlet;
import java.io.IOException;
import java.util.HashMap;
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 vo.Book;
@WebServlet("/RemoveServlet")
public class RemoveServlet extends HttpServlet{
//测试一下dopost()是否可以接收a标签传过来的数值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String bookNo=req.getParameter("bookNo");
HashMap books=(HashMap)req.getSession().getAttribute("books");
Book book=(Book)books.get(bookNo);
System.out.print("测试删除时,获取过来的删除数是:"+book.getBookNumber());
Float money=(Float)req.getSession().getAttribute("money");
money=money-book.getBookPrice()*book.getBookNumber();
req.getSession().setAttribute("money", money);
books.remove(bookNo);
resp.sendRedirect("showCart.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
全部删除,金额为0
11.设置session监听器,会在项目开始时自动运行,创建session。
package listener;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session=se.getSession();
HashMap books=new HashMap();
ArrayList list=new ArrayList();
System.out.println("测试list初始化的值:"+list);
System.out.println("测试books初始化时的值:"+books);
session.setAttribute("books", books);
session.setAttribute("money", 0F);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
}