这里开始就需要与数据库进行交互啦!这里需要引入一个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();
获得。
PreparedStatement PreparedStatement是Statement的子接口,它的实例对象可以通过调用Connection.preparedStatement(String sql);
方法获得,相对于Statement对象有如下优点:
preStmt = conn.prepareStatement("select * from users where name=?");
在设置?的参数值:preStmt.setString(1,"xiaoming");
可以看下这篇简书上关于JDBC的文章:Java 与数据库的桥梁——JDBC
每个jsp页面对应一个servlet类,所以我们写的时候其实可以直接看成是一个java文件进行编写。那么我们需要知道一小点的基本语法。
每个jsp文件都是有静态代码(html)和动态代码(java)构成。
声明中可以定义成员变量和成员方法。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提供输出表达式值的简单方法
<%=表达式 %><%-- 案例 --%><%=count %><%=info() %>JSP脚本在应用中使用的非常广泛,也是主要写java代码主要部分。
<% BookDAO bookDao = new BookDAO(); ArrayList<Book> books = bookDao.getAllBooks(); if(books != null && books.size() > 0){ for(Book book:books){ %> ··· html代码 ···<% } }%>这里的逻辑还是比较简单的,由于我们之前以及封装好了对数据库进行交互的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 I A G R A 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">©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>新闻热点
疑难解答