一、课前说明
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、获取连接对象 Connection
3、获取发送sql语句的对象 Steatement
4、执行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、创建核心对象QueryRunner
QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
//2、准备sql
String 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、创建核心对象QueryRunner
QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
//2、准备sql
String 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.jsp
request.getRequestDispatcher("/elist.jsp").forward(request, response);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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);
![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中,取不出来数据了,这是为什么?
三、项目的环境搭建
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点之前