案例需求分析
分三个界面:
-
选择图书界面:
- 界面显示所有图书的名称、价格
- 点击每本书后面的“购买”可以进行购买,跳转到购买页面
- 界面下册可以点击“查看购物车”跳转到购物车界面
-
购买页面:
- 显示购买的该图书名称、价格
- 可以输入选择购买的数量
- 点击购买按钮后将图书存入购物车
- 购买完成后跳转到购物车界面
-
购物车界面
- 显示购买的图书的名称、单价、数量
- 可以点击“删除”按钮对该购买的图书进行删除
- 显示现在购书的全部金额
- 点击“继续购书”可以返回到选择图书界面进行选书购书
系统分析
视图:
- 显示所有图书的界面
- showAllBook.jsp
- 买书界面
- buyForm.jsp
- 显示购物车界面
- showCart.jsp
模型:
-
查询所有图书
-
InitServlet.java
-
SessionListener.java:作为监听器,初始化和记录购买信息
-
BookDao.java:实现查询图书功能
-
Book.java:封装对图书信息的操作
-
-
-
买书
- AddServlet.java
-
从购物车中删除图书
- RemoveServlet.java
在界面中实现选择跳转的目的页面
设计数据结构
书籍的信息来自库,而且信息属性多,所以选择集合类数据结构存储。
如果用List<Object>
来存储,在对图书进行操作时会需要获得图书的No,比较麻烦。
所以可以考虑用HashMap<bookno, Object>
的形式进行存储,方便查找和修改。
[HashMap简介](Java HashMap | 菜鸟教程 (runoob.com))
项目结构如上
开发阶段
创建项目:
这里需要说明一下,有的朋友没有web.xml可能是因为项目没设置为Java EE
我这里使用的是Mysql,所以要加一下connector包(各位根据自己的数据库来进行不同的操作)
数据库操作
建表
CREATE TABLE T_BOOK(
BOOKNO varchar(40),
BOOKNAME varchar(40),
BOOKPRICE float
)
添加数据
INSERT INTO T_book VALUES ('1','Java', 39.0);
INSERT INTO T_book VALUES ('2','算法与数据结构', 35.0);
编写Book.java & BookDao.java
Book.java如下:
package vo;
public class Book {
private String bookno;
private String bookname;
private float bookprice;
private int booknumber;
public String getBookno(){
return bookno;
}
public String getBookname(){
return bookname;
}
public float getBookprice(){
return bookprice;
}
public int getBooknumber(){
return booknumber;
}
public void setBookno(String bookno){
this.bookno = bookno;
}
public void setBookname(String bookname){
this.bookname = bookname;
}
public void setBookprice(float bookprice){
this.bookprice = bookprice;
}
public void setBooknumber(int booknumber){
this.booknumber = booknumber;
}
}
BookDao.java
这里注意根据自己的数据库,进行修改相应的数据库操作
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import vo.Book;
public class BookDao {
private Connection conn = null;
public void initConnection() throws Exception{
Class.forName("com.mysql.jdbc.Driver"); //加载驱动
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","Lfy666666");
}
public void closeConnection() throws Exception{
conn.close();
}
public HashMap getAllBook() throws Exception{
HashMap hm = new HashMap();
this.initConnection();
Statement stat = conn.createStatement();
String sql = "SELECT BOOKNO, BOOKNAME, BOOKPRICE FROM T_BOOK";
ResultSet rs = stat.executeQuery(sql);
int num = 0;
while(rs.next()){
System.out.println("num="+ num++);
Book book = new Book();
book = new Book();
book.setBookno(rs.getString("bookno"));
book.setBookname(rs.getString("bookname"));
book.setBookprice(rs.getFloat("bookprice"));
hm.put(book.getBookno(), book);
}
this.closeConnection();
return hm;
}
}
编写监听器SessionListener.java
SessionListener.java代码如下:
package listener;
import java.util.HashMap;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent event){
HttpSession session = event.getSession();
HashMap books = new HashMap();
session.setAttribute("books", books);
session.setAttribute("money", 0F);
}
public void sessionDestroyed(HttpSessionEvent arg0){
}
}
对于SessionListener.java的配置:
在web的WEB-INF下的web.xml中:
添加以下代码:
<listener>
<listener-class>listener.SessionListener</listener-class>
</listener>
编写InitServlet.java & showAllBook.java
InitServlet.java代码如下:
这里注意跳转的页面,我这里是/WebApplication3/showAllBook.jsp,各位根据自己文件的位置进行跳转
package servlet;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.BookDao;
public class InitServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
BookDao bdao = new BookDao();
HashMap allbook = new HashMap();
try{
allbook = bdao.getAllBook();
} catch(Exception e){
e.printStackTrace();
}
request.getSession().setAttribute("allbook", allbook);
response.sendRedirect("/WebApplication3/showAllBook.jsp");
}
}
同样的,在web.xml中配置InitServlet.java
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>servlet.InitServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/InitServlet</url-pattern>
</servlet-mapping>
showAllBook.jsp代码如下:
<%@page contentType="text/html" pageEncoding="gb2312"%>
<%@page import="java.util.*"%>
<%@page import="vo.Book"%>
<%@page import="servlet.InitServlet"%>
<!DOCTYPE html>
<html>
<body>
欢迎选购图书<br>
<%
// InitServlet init_serv = new InitServlet();
// init_serv.doGet(request, response);
HashMap allbook = (HashMap) session.getAttribute("allbook");
// for(Map.Entry<Integer, Integer> entry : map.entrySet())
%>
<table border="1">
<tr bgcolor ="pink">
<td>书本名称</td>
<td>书本价格</td>
<td>购买</td>
</tr>
<%
Set set = allbook.keySet();
Iterator ite = set.iterator();
while (ite.hasNext()) {
String bookno = (String) ite.next();
Book book = (Book) allbook.get(bookno);
%>
<tr bgcolor ="yellow">
<td><%=book.getBookname()%></td>
<td><%=book.getBookprice()%></td>
<td><a href="buyForm.jsp?bookno=<%=bookno%>">购买</a></td>
</tr>
<%}%>
</table><!-- comment -->
<a href="showCart.jsp">查看购物车</a>
</body>
</html>
预览:
这个时候,在浏览器输入:http://localhost:8080/WebApplication4/InitServlet
这时候就会出现我们的选书界面:
编写buyForm.jsp 和 AddServlet.java
buyFrom.jsp:
这里的form提交后会转到AddServlet,为什么不是WebApplication3/servlet/AddServlet?
[看这里](Servlet返回“ HTTP状态404请求的资源(/ Servlet)不可用_eclipse请求的资源不可用404怎么办_沙漠一只雕得儿得儿的博客-CSDN博客)
<%@page contentType="text/html" pageEncoding="gb2312"%>
<%@page import="java.util.*"%>
<%@page import="vo.Book"%>
<!DOCTYPE html>
<html>
<body>
<%
String bookno = request.getParameter("bookno");
HashMap allbook = (HashMap) session.getAttribute("allbook");
Book book = (Book) allbook.get(bookno);
%>
欢迎购买:<%=book.getBookname()%>
<form action ="AddServlet" method="post">
书本价格:<%=book.getBookprice()%><br><!-- comment -->
<input name="bookno" type="hidden" value="<%=book.getBookno()%>">
<input name = "bookname" type = "hidden"
value="<%=book.getBookname()%>">
<input name="bookprice" type="hidden"
value="<%=book.getBookprice()%>"><!-- comment -->
数量:
<input name="booknumber" type="text"><!-- comment -->
<input type ="submit" value="购买">
</form>
</body>
</html>
AddServlet.java:
同理这里注意自己跳转的页面
package servlet;
import java.io.IOException;
import java.util.HashMap;
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 vo.Book;
public class AddServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("gb2312");
HttpSession session = request.getSession();
HashMap books = (HashMap)session.getAttribute("books");
String bookno = request.getParameter("bookno");
String bookname = request.getParameter("bookname");
String strBookprice = request.getParameter("bookprice");
String strBooknumber = request.getParameter("booknumber");
Book book = new Book();
book.setBookno(bookno);
book.setBookname(bookname);
float bookprice = Float.parseFloat(strBookprice);
book.setBookprice(bookprice);
int booknumber = Integer.parseInt(strBooknumber);
book.setBooknumber(booknumber);
books.put(bookno, book);
float money = (Float)session.getAttribute("money");
money = money + bookprice*booknumber;
session.setAttribute("money", money);
response.sendRedirect("/WebApplication3/showCart.jsp");
}
}
同样的,配置注册AddServlet
<servlet>
<servlet-name>AddServlet</servlet-name>
<servlet-class>servlet.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>
预览
这时候就可以购买图书了,界面如下:
编写showCart.jsp和RemoveServlet.java
showCart.jsp
同理更改路径名称
<%@page contentType="text/html" pageEncoding="gb2312"%>
<%@page import="java.util.*"%>
<%@page import="vo.Book"%>
<!DOCTYPE html>
<html>
<body>
<table border="1">
<tr bgcolor="pink">
<td>书本名称</td>
<td>书本价格</td>
<td>数量</td>
<td>删除</td>
</tr>
<%
HashMap books = (HashMap) session.getAttribute("books");
if (books == null) {
System.out.println(1111);
} else {
System.out.println(2222);
}
Set set = books.keySet();
Iterator ite = set.iterator();
while (ite.hasNext()) {
String bookno = (String) ite.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="/WebApplication3/RemoveServlet?bookno=<%=book.getBookno()%>">删
除</a></td>
</tr>
<% }%>
</table>
现金总额:<%=session.getAttribute("money")%><hr>
<a href="showAllBook.jsp">继续买书</a>
</body>
</html>
RemoveServlet.java
同理更改路径名称
package servlet;
import java.io.IOException;
import java.util.HashMap;
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 vo.Book;
public class RemoveServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("gb2312");
String bookno = request.getParameter("bookno");
HttpSession session = request.getSession();
HashMap books = (HashMap) session.getAttribute("books");
Book book = (Book) books.get(bookno);
float money = (Float) session.getAttribute("money");
money = money - book.getBooknumber() * book.getBookprice();
session.setAttribute("money", money);
books.remove(bookno);
response.sendRedirect("/WebApplication3/showCart.jsp");
}
}
配置注册RemoveServlet
<servlet>
<servlet-name>RemoveServlet</servlet-name>
<servlet-class>servlet.RemoveServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RemoveServlet</servlet-name>
<url-pattern>/RemoveServlet</url-pattern>
</servlet-mapping>
至此,此项目就结束了
效果展示:
首先,我们可以点击Clean and Build清理原来的缓存
在浏览器输入:http://localhost:8080/WebApplication4/InitServlet
点击“Java”的购买后,输入数量2:
再点击“购买”会进入购物车界面:
点击“继续买书”,回到查看书籍和选购书界面
我们再买本“算法与数据结构”后,购物车界面如下:
点击Java后的“删除”后,效果如下:
附加题
-
直接访问showAllBook.jsp会报错——该问题已解决,因为在web.xml中已经配置注册了InitServlet,即使不以它为入口,也会执行
-
本项目只能对购物车内容进行删除,但一般情况要求修改(即:在“删除”后面在添加一列“修改”并实现该功能)
-
首先创建一个jsp:update.jsp
- 功能一:实现一个表单功能
- 功能二:表单input框直接获取当前书本信息
- 功能三:可以对input框内容进行修改
- 功能四:“提交”与“取消”功能。提交后把input框内容(同时包括hidden类型的bookno)提交到updateServlet.java进行处理
-
首先再创一个Servlet:updateServlet.java
- 功能一:获取update.jsp提交的各个书本数据
- 功能二:连接数据库,根据bookno对书籍进行定位
- 功能三:使用executeQuery(sql)更改T_BOOK表内容
- 功能四:更新成功后跳转到update.jsp同时实现刷新效果
-