一、课前说明

1.1 课程安排

image.png

前台系统:给普通用户使用、页面要求美观

后台系统:给管理员使用、页面要求快速、简单

1.2 考核安排

  • 平常的考勤
  • 每天作业的上交情况
  • 实训结束后的小的答辩

1.3 授课说明

  • 听课时关注核心技术、功能
  • 带着问题听知识点(会给大家几分钟时间消化知识点、代码)
  • 分成小组
  • 如何解决敲代码遇到的bug:先查看异常、百度一下、小组内互问、问老师

1.4 项目所使用的技术

image.png

二、两个入门案例

目的:将项目中所使用到的技术进行一个作用、使用的讲解,为做项目打下基础

1.1 添加员工

使用的技术:HTMl中的表单、Servlet、dbutils、三层架构思想

流程图:

image.png

创建项目:

image.png

准备工作:

  • 将add.jsp、elist.jsp(今天的入门资料里)拷贝到项目中

form表单

  1. 作用:用来接收用户输入的数据
  1. type的取值:
  2. text:普通文本 可见的
  3. password:密码框 不可见的
  4. radio 单选框
  5. file:文件上传
  6. 下拉框:
  7. <select name="did ">
  8. <option value="10">教研部</option>
  9. <option value="20">学工部</option>
  10. </select>

问题1:如何让表单中的数据提交到服务器中?

form的两个属性:

  1. action:将表单中的数据提交到哪个地方(地址)
  2. method:提交方式(常用的两种:getpost)

触发动作:

  1. <input type="submit" value="添加员工"/>
  2. submit:提交表单

get和post的区别:

1、提交数据的方式不同

  • post提交的数据在请求体中

image.png

  • get提交的数据在地址栏中image.png

2、安全性方面不同

  • get暴露数据在地址栏中,数据不安全
  • post是在请求体重,相对而言安全

3、提交数据量方面

  • get在地址栏行,只能提交有限的数据
  • post在请求体中,可以提交无限的数据(一般来说,没有数量的限制)

问题2:如何接受表单的请求

使用的技术:Servlet

  1. @WebServlet("/addEmp") // Servlet的访问路径 和form中的action对应
  2. public class AddServlet extends HttpServlet {
  3. //doGet和doPost方法 和表单中的 method的取值对应上
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. System.out.println("doGet方法执行了!!!");
  6. }
  7. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  8. System.out.println("doPost方法执行了!!!");%这里被坑了!!!
  9. }
  10. }

这里被坑了!!!

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. //写方法
  3. }
  4. protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
  5. doGet(request, response);
  6. }

问题3:如何获取表单中的数据呢?

  1. //1、获取表单输入的数据
  2. String ename = request.getParameter("ename");
  3. String joindate = request.getParameter("joindate");
  4. String salary = request.getParameter("salary");
  5. String bonus = request.getParameter("bonus");
  6. String is_good = request.getParameter("is_good");
  7. String did = request.getParameter("did");

问题4:如何将获取到的数据插入到数据库中?

需要一张员工表:(见今日入门资料中)

使用的技术:jdbc

jdbc的步骤:

  1. 1、注册驱动
  2. 2、获取连接对象 Connection
  3. 3、获取发送sql语句的对象 Steatement
  4. 4、执行sql并返回结果 .updateexecuteQuery()
  5. 5、处理结果
  6. 6、释放资源
  7. .close

能否针对以上六步进行代码上的简化呢?

  1. 可以:dbutils

dbutils:

  1. **作用:**简化代码的书写
  2. **如何使用(固定步骤):**

注意:

  • 导入jar包
  • 导入c3p0-config.xml配置文件(连接池的配置信息)

    1. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    2. <property name="jdbcUrl">jdbc:mysql://localhost:3306/xm?characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=UTC</property>
  • 导入C3p0Utils.java 作用 :给QueryRunner提供对象 DataSource

代码的实现:

  1. //2、将数据插入到emp中 使用dbutils)
  2. //1、创建核心对象QueryRunner
  3. QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
  4. //2、准备sql
  5. String sql = "insert into emp values(?,?,?,?,?,?,?)";
  6. //3、给占位符赋值
  7. Object [] param = {null,ename,joindate,salary,bonus,is_good,did};
  8. //4、执行sql并返回结果
  9. int row = qr.update(sql, param);
  10. if(row >0) {
  11. System.out.println("插入成功!!");
  12. }else {
  13. System.out.println("插入失败");
  14. }

乱码的解决方式:

  • Servlet中获取的中文就是乱码 原因:提交的方式是post
    解决:在Servlet中方法的首行加以下代码java //将请求体的编码方式设置为utf-8 request.setCharacterEncoding("utf-8");

  • 获取到的是中文,但插入到数据库中变成了乱码
    解决:修改c3p0的配置(百度c3p0中文乱码配置)

如何去完成项目中的功能

  • 明确目标
  • 实现思路
  • 代码实现(技术)

1.2 查询所有员工信息

使用的技术:JSP 中的 EL表达式、JSTL标签、域对象、资源跳转方式

修改eclise中的jsp的编码:

image.png

目标:

  • 查询数据库中所有员工数据
  • 将查询到的数据在elist.jsp中取出来

思路:
image.png

代码实现:

使用方法时注意几点:

  • 方法的作用
    添加、修改、删除 update()
    查询: query()
  • 看方法的参数
  • 看方法的返回类型

Java:

  1. 面向对象思想:类、对象

如何让表和Java中的类产生联系

  • 类名对应表名
  • 类中的属性对应表中的字段名
  • 类中的一个对象对应表中的一行记录

如何将表中的数据封装到结果集中?

域对象:

  1. 作用:用来存、取、移除数据
  2. 三种:requestsessionservletContext

使用:

  1. 存数据:request.setAttribute(key,value) 相当于 map.put(key,value)
  2. 取数据:request.getAttriubet(key) 相当于map.get(key)
  3. 移除数据:request.removeAttriubet(key) 相当于map.remove(key)

EL表达式:

作用:从域对象中取数据,简化

格式:${key}

JSTL标签使用:

  • 导入jar包

image.png

  • 使用jsp指令引入核心标签库shell <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  • 使用c:if 和 c:forEach标签

代码实现:

index.jsp:

  1. <a href="/anli/SearchAllEmp">查询所有员工信息</a>

Servlet:

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. try {
  3. //使用dbutils查询所有员工信息
  4. //1、创建核心对象QueryRunner
  5. QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
  6. //2、准备sql
  7. String sql = "select * from emp";
  8. //3、给占位符赋值(暂无)
  9. //4、执行查询并返回结果
  10. //参数2:ResultSetHandler<T> 如何封装结果集
  11. List<Emp> elist = qr.query(sql, new BeanListHandler<Emp>(Emp.class));
  12. //存到域对象中
  13. request.setAttribute("elist", elist);
  14. //使用请求转发跳转到elist.jsp
  15. request.getRequestDispatcher("/elist.jsp").forward(request, response);
  16. } catch (SQLException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
  22. doGet(request, response);
  23. }

Emp实体类:

  1. public class Emp {
  2. private int id;
  3. private String ename;
  4. private String joindate;
  5. private double salary;
  6. private double bonus;
  7. private int dept_id;
  8. private int is_good;
  9. //省略get、set、toString()
  10. }

elist.jsp

  1. <!-- 判断elist是否为空-->
  2. <c:if test="${not empty elist}">
  3. <!-- 遍历elist for(Emp e:elist){ e.getEname()} -->
  4. <c:forEach items="${elist}" var="e" varStatus="vs">
  5. <tr>
  6. <td>${vs.count}</td>
  7. <td>${e.ename}</td>
  8. <td>${e.joindate}</td>
  9. <td>${e.salary}</td>
  10. <td>${e.bonus}</td>
  11. <td align="center">
  12. <a href="">修改员工</a>
  13. <a href="">删除员工</a>
  14. </td>
  15. </tr>
  16. </c:forEach>
  17. </c:if>

request和response(成对出现的)的生命周期:

image.png

两种资源跳转方式有什么区别

  • 请求转发java request.getRequestDispatcher("/elist.jsp").forward(request, response);
  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593420444981-27f5b15d-d389-470d-a725-8b1a9ffd0f98.png#align=left&display=inline&height=221&margin=%5Bobject%20Object%5D&name=image.png&originHeight=442&originWidth=1110&size=62487&status=done&style=none&width=555)
  • 重定向java response.sendRedirect("/anli/elist.jsp");
    问题1:跳转时需要加上项目名,而请求转发却不需要,这是为什么?
    问题2:重定向到elist.jsp中,取不出来数据了,这是为什么?

image.png

三、项目的环境搭建

3.1 页面结构

前端三驾马车:

  1. HTML:网页的骨架
  2. CSS:美化网页
  3. JavaScript:网页的灵魂

jquery:是JavaScript库,相比js,写的更少,做的更多

WEB-INF目录:受保护的目录

3.2 数据表结构

目前只做用户注册、用户登录,所以暂时涉及到一张表:用户表

  1. CREATE TABLE `user` (
  2. `uid` INT(10) PRIMARY KEY AUTO_INCREMENT,#主键
  3. `name` VARCHAR(100) NOT NULL, #用户的真实姓名
  4. `sex` int(1),# 1: 0:女
  5. `phone_number` VARCHAR(20) UNIQUE,#手机号
  6. `area` VARCHAR(100),#所在地区
  7. `manager` INT(1), # 是否是管理员 1:管理员 0:普通用户
  8. `username` VARCHAR(50) UNIQUE, #用户名
  9. `password` VARCHAR(50) NOT NULL,#密码
  10. `photo` VARCHAR(100), # 头像
  11. `create_time` TIMESTAMP #注册时间 时间戳
  12. )

看表结构:

  • 看表和其它表的关系
  • 看主键
    自增的:注册用户时,无需管理主键的值
  • 看表的约束类型
  • 看字段的类型以及长度范围

3.3 项目的包结构

三层架构思想:

为什么要分层:

  • 当业务复杂时,代码量会变多,会显得很臃肿
  • 每层有各自的分工,出现问题后可以快速的进行定位、解决

image.png

pojo/domain/entity:实体层 存和表对应的实体类

utils:工具层

image.png

因为要连接数据库、使用dbutils,所以需要导入c3p0.xml配置文件还有C3p0Utils工具类

中文乱码问题:

  1. 如果请求方式是post,会发生乱码问题
  • 请求过来时,拿到参数值就乱码了

    1. @WebFilter("/*")
    2. public class EncodingFilter implements Filter {
    3. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    4. //解决请求乱码
    5. request.setCharacterEncoding("utf-8");
    6. //解决响应乱码
    7. response.setContentType("text/html;charset=utf-8");
    8. chain.doFilter(request, response);
    9. }
    10. }
    11. //可以解决所有的请求、响应乱码问题
  • 请求过来时是中文,但保存到数据库里乱码了

    • 查看数据库的编码
    • 修改jdbcUrl的值

遇到问题

1.数据库连不上
该jar包
2.网上导入项目报错/自己写的项目报错
3.插入数据问题
自增

作业:

将当天的代码独立完成,上交过来

最晚截止时间:7月3号中午12点之前