概述
本次文章基于第三章的ServletConfig,ServletContext,HttpServletRequest,HttpServletResponse對象完成一個圖書訂閱系統的購買圖書和查看圖書購買記錄功能。
搭建項目主頁面
創建一個動態網站項目,在src中新建包com.book.servlet.
在包中,新建HomeServlet作為主頁。效果圖如下:
為了讓一訪問項目根路徑地址就默認進入HomeServlet,這里需要將 HomeServlet的虛擬地址寫入web.xml文件中作為默認的首頁地址。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Day07Jsp</display-name> <welcome-file-list> <welcome-file>HomeServlet</welcome-file> </welcome-file-list> </web-app>
HomeServlet中要完成超鏈接的顯示,這里需要在該Servlet中定義兩個靜態數據,使用java注解的方式進行定義,代碼如下:
package com.book.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HomeServlet */ @WebServlet(urlPatterns = "/HomeServlet", initParams = { @WebInitParam(name = "buy",value = "購買圖書"), @WebInitParam(name = "selectOrder",value = "查看訂單") }) public class HomeServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HomeServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
然后在類中的空白處,重寫init方法,用于加載兩個靜態數據,因這兩個靜態數據需要在其他方法中被使用,因此定義成全局變量。代碼如下:
再重寫init方法,并通過兩個靜態數據,存儲至全局變量。
@Override public void init(ServletConfig config) throws ServletException { buy=config.getInitParameter("buy"); selectOrder=config.getInitParameter("selectOrder"); }
因瀏覽器訪問服務器默認使用Get請求,這里我們在diGet方法中編寫兩個超鏈接發送給瀏覽器上顯示:
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //當瀏覽器訪問該Servlet的時候,servlet將靜態數據發給瀏覽器顯示 response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter pw=response.getWriter(); pw.append("<div align="center">"); pw.append("<a href="">"+buy+"</a> "); pw.append("<a href="">"+selectOrder+"</a> "); pw.append("</div>"); }
這里運行以后,可看到以上的效果圖所示的頁面。
定義圖書實體類
因為我們需要展示多本圖書供用戶進行購買,而每一本圖書都需要包含,書名,作者,單價,出版社,購買時間等等數據,因此為采用定義實體類的方式用于分別存儲每一本書的這些數據信息。
接著我們在src文件夾中定義包com.book.entity,用于存儲創建的所有實體類,點右鍵新建class類,類名為Book,在Book中定義五個全局變量用于存儲以上五個信息,并對其進行數據封裝,代碼如下:
package com.book.entity; /** * 圖書的實體類 * @author teacher * 2021/10/14 */ public class Book { //java類的封裝 private String bookName;//書名 private String author;//作者 private String price;//單價 private String address;//出版社 private String buyTime;//購買時間 public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getBuyTime() { return buyTime; } public void setBuyTime(String buyTime) { this.buyTime = buyTime; } //生成所有變量的get和set方法 //構造方法的作用: //1.用于創建這個類的對象 //2.用于快速給變量進行賦值 //生成無參構造方法 public Book() { // TODO Auto-generated constructor stub } //生成有參構造方法 public Book(String bookName, String author, String price, String address, String buyTime) { super(); this.bookName = bookName; this.author = author; this.price = price; this.address = address; this.buyTime = buyTime; } @Override public String toString() { return "Book [bookName=" + bookName + ", author=" + author + ", price=" + price + ", address=" + address + ", buyTime=" + buyTime + "]"; } //生成toString方法,為了在做功能的時候, //查看檢查這個對象中是否有數據 }
定義臨時圖書庫工具類
這里我們使用List集合臨時將多本圖書信息存儲起來,用于顯示在頁面上供用戶進行購買,這里我們在src文件夾中新建包com.book.util,在包中新建類BookDBUtil,在類中定義方法,創建多本圖書信息,并將多本圖書存儲至List集合,代碼如下:
package com.book.util; /** * 圖書信息的工具類 * @author teahcer * 2021/10/14 *用于臨時存儲一些圖書信息 */ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.book.entity.Book; public class BookDataUtil { //定義方法,用于存儲多本書的信息 public List<Book> getBooks(){ Book book1=new Book("Java編程思想", "馬云", "120.0元", "人民郵電出版社", ""); Book book2=new Book("MySQL數據庫教程", "任正非", "89.0元", "清華大學出版社", ""); Book book3=new Book("Java瘋狂講義", "馬化騰", "108.0元", "電子工業出版社", ""); Book book4=new Book("Python爬蟲技術", "李彥宏", "66.0元", "新華出版社", ""); Book book5=new Book("C語言從入門到放棄", "李云龍", "56.0元", "江西出版社", ""); //創建List用于存儲以上五本書 List<Book> oBooks=new ArrayList<Book>(); oBooks.add(book1); oBooks.add(book2); oBooks.add(book3); oBooks.add(book4); oBooks.add(book5); return oBooks; } //獲得當前實時時間 public static String getNowTime() { //獲得的現在實時時間是毫秒計算的 Date date=new Date(); //簡單日期格式類 2021年10月20 日 13:55:30 SimpleDateFormat sdf= new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //按照設定的格式進行格式化 String time=sdf.format(date); return time; } }
創建圖書信息列表頁面供用戶購買圖書
即多本圖書已準備好,這里需要創建Servlet完成圖書信息列表頁面,類名為ShowBookInfoServlet,這里我們需要先從工具類中獲得所有圖書信息,并將該圖書已表格的形式發送給瀏覽器上顯示出來,其代碼如下:
package com.book.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.List; 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.book.entity.Book; import com.book.util.BookDataUtil; /** * Servlet implementation class ShowBookInfoServlet */ @WebServlet("/ShowBookInfoServlet") public class ShowBookInfoServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ShowBookInfoServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得所有圖書信息 BookDataUtil util=new BookDataUtil(); List<Book> oBooks=util.getBooks(); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter pw=response.getWriter(); pw.append("<div align="center">"); pw.append("<table border="1" style="width:800px;text-align:center;">"); //寫標題 pw.append("<tr>"); pw.append("<td>書名</td>"); pw.append("<td>作者</td>"); pw.append("<td>單價</td>"); pw.append("<td>出版社</td>"); pw.append("<td>操作</td>"); pw.append("</tr>"); for (int i=0;i<oBooks.size();i++) { pw.append("<tr>"); pw.append("<td>"+oBooks.get(i).getBookName()+"</td>"); pw.append("<td>"+oBooks.get(i).getAuthor()+"</td>"); pw.append("<td>"+oBooks.get(i).getPrice()+"</td>"); pw.append("<td>"+oBooks.get(i).getAddress()+"</td>"); pw.append("<td><a href="BuyBookServlet?index="+i+""><input type="button" " + "style="background-color:green;" " + "value="購買"></a></td>"); pw.append("</tr>"); } pw.append("</table>"); pw.append("</div>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
并在HomeServlet的首頁的購買圖書的超鏈接上添加圖書信息列表頁面的虛擬地址。
其運行后,點擊購買圖書即課跳轉至圖書信息列表頁面,效果如下:
完成存儲用戶購買的圖書記錄信息
當用戶點擊任意一本圖書進行購買的時候,這里我們采取發送給圖書的下標給服務器的方式,能盡快的獲取用戶要購買的圖書信息,這里新建一個Servlet類,類名為BuyBookServlet,用于接收用戶將要購買的圖書的下標,并查找出該圖書,并通過方法獲得當前購買圖書的下單的實時時間,存儲至該購買的圖書中,然后將該圖書存儲至List集合,因為用戶可能會購買多本圖書,最后將所喲購買的圖書記錄信息存儲至ServletContext對象中。
package com.book.servlet; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContext; 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.book.entity.Book; import com.book.util.BookDataUtil; /** * Servlet implementation class BuyBookServlet */ @WebServlet("/BuyBookServlet") public class BuyBookServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public BuyBookServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得用于點擊購買按鈕發送過來的請求 //獲得瀏覽器發送過來的圖書的下標 String index=request.getParameter("index"); //將接收的字符串類型轉換成int類型 int i=Integer.parseInt(index); //根據用戶發送過來的下標,去查找用戶將要購買的書籍 List<Book> oBooks=new BookDataUtil().getBooks(); Book book=oBooks.get(i); //當用戶購買圖書的時候,需要獲得當前實時時間 book.setBuyTime(BookDataUtil.getNowTime()); //獲得ServletContext對象 ServletContext sc=getServletContext(); //判斷ServletContext是否存在List集合 Object object=sc.getAttribute("orders"); List<Book> oList=null; if (object==null) { //說明以前從來沒有購買過書 oList=new ArrayList<Book>(); oList.add(book); }else { //以前有購買書,只需要拿到List集合繼續添加購買記錄即可 //不需要重新創建List集合 oList=(List<Book>) object; oList.add(book); } //保存完購買記錄,之后存儲至ServletContext對象 sc.setAttribute("orders", oList); //購買成功之后,跳轉至提示頁面 //使用請求轉發跳轉,因為請求轉發可以攜帶數據跳轉頁面 request.setAttribute("book", book); request.getRequestDispatcher("AlertServlet") .forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
創建提示信息頁面
在圖書記錄信息存儲后,需要提示用戶購買的圖書下單完成,是否需要繼續購買的提示,這里新建一個Servlet類,類名為:AlertServlet
package com.book.servlet; import java.io.IOException; import java.io.PrintWriter; 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.book.entity.Book; /** * Servlet implementation class AlertServlet */ @WebServlet("/AlertServlet") public class AlertServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public AlertServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Book book=(Book) request.getAttribute("book"); String info="您的《"+book.getBookName()+"》購買成功," + "如果繼續購買請<a href="ShowBookInfoServlet">點擊這里</a>," + "或者5秒之后自動跳回首頁"; response.setHeader("refresh", "5;url=HomeServlet"); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter pw=response.getWriter(); pw.print(info); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
效果如下:
完成查看圖書記錄信息列表頁面
用戶在購買完圖書信息之后,需要查看當前購買的所有圖書的記錄信息,這里我們新建Servlet類,類名為:SelectOrderServlet,從ServletContext類中獲得所有的圖書記錄信息,展示在表格上,并需要判斷是否有購買圖書記錄信息,其代碼如下:
package com.book.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletContext; 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.book.entity.Book; /** * Servlet implementation class SelectOrderServlet */ @WebServlet("/SelectOrderServlet") public class SelectOrderServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public SelectOrderServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //因為用戶購買的圖書信息被存儲在ServletContext對象中 //要展示用戶的購買記錄,需要先獲得ServletContext對象 ServletContext sc=getServletContext(); //從該對象中獲得存儲圖書記錄的List集合 Object object=sc.getAttribute("orders"); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter pw=response.getWriter(); List<Book> oBooks=null; if (object!=null) { oBooks=(List<Book>) object; pw.append("<div align="center">"); pw.append("<table border="1" style="width:800px;text-align:center;">"); //寫標題 pw.append("<tr>"); pw.append("<td>書名</td>"); pw.append("<td>作者</td>"); pw.append("<td>單價</td>"); pw.append("<td>出版社</td>"); pw.append("<td>購買時間</td>"); pw.append("</tr>"); for (int i=0;i<oBooks.size();i++) { pw.append("<tr>"); pw.append("<td>"+oBooks.get(i).getBookName()+"</td>"); pw.append("<td>"+oBooks.get(i).getAuthor()+"</td>"); pw.append("<td>"+oBooks.get(i).getPrice()+"</td>"); pw.append("<td>"+oBooks.get(i).getAddress()+"</td>"); pw.append("<td>"+oBooks.get(i).getBuyTime()+"</td>"); pw.append("</tr>"); } pw.append("</table>"); pw.append("</div>"); }else { pw.print("當前還沒有購買圖書的記錄,請先購買再查看!!!"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
并把給Servlet的虛擬地址添加至主頁面的第二個超鏈接上,
其運行的效果如下:
初學者可根據代碼完成以上功能,可自行擴展修改圖書信息以及刪除購買記錄的功能等等。
到此這篇關于JavaWeb案例講解Servlet常用對象的文章就介紹到這了,更多相關JavaWeb Servlet 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/u010321564/article/details/120896362