手把手做一個JSP入門程式(五):擷取所有商品渲染首頁(JSP)

來源:互聯網
上載者:User
擷取所有商品渲染首頁 實現與資料庫互動的類:BookDAO.java

  這裡開始就需要與資料庫進行互動啦。這裡需要引入一個DAO(Data Access Object)的概念。DAO是工作在持久層的,主要負責從底層儲存中寫入/讀取資料,對業務層來說只需要知道DAO的介面即可完成CRUD操作,而不必關心底層的資料存放區方式。而對擷取商品的dao的開發,也就是JDBC(Java Data Base Connectivity)編程,會有如下的過程:

JDBC編程過程:
1. 串連資料庫
2. 執行SQL語句,接收執行結果集ResultSet;
3. 處理執行結果集ResultSet
4. 必要的關閉ResultSet、Statement和Connection

package dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import entity.Book;import util.DBHelper;// 與資料庫互動類public class BookDAO {    /*     JDBC編程過程:     1. 串連資料庫     2. 執行SQL語句,接收執行結果集ResultSet     3. 處理執行結果集ResultSet     4. 必要的關閉ResultSet、Statement     */    /*     * 擷取所有書籍     */    public ArrayList<Book> getAllBooks(){//      資料庫連接        Connection conn = null;//      資料庫操作:對SQL進行先行編譯的Statment,用於執行sql語句        PreparedStatement preStmt = null;//      資料庫結果:ResultSet是資料庫執行結果集。資料結構和資料庫中的表相當        ResultSet bookSet = null;//      存放所有的書籍結果        ArrayList<Book> books = new ArrayList<Book>();        try{//--------------- 1. 串連資料庫------------------            conn = DBHelper.getConnection();//--------------- 2. 執行SQL語句,接收執行結果集ResultSet ------------------            String sql = "select * from book where state='n'";//          先行編譯sql語句,擷取PreparedStament對象            preStmt = conn.prepareStatement(sql);//          執行編譯的結果            bookSet = preStmt.executeQuery();//          遍曆結果集的方法如下://--------------- 3. 處理執行結果集ResultSet ------------------            while(bookSet.next()){                Book book = new Book();                book.setAuthor(bookSet.getString("author"));                book.setImg(bookSet.getString("img"));                book.setIntro(bookSet.getString("intro"));                book.setIsbn(bookSet.getString("isbn"));                book.setName(bookSet.getString("name"));                book.setPrice(Float.parseFloat(bookSet.getString("price")));                book.setPrice_original(Float.parseFloat(bookSet.getString("price_original")));                books.add(book);            }            return books;        }catch(Exception ex){            ex.printStackTrace();            return null;        }finally{//--------------- 4. 必要的關閉ResultSet、Statement ------------------//          為了確保資源不被佔用,需要在fianlly釋放資源,注意這裡不可以關閉Connection,否則會報錯//          釋放 ResultSet            if(bookSet != null){                try{                    bookSet.close();                    bookSet = null;                }catch(Exception ex){                    ex.printStackTrace();                }            }//          釋放語句對象:PreparedStatement            if(preStmt != null){                try{                    preStmt.close();                    preStmt = null;                }catch(Exception ex){                    ex.printStackTrace();                }            }        }    }}

這裡對Statement和Prestatement進行一點說明
Statement
  Jdbc程式中的Statement對象用於向資料庫發送SQL語句。可通過Statement stmt = conn.createStatement();獲得。

/************* 常用方法 **************/executeQuery(String sql);  //用於向資料發送查詢語句。select語句,傳回值ResultSet結果集。executeUpdate(String sql); //用於向資料庫發送insert、update或delete語句。傳回值為int:受影響行數。execute(String sql);       //用於向資料庫發送任意sql語句,傳回值為boolean:如果第一個結果為 ResultSet 對象,則返回 true;如果其為更新計數或者不存在任何結果,則返回 false 。/************* 批處理方法 **************/addBatch(String sql); //把多條sql語句放到一個批處理中。executeBatch();       //資料庫發送一批sql語句執行。

PreparedStatement
  PreparedStatement是Statement的子介面,它的執行個體對象可以通過調用Connection.preparedStatement(String sql);方法獲得,相對於Statement對象有如下優點: PreperedStatement可以避免SQL注入的問題。 Statement會使資料庫頻繁編譯SQL,可能造成資料庫緩衝區溢位。PreparedStatement 可對SQL進行先行編譯,從而提高資料庫的執行效率。 PreperedStatement對於sql中的參數,允許使用預留位置的形式進行替換,簡化sql語句的編寫。如:preStmt = conn.prepareStatement("select * from users where name=?");在設定?的參數值:preStmt.setString(1,"xiaoming");

可以看下這篇簡書上關於JDBC的文章:Java 與資料庫的橋樑——JDBC 顯示所有商品資訊

  每個jsp頁面對應一個servlet類,所以我們寫的時候其實可以直接看成是一個java檔案進行編寫。那麼我們需要知道一小點的基本文法。 基本文法

  每個jsp檔案都是有靜態代碼(html)和動態代碼(java)構成。 JSP 注釋

<%-- 這是jsp注釋,運行之後在瀏覽器中不可見 --%><!-- 這是HTML注釋,運行之後在瀏覽器可見 -->
JSP聲明
<%!// 聲明一個變數public int count;// 聲明一個方法public String info(){    return "Hello";}%>

  聲明中可以定義成員變數和成員方法。JSP聲明會在編譯之後轉化為Servlet的成員變數和成員方法。我們可以在Tomcat的work\Catalina\localhost(或者Eclipse的預設路徑的.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\SimpleShop\org\apache\jsp)中的相應項目內的相應Servlet類檔案中看到相應的程式碼片段。不可以使用abstract進行JSP聲明,因為抽象的方法會導致JSP對應的Servlet編程抽象類別而無法執行個體化。
  還有一點需要注意的是,JSP頁面會編譯成一個Servlet類,每個Servlet容器中只有一個執行個體,所以JSP中聲明的變數時共有變數,所有的用戶端共用同一個count變數,且該變數會一直保持到該執行個體被銷毀為止。 輸出JSP運算式

  這是JSP提供輸出運算式值的簡單方法

<%=運算式 %><%-- 案例 --%><%=count %><%=info() %>
JSP指令碼

JSP指令碼在應用中使用的非常廣泛,也是主要寫java代碼主要部分。

<%    BookDAO bookDao = new BookDAO();    ArrayList<Book> books = bookDao.getAllBooks();    if(books != null && books.size() > 0){        for(Book book:books){   %>    ··· html代碼 ···<%        }    }%>
index.jsp代碼

  這裡的邏輯還是比較簡單的,由於我們之前以及封裝好了對資料庫進行互動的BookDAO類,所以只要執行個體化這個類,調用getAllBooks()方法擷取書籍資訊,在將其渲染到html代碼中就可以了。這裡需要記得修改編碼方式為utf-8,否則會看到中文亂碼。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><%-- 利用page的import來引入包 --%><%@ page import="entity.Book" %><%@ page import="dao.BookDAO" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE html><html lang="en"><head>    <!-- base 這裡可有可無 -->    <base href="<%=basePath%>">    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1">    <title>DIAGRAM</title>    <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />  <link href="./bootstrap-3.3.0/css/bootstrap.min.css" rel="stylesheet"/>  <link href="./css/style.css" rel="stylesheet"/></head><body>    <nav class="navbar navbar-default" role="navigation">        <div class="logo-big"><span>D&nbsp;I&nbsp;A&nbsp;G&nbsp;R&nbsp;A&nbsp;M</span></div>        <div class="container-fluid">         <div class="row nav-menuare">            <div class="navbar-header">                <a class="navbar-brand logo-small" href="#">DIAGRAM</a>                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">                    <span class="sr-only">Toggle navigation</span>                    <span class="icon-bar"></span>                    <span class="icon-bar"></span>                    <span class="icon-bar"></span>                </button>            </div>            <div class="row navbar-row">                <div class="nav-divider col-md-3 col-sm-3"><span class="divider"></span></div>                <div id="navbar"  class="col-md-6 col-sm-6 collapse">                    <ul>                        <li class="li-col"><a href="#">SHOPINDEX</a></li>                        <li class="li-col"><a href="#">NEWBOOK</a></li>                        <li class="li-col li-logo"><a href="./index.jsp"><img class="logo-img" src="./img/robot.png"/></a></li>                        <li class="li-col"><a href="#">CART(2)</a></li>                        <li class="li-col"><a href="#">CUSTOMER</a></li>                    </ul>                </div>                <div class="nav-divider col-md-3 col-sm-3"><span class="divider"></span></div>            </div>            </div>        </div>    </nav>    <div class="main">        <div class="container-fluid">            <div class="row">            <%-- 通過BookDao擷取資料庫中的書籍資料 --%>            <%                BookDAO bookDao = new BookDAO();                ArrayList<Book> books = bookDao.getAllBooks();                if(books != null && books.size() > 0){                    for(Book book:books){            %>                <div class="book-box col-md-3 col-sm-6">                    <div class="book">                        <a href="single.jsp?isbn=<%= book.getIsbn() %>"><img src="img/<%= book.getImg() %>"/></a>                        <p class="book-name">《<%= book.getName() %>》</p>                        <p class="book-intro"><%= book.getIntro() %></p>                        <div class="add-button">                            <span class="cost">¥<%= book.getPrice() %></span> / <span class="cost-original">¥<%= book.getPrice_original() %></span><button>Add To Cart</button>                        </div>                    </div>                </div>            <%                    }                }            %>            </div>        </div>    </div>    <div class="footer">        <div class="container-fluid">            <div class="row">                <div class="col-md-3">                </div>                <div class="blog-coyp col-md-6">                    <div class="blog text-left"><a href="https://github.com/donespeak" target="_blank">GITHUB</a> | <a href="http://blog.csdn.net/donespeak" target="_blank">CSDN</a> | EMAIL:yangguanr@gmail.com </div><div class="copy text-right">&copy;DoneSpeak.inc</div>                </div>            </div>          </div>    </div>    <script src="./js/jquery-2.1.4.min.js"></script>  <script src="./bootstrap-3.3.0/js/bootstrap.min.js"></script>  <script src="./js/script.js"></script></body></html>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.