薛倩
基于MVC模式和Java EE技術(shù)網(wǎng)上書店的設(shè)計(jì)與實(shí)現(xiàn)
薛倩
網(wǎng)上書店作為電子商務(wù)的一種,與傳統(tǒng)的店面書店相比,其經(jīng)營(yíng)方式和銷售渠道表現(xiàn)出很多優(yōu)勢(shì),為此進(jìn)行網(wǎng)上電子書店的設(shè)計(jì)與實(shí)現(xiàn)。為了程序的易維護(hù)性和可擴(kuò)展性,結(jié)合網(wǎng)上交易系統(tǒng)的特點(diǎn),采用模式視圖控制器(MVC)設(shè)計(jì)模式,使之適用于Java EE(企業(yè)版)技術(shù)來進(jìn)行項(xiàng)目的開發(fā)。根據(jù)企業(yè)需求分析,進(jìn)行系統(tǒng)功能結(jié)構(gòu)設(shè)計(jì),以系統(tǒng)開發(fā)技術(shù)應(yīng)用和購物車的實(shí)現(xiàn)為例,詳盡介紹了網(wǎng)上書店的設(shè)計(jì)與開發(fā)方法。
MVC模式;Java EE技術(shù);網(wǎng)上書店;購物車;JSP標(biāo)準(zhǔn)標(biāo)簽庫;JNDI技術(shù)
基于Internet的信息服務(wù),商務(wù)服務(wù)已經(jīng)成為現(xiàn)代企業(yè)不可缺少的一項(xiàng)服務(wù)。很多企業(yè)都已不滿足于建立一個(gè)簡(jiǎn)單的僅僅能夠發(fā)布信息的靜態(tài)網(wǎng)站[1]?,F(xiàn)代企業(yè)需要的是一個(gè)功能強(qiáng)大的,能提供完善的電子商務(wù)服務(wù)的動(dòng)態(tài)商務(wù)網(wǎng)站。網(wǎng)上書店作為電子商務(wù)的一種,與傳統(tǒng)的店面書店相比,其經(jīng)營(yíng)方式和銷售渠道表現(xiàn)出很多優(yōu)勢(shì)。首先,它不受傳統(tǒng)購物的諸多限制,24小時(shí)全天候、全方位服務(wù)是店面書店所不能企及的。其次商家可以通過網(wǎng)絡(luò)拉近與消費(fèi)者的距離、迅速增加所擁有的消費(fèi)群,同時(shí)對(duì)于消費(fèi)者可以擴(kuò)大選擇面,足不出戶通覽互聯(lián)網(wǎng)上的書籍信息,盡情享受購書樂趣,體現(xiàn)了個(gè)性化的購物過程。第三,成本低廉是網(wǎng)上電子書店的顯著優(yōu)點(diǎn)。網(wǎng)上購書減少了商品流通的中間環(huán)節(jié),節(jié)省了大量的開支,從而也大大降低商品流通和交易成本。加之與其他網(wǎng)上交易相比,購書過程易于判斷和選擇,書籍的運(yùn)送不易破損,不具時(shí)效性等特點(diǎn),更加明確了網(wǎng)上書店的優(yōu)勢(shì)。網(wǎng)上交易平臺(tái)對(duì)書籍銷售企業(yè)具有重要的意義,為此研究能夠?qū)崿F(xiàn)簡(jiǎn)單電子商務(wù)的小型動(dòng)態(tài)商務(wù)網(wǎng)站——網(wǎng)上電子書店交易系統(tǒng)。
1.1 開發(fā)技術(shù)選擇
很多網(wǎng)上交易系統(tǒng)是由JSP(Java Server Pages)技術(shù)完成的,仔細(xì)分析發(fā)現(xiàn)JSP技術(shù)存在弊端。最突出的問題是代碼和業(yè)務(wù)邏輯混淆在一起,彼此嵌套,難以對(duì)項(xiàng)目進(jìn)行有效的維護(hù)和擴(kuò)展。例如,使用JSP技術(shù)編寫的程序,其JSP頁面直接訪問數(shù)據(jù)庫,如果數(shù)據(jù)庫中表的名稱改變了,需要改寫所有的訪問語句;同時(shí)程序中所有的頁面都需要美工進(jìn)行美化,這樣一來,當(dāng)網(wǎng)站業(yè)務(wù)需求發(fā)生變化的時(shí)候,對(duì)于程序員和美工都是一個(gè)很重的負(fù)擔(dān)。因此,為了使程序具有維護(hù)性和可擴(kuò)展性,結(jié)合網(wǎng)上交易系統(tǒng)的特點(diǎn),本文采用MVC(Model View Controller)設(shè)計(jì)模式,使用適用于Java EE(Java Platform,Enterprise Edition)技術(shù)來進(jìn)行項(xiàng)目的開發(fā)。
1.2 系統(tǒng)開發(fā)技術(shù)介紹
1.2.1 MVC設(shè)計(jì)模式和Java EE技術(shù)
所謂設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)[2],設(shè)計(jì)模式的作用是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。MVC設(shè)計(jì)模式可應(yīng)用到某種應(yīng)用開發(fā)中,由模型、視圖、控制器3個(gè)模塊組成。Java EE開發(fā)技術(shù)就是基于MVC設(shè)計(jì)模式的應(yīng)用,其中模型代表應(yīng)用程序狀態(tài)和業(yè)務(wù)邏輯,進(jìn)行業(yè)務(wù)操作和訪問數(shù)據(jù)庫,對(duì)應(yīng)的組件是JavaBean。視圖提供可交互的客戶界面,向客戶顯示模型數(shù)據(jù),對(duì)應(yīng)的組件是JSP或HTML文件。首先,控制器根據(jù)客戶的請(qǐng)求來操縱模型,并把結(jié)果經(jīng)由視圖展現(xiàn)給客戶,對(duì)應(yīng)的組件是Servlet。Java EE開發(fā)技術(shù)優(yōu)點(diǎn)在于3個(gè)層各盡其責(zé)、互不干涉,如果哪一層的需求發(fā)生變化只需要更改相應(yīng)層的代碼,而不影響其他層。其次,由于按層把系統(tǒng)分開,有利于實(shí)現(xiàn)開發(fā)中的分工。第三是把顯示和數(shù)據(jù)分離,增加了各模塊的可重用性。MVC訪問模式如圖1所示:
圖1 MVC訪問模式
Java EE體系架構(gòu)采用傳統(tǒng)的MVC設(shè)計(jì)模式,支持企業(yè)級(jí)應(yīng)用開發(fā),簡(jiǎn)化企業(yè)解決方案的開發(fā)、部署和管理等復(fù)雜問題,事實(shí)上,Java EE已經(jīng)成為企業(yè)級(jí)開發(fā)的工業(yè)標(biāo)準(zhǔn)和首選平臺(tái)[3]。
1.2.2 Servlet
Servlet是一個(gè)Java程序,是在服務(wù)器上運(yùn)行以處理客戶端請(qǐng)求并做出響應(yīng)的程序[4]。我們使用Web容器構(gòu)建電子商務(wù)應(yīng)用程序時(shí),一般使用的是Web HTTP請(qǐng)求,構(gòu)建的Servlet不需要提供Servlet接口,只要繼承HttpServlet類就行了,繼承了HttpServlet的類就是一個(gè)可在Servlet引擎Web服務(wù)器里面運(yùn)行的小應(yīng)用程序。用來接收客戶請(qǐng)求,并做出響應(yīng)的Java程序,Servlet是中間件技術(shù)的重要部分,它控制著其他的組件。
Servlet編程基本模式:首先處理Get和Post請(qǐng)求,其次Servlet接收數(shù)據(jù),最后根據(jù)結(jié)果,轉(zhuǎn)向其他頁面或資源。Servlet的生命周期由Servlet容器控制,如Tomcat就是一個(gè)Servlet容器。
1.2.3 JSP標(biāo)準(zhǔn)標(biāo)簽庫
JSP標(biāo)準(zhǔn)標(biāo)簽庫簡(jiǎn)稱為JSTL(Java Server Pages Standard Tag Library),輔助JSP顯示動(dòng)態(tài)內(nèi)容的標(biāo)準(zhǔn)標(biāo)簽庫。JSTL提供的標(biāo)準(zhǔn)標(biāo)簽有包含通用標(biāo)簽、條件標(biāo)簽、迭代標(biāo)簽的核心標(biāo)簽庫和SQL標(biāo)簽庫等,可用于編寫各種動(dòng)態(tài)JSP頁面和訪問數(shù)據(jù)庫。比如使用setDataSource標(biāo)簽定義數(shù)據(jù)源的代碼為,<sql:setDataSource driver="driverClass" url= "databaseURL" user="username" password= "userpass" var= "datasource"/〉 1.2.4 JNDI(Java Naming and Directory Interface)技術(shù)
企業(yè)級(jí)開發(fā)需要穩(wěn)健和高效的數(shù)據(jù)訪問層[5],而傳統(tǒng)的數(shù)據(jù)庫連接技術(shù)已經(jīng)無法滿足需求,而且需要打開連接,操作數(shù)據(jù)庫,關(guān)閉連接等多次重復(fù)操作。JNDI技術(shù)可以給應(yīng)用程序提供可靠的已連接好的空閑連接。JNDI是一組在Java應(yīng)用中訪問命名和目錄服務(wù)的應(yīng)用程序編程接口(API),其javax.naming.Context接口提供了查找JNDI Resource的接口,該接口的lookup()方法獲得數(shù)據(jù)源。得到數(shù)據(jù)源DataSource對(duì)象后,javax.sql.DataSource接口負(fù)責(zé)建立與數(shù)據(jù)庫的連接,可以通過DataSource的getConnection()方法獲得數(shù)據(jù)庫連接對(duì)象Connection,把連接保存在連接池中。連接池是由容器提供的,用來管理池中連接對(duì)象。JNDI技術(shù)進(jìn)行數(shù)據(jù)連接的工作過程如圖2所示:
圖2 JNDI技術(shù)進(jìn)行數(shù)據(jù)連接的工作過程
2.1 系統(tǒng)功能結(jié)構(gòu)設(shè)計(jì)
系統(tǒng)的功能是建立簡(jiǎn)單小型動(dòng)態(tài)網(wǎng)上購書網(wǎng)站。根據(jù)網(wǎng)站功能需求,系統(tǒng)設(shè)計(jì)的主要功能模塊包括書籍展示、書籍詳情、購物車、購物結(jié)算、用戶認(rèn)證注冊(cè)等內(nèi)容。書籍展示顯示了所有書籍的列表及概要信息,并可以根據(jù)需要選擇其中一本,鏈接到書籍詳情。書籍詳情頁面將詳細(xì)介紹書籍的作者、出版時(shí)間、摘要等相關(guān)信息。購物車是網(wǎng)上書店功能結(jié)構(gòu)中的核心[6],通過購物車可以將需要購買的書籍依次添加進(jìn)來,直至最終實(shí)現(xiàn)購物結(jié)算功能。除了以上基本功能模塊,網(wǎng)上書店可以根據(jù)需要拓展、增加其他功能模塊,比如留言板、新書推薦等。
2.2 開發(fā)環(huán)境
系統(tǒng)采用B/S結(jié)構(gòu),以Apache Tomcat 7.0作為應(yīng)用服務(wù)器,SQL Server 2005作為數(shù)據(jù)庫服務(wù)器,使用集成開發(fā)工具M(jìn)yEclipse8.0,基于MVC模式和Java EE技術(shù)進(jìn)行網(wǎng)絡(luò)應(yīng)用程序的開發(fā),以JNDI技術(shù)連接訪問數(shù)據(jù)庫。
3.1 使用Servlet實(shí)現(xiàn)電子書店用戶認(rèn)證
用戶輸入用戶名和密碼進(jìn)行用戶認(rèn)證,如果用戶名或密碼錯(cuò)誤,返回到登錄頁面login.jsp,否則顯示驗(yàn)證成功頁面success.jsp,Servlet主要代碼如下所示:
…
public class AuthenticationServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName=request.getParameter("userName");
String userPass=request.getParameter("userPass");
if (userName == "accp" && userPass == "123")
response.sendRedirect("success.jsp");
else
response.sendRedirect("login.jsp ");
}
}
…
3.2 使用JSTL中update標(biāo)簽進(jìn)行數(shù)據(jù)更新應(yīng)用
使用帶參數(shù)的update標(biāo)簽設(shè)置數(shù)據(jù)源,設(shè)置SQL語句,param標(biāo)簽的功能是用來設(shè)置相關(guān)參數(shù),數(shù)據(jù)庫名稱為“books”。主要代碼如下所示:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%〉
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%〉
<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName= books"
user="sa" password="sa" var="conn"/〉
<sql:update var="order" dataSource="${conn}"〉
insert into BookOrder(username,zipcode,phone,creditcard,total)
values(?,?,?,?,?)
<sql:param value='${param["username"]}'/〉<sql:param value='${param["zipcode"]}'/〉<sql:param value='${param["phone"]}'/〉
<sql:param value='${param["creditcard"]}'/〉
<sql:param value='${100}'/〉
</sql:update〉
3.3 使用JNDI獲取連接數(shù)據(jù)庫對(duì)象
除了編寫代碼外,還要進(jìn)行JNDI配置,主要包括Tomcat的conf/context.xml中的配置、加入數(shù)據(jù)庫驅(qū)動(dòng)文件、應(yīng)用程序的web.xml文件的配置等。主要代碼如下所示:
…
public List getTitles() {
try {
Context ic = new InitialContext();
DataSource source
=(DataSource)ic.lookup("java:comp/env/jdbc/books");
Connection connection = source.getConnection();
titlesQuery = connection.prepareStatement("SELECT * FROM titles ");
ResultSet results = titlesQuery.executeQuery();
}
…
購物車的實(shí)現(xiàn)是該項(xiàng)目的核心,根據(jù)MVC設(shè)計(jì)模式進(jìn)行購物車設(shè)計(jì),主要包括3個(gè)部分:1.購物車中對(duì)象的設(shè)計(jì);2.編寫Servlet實(shí)現(xiàn)添加書籍到購物車;3.編寫JSP實(shí)現(xiàn)查看購物車的書籍列表。
4.1 購物車中對(duì)象的設(shè)計(jì)
首先設(shè)計(jì)MVC中的模型,購物車中的對(duì)象主要包括購買的書籍本身信息和購買數(shù)量,將兩項(xiàng)屬性封裝為名為CartItemBean的模型JavaBean,主要代碼如下所示:
…
public class CartItemBean implements Serializable {
private BookBean book;
private int quantity;
public CartItemBean(BookBean bookToAdd, int number)
{
book = bookToAdd;
quantity = number;
}
public BookBean getBook() {
return book;
}
public void setQuantity(int number) {
quantity = number;
}
public int getQuantity() {
return quantity;
}
}
4.2 編寫Servlet實(shí)現(xiàn)添加書籍到購物車
購物車Servlet功能是根據(jù)客戶請(qǐng)求,實(shí)現(xiàn)添加書籍到購物車。首先獲得session對(duì)象,并從session中取出BookBean對(duì)象,然后創(chuàng)建HashMap對(duì)象,并添加一個(gè)條目到Map中?!?/p>
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(false);
RequestDispatcher dispatcher;
if (session == null) {
dispatcher = request.getRequestDispatcher("/../books.jsp");
dispatcher.forward(request, response);
}
Map cart = (Map) session.getAttribute("cart");
BookBean book = (BookBean) session.getAttribute("bookToAdd");
if (cart == null) {
cart = new HashMap();
session.setAttribute("cart", cart);
}
CartItemBean cartItem = (CartItemBean) cart.get(book.getISBN());
if (cartItem != null)
cartItem.setQuantity(cartItem.getQuantity() + 1); else
cart.put(book.getISBN(), new CartItem-Bean(book, 1));
dispatcher = re
quest.getRequestDispatcher("/../viewCart.jsp");
dispatcher.forward(request, response);
}
…
4.3 編寫JSP實(shí)現(xiàn)查看購物車的書籍列表
Servlet根據(jù)數(shù)據(jù)處理的結(jié)果,通過MVC中視圖JSP,向客戶顯示模型數(shù)據(jù),顯示購物車內(nèi)商品。顯示購物車內(nèi)書籍的JSP頁面主要代碼如下所示:
…
Map cart = (Map) session.getAttribute("cart");
Set cartItems = cart.keySet();
Object[ ] isbn = cartItems.toArray();
BookBean book;
int i = 0;
while (i < isbn.length) {
cartItem = (CartItemBean)
cart.get((String)isbn[i]);
book = cartItem.getBook();
i++;
}
系統(tǒng)基于MVC模式,采用Tomcat作為應(yīng)用服務(wù)器,使用JNDI技術(shù)獲取連接對(duì)象訪問數(shù)據(jù)庫,根據(jù)企業(yè)需求分析,進(jìn)行系統(tǒng)功能結(jié)構(gòu)設(shè)計(jì),對(duì)系統(tǒng)所使用的開發(fā)技術(shù)進(jìn)行舉例,完成系統(tǒng)核心—購物車的實(shí)現(xiàn),詳盡介紹了基于Java EE技術(shù)完成網(wǎng)上書店的設(shè)計(jì)與開發(fā)方法。系統(tǒng)能夠提供書籍展示、書籍詳情、購物車、購物結(jié)算、用戶認(rèn)證注冊(cè)等功能,且具有訪問速度快,安全可靠,易于維護(hù)和管理的特點(diǎn)。
[1] 鮑振軍,趙武,榮先奎.利用JavaEE構(gòu)建創(chuàng)新型企業(yè)管理系統(tǒng)[J].機(jī)械設(shè)計(jì)與制造.2011,(2):229-233.
[2] 徐東風(fēng),曹維,廖俊杰.基于MVC模式的實(shí)驗(yàn)室儀器管理系統(tǒng)設(shè)計(jì)[J].實(shí)驗(yàn)室研究與探索.2010,29(8):101-104.
[3] 陳俊杰,趙春勝,高靜.基于JavaEE架構(gòu)的可定制審計(jì)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].內(nèi)蒙古農(nóng)業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版).2012,33(4):37-40.
[4] 靳大尉,趙成,陳剛.統(tǒng)一權(quán)限管理下的Web應(yīng)用管理平臺(tái)[J].計(jì)算機(jī)應(yīng)用.2013,33(s2):305-306,311.
[5] 張海營(yíng).基于物聯(lián)網(wǎng)的圖書館館藏推薦服務(wù)平臺(tái)構(gòu)建[J].圖書館雜志.2013,(12):33-37.
[6] 劉冰,李正凡.基于Struts擴(kuò)展框架的Web應(yīng)用研究[J].計(jì)算機(jī)應(yīng)用.2008,28(10):221-224.
Design and Implementation of Online Bookstore Based on MVC Model and Java EE Technology
Xue Qian
(Shaanxi College of Communication Technology, Xi’an 710018, China)
Business service has become a modern enterprise indispensable service. Online bookstore is a kind of electronic com-merce. Compared with the traditional storefront bookstore, online bookstore’s mode of operation and sales channels shows many advantages, so we design and realize the online bookstore system. For the sake of program maintainability and scalability, combined with the characteristics of online trading system, this paper adopts MVC design pattern and uses Java EE technology which is suitable for enterprise application to carry on the project. According to the analysis of business needs, the system function structure is designed. Design and development method of online bookstore is introduced in great detail for application system development technology and shopping cart implementation.
MVC Pattern; Java EE Technology; Online Bookstore; Shopping Cart; JSTL; JNDI Technology
TP311
A
2014.07.20)
國家自然科學(xué)青年基金項(xiàng)目(41102107)
薛 倩(1978-)女,河南焦作,陜西交通職業(yè)技術(shù)學(xué)院,講師,工學(xué)碩士,研究方向:交通信息工程、圖形處理與模式識(shí)別,西安,710018
1007-757X(2014)08-0014-04