一、课前说明
1.1 课程安排

前台系统:给普通用户使用、页面要求美观
后台系统:给管理员使用、页面要求快速、简单
1.2 考核安排
- 平常的考勤
- 每天作业的上交情况
- 实训结束后的小的答辩
1.3 授课说明
- 听课时关注核心技术、功能
- 带着问题听知识点(会给大家几分钟时间消化知识点、代码)
- 分成小组
- 如何解决敲代码遇到的bug:先查看异常、百度一下、小组内互问、问老师
1.4 项目所使用的技术

二、两个入门案例
目的:将项目中所使用到的技术进行一个作用、使用的讲解,为做项目打下基础
1.1 添加员工
使用的技术:HTMl中的表单、Servlet、dbutils、三层架构思想
流程图:

创建项目:

准备工作:
- 将add.jsp、elist.jsp(今天的入门资料里)拷贝到项目中
form表单:
作用:用来接收用户输入的数据
type的取值:text:普通文本 可见的password:密码框 不可见的radio: 单选框file:文件上传下拉框:<select name="did "><option value="10">教研部</option><option value="20">学工部</option></select>
问题1:如何让表单中的数据提交到服务器中?
form的两个属性:
action:将表单中的数据提交到哪个地方(地址)method:提交方式(常用的两种:get、post)
触发动作:
<input type="submit" value="添加员工"/>submit:提交表单
get和post的区别:
1、提交数据的方式不同
- post提交的数据在请求体中

- get提交的数据在地址栏中

2、安全性方面不同
- get暴露数据在地址栏中,数据不安全
- post是在请求体重,相对而言安全
3、提交数据量方面
- get在地址栏行,只能提交有限的数据
- post在请求体中,可以提交无限的数据(一般来说,没有数量的限制)
问题2:如何接受表单的请求
使用的技术:Servlet
@WebServlet("/addEmp") // Servlet的访问路径 和form中的action对应public class AddServlet extends HttpServlet {//doGet和doPost方法 和表单中的 method的取值对应上protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doGet方法执行了!!!");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doPost方法执行了!!!");%这里被坑了!!!}}
这里被坑了!!!
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//写方法}protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {doGet(request, response);}
问题3:如何获取表单中的数据呢?
//1、获取表单输入的数据String ename = request.getParameter("ename");String joindate = request.getParameter("joindate");String salary = request.getParameter("salary");String bonus = request.getParameter("bonus");String is_good = request.getParameter("is_good");String did = request.getParameter("did");
问题4:如何将获取到的数据插入到数据库中?
需要一张员工表:(见今日入门资料中)
使用的技术:jdbc
jdbc的步骤:
1、注册驱动2、获取连接对象 Connection3、获取发送sql语句的对象 Steatement4、执行sql并返回结果 .update、executeQuery()5、处理结果6、释放资源.close
能否针对以上六步进行代码上的简化呢?
可以:dbutils
dbutils:
**作用:**简化代码的书写**如何使用(固定步骤):**
注意:
- 导入jar包
导入c3p0-config.xml配置文件(连接池的配置信息)
<property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/xm?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC</property>
导入C3p0Utils.java 作用 :给QueryRunner提供对象 DataSource
代码的实现:
//2、将数据插入到emp中 使用dbutils)//1、创建核心对象QueryRunnerQueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());//2、准备sqlString sql = "insert into emp values(?,?,?,?,?,?,?)";//3、给占位符赋值Object [] param = {null,ename,joindate,salary,bonus,is_good,did};//4、执行sql并返回结果int row = qr.update(sql, param);if(row >0) {System.out.println("插入成功!!");}else {System.out.println("插入失败");}
乱码的解决方式:
Servlet中获取的中文就是乱码 原因:提交的方式是post
解决:在Servlet中方法的首行加以下代码java //将请求体的编码方式设置为utf-8 request.setCharacterEncoding("utf-8");获取到的是中文,但插入到数据库中变成了乱码
解决:修改c3p0的配置(百度c3p0中文乱码配置)
如何去完成项目中的功能:
- 明确目标
- 实现思路
- 代码实现(技术)
1.2 查询所有员工信息
使用的技术:JSP 中的 EL表达式、JSTL标签、域对象、资源跳转方式
修改eclise中的jsp的编码:

目标:
- 查询数据库中所有员工数据
- 将查询到的数据在elist.jsp中取出来
思路:

代码实现:
使用方法时注意几点:
- 方法的作用
添加、修改、删除 update()
查询: query() - 看方法的参数
- 看方法的返回类型
Java:
面向对象思想:类、对象
如何让表和Java中的类产生联系:
- 类名对应表名
- 类中的属性对应表中的字段名
- 类中的一个对象对应表中的一行记录
如何将表中的数据封装到结果集中?
域对象:
作用:用来存、取、移除数据三种:request、session、servletContext
使用:
存数据:request.setAttribute(key,value) 相当于 map.put(key,value)取数据:request.getAttriubet(key) 相当于map.get(key)移除数据:request.removeAttriubet(key) 相当于map.remove(key)
EL表达式:
作用:从域对象中取数据,简化
格式:${key}
JSTL标签使用:
- 导入jar包

使用jsp指令引入核心标签库
shell <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>使用c:if 和 c:forEach标签
代码实现:
index.jsp:
<a href="/anli/SearchAllEmp">查询所有员工信息</a>
Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {//使用dbutils查询所有员工信息//1、创建核心对象QueryRunnerQueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());//2、准备sqlString sql = "select * from emp";//3、给占位符赋值(暂无)//4、执行查询并返回结果//参数2:ResultSetHandler<T> 如何封装结果集List<Emp> elist = qr.query(sql, new BeanListHandler<Emp>(Emp.class));//存到域对象中request.setAttribute("elist", elist);//使用请求转发跳转到elist.jsprequest.getRequestDispatcher("/elist.jsp").forward(request, response);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {doGet(request, response);}
Emp实体类:
public class Emp {private int id;private String ename;private String joindate;private double salary;private double bonus;private int dept_id;private int is_good;//省略get、set、toString()}
elist.jsp
<!-- 判断elist是否为空--><c:if test="${not empty elist}"><!-- 遍历elist for(Emp e:elist){ e.getEname()} --><c:forEach items="${elist}" var="e" varStatus="vs"><tr><td>${vs.count}</td><td>${e.ename}</td><td>${e.joindate}</td><td>${e.salary}</td><td>${e.bonus}</td><td align="center"><a href="">修改员工</a><a href="">删除员工</a></td></tr></c:forEach></c:if>
request和response(成对出现的)的生命周期:

两种资源跳转方式有什么区别
- 请求转发
java request.getRequestDispatcher("/elist.jsp").forward(request, response);

- 重定向
java response.sendRedirect("/anli/elist.jsp");
问题1:跳转时需要加上项目名,而请求转发却不需要,这是为什么?
问题2:重定向到elist.jsp中,取不出来数据了,这是为什么?

三、项目的环境搭建
3.1 页面结构
前端三驾马车:
HTML:网页的骨架CSS:美化网页JavaScript:网页的灵魂
jquery:是JavaScript库,相比js,写的更少,做的更多
WEB-INF目录:受保护的目录
3.2 数据表结构
目前只做用户注册、用户登录,所以暂时涉及到一张表:用户表
CREATE TABLE `user` (`uid` INT(10) PRIMARY KEY AUTO_INCREMENT,#主键`name` VARCHAR(100) NOT NULL, #用户的真实姓名`sex` int(1),# 1: 男 0:女`phone_number` VARCHAR(20) UNIQUE,#手机号`area` VARCHAR(100),#所在地区`manager` INT(1), # 是否是管理员 1:管理员 0:普通用户`username` VARCHAR(50) UNIQUE, #用户名`password` VARCHAR(50) NOT NULL,#密码`photo` VARCHAR(100), # 头像`create_time` TIMESTAMP #注册时间 时间戳)
看表结构:
- 看表和其它表的关系
- 看主键
自增的:注册用户时,无需管理主键的值 - 看表的约束类型
- 看字段的类型以及长度范围
3.3 项目的包结构
三层架构思想:
为什么要分层:
- 当业务复杂时,代码量会变多,会显得很臃肿
- 每层有各自的分工,出现问题后可以快速的进行定位、解决

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

因为要连接数据库、使用dbutils,所以需要导入c3p0.xml配置文件还有C3p0Utils工具类
中文乱码问题:
如果请求方式是post,会发生乱码问题
请求过来时,拿到参数值就乱码了
@WebFilter("/*")public class EncodingFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//解决请求乱码request.setCharacterEncoding("utf-8");//解决响应乱码response.setContentType("text/html;charset=utf-8");chain.doFilter(request, response);}}//可以解决所有的请求、响应乱码问题
请求过来时是中文,但保存到数据库里乱码了
- 查看数据库的编码
- 修改jdbcUrl的值
遇到问题
1.数据库连不上
该jar包
2.网上导入项目报错/自己写的项目报错
3.插入数据问题
自增
作业:
将当天的代码独立完成,上交过来
最晚截止时间:7月3号中午12点之前
