JavaWeb案例講解Servlet常用對象
概述
本次文章基于第三章的ServletConfig,ServletContext,HttpServletRequest,HttpServletResponse對象完成一個圖書訂閱系統(tǒng)的購買圖書和查看圖書購買記錄功能。
搭建項目主頁面
創(chuàng)建一個動態(tài)網(wǎng)站項目,在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中定義兩個靜態(tài)數(shù)據(jù),使用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方法,用于加載兩個靜態(tài)數(shù)據(jù),因這兩個靜態(tài)數(shù)據(jù)需要在其他方法中被使用,因此定義成全局變量。代碼如下:

再重寫init方法,并通過兩個靜態(tài)數(shù)據(jù),存儲至全局變量。
@Override
public void init(ServletConfig config) throws ServletException {
buy=config.getInitParameter("buy");
selectOrder=config.getInitParameter("selectOrder");
}
因瀏覽器訪問服務器默認使用Get請求,這里我們在diGet方法中編寫兩個超鏈接發(fā)送給瀏覽器上顯示:
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//當瀏覽器訪問該Servlet的時候,servlet將靜態(tài)數(shù)據(jù)發(fā)給瀏覽器顯示
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>");
}
這里運行以后,可看到以上的效果圖所示的頁面。
定義圖書實體類
因為我們需要展示多本圖書供用戶進行購買,而每一本圖書都需要包含,書名,作者,單價,出版社,購買時間等等數(shù)據(jù),因此為采用定義實體類的方式用于分別存儲每一本書的這些數(shù)據(jù)信息。
接著我們在src文件夾中定義包com.book.entity,用于存儲創(chuàng)建的所有實體類,點右鍵新建class類,類名為Book,在Book中定義五個全局變量用于存儲以上五個信息,并對其進行數(shù)據(jù)封裝,代碼如下:
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方法
//構(gòu)造方法的作用:
//1.用于創(chuàng)建這個類的對象
//2.用于快速給變量進行賦值
//生成無參構(gòu)造方法
public Book() {
// TODO Auto-generated constructor stub
}
//生成有參構(gòu)造方法
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方法,為了在做功能的時候,
//查看檢查這個對象中是否有數(shù)據(jù)
}
定義臨時圖書庫工具類
這里我們使用List集合臨時將多本圖書信息存儲起來,用于顯示在頁面上供用戶進行購買,這里我們在src文件夾中新建包com.book.util,在包中新建類BookDBUtil,在類中定義方法,創(chuàng)建多本圖書信息,并將多本圖書存儲至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數(shù)據(jù)庫教程", "任正非", "89.0元", "清華大學出版社", "");
Book book3=new Book("Java瘋狂講義", "馬化騰", "108.0元", "電子工業(yè)出版社", "");
Book book4=new Book("Python爬蟲技術(shù)", "李彥宏", "66.0元", "新華出版社", "");
Book book5=new Book("C語言從入門到放棄", "李云龍", "56.0元", "江西出版社", "");
//創(chuàng)建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() {
//獲得的現(xiàn)在實時時間是毫秒計算的
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;
}
}
創(chuàng)建圖書信息列表頁面供用戶購買圖書
即多本圖書已準備好,這里需要創(chuàng)建Servlet完成圖書信息列表頁面,類名為ShowBookInfoServlet,這里我們需要先從工具類中獲得所有圖書信息,并將該圖書已表格的形式發(fā)送給瀏覽器上顯示出來,其代碼如下:
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的首頁的購買圖書的超鏈接上添加圖書信息列表頁面的虛擬地址。

其運行后,點擊購買圖書即課跳轉(zhuǎn)至圖書信息列表頁面,效果如下:


完成存儲用戶購買的圖書記錄信息
當用戶點擊任意一本圖書進行購買的時候,這里我們采取發(fā)送給圖書的下標給服務器的方式,能盡快的獲取用戶要購買的圖書信息,這里新建一個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 {
//獲得用于點擊購買按鈕發(fā)送過來的請求
//獲得瀏覽器發(fā)送過來的圖書的下標
String index=request.getParameter("index");
//將接收的字符串類型轉(zhuǎn)換成int類型
int i=Integer.parseInt(index);
//根據(jù)用戶發(fā)送過來的下標,去查找用戶將要購買的書籍
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集合繼續(xù)添加購買記錄即可
//不需要重新創(chuàng)建List集合
oList=(List<Book>) object;
oList.add(book);
}
//保存完購買記錄,之后存儲至ServletContext對象
sc.setAttribute("orders", oList);
//購買成功之后,跳轉(zhuǎn)至提示頁面
//使用請求轉(zhuǎn)發(fā)跳轉(zhuǎn),因為請求轉(zhuǎn)發(fā)可以攜帶數(shù)據(jù)跳轉(zhuǎn)頁面
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);
}
}
創(chuàng)建提示信息頁面
在圖書記錄信息存儲后,需要提示用戶購買的圖書下單完成,是否需要繼續(xù)購買的提示,這里新建一個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()+"》購買成功,"
+ "如果繼續(xù)購買請<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的虛擬地址添加至主頁面的第二個超鏈接上,

其運行的效果如下:


初學者可根據(jù)代碼完成以上功能,可自行擴展修改圖書信息以及刪除購買記錄的功能等等。
到此這篇關(guān)于JavaWeb案例講解Servlet常用對象的文章就介紹到這了,更多相關(guān)JavaWeb Servlet 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Event?Sourcing事件溯源模式優(yōu)化業(yè)務系統(tǒng)
這篇文章主要為大家介紹了Event?Sourcing事件溯源模式優(yōu)化業(yè)務系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
Java利用TreeUtils工具類實現(xiàn)列表轉(zhuǎn)樹
在開發(fā)過程中,總有列表轉(zhuǎn)樹的需求,幾乎是項目的標配,有沒有一種通用且跨項目的解決方式呢?本文將基于Java8的Lambda?表達式和Stream等知識,使用TreeUtils工具類實現(xiàn)一行代碼完成列表轉(zhuǎn)樹這一通用型需求,需要的可以參考一下2022-11-11

