码迷,mamicode.com
首页 > 编程语言 > 详细

javaee三层架构案例--简单学生管理系统

时间:2019-01-24 18:51:10      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:表达式   inpu   let   obb   input   生日   gets   列表   one   

背景

学了jdbc、jsp等需要串起来,不然会忘记

项目环境

  • win10
  • jdk11
  • mysql8.0.13

    !!需求 等下补充!!!

通过javaee三层架构的形式来设计一个简易的学生信息管理系统

一个主页index.jsp,用来
目录结构截图也要一个

!!这里需要一个三层架构的图

!1!j!!ar包要补充 util工具等下也写一篇吧

准备数据库

/*创建一个存放学生信息的表格*/

/*创建数据库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>
        <td>性别</td>
        <td>电话</td>
        <td>生日</td>
        <td>爱好</td>
        <td>简介</td>
        <td>操作</td>
    </tr>
    <c:forEach items="${list }" var="stu">
    <tr>
        <td>${stu.sid }</td>
        <td>${stu.sname }</td>
        <td>${stu.gender }</td>
        <td>${stu.phone }</td>
        <td>${stu.birthday }</td>
        <td>${stu.hobby }</td>
        <td>${stu.info }</td>
        <td>!~~~超链接还没写,等下补完<a href="#">更新</a><a href="#">删除</a></td>
    </tr>
    </c:forEach>

第一步小结

用图片来表示以下上面的流程

技术分享图片


继续完善list.jsp

做一个添加功能,其他先不管

技术分享图片

所以让我们继续补充一个超链接

提交到add.jsp中吧

    <tr>
        <td colspan="8"><a href="add.jsp">添加</a></td>
    </tr>

没有add.jsp,我们在web文件夹下创建一个,大概长这个样子

技术分享图片


信息很多,我们用post方法提交,交到一个addServlet让他处理

<h3>添加学生页面</h3>
<form action="${pageContext.request.contextPath}/addServlet" method="post">
    <table border="1px" width="600px">
        <tr>
            <td>姓名</td>
            <td><input type="text" name="sname"/></td>
        </tr>
        <tr>
            <td>性别</td>
            <td>
                <input type="radio" name="gender" value="男" checked/>男
                <input type="radio" name="gender" value="女"/>女
            </td>
        </tr>
        <tr>
            <td>电话</td>
            <td><input type="text" name="phone"/></td>
        </tr>
        <tr>
            <td>生日</td>
            <td><input type="text" name="birthday"/></td>
        </tr>
        <tr>
            <td>爱好</td>
            <td>
                <input type="checkbox" name="hobby" value="游泳"/>游泳
                <input type="checkbox" name="hobby" value="篮球"/>篮球
                <input type="checkbox" name="hobby" value="足球"/>足球
                <input type="checkbox" name="hobby" value="看书"/>看书
                <input type="checkbox" name="hobby" value="写字"/>写字
            </td>
        </tr>
        <tr>
            <td>简介</td>
            <td><textarea name="info" rows="3" cols="20"></textarea></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="添加"/>
            </td>
        </tr>
    </table>
</form>

addServlet要做什么呢

  1. 中文乱码问题解决
  2. 要获取客户端提交上来的数据并处理
  3. 把数据打包交给service进行业务处理
  4. 交给别人展示数据

实现过程

  1. 中文乱码问题解决

    request.setCharacterEncoding("UTF-8");
  2. 获取客户端提交上来的数据

                String sname = request.getParameter("sname");
                String gender = request.getParameter("gender");
                String phone = request.getParameter("phone");
                String birthday = request.getParameter("birthday");
                String hobby = request.getParameter("hobby");
                String info = request.getParameter("info");

    并处理下,考虑到birthday是data类型,要转换下

    Date date = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
  3. 把数据打包

    就是弄个JavaBean对象封装一下,用一堆set方法有点麻烦,直接在Student类中增加一个带参的构造器(之前写了空参的好处就在此,不会忘记写)

    Student student = new Student(sname, gender, phone, date, hobby, info);

    交给service进行业务处理

    取名为insert方法吧,等会去service中生成需要的接口和对应的实现类

    StudentService service = new StudentServiceImpl();
    service.insert(student);
  4. 交给别人展示数据

    这里就是把结果返回给list.jsp中啦。如果直接转发到list.jsp,会有一个问题,request域中是空的,会没有元素。因此需要重新转发到对应的Servlet中

    目前看起来转发需要加 / ,对其路径的获取还不是很懂

    request.getRequestDispatcher("/StudentListServlet").forward(request,response);

继续写全service

  1. 把StudentService补全,把其实现类补全

    接口就多一个insert方法

        /**
         * 需要添加到数据库的学生对象
         * @param student 封装
         * @throws SQLException 异常
         */
        void insert(Student student) throws SQLException;

    实现类

    业务没什么新的,就是在数据库里加东西,调用DAO层

        @Override
        public void insert(Student student) throws SQLException {
            StudentDao dao = new StudentDaoImpl();
            dao.insert(student);
        }

该传到DAO层了

  1. 把DAO补全,把其实现类补全

    接口和前面service层的接口是一样的

        /**
         * 需要添加到数据库的学生对象
         * @param student 封装
         * @throws SQLException 异常
         */
        void insert(Student student) throws SQLException;

    实现类

    之前sql代码打错了,大家一定要在sql试过了再写进来,这样成功率高点

     @Override
        public void insert(Student student) throws SQLException {
            QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
    
            //INSERT INTO stu VALUES(NULL,‘姓名‘,‘性别‘,‘电话‘,‘1999-1-1‘,‘爱好‘,‘备注‘);
            runner.update("INSERT INTO stu VALUES(null,?,?,?,?,?,?)",
                    student.getSname(),
                    student.getGender(),
                    student.getPhone(),
                    student.getBirthday(),
                    student.getHobby(),
                    student.getInfo()
            );
        }

添加功能小结

  1. 做个jsp表单界面,注意name属性,这是之后获取参数用的

  2. 做个提交过去的Servlet

  3. Servlet收集数据,处理数据,封装数据,传递数据(service),展示数据(转发,可以发给Servlet)

  4. service处理业务逻辑,遇到对数据库处理的部分,调用dao层

  5. dao实现对数据库的处理


未完待续

javaee三层架构案例--简单学生管理系统

标签:表达式   inpu   let   obb   input   生日   gets   列表   one   

原文地址:https://www.cnblogs.com/richardwlee/p/10316042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!