手把手做一个JSP入门程序(五):获取所有商品渲染主页(JSP)

获取所有商品渲染主页

实现与数据库交互的类: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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值