Java后台开发必备技能JDBC+Servlet+JSP

前言:

学习Java后端开发的过程中,很多情况下都要和数据库打交道,如何通过Java程序去访问数据库,成为每一个后端开发人员必备的技能点。本文以一个简单的
项目将数据库(这里使用Mysql)、JDBC、Servlet、JSP串联起来,将其中的逻辑流畅地走一遍,由于需要用到JSP和Servlet,所以这里建立的项目
类型是Dynamic Web Project,在此声明:仅是自己的学习总结,如有不对的地方,还请指教,互相交流学习哈^^。

第一步 数据库及模型层的准备(模型层)

    首先,自己的电脑上需要安装Mysql数据库,然后再数据库中建立自己项目中需要要到的数据库,数据库名为shopping;接着在shopping数据
库中创建数据表,表名为goods;然后向其中添加几条记录;这样,数据库方面的准备就完成啦!接着,需要针对项目中建立的数据表,设计对应的
JavaBean,用来存储存储从数据库读取的记录。

    这里用到的sql文件:
        /*
        Navicat MySQL Data Transfer
        Source Server         : JDBC
        Source Server Version : 50719
        Source Host           : localhost:3306
        Source Database       : shopping

        Target Server Type    : MYSQL
        Target Server Version : 50719
        File Encoding         : 65001
        Date: 2017-10-24 20:02:59
        */
        SET FOREIGN_KEY_CHECKS=0;
        -- ----------------------------
        -- Table structure for goods
        -- ----------------------------
        DROP TABLE IF EXISTS `goods`;
        CREATE TABLE `goods` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `name` varchar(50) DEFAULT NULL,
          `origin` varchar(50) DEFAULT NULL,
          `price` int(11) DEFAULT NULL,
          `stock` int(11) DEFAULT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
    package com.model;
    /**
     * 与数据库shopping中的goods数据表相对应的JavaBean
     */
    public class Goods {
        private int id;//商品编号
        private String name;//商品名称 
        private int price;//商品价格
        private String origin;//商品产地
        private int stock;//商品库存
        public int getId() 
        {
            return id; 
        }
        public void setId(int id) 
        {
            this.id = id; 
        }
        public String getName() 
        {
            return name; 
        }
        public void setName(String name) 
        {
            this.name = name;
        }
        public int getPrice()  
        {
            return price;
        }
        public void setPrice(int price) 
        {
            this.price = price;
        }
        public String getOrigin()  
        {
            return origin;
        }
        public void setOrigin(String origin)  
        {
            this.origin = origin;
        }
        public int getStock() 
        {
            return stock;
        }
        public void setStock(int stock)  
        {
            this.stock = stock;
        }
    }`

第二步 数据库连接的准备(服务层)

    首先,下载JDBC所用的jar包,将jar包拷贝到项目的lib文件夹下,然后右击jar包,选择Build Path,将jar包添加到当前项目的路径
中;接着,进行获取数据库连接的代码编写;代码如下所示。
        package com.dbhelper;
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.SQLException;
        /**
         * 专门用于提供数据库连接的类
         */
         public class DBHelper {
            private static final String driver = "com.mysql.jdbc.Driver";
            //数据库驱动
            private static final String url = "jdbc:mysql://localhost:3306/shopping";
            //要连接到的数据库地址
            private static final String user = "root";
            //数据库的用户名
            private static final String password = "root";
            //数据库的登录密码

            private static Connection conn = null;//数据库连接对象,采用单例模式(懒汉模式)

            static{
                try {
                    Class.forName(driver);//加载驱动
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }   
            }
            //用于获取数据库连接对象的静态方法,直接由类调用
            public static  Connection getConnection(){
                if(conn==null) {
                    try {
                        conn = DriverManager.getConnection(url, user, password);
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                return conn;
            }
        }

第三步 访问数据库的业务处理(服务层)

    这里,我们将访问数据库的业务逻辑只局限在从数据库中读取响应的数据,其他的业务(如向数据库中写数据(增)、删除数据(删)、更新数据
(改))并没有进行代码的编写,但是这些操作的实现所需的知识点,项目中给出的两个业务逻辑处理方法都涵盖,只需要将对应的sql语句做适当
的修改即可。
    package com.dao;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import com.model.Goods;
    import com.dbhelper.DBHelper;
    /**
     * 专门用于提供对数据库进行处理的方法的类
     */
    public class DBService {
        //获取数据库的连接作为本类的静态域,供所有方法使用
        private static Connection conn = DBHelper.getConnection(); 
        //返回数据库中所有商品信息的方法
        public ArrayList<Goods> query() {
            ArrayList<Goods> list = null;
            String sql = "select id,name,price,origin,stock from goods where 1=1";
            PreparedStatement statement = null;
            ResultSet rs = null;
            Goods good = null;
            try {
                statement = conn.prepareStatement(sql);
                rs = statement.executeQuery();
                if(rs==null) 
                {
                    return null;
                }
                list = new ArrayList<>();
                while(rs.next()) 
                {
                    //创建一个Goods对象,将结果集中的信息存放到其中,再添加到集合中,最后由方法返回
                    good = new Goods();
                    good.setId(rs.getInt("id"));
                    good.setName(rs.getString("name"));
                    good.setPrice(rs.getInt("price"));
                    good.setOrigin(rs.getString("origin"));
                    good.setStock(rs.getInt("stock"));
                    list.add(good);
                }
                good = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                if(rs!=null)  
                {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(statement!=null) 
                {
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            return list;
        }

        //返回数据库中指定id的商品信息的方法
        public Goods queryById(int id) {
            Goods good = null;
            PreparedStatement statement = null;
            ResultSet rs = null;
            String sql = "select id,name,price,origin,stock from goods where id = ?";
            try {
                statement = conn.prepareStatement(sql);
                statement.setInt(1, id);
                rs = statement.executeQuery();
                if(rs == null)  
                {
                    return null;
                }
                while(rs.next()) {
                    good = new Goods();
                    good.setId(rs.getInt("id"));
                    good.setName(rs.getString("name"));
                    good.setPrice(rs.getInt("price"));
                    good.setOrigin(rs.getString("origin"));
                    good.setStock(rs.getInt("stock"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                if(rs!=null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(statement!=null) {
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            return good;
        }
    }

第四步 Servlet的准备(控制层)

    项目中利用Servlet读取用户请求、调用业务处理层进行处理请求以及响应客户的请求。
        package com.servlet;
        import java.io.IOException;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import com.dao.DBService;
        import com.model.Goods;

        @SuppressWarnings("serial")
        public class ServiceServlet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
            {
                doPost(request,response);
            }

            @Override
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
            {
                System.out.println("post请求处理中...");
                String id = request.getParameter("idnum");
                System.out.println(id);
                DBService dbservice = new DBService();
                Goods good = dbservice.queryById(Integer.valueOf(id));
                request.setAttribute("good", good);
                request.getRequestDispatcher("/result.jsp").forward(request, response);
            }
        }

第五步 JSP的准备(视图层)

    这里采用两个JSP文件作为视图层,其中,query.jsp文件负责将客户的请求传送到Servlet中,由Servlet进行请求的接收、处理和响应
,这里的响应为将处理请求的结果传送到另一个jsp文件,该文件(result.jsp)将处理的结果展示到jsp页面上。
    query.jsp文件:
        <%@ page language="java" contentType="text/html; charset=utf-8"%>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Insert title here</title>
        </head>
        <body>
        <form name="demandForm" action="com/servlet/ServiceServlet" method="post">
            <table>
                <tr>
                    <td>全部查询</td>
                    <td><input type="submit" name="all" id="all" value="全部查询"/></td>
                </tr>
            </table>
        </form>
        <form name="demandForm1" action="com/servlet/ServiceServlet" method="post">
            <table>
                <tr>
                    <td>id查询</td>
                    <td><input type="text" name="idnum" id="idnumber" /></td>
            <td><input type="submit" value="id查询" /></td>
                </tr>
            </table>
        </form>
        </body>
        </html>
    result.jsp文件:
        <%@ page language="java" contentType="text/html; charset=utf-8"%>
        <%@ page import="com.model.Goods" language="java"%>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Insert title here</title>
        </head>
        <body>
        <%
            Goods good = (Goods)request.getAttribute("good");
        %>
        商品id:<%=good.getId() %><br />
        商品名称:<%=good.getName() %><br />
        商品价格:<%=good.getPrice() %><br />
        商品产地:<%=good.getOrigin() %><br />
        商品库存:<%=good.getStock() %><br />
        </body>
        </html>

总结

    以上就是整个项目的思路和处理流程,采用从模型层开始,接着控制层,最后视图层的顺序完成整个项目的开发!整个项目框架已经搭建好,
但是细节有待完善,本文的目的是将整体的框架搭建出来,使整个处理流程在逻辑上能够畅通。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章