背景
学了jdbc、jsp等需要串起来,不然会忘记
项目环境
win10
jdk11
mysql8.0.13
jar包
c3p0-0.9.5.2
commons-dbutils-1.7
jstl
mchange-commons-java-0.2.11
mysql-connector-java-8.0.14
standard
项目地址
还不会用github,所以只能这样咯
链接:https://pan.baidu.com/s/1JwSag2RIEBVhGZVAETNqlQ
提取码:o0x3
复制这段内容后打开百度网盘手机App,操作更方便哦
准备数据库
/*创建一个存放学生信息的表格*/
/*创建数据库stus*/
CREATE DATABASE stus;
/*使用stus*/
USE stus;
/*创建学生表stu*/
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
gender VARCHAR(5),
phone VARCHAR(20),
birthday DATE,
hobby VARCHAR(50),
info VARCHAR(200)
);
做一个主页
通过IDEA在web目录下创建一个index.jsp作为主页
页面先只有一个超链接叫做 显示所有学生列表
还没写链接到哪个Servlet,用 # 先代替下,等创建好了再写回来<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>首页</title> </head> <body> <h3><a href="/studentList">显示所有学生列表</a></h3> </body> </html>
创建一个Servlet
index.jsp标记1出用的Servlet,创一个Servlet的包,创一个StudentListServlet类,用doGet方法(转发需要用doGet方法,且用doPost没有这个需求)
Servlet接受用户点击,去通知service实现业务逻辑
//这个是用反射,写在类上一行,也可以在web.xml中配置Servlet @WebServlet(name = "StudentListServlet",urlPatterns = {"/StudentListServlet"}) //写在doGet方法然后在doPost方法中互调.... //因为之后转发只能用doGet方法,有点麻烦 //面向接口编程 //StudentService:接口 StudentServiceImpl:接口实现类 StudentService service = new StudentServiceImpl(); //调用实现类的findAll方法,把结果放在一个list表中,泛型为Student对象 List<Student> list = service.findAll();
创建Student类
上文中缺少Student类,这是一个JavaBean,封装用。
!!!JavaBean一定要有一个空参!!!
!!!JavaBean是用空参来反射得到实例的!!!
创建domian包,里面创建Student类,包含和数据库名字、类型对应的成员变量
//数据类型为Date的导util包,sql包中的Date也是继承该util包中的 import java.util.Date; private int sid; private String sname; private String gender; private String phone; private Date birthday; private String hobby; private String info; //生成getXxx和setXxx方法 //生成toString方法
创建一个Service接口和Service的实现类
上面没有Service接口,创建一个service包,下面创建StudentService接口
这里是为了实现学生业务逻辑的处理规范
目前只有一个查找所有学生信息的业务
public interface StudentService { //这里的throws SQLException是在最后面dao层发现需要抛,一步一步返回来的,当然IDEA中一键生成 List<Student> findAll() throws SQLException; }
创建接口的实现类,在service包下创建一个impl包,在impl包内创建StudentServiceImpl实现类
实现学生业务,findAll方法是去数据库中查询,因此要调用查询数据库的方法
public class StudentServiceImpl implements StudentService { @Override public List<Student> findAll() throws SQLException { //StudentDao:接口 StudentDaoImpl:实现类 StudentDao dao = new StudentDaoImpl(); return dao.findAll(); } }
创建dao层中接口和实现类
创建一个dao包,创建StudentDao接口,在dao包中创建一个impl包,里面创建一个StudentDaoimpl实现类
public interface StudentDao { List<Student> findAll() throws SQLException; }
StudentDaoImpl实现findAll方法,通过C3P0,自己的工具类JDBCUtil调用
通过数据库代码查询,结果返回到BeanListHandler<>(Student.class)中
public class StudentDaoImpl implements StudentDao { @Override public List<Student> findAll() throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource()); String sql = "SELECT * FROM stu"; return runner.query(sql, new BeanListHandler<>(Student.class)); } }
把查询出的结果发到list.jsp中
在StudentListServlet类的doGet方法中,要把结果存到request域中
//名字就叫list,值也是list request.setAttribute("list",list);
再把结果转发到list.jsp中,不需要改变页面地址
request.getRequestDispatcher("list.jsp").forward(request, response);
目前先做红框内的东西,分析一下,就是2行8列,一行是标题,一行是内容(靠循环出来的结果)
要用el表达式,导包jstl.jar和standard.jar
导jstl标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--2行8列展示结果--%> <table border="1px" width="600px"> <tr> <td>编号</td> <td>姓名</td>