标签:表达式 inpu let obb input 生日 gets 列表 one
学了jdbc、jsp等需要串起来,不然会忘记
mysql8.0.13
通过javaee三层架构的形式来设计一个简易的学生信息管理系统
一个主页index.jsp,用来
目录结构截图也要一个
/*创建一个存放学生信息的表格*/
/*创建数据库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>
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类,这是一个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包,下面创建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包,创建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)); } }
在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>
用图片来表示以下上面的流程
做一个添加功能,其他先不管
所以让我们继续补充一个超链接
提交到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要做什么呢
- 中文乱码问题解决
- 要获取客户端提交上来的数据并处理
- 把数据打包交给service进行业务处理
- 交给别人展示数据
实现过程
中文乱码问题解决
request.setCharacterEncoding("UTF-8");
获取客户端提交上来的数据
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);
把数据打包
就是弄个JavaBean对象封装一下,用一堆set方法有点麻烦,直接在Student类中增加一个带参的构造器(之前写了空参的好处就在此,不会忘记写)
Student student = new Student(sname, gender, phone, date, hobby, info);
交给service进行业务处理
取名为insert方法吧,等会去service中生成需要的接口和对应的实现类
StudentService service = new StudentServiceImpl(); service.insert(student);
交给别人展示数据
这里就是把结果返回给list.jsp中啦。如果直接转发到list.jsp,会有一个问题,request域中是空的,会没有元素。因此需要重新转发到对应的Servlet中
目前看起来转发需要加 / ,对其路径的获取还不是很懂
request.getRequestDispatcher("/StudentListServlet").forward(request,response);
继续写全service
把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层了
把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() ); }
做个jsp表单界面,注意name属性,这是之后获取参数用的
做个提交过去的Servlet
Servlet收集数据,处理数据,封装数据,传递数据(service),展示数据(转发,可以发给Servlet)
service处理业务逻辑,遇到对数据库处理的部分,调用dao层
dao实现对数据库的处理
标签:表达式 inpu let obb input 生日 gets 列表 one
原文地址:https://www.cnblogs.com/richardwlee/p/10316042.html