目录:
day01:业务需求+开发环境
day02:HTML网页制作+CSS样式表+二维码
day03:动态技术J2ee Servlet+JSP
day04:mysql数据库+sqlyog的使用
day05: PowerDesigner的使用+Jdbc
day06:日期格式的转换和统一
day07:项目开发设计思路
Database:永和大王数据
FAQ:没有在WEB-INF\classes中生成class文件
day01:业务需求+开发环境
1.1 培优课程体系
1.2 培优的就业数据
1.3软件开发
拿到一个项目如何开发呢?从哪里入手呢?具体的技术点如何实现呢?这就是我们这次要让大家体会的,不为你理解每个技术细节,这些后期课程中都会详细讲到。只为你有大的格局,你有清晰的目标,你有真实的体验。有所了解后踏实学习java培优的课程,它能支持你在这个日益竞争激烈的世界里,安身立命,实现梦想,过上好日子!
1.3.1 开发岗位
1.3.2 软件开发流程
也称为软件开发生命周期:
l 意向
l 软件项目立项,立项报告,立项审批
l 需求调研,需求评审
l 概要设计,用例图,页面原型设计
l 数据库设计,表设计
l 详细设计,类设计
l 开发编码
l 需求变更
l 测试
l 试运行,bug满天飞(加班)
l 正式上线
l 维护期
l 项目完成
1.4 学到的技术点
1.4.1 Day01
l Jdk的使用
l Eclipse的使用
l 创建java工程
l 创建class类
1.4.2 Day02
l 创建Web工程
l HTML静态网页
l CSS样式表
l 二维码
1.4.3 Day03
l Eclipse中增加jdk支持
l 配置jdk
l Eclipse中增加tomcat支持
l 配置tomcat
l Servlet3.0 注解开发
l Jsp页面
l Pojo封装传递多个值
l Jsp的安全访问
1.4.4 Day04
l PowerDesinger
l 单表设计
l 数据库基本操作Dos
l 数据库基本命令Dos
l SqlYog操作客户端
1.4.5 Day05
l 数据库导入、导出
l 关联表设计
l Pojo对象关联
1.4.6 Day06
l 综合练习
1.5 永和大王门店管理系统
1.5.1 项目背景
《永和大王门店管理系统》实现顾客进店后选择购买的套餐,并在系统中生成订单,包括:门店名称,门店电话,订单号,并记录下订单类型及人数和收银员是谁,及下单时间和结账时间,并记录订单详情,顾客点了哪些食物,支付方式以及支付总金额等信息,最终实现打印门店小票。同时,在订单下方展示本店的二维码,方便顾客扫描二维码自助填写税务发票信息等功能。
1.5.2 还能实现什么?
票据打印
1.5.2.1 医药管理系统
1.5.2.2 税务发票系统
1.5.2.3 餐厅结账单
1.5.2.4 德克士
1.5.2.5 加油站
1.6开发工具
1.6.1 必备的开发软件
l PowerDesinger v15.1 数据库表设计&UML设计
l mysql-5.5.27-winx64.msi mysql数据库
l SQLyogEnt v8.2 数据库客户端
l 安装双jdk1.7 & jdk1.8 java环境
l Eclipse Mars.2 Release (4.5.2) IDE 开发工具,配置jdk、tomcat
l 安装Tomcat Web中间件,运行web程序
1.6.2 FTP下载资料
打开浏览器访问code.tarena.com.cn 账号:tarenacode 密码:code_2017
点击CGBCODE -- > 1805 à 按阶段下载资料。
1.6.3 PowerDesinger设计工具安装
语言选择中文RPC,同意协议,其他一路next即可。
1.7 Java开发环境安装
1.1.1 安装jdk并检验
点击Window窗口,输入cmd命令,回车。
1.1.2 检查jdk版本
1.1.3 常用DOS命令:
C:\Users\Administrator>d: 切换盘符,进度d盘D:\>cd a 进入a文件夹D:\a>dir 显示a文件夹下的所有文件D:\a>cd .. 返回上级目录D:\a\b\c\d>cd / 返回根目录
1.8 第一个java程序HelloWorld
1.1.4 开发环境的准备
开发工具:eclipse
1.1.5 开发步骤
1.1.5.1 创建Java工程
1.1.5.2 创建HelloWorld类
选中src,右键,new,class,..
1.1.5.3 创建main方法
第一个段Java代码
package cn.tedu.hello;//这个类用来做Java的第一个小程序/*** public 是类的修饰符* class 用来定义一个类* HelloWorld 是类的名字*/
public class HelloWorld {//Java中的入口程序,定义一个main方法(函数)/*** public 是方法的修饰符* static 是静态的,作为方法的描述信息,* 表示了一个静态方法* void 是指定方法的返回值为空* main 叫做方法名字* (String[] args) 叫做方法的参数* String[] 叫参数的类型* args 叫参数的名字* */public static void main(String[] args){/*** System 系统指令* out 让系统做一个输出的动作* println 换行打印* "hello world~~" 打印一个字符串("")* ; java语句结束符** 想要运行的话:* 空白处右键->run as --> java application*/System.out.println("hello world~~");}}
day02:HTML网页制作+CSS样式表+二维码
1 HTML网页制作
1.1 概述
超文本标记语言,标准通用标记语言下的一个应用。
“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
超文本标记语言的结构包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
1.2 如何使用
1.2.1 创建动态web工程
1.2.2 创建order.html
在WebContent下创建,选中WebContent,右键,new,html,order.html
<!DOCTYPE html><html><!-- 指定文件是一个网页文件 --><head><!-- 网页的头部分 --><meta charset="UTF-8"><!-- 指定编码格式 --><title>永和大王</title><!-- 指定网页的标题 --></head><body><!-- 网页的体部分 --><div>顾客联</div><div>请您留意取餐账单号</div><div>自取顾客联</div><div>永和大王(北三环西路店)</div><div>010-62112313</div><div>--结账单--</div><div>账单号:P000009</div><div>账单类型:堂食</div><div>人数:1</div><div>收银员:张静</div><div>开单时间:2018-04-17 07:24:11</div><div>结账时间:2018-04-17 07:24:22</div><hr/><div><table><!-- 向网页中插入一个表格 --><tr><!-- 表示表格中的行元素 --><td>数量</td><!-- 表格中的列元素 --><td>品项</td><td>金额</td></tr><tr><td>1</td><td>豆浆油条套餐</td><td>7.00</td></tr><tr><td> </td><td>1 X --非矾油条</td><td> </td></tr><tr><td> </td><td>1 X --现磨豆浆(热/甜)</td><td> </td></tr></table></div><hr/><div><table><tr><td>支付宝花呗一元早餐</td><td>1</td><td>-3.00</td></tr><tr><td>合计</td><td> </td><td>4.00</td></tr><tr><td>支付宝</td><td> </td><td>1.00</td></tr> <tr><td>支付宝补贴</td><td> </td><td>3.00</td></tr> </table></div><hr/><div>打印时间:2018-04-17 07:24:23</div><hr/><div>根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持小票平整。</div><div><img src=""/><!-- 向网页中插入一张图片 --></div><div>官网:www.yonghe.com.cn</div><div>加盟热线:86-21-60769397或 86-21-60769002</div></body>
</html>
2 CSS样式表
2.1 概述
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
2.2 如何使用
2.2.1 Html网页中内嵌css代码
缺点:使网页的结构看起来十分混乱。不易后期维护。
<!DOCTYPE html>
<html><!-- 指定文件是一个网页文件 --><head><!-- 网页的头部分 --><meta charset="UTF-8"><!-- 指定编码格式 --><title>永和大王</title><!-- 指定网页的标题 --><!-- css代码修饰网页效果 --><style>body{font-size:8px;/*设置字体大小*/width:260px;/*设置网页宽度*/margin:5px;/*设置内容和边框的距离*/}.please{font-size:28px;}.me{padding-left:60px;/*设置字和左边的距离*/}.note{text-indent:20px;/*设置首行缩进*/padding-top:15px;/*保持上边距5px*/padding-bottom:15px;/*保持下边距5px*/}</style></head><body><!-- 网页的体部分 --><div>顾客联</div><div class="please">请您留意取餐账单号</div><div class="me">自取顾客联</div><div>永和大王(北三环西路店)</div><div>010-62112313</div><div class="me">--结账单--</div><div class="please">账单号:P000009</div><div>账单类型:堂食</div><div>人数:1</div><div>收银员:张静</div><div>开单时间:2018-04-17 07:24:11</div><div>结账时间:2018-04-17 07:24:22</div><hr style="border:1px dashed;"/><div><table><!-- 向网页中插入一个表格 --><tr><!-- 表示表格中的行元素 --><td>数量</td><!-- 表格中的列元素 --><td>品项</td><td>金额</td></tr><tr><td>1</td><td>豆浆油条套餐</td><td>7.00</td></tr><tr><td> </td><td>1 X --非矾油条</td><td> </td></tr><tr><td> </td><td>1 X --现磨豆浆(热/甜)</td><td> </td></tr></table></div><hr style="border:1px dashed;"/><div><table><tr><td width="170">支付宝花呗一元早餐</td><td width="30">1</td><td>-3.00</td></tr><tr><td>合计</td><td> </td><td>4.00</td></tr><tr><td>支付宝</td><td> </td><td>1.00</td></tr> <tr><td>支付宝补贴</td><td> </td><td>3.00</td></tr> </table></div><hr style="border:1px dashed;"/><div>打印时间:2018-04-17 07:24:23</div><hr style="border:1px dashed;"/><div class="note">根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持小票平整。</div><div><img src=""/><!-- 向网页中插入一张图片 --></div><div>官网:www.yonghe.com.cn</div><div>加盟热线:86-21-60769397或 86-21-60769002</div></body>
</html>
2.2.2 Css代码提取到base.css文件里
将HTML代码和css代码分隔。
body {font-size: 8px; /*设置字体大小*/width: 260px; /*设置网页宽度*/margin: 5px; /*设置内容和边框的距离*/
}.please {font-size: 28px;
}.me {padding-left: 60px; /*设置字和左边的距离*/
}.note {text-indent: 20px; /*设置首行缩进*/padding-top: 15px; /*保持上边距5px*/padding-bottom: 15px; /*保持下边距5px*/
}
2.2.3 网页中引入外部的css文件
<!DOCTYPE html>
<html><!-- 指定文件是一个网页文件 --><head><!-- 网页的头部分 --><meta charset="UTF-8"><!-- 指定编码格式 --><title>永和大王</title><!-- 指定网页的标题 --><!-- css代码修饰网页效果 --><!-- 引入外部的css文件rel 指定要引入的文件类型href 指定引入文件的路径(存放的位置)--> <link rel="stylesheet" href="base.css"/></head><body><!-- 网页的体部分 --><div>顾客联</div><div class="please">请您留意取餐账单号</div><div class="me">自取顾客联</div><div>永和大王(北三环西路店)</div><div>010-62112313</div><div class="me">--结账单--</div><div class="please">账单号:P000009</div><div>账单类型:堂食</div><div>人数:1</div><div>收银员:张静</div><div>开单时间:2018-04-17 07:24:11</div><div>结账时间:2018-04-17 07:24:22</div><hr style="border:1px dashed;"/><div><table><!-- 向网页中插入一个表格 --><tr><!-- 表示表格中的行元素 --><td>数量</td><!-- 表格中的列元素 --><td>品项</td><td>金额</td></tr><tr><td>1</td><td>豆浆油条套餐</td><td>7.00</td></tr><tr><td> </td><td>1 X --非矾油条</td><td> </td></tr><tr><td> </td><td>1 X --现磨豆浆(热/甜)</td><td> </td></tr></table></div><hr style="border:1px dashed;"/><div><table><tr><td width="130">支付宝花呗一元早餐</td><td width="20">1</td><td>-3.00</td></tr><tr><td>合计</td><td> </td><td>4.00</td></tr><tr><td>支付宝</td><td> </td><td>1.00</td></tr> <tr><td>支付宝补贴</td><td> </td><td>3.00</td></tr> </table></div><hr style="border:1px dashed;"/><div>打印时间:2018-04-17 07:24:23</div><hr style="border:1px dashed;"/><div class="note">根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持小票平整。</div><div><img src=""/><!-- 向网页中插入一张图片 --></div><div>官网:www.yonghe.com.cn</div><div>加盟热线:86-21-60769397或 86-21-60769002</div></body>
</html>
3 创建二维码
二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
3.1 导入jar包
3.2 创建QR类
3.3 创建create方法
package cn.tedu.qr;import org.junit.Test;/** 这个类用来创建二维码*/
public class QR {//创建单元测试的方法create@Test//选中方法名,右键,run as,junit testpublic void create(){//指定二维码图片的宽度int width=150;//指定二维码图片的高度int height=150;//指定二维码图片的内容String content="www.baidu.com";//指定二维码图片的存放位置String path = "e:\\qr.png";//调用Google的方法,用来产生二维码CreateQR.create(width,height,content,path);//打印System.out.println("二维码生成成功!!");}}
3.4 产生了二维码的图片
把指定路径下产生的二维码图片,复制到项目中。
放在WebContent/qr.png。
3.5 改造order.html
<!DOCTYPE html>
<html><!-- 指定文件是一个网页文件 --><head><!-- 网页的头部分 --><meta charset="UTF-8"><!-- 指定编码格式 --><title>永和大王</title><!-- 指定网页的标题 --><!-- css代码修饰网页效果 --><!-- 引入外部的css文件rel 指定要引入的文件类型href 指定引入文件的路径(存放的位置)--> <link rel="stylesheet" href="base.css"/></head><body><!-- 网页的体部分 --><div>顾客联</div><div class="please">请您留意取餐账单号</div><div class="me">自取顾客联</div><div>永和大王(北三环西路店)</div><div>010-62112313</div><div class="me">--结账单--</div><div class="please">账单号:P000009</div><div>账单类型:堂食</div><div>人数:1</div><div>收银员:张静</div><div>开单时间:2018-04-17 07:24:11</div><div>结账时间:2018-04-17 07:24:22</div><hr style="border:1px dashed;"/><div><table><!-- 向网页中插入一个表格 --><tr><!-- 表示表格中的行元素 --><td>数量</td><!-- 表格中的列元素 --><td>品项</td><td>金额</td></tr><tr><td>1</td><td>豆浆油条套餐</td><td>7.00</td></tr><tr><td> </td><td>1 X --非矾油条</td><td> </td></tr><tr><td> </td><td>1 X --现磨豆浆(热/甜)</td><td> </td></tr></table></div><hr style="border:1px dashed;"/><div><table><tr><td width="130">支付宝花呗一元早餐</td><td width="20">1</td><td>-3.00</td></tr><tr><td>合计</td><td> </td><td>4.00</td></tr><tr><td>支付宝</td><td> </td><td>1.00</td></tr> <tr><td>支付宝补贴</td><td> </td><td>3.00</td></tr> </table></div><hr style="border:1px dashed;"/><div>打印时间:2018-04-17 07:24:23</div><hr style="border:1px dashed;"/><div class="note">根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持小票平整。</div><div class="qrimg"><img src="qr.png"/><!-- 向网页中插入一张图片 --></div><div>官网:www.yonghe.com.cn</div><div>加盟热线:86-21-60769397或 86-21-60769002</div></body>
</html>
3.6 改造base.css
body {font-size: 8px; /*设置字体大小*/width: 260px; /*设置网页宽度*/margin: 5px; /*设置内容和边框的距离*/
}.please {font-size: 28px;
}.me {padding-left: 60px; /*设置字和左边的距离*/
}.note {text-indent: 20px; /*设置首行缩进*/padding-top: 15px; /*保持上边距5px*/padding-bottom: 15px; /*保持下边距5px*/
}.qrimg{text-align:center;/*设置图片居中*/
}
3.7 效果
4 Eclipse中配置tomcat
4.1 Eclipse配置tomcat插件
4.2 展示server窗口
4.3 发布项目到tomcat服务器
4.4 启动服务器
4.5 关闭服务器
4.6 测试
访问:http://localhost:8080/项目名称/资源名称
如:http://localhost:8080/day02/order.html
5 Eclipse中配置jdk
day03:动态技术J2ee Servlet+JSP
知识回顾:
3w1h,对每个知识点要why?
静态页面技术HTML
<!DOCTYPE html> 标识这个文件是一个HTML文件
<html> 标识一个html文件内容开始
<head> 头信息,
<meta charset="UTF-8"> 告诉浏览器我的编码utf-8
<link rel="stylesheet" href="css/base.css"> 链接样式表
<title>永和大王门店管理信息系统</title> 在浏览器上显示的标题
</head> 头信息结束
<body> 业务的内容<div>顾客联</div> 块<div class="please">请您留意取餐账单号</div> 在div属性中加入class属性,这样要在css文件中去定义这样一个样式,.please{},然后加载样式表后div就被渲染<div class="me">自取顾客联</div><div>永和大王(北三环西路店)</div><div>010-62112313</div><div class="me">--结账单--</div> 样式表定义一个样式,多处使用,如果需要变化,修改一处即可。复用!<div class="please">账单号:P000021</div><div>账单类型:堂食</div><div>人数:1</div><div>收银员:朱晓侠</div><div>开单时间:2018-04-27 07:36:05</div><div>结账时间:2018-04-27 07:38:11</div><hr class="line"> hr是一根直线,线型:直线、虚线、点线css规范中都有相应名称
直线solid,虚线dashed<div><table> 表格的开始<tr> 一行
<td width="40">数量</td> 一列,style=”width:40px;”
在html规范中字符串表达,支持双引号也支持单引号
表格中某个td设置宽度后,其他对应这列的td的宽度会随着改变
<td width="170">品项</td>
<td width="40" align="right">金额</td> align水平方向对齐left/center/right
</tr><tr><td valign="top">4</td> align水平对齐,valign垂直方向对齐top/center/bottom<td>香菇菜包套餐-ECS<br/> <br><br/>后面的标准,换行在txt中就是换行\r \n不可见字符,HTML都是可见的4 X --香菇菜包<br/>4 X --现磨豆浆(热/无糖)</td><td valign="top" align="right">28.00</td>设置水平对齐和垂直对齐这只对当前的单元格起作用!</tr><tr><td>2</td><td>非矾油条</td><td align="right">10.00</td></tr><tr><td>2</td><td>鲜肉小馄饨</td><td align="right">20.00</td></tr></table> <hr class="line"><table><tr><td width="40">合计</td><td width="170"></td><td width="40" align="right">56.00</td></tr><tr><td>微支付</td><td></td><td align="right">58.00</td></tr></table></div><hr class="line"><div>打印时间:2018-04-27 07:38:12</div><hr class="line"><div class="note"> 根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。</div>
特殊字符在html中需要单独标识,如果在html有多个空格,html解析时把多的空格就删除了。特殊字符转换,空格转换 ,转换的字符&作为开始;分号作为结束<img class="qrimg" src="img/qr.png"> src执向图片文件
<img></img><img/><div>官网:www.yonghe.com.cn</div><div>加盟热线:86-21-60769397 或 86-21-60769002</div>
</body>
</html> html文件内容的结束位置
Table标签和div差异
-
早期系统table布局,自适应;现今使用div+css布局,样式更加灵活,美观
-
Table布局造成页面加载时,如果这个table很大,只有读取到table的结束标签之后,浏览器才会把这部分展现。短暂白屏,才会全部展现。
-
Div出现后,div结束的标签浏览器就会直接展现。
表格常用标签
<table><th><tr><td>,th等价于tr,th专用于表头
HTML标签区分大小写吗?不区分
Java区分大小写吗?严格区分大小写
CSS区分大小写吗?严格区分大小写,自己写时习惯小写
-
样式美化CSS样式表
@CHARSET "UTF-8"; 标识这个css样式字符集utf-8
body{ 全局的使用,指定标准的标签
font-size:8px; 字体的大小,8个像素;以分号结束
width:280px; 宽度,width:280px; width:90%;
}
.please{ font-size:28px; }
.me{ padding-left:100px; }
.line{ border:dashed 1px;} border边线,dashed虚线 1px1个像素的宽度
.note{ padding-top:15px; padding-bottom:10px; } 上边空15个像素,下边空10个像素
.qrimg{ padding-left:60px; }
样式有三种方式
-
(系统有一个全局的样式表)全局的标准标签body,table,tr
-
(用的最多)在页面的标签上class=”me”,在样式表中.me{},局部修饰,可以多次调用,重用/复用
-
(form表单使用)在页面的标签上id=”me”,在样式表中#{},局部修饰,至少在这个页面中应该保证使用一次
-
二维码
直接应用,java培优非常好学,这些东西都是高手写出来,在市场上广泛使用。它的稳定性,性能,安全等等指标,经过千锤百炼!“拿来主义”,只应用!(适应初级程序员)
Nginx(c),Redis(c),mycat+mysql阿里,rabbotmq(erlang并发,爱立信出品,在银行业和电信业广泛使用)、微服务dubbo(java)阿里、docker(go并发)容器化技术
Hadoop离线分析(java)Spark(实时分析)(scala,下一代java)jdk1.8引入函数式编程
二维码应用
-
图片高度和宽度
-
生成图片路径
-
调用谷歌第三方jar,有两个jar包:放在WebContent/WEB-INF/lib
core-3.3.2.jar\com\google\zxing
javase-3.3.2.jar\com\google\zxing
执行程序的方式:
-
main函数,public static void main(String[] args){},在main还有static,运行java application
-
@Test junit单元测试,运行Junit Test,在一个类中可以写多个@Test
@Test
public void getValue(){} 普通方法
解决未知技术应该怎么做呢?
-
问人,问同事,问技术好
-
百度,推荐demo,如果技术难度比较大,不做读百文多看评论CSDN
-
官网,规范,严谨; 不好的地方,写文档的人还不如普通的开发者!
-
书,太多垃圾,断片;看补足底蕴。会讲很多理论。
今天任务:
-
动态技术J2ee Servlet+JSP
Servlet被SpringMVC Controller
Servlet3.0会使用注解方式 @Web 标签
JSP(用的最多的标签就是HTML标签),EL(${name})+JSTL(taglib c:forEach做循环),
2)创建JavaWeb项目,配置自己的jdk,Servlet和jsp是有运行环境的?Web中间件Tomcat
环境配置:
-
jdk,怎么给我们的项目指定jdk?
Jdk现在有多个版本,jdk1.4,目前jdk1.7,趋向jdk1.8
jdk1.9,jdk1.10,jdk1.11,宣布废弃java
企业追求什么样的技术?
-
最新技术
-
最稳定、安全的技术(企业最喜欢)
企业技术“落伍”!
JavaWeb项目?怎么配置jdk的?
要把jdk放在一个目录
目录要求:a.不能有空格(新版本的jdk是支持),b.不能有中文
安装版,一路next,存在系统文件夹中,它中间有空格
D:\java\env
绿色解压版,D:\java\env\jdk1.7.0_72
给eclipse配置jdk版本
如果没有jdk1.7就给它添加
D:\java\env\jdk1.7.0_72
点击add,选择根目录即可,它会自动填写其他的内容
如果项目已经存在,要使用新的jdk怎么处理?
要修改3处
编译java保存后eclipse会自动调用编译方式就把java文件形成class文件。
还需要配置编译时的Java的版本
修改第三处
为什么我们要改这么多处?
Eclipse插件机制,base基础,其它公司可以在这个的基础上增加“插件”按它的规范编写代码,扩充它的功能。
很多公司的很多的插件。
配置Web中间件Tomcat
Eclipse做的不好用,配置非常啰嗦,
-
有一个单独的窗口来管理Servers
-
主流tomcat7怎么配置它,要增加到eclipse
-
把tomcat7和项目yh绑定,运行Servlet就放在指定tomcat中运行
没有有效server,没有一个可用server。
配置当前项目到tomcat中
先选中项目yh,点击add按钮,把项目添加到tomcat中,
这样在tomcat运行时就会自动启动yh项目,这样可用执行Servlet和JSP。
如果已经有tomcat启动,就会报端口冲突
Eclipse给我们提供了更加方便的修改server.xml的方式
修改3个端口8005,8080,8009,一般加10
访问文件的方式:
file:///D:/java/ws/jt/yh/WebContent/HelloWorld.html
通过网络的方式:
http://localhost:8090/yh/HelloWorld.html
http网络协议
localhost本机,测试,ip地址,域名
8090端口号,找到tomcat
yh是项目名称
HelloWorld.html 在WebContext下
http://localhost:8090/yh/img/qr.png
http://localhost:8090\\yh\\img\\qr.png(不要使用)
它们之间怎么隔开的,用户/
开发步骤:
-
保证你有一个绿色解压版的Jdk
-
解压到硬盘D:\java\env\D:\java\env\jdk1.7.0_72
-
把jdk和eclipse关联起来
-
把配置的jdk和项目关联起来
把tomcat配置开发步骤:
-
把绿色解压版解压apache-tomcat-7.0.59
-
把tomcat和eclipse关联
-
把tomcat和yh项目关联
运行环境Servlet,JSP
-
Servlet2.3,SpringMVC Controller
-
Servlet3.0 注解方式(京淘)@Web…
-
利用eclipse创建Servlet
如果有错,是不能运行的,意味着必须先把所有的错误解决。
错误分为两种:
-
编译错误,保存文件时,自动去进行编译
-
运行时错误,运行时访问、调用才出错
Javax,jdk,j2ee中规定它行为,没有具体去实现,
交给第三方的Web中间件厂商去实现。
是第三方的就需要导入jar包。
怎么和我们的项目yh关联?
如果把servlet-api.jar直接放入到WebContent/WEB-INF/lib下
在tomcat启动后它就会发现有两个这个jar包,一个在上面项目中,一个在自己的lib目录中,它该调用谁?
它无法解决,就报错。
正确的姿势:
-
在控制台上打印Hello Servlet字符串
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("Hello Servlet");
}
-
在浏览器上怎么访问
保证项目发布到tomcat中
启动tomcat服务,手动启动(推荐:debug模式)
在浏览器上访问
http://localhost:8090/yh/HelloServlet
注意Servlet它特殊,它就不需要后缀
什么样的第三方jar使用拷贝jar到WEB-INF/lib下?
什么样的第三方jar使用项目的引用新增额外jar包?
Servlet.jar引用lib下,是不会被拷贝到最终的tomcat中,它只在eclipse中使用。
二维码,tomcat中有吗?没有,必须放在WEB-INF/lib
剖析servlet3.0结构:
1)@WebServlet("/HelloServlet") 注解
@WebServlet规范中的,目的就是把后面的字符串作为,在浏览器访问时路径值
http://localhost:8090/yh/HelloServlet
2.JSP
最早j2ee规范中只有servlet,
简化 HTML标签这种内容
http://localhost:8090/yh/HelloServlet
jsp访问地址
http://localhost:8090/yh/helloWorld.jsp
http://localhost:8090/yh/WEB-INF/helloWorld.jsp
放在WEB-INF下的文件不能浏览器直接访问
在外面WebContext这个文件能否直接访问?能
jsp对于html,通吃!html内容在jsp中完全通用。
需求:在jsp中店名变成动态
开发步骤:
-
准备数据(准备店名)
-
在jsp中获取并展现这个信息
比较
-
Html 纯静态,不可改变
-
Servlet 后台运行,访问数据库获取数据
-
Jsp 负责展现,把html都拿过来,然后加动态支持el表达式(${name})
小结:
-
HTML静态网页,通过很多预定义标签<html><body><div>,展示了一个网页,和txt纯文本?txt是只是数据没有修饰,静态网页,可以通过标签+css样式修饰实现页面更加美好,txt不支持图片,HTML图文并茂
-
HTML缺点,一旦写死就不能变化。出现动态页面技术纯Servlet,里面使用的java语句。
-
Servlet它要加html标签,代码太混乱,工作量大,重复代码。出现jsp技术
-
Jsp页面全部包容html标签,额外增加了一些el表达式${doorName}
Servlet中:
String doorName = “大钟寺店”;
request.setAttribute(“doorName”,doorName);
转向Order.jsp
Jsp中:
Jsp页面可以获取到request对象,这个中放置doorName
Order.jsp加载时看${doorName}
这个内容就会找request中有没有doorName,就把对应值获取到。
内容就可以动态来实现
总结:servlet加工获取数据(业务逻辑)
环境配置:
在eclipse中配置jdk和tomcat
-
jdk安装版1.8
1.7 add(arg01,arg02)
1.8 add(arg01,arg02,arg03)
1.7 update() 删除线,过期,在后期版本中就可能删除掉
1.8 没有update方法了,
在实际开发中,会规定项目的版本
在实际开发中,项目的jdk版本能升级吗?dubbo
-
怎么指定eclipse对应的jdk版本?
-
在eclipse环境中配置jdk1.7
-
把配置的jdk和项目yh关联
C:\programe files\java
Java代码解析,c:\\programe%20files\java
-
怎么指定eclipse对应tomcat版本?
Tomcat称为web中间件,支持servlet和jsp运行。不管旧三大框架struts2+spring+hibernate,新三大框架springmvc+spring+mybatis都是在servlet和jsp技术上发展起来的。
-
给eclipse配置一个tomcat
-
把tomcat和项目关联
-
访问
http://localhost:8090/yh/Order
http://127.0.0.1:8090/yh/Order
-
创建Servlet3.0 引入注解@WebServlet(“/Order”)
-
Servlet就按java代码来编写,写业务逻辑(加工过程)
作业:
-
再安装一个jdk1.9
-
再安装一个tomcat8
-
写一个servlet3.0
-
写一个order.jsp
-
把html和servlet+jsp请求过程画图
day04:mysql数据库+sqlyog的使用
知识回顾:
-
Jdk 一台机器上可以安装多个版本的jdk。企业中有很多项目,旧的项目需要维护jdk1.6;开发新的项目jdk1.7。配置eclipse指定jdk。项目在开发时就会使用我们指定版本。
在eclipse怎么项目的jdk环境?
javaWeb配置3处:a.Build Pach,b.Compile编译,c. facets(每个功能是不同厂家完成,每个厂家的工具(eclipse 插件)都有自己的配置)
-
Tomcat web中间件,支持servlet和jsp的运行环境。
Javax,java扩展,很多就不是java自己实现,java只是定义规范,其他厂商为了使用这个东西,就要按照规范来写一个实现。
Tomcat就实现Servlet规范
-
把它在eclipse中创建
-
我们要把tomcat和项目关联
-
启动tomcat,tomcat就会运行相关项目(部署、发布)
-
Servlet
动态,可以执行业务逻辑,加工处理
利用eclipse来创建一个Servlet3.0类,利用eclipse提供模板
特点:
-
在它的类上有一个标识,称为一个注解@WebServlet,注解中有一个字符串,和类名完全一致,但是/HelloServlet。
-
类有doGet(直接在浏览器上输入地址),doPost(表单,登录)
-
总有两个参数HttpServletRequest request请求,HttpServletResponse response响应
-
返回request.getRequestDispatcher("Order.jsp")
.forward(request, response); 通过request和response对象给jsp传递值
-
传值 request.setAttribute(key,value); key唯一,value随便
-
Jsp
负责数据最后展现
-
完全兼容所有的html标签+css
-
它可以通过servlet准备数据,在jsp中利用EL表达式${doorName},它内部就去遍历request,找key 为doorName的,如果有就返回它里面的值,如果没有就不抛出错误,直接显示空。
-
特点就是动态,它的值可以变化。而html写死。
扩展:
Jsp文件放入到WEB-INF目录下,还能直接访问吗?
http://localhost:8090/yh/WEB-INF/Order.jsp j2ee Servlet规范放在WEB-INF下的文件不允许用户直接在浏览器上访问!保证某些信息不对外公开,安全性。
利用这个目录的特性把一些不需要对外直接展示jsp就放在其中。(工资条)主流项目都是这样。
改造让jsp不允许直接访问,根据安全!
Servlet可以访问WEB-INF下的jsp资源,因为进入Servlet中,如果需要可以进行权限校验。
开发步骤:
a.)servlet中修改,修改路径:/WEB-INF/views/Order.jsp
b.)把jsp扔到上面目录中
servlet中如果数据写死,还没有html写死方便呢?
怎么体现servlet动态呢?
Servlet是可以做到的,但是它自己不能独立完成,需要数据库来管理数据,它从数据库获取数据。
今日任务:
-
数据库,主流数据库mycat+mysql免费(开源),Oracle(性能最好的,收费),sqlServer(最好用好,性能,安全性都一般,闭源)
-
Mysql基础操作,CRUD,信息维护,增删改查
-
数据存储的地方,数据库
概念:
a. 数据库database简称db,存放数据,创建store-yh
b. 表 table,门店信息tb_door,订单信息tb_order
c. 字段(列)colume
大钟寺店 doorname,类型:varchar;长度:200
086-010-48428920 tel, 类型:varchar;长度:20
1 大钟寺店 010-48428920
2 火车南站店 010-48428920
d. 主键 primary key,记录唯一性,或者唯一代表这条记录
自增1,2,3,有唯一性
Mysql数据库,维护数据
开发步骤:
-
有mysql数据库程序服务端
-
创建一个数据库store-yhmis,乱码utf-8
-
创建一张表tb_door(设计习惯tb_前缀),创建时指定字段,类型,长度,主键
-
新增数据Insert
-
修改数据(修改电话)Update
-
信息无用,删除 Delete
-
查询 Select
常用dos命令:
1)cd .. 向上退一层
cd . 查看当前目录
2)cd tony 进入到tony目录中
进入有空格的目录C:\>cd "Program Files"
3)cd / 从任何目录直接返回到根目录c:d:e:
4)切换盘符d:(只在window中,linux root)
5)dir列当前目录下子目录和文件
6)mkdir创建目录
如果机器上有mysql怎么知道呢?
mysql -uroot -proot
mysql代表mysql.exe执行程序,数据库给我们提供客户端工具
-u参数,username用户名,后面紧跟用户名,当mysql安装时默认用户名,叫root
-p参数,password密码,设置密码
常用数据库命令:
数据库中命令是以分号结尾
-
exit; 退出mysql数据库环境
-
mysql中有哪些数据库?
怎么创建自己的数据库呢?解决乱码问题?
create database yh;
创建完数据库是有问题的,中文存入会乱码。
创建数据库时要设置字符集
create database yh default character set utf8;
创建一个yh数据库,并且设置它的字符集为utf8;
不设置字符集,mysql默认它的字符集lantin1,相当于网页ISO-8859-1
打开要使用的数据库
打开yh数据库,后面的操作就都针对这个数据库
use yh;
创建表table(复杂),指定字段,类型,长度
create table tb_door(id int,door_name varchar(200),tel varchar(20));
创建tb_door表,表有3个字段,id主键字段类型int,door_name字段类型varchar(200),tel varchar类型,20长度。
展现当前数据库中所有表
show tables;
删除数据库
drop table tb_door;
展示表的结构
desc tb_door;
创建表,并且设置主键
create table tb_door(id int,door_name varchar(200),tel varchar(20),primary key(id));show tables;desc tb_door;
create table tb_door(id int auto_increment, door_name varchar(200), tel varchar(20), primary key(id));
设置id列为自增和主键
插入数据
insert into tb_door(door_name,tel) values(‘dzs’,’110’);
insert into关键字 values关键字
tb_door表
(字段)
values(多个值,用逗号隔开)
如果是字符串,必须用单引号包括起来
常用SQL语句
SQL语句不区分大小写。
习惯:
关键字大写,其它内容小写
SELECT * FROM tb_door sqlserver/mysql
关键字小写,其它的内容大写
select * from TB_DOOR oracle
习惯:
都小写
1.创建数据库
create database yh;
默认是lantin1字符集和网页ISO-8859-1
create database yh default character set utf8;
设置创建数据库时指定编码,支持中文了。
2.查询mysql中所有的数据库
show databases;
3.打开指定数据库
use yh;
4.创建数据库表
create table tb_door(id int,door_name varchar(200),tel varchar(20));
tb_作为前缀,标识它是一个table
create table tb_door(id int,door_name varchar(200),tel varchar(20),primary key(id));
指定id为主键
自增主键,int整形,数据库底层它会记录下当前值
每次用户新增记录,加+1,返回当主键(非常多,电商表)
流水号
create table tb_door(id int auto_increment,door_name varchar(200),tel varchar(20),primary key(id));
5.插入数据
insert into tb_door(id,door_name,tel)values(10,’大钟寺门店’,’110’);
字段名称和java不一样,要大写都大写oracle,要小写都小写mysql
多个单词之间下划线隔开
5.查询数据
查询所有的数据
select * from tb_door;
7.特殊SQL
drop database yh; 删除yh数据库drop table tb_door; 删除表tb_doorshow create table tb_door; 查看创建表的sql语句desc tb_door; 查看表的结构
修改信息
把tb_door中id=1数据它的电话修改为112
update tb_door set tel=’112’ where id=1;
-
备份数据,测试库
-
写update SQL时先写where条件
update tb_door set tel=’110’ where id=1;update tb_door set tel='119',door_name='火车南站' where id='1';
设置多个字段,用逗号隔开
update tb_door set door_name='大钟寺',tel='110' where door_name='dazhognsi' and tel='112';
多个字段用逗号隔开
如果在where条件中多个条件并列使用and
火车票订票12306
Ticket 1张
用户1,1,支付,支付成功买到了票,总票数=0
用户2,0,不能买
高并发情况下,同时很快去操作
用户1,1,支付,啰嗦,密码试了几次,终于找到了,
在用户1尝试过程中,用户2查表,1,动作快,直接支付,总票数1-1=0
用户1密码成功了,开始支付,但是它会没票
多限定了一个where条件,把要修改的旧的值作为一个where条件
Where id=1 and tel=’001’,当其他用户提交,它再提交
但是数据已经发生变化,所以执行SQL成功,但是没有数据发生变化。
删除
更要先写where条件
delete from tb_door; 删除tb_door表的所有数据delete from tb_door where id=1; 只删除id=1的记录delete from tb_door where id=1 and tel=’003’; 并列删除条件id=1和tel是003的
对于null有特殊的语法,is null
delete from tb_door where tel is null;
删除门店为dzs的或者电话为119的
delete from tb_door where door_name='dzs' or tel='119';
排序:
select * from tb_door order by tel desc;按电话号码倒序,null最后select * from tb_door order by tel [asc]; 默认正序,null排第一
Dos窗口方式
在生产环境中,不允许使用其他的软件从远程接入
也不允许在生产环境中的机器上随便安装软件
需要安装mysql
只能mysql客户端mysql.exe,它可以本地访问。
在实际开发过程,安装测试服务器上,测试库。
Mysql数据库客户端程序,sqlyog/navcat第三方工具
常见问题:
-
端口号,安装时配置,别人要告诉你(系统管理员)
-
Mysql服务没有启动
查看服务,如果未启动,手动启动即可
-
删除数据库
注意创建数据库时,如果有中文,必须设置字符集为utf-8;
创建数据库
创建表
查看数据
新增数据
小结:
-
why?为什么需要数据库?
CRUD操作,如果有1个月的永和大王大钟寺门店订单。
数据挖掘:(统计查询)
-
这个门店中这个月的销售额
-
畅销产品 order by desc,滞销产品 order by
-
优秀员工,谁卖的多,每个订单收银员,单数和总金额
-
工作效率,结账时间-开单时间,时间越小越好
-
概念:
-
数据库 database
-
表 table
-
字段 colume/field
-
类型 datatype int/varchar(n)/double/timestamp时间戳
-
主键 primary key,唯一标识一行数据
-
自增 auto_increment +1,底层自动管理
-
数据库database
数据一个集合,数据会存储下来。Mysql底层是文件。
Mysql就是默认数据库
Mysql中数据库本质就是file文件。最终保存在磁盘上。
字符集问题,创建库时候指定,默认lantin1=ISO-8859-1,如果存中文就乱码???。
指定数据库
一个项目一个数据库
-
表table,一个数据库中隔离业务
create table
注意字段+类型+长度
-
主键+自增
-
常规操作
CRUD增insert删改查
insert into tb_door(id,name) values(1,’tony’);delete from tb_door where id=1;update tb_door set name=’hell’ where id=1select * from tb_door;select * from tb_door where id=1;select * from tb_door where name=’tony’;
数据tony tony2
要求:tony开头
select * from tb_door where name like ‘tony%’;(常用)
通配符%,匹配任意多的字符
要求:包含tony字符串
select * from tb_door where name like ‘%tony%’;(常用)
去掉name为null的记录
select * from tb_door where name is not null;
只查询name为null的记录
select * from tb_door where name is null;
按名称排序
正序 select * from tb_door order by name [asc];倒序 select * from tb_door order by name desc;
查询记录总数
SELECT COUNT(*) FROM tb_door;select count(id) from tb_door;
6)特殊SQL
删除数据库 drop database yh;删除数据库表 drop table tb_door;查看创建表的sql语句 show create table tb_door;查看数据库中有哪些数据库 show databases;打开某个数据库 use yh;某个数据库有哪些表 show tables;查看表结构 desc tb_door;
day05: PowerDesigner的使用+Jdbc
知识回顾:
-
数据库,因为数据方便存储,通过SQL结构化查询语言Struction Query Lanuage。不光完成数据维护(新增、修改、删除),查询(统计查询)
-
关系型数据库Oracle、MySQL、SqlServer,非关系型数据库no sql Redis(key,value)KV数据,mongodb(json带格式的一个字符串 {abc}),hbase(列式存储)
-
概念:
-
数据库database, mysql,隔离不同的项目,yhdb,jtdb
-
表table,在一个项目中有很多的业务:购物车表,订单表
-
字段column,field,一个表中有很多信息,可以划分成很多的字段,字段最小单位不能分拆
-
类型datatype,数据库对不同类型的数据要进行存储
int/tinyint/double/varchar/timestamp
-
-
主键 primary key,唯一的标识这一条的记录
-
自增 auto_increment(mysql独有的)+1,数据库底层会记录这个表的主键的最大值
-
-
基础的SQL语句
-
create database yhdb; 默认的字符集lantin1,相当于iso-8859-1
-
create database yhdb default character set utf8;
-
create table tb_door(id int not null auto_increment,door_name varchar(200),tel varchar(20), primary key(id)); 创建表,3个字段,类型,主键,自增
-
show databases; 展示所有的数据库
-
show tables; 展示某个库的所有的表
-
use yhdb; 打开某个数据库,它就作为当前数据库
-
show create table tb_door; 展现表的创建的sql语句
-
desc tb_door; 展现表的结构
-
drop table tb_door; 删除表,自增管理也被删除了
delete from tb_door; 只删除内容,不会把自增删除。
-
drop database yhdb; 删除库,所有的数据都丢失
5)最常用SQL语句
CRUD操作,新增,修改,删除,查询
insert into tb_door(door_name,tel) values(‘大钟寺店’,’110’);insert into tb_door(tel ,door_name) values(’110’,‘大钟寺店’);insert into tb_door(price) values(110.00);
update tb_door set tel=’119’ where id=1update tb_door set door_name=’dzs’,tel=’119’ where id=1
delete from tb_door where id=1;
查询所有数据
select * from tb_door;select tel from tb_door;select tel from tb_door where id=1;select count(*) from tb_door;底下性能比上面的高select count(id) from tb_door;
-
使用客户端sqlyog
把门店信息表实现
-
表设计,在概要设计时就开始表设计,在详细设计中继续细化,在详细设计完成,表设计就完全完成了。在实际开发中也会局部修改。
-
表名tb_door,字段们id,door_name,tel,字段类型,长度
-
实现建表SQL语句
在业界有标准表设计工具,PowerDesigner,以图形展现,看着方便直观,可与直接产生建表SQL语句。
安装PD
-
PowerDesigner15.1汉化破解版.rar
破解
把所有的文件覆盖下面目录即可
C:\Program Files (x86)\Sybase\PowerDesigner 15
然后运行就可以。汉化不彻底。
安装时选择语言(下拉框)选择PRC中文(最长的那个)同意协议,
然后一路next
-
录入数据
-
查询数据
在实际开发中怎么使用PD表设计?(了解,会看,会用)
表设计,非常关键,对业务了解,开发团队资深系统分析师
工具栏中就注意2个按钮,
上面的叫表,下面的是表之间关系
把页面中所有的表放在一个页面
产生建表语句,拿到sqlyog中执行
create table tb_door
(id int not null auto_increment,door_name varchar(200),tel varchar(20),primary key (id)
);
最后一步:
怎么从数据库获取数据?
JDBC java database connect java访问数据库jar工具包
JDBC j2ee规范,数据库厂商oracle(ojdbc.jar),mysql(mysql-connector-java-5.1.10-bin.jar)
-
导入jar
这些对象都选择java.sql下的
No suitable driver found for jdbc:mysql231://localhost:3306/yh
没有匹配驱动,
错误原因:url写错了
解决方案:修改成正常的
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Caused by: java.net.UnknownHostException: locathost
错误:第一首先看最前面,最前面的不够定位准确,再看最后
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
Unknown database 'yhdb'
错误:不认识数据库yhdb
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
Table 'yh.tb_door123' doesn't exist
错误:table tb_door123表不存在
程序高手!
故意搞破坏!
java.sql.SQLException: Invalid value for getInt() - '大钟寺北三环店'
抛出SQLException,无效的值
问题:
-
有两次数据库访问
-
大量的代码重复
优化:
String doorName,String tel
Door对象,有两个属性doorName,tel
开发步骤:
-
创建Door对象,有两个属性doorName,tel,一次数据库访问
-
可以分别设置doorName和tel。setDoorName,setTel,对象就能保存两个值
-
可以从Door对象中获取 getDoorName,getTel
特性:这种对象pojo对象(传递数据)
-
它有属性字段
-
每个属性有set方法
-
每个属性有get方法
解决2个问题:
-
不能多次访问数据库,合并一次
-
方法要返回多个值
解决方法:
不能用普通对象String一次只能一个值
使用java中pojo对象
Pojo对象特点:
-
多个属性值 private Integer id/private String doorName/private String tel
-
设置这个属性值,通过给每个属性设置set方法
-
Servlet中获取这个值,给每个属性增加一个get方法
鼠标右键,source菜单,选择生成get和set方法项,会自动生成相应代码
使用:pojo对象传值,步骤:
1)创建pojo对象 Door door = new Door();
2)调用这个对象set方法给它设置值 door.setId(rs.getInt(“id”));
3)在servlet中获取
对象是有作用域,方法内部创建的对象,出了这个方法就不能用了。
while(rs.next()){
}
方法调用过程
小结:
-
PD powerdesinger设计工具,主要用来表设计
文件保存pdm物理数据模型
对初级程序员,会看,会找到建表sql语句
-
程序就要从数据库中获取数据
-
写3个参数
url=”jdbc:mysql://localhost:3306/yh”
jdbc:mysql:// 协议头
localhost找到数据库所在服务器
3306 mysql服务的端口,找到mysql服务
yhdb数据库
b)创建链接
new Driver();
Connection cn = DriverManager.getConnection(url,user,password);
c)创建执行者(语句)
Statement stat = cn.createStatement();
d)ResultSet rs = stat.executeQuery(“select * from tb_door”);
e)循环数据
while(rs.next()){
Integer id = rs.getInt(1);
String doorName = rs.getString(“door_name”);
。。。。
}
f)释放资源
最早声明对象,最后释放
rs.close();
stat.close();
cn.close();
在项目中获取数据库的数据
-
在servlet中增加一个获取数据库的方法
public String getDoorName(); //获取数据库的表中的门店数据
public String getTel(); //获取电话
访问数据库的次数太多,重复的代码也太多了。
-
改造优化下
多个数据库访问合成一个
把内容一次查出,放入一个对象中,一个对象可以有多个属性
在java世界中把这个对象就称为pojo对象。对象就是传递数据的。
Public Door getDoor(){
Door door = new Door(); //在方法内存储数据,出了方法外这个对象就失效,不能访问了;
查询数据库,把数据通过set方法设置到door
反 return语句, return door;
}
遇到return它就范围调用者
Door door1 = getDoor(); door1和door是一个类型Door,那就把door的每个属性值赋值给door1里面每个的值。
可以从door1中获取信息
door1.getDoorName()
door1.getTel()
一次可以传递多个值
HTTP Status 500
内部错误,servlet里面有错误
java.lang.NullPointerException(空指针错误)
cn.tedu.yh.servlet.Order.doGet(Order.java:33)
Order servlet中33行错误
声明一个变量,变量没有给他设置值,默认值null
Pojo对象特点:
-
多个属性,private修饰符
-
对应每个属性设置方法setXxx
-
对应每个属性获取方法getXxx
Jdbc淘汰,不会直接写这些代码,框架封装,Mybatis
day06:日期格式的转换和统一
课改:
学习方式:
-
按部就班一步一步踏实脚印走(太多啰嗦地方)java面向对象,封装,继承,多态
-
另辟蹊径(拔苗助长,我还不会走,老师就让我跑)
田忌赛马
我们学员 | 资深的技术人员:项目经理,技术经理,架构师,技术副总 |
弱项:java基础、javaWeb、3大框架 (面试技巧,最重要是表现自己好学和渴望进入这家公司态度) | 强项: Java1991年17年了,市场上企业中有大把java程序员,在企业中通过非常多的项目来真实锤炼,周期3-20年。真实企业环境。 |
在培优课程中优势:
Docker容器化,1s启动一个服务,瞬间达到百万级别(阿里双11,2017,2018都是运行在docker之上) Nginx+redis(x)+mycat Rabbitmq+docker+dubbo Jsoup 爬虫,薪资9k+ Lucene+solr/es 10K+全文检索工程师,自己百度 2)大数据项目 Hadoop,HDFS,flume,hive,storm,zookeeper,kafka 真实项目网络流量日志分析PV,UV,VV | 弱项:在工作中接触的技术的面小!越大公司越窄。跳槽! 对新技术消化能力差,(为了现有系统稳定,不可能直接把新的技术引入)但是它渴望,企业渴望! 技术变化非常快!它虽然很难实质推动企业技术变更,但是他希望有人来做这个事情, 大多企业: 大型,互联网架构+大数据 中型,dubbo互联网架构+ssm(springmvc+spring+mybatis)三大框架 小型,ssh(struts2+spring+hibernate) |
Jsp动态网站,和服务器可以交互。
传递参数,活动,和数据库一结合,这些数据就能从数据库获取。当数据库修改了,这些页面的数据重新加载页面时,就变化成新的内容。
Servlet负责数据准备,传递给jsp页面。
从数据库获取数据jdbc,数据返回值给变量
String doorName = getDoorName(去访问数据库返回店名)
Servlet是如何把信息传递给jsp(request)
request.setAttribute(key,value);
request.setAttribute(“doorName”,doorName)
//把请求转发到order.jsp页面,把参数对应值都传递给jsp页面
request.getRequestDispatcher(“/WEB-INF/views/Order.jsp”, ).forward(request,response);
Jsp负责页面的展现
展示html标签,tomcat直接翻译,静态页面
动态的信息doorName,在jsp中如何获取呢(el表达式)
${doorName}内部回去request找,key=”doorName”,如果找到把value值进行返回。如果没找,就返回空,在页面上就什么也不展示。
Rs.getInt(“id”)
getInt而不叫getInteger
在于作者的目的。返回int
在java中两类变量:
-
基础变量int,double,long,char,boolean
-
对象变量 Integer,Double,Long,String,Boolean
最大的差异:基础变量都有默认值,而对象变量的默认值都是null
int=0;double=0.0
需求:考试,一个学员考试,有成绩。
int =0,(int i=-1)
Integer =null
基础变量存储的空间小,对象变量存储空间大!内存
Java中尽量使用对象变量(面向对象编程)
如果是在做通信程序,推荐使用简单变量
Mysql数据库实质文件类型。
早期的mysql是直接和mysql/test默认的数据库放在一起的。
现在版本换地方,从一个文件中看到,全局mysql配置文件mysql.ini(ini微软习惯配置信息的一个文件)
Mysql提供数据库所在位置
C:\Program Files\MySQL\MySQL Server 5.5\data\mysql
这是一个隐藏目录!
数据库包括表其实mysql本质文件,它把这些信息组织后,存储成二进制文件。Mysql数据库自己来维护。
String doorName = “大钟寺门店”; 单独进行数据库访问写成一个方法(函数)getDoorName(jdbc,返回值string)
String tel = “110”; 单独进行数据库访问,把上面的方法拷贝,然后修改获取值的地方
缺点:
-
大量重复代码
-
数据库进行多次链接
解决方案:
-
pojo对象,因为这个做后,可以支持返回多个值
-
查询数据库就合成了一个方法(一次查询),
-
返回值就变成pojo,代码怎么设置pojo? Door door = new Door();利用pojo对象每个属性的set方法去设置即可
-
需要属性怎么获取,就利用pojo的get方法获取。
找出需求中的动态数据,这些数据就需要放在数据库中,方便维护!
特殊的表名,列名
SELECT * FROM `order`;
''
` 刀秋
创建表的主键
尽量的和业务无关,如果业务唯一性不能保证,我们的表丝毫不受影响!
Char和varchar有什么区别?
Char固定长度,查询的性能高,但是不宜太长,会浪费我们的存储的空间
Varcar变长,长度变化,查询的性能低,存储不会浪费空间
Fk 外键 forgein key
表设计
如何从用户原始需求中提炼数据库表?
-
原始界面中逐字分析
-
把信息分成几类:静态内容和动态的内容。把静态内容就排除在外。
-
怎么把信息拆到不同的数据库表中
-
从上向下分析,如果遇到动态内容,第一遇到先创建一个表
-
“店名”这个信息是描述什么的,一般就会以关键信息点作为表名tb_door
-
遇到“电话”,首先判断是否属于当前这个表的内容,电话就是属于描述门店信息的,所以就成为这个表的字段。
-
遇到“账单号”,也是判断是否属于当前这个表,不属于描述门店的信息,创建新的表。创建订单表。tb_order
-
“账单类型”看它从属我们哪个表,明显属于订单表
-
“订单数量”判断是否从事现有的表,它描述的和上面的表的分类都不相同,又创建新表tb_order_detail。如果感觉它也可以属于订单表,可以先放放试试,如果把这个内容放入到订单,其它字段内容,而且大多的字段,内容都重复。如果其中一个修改,这多条数据都有随之修改。如果发生这样的事情,表就设计的有问题,不能大量重复,就把信息拆开,形成了新表。
-
合计不能放入,要求:如果这个字段的内容可以由其它字段加工而成,这样的内容不能放入到数据库中。合计=数量*单价,累加
-
“微支付”要同时多看几张订单,就可以拆除,这个内容含有两个信息,只是表达的比较隐晦。它的值有:微支付和支付宝支付,现今支付。拆成两个字段:支付类型,和支付金额。
-
“打印时间”可以放入数据库表(后期对打印时间做统计),也可以不放入(不去统计时,不用放入表)。
/*==============================================================*/
create table tb_door
(id int not null auto_increment,door_name varchar(200),tel varchar(20),primary key (id)
);
/*==============================================================*/
/*==============================================================*/
create table tb_order
(id int not null,door_id int,order_no varchar(20),order_type varchar(30),persion_num tinyint,cashier varchar(30),crate_time timestamp,end_time timestamp,payment_type varchar(10),payment double(8,2),print_time timestamp,primary key (id)
);alter table tb_order add constraint FK_Reference_1 foreign key (door_id)
references tb_door (id) on delete restrict on update restrict;
/*==============================================================*/
/*==============================================================*/
create table tb_order_detail
(id int not null,order_id int,num varchar(200),item varchar(300),price double(8,2),primary key (id)
);alter table tb_order_detail add constraint FK_Reference_2 foreign key (order_id)
references tb_order (id) on delete restrict on update restrict;
/*==============================================================*/
Mysql+sqlyog在处理日期时不够严谨,有默认值0000-00-00 00:00:00这样的格式值直接放在字段中,如果查询数据库时含有这样的内容,将来java中就会报错。它不是一个正确日期格式。
完成这个订单信息
--查询某个订单所对应门店信息
SELECT * FROM tb_door WHERE id=1;
带3个字段返回,Door pojo
--查询某个订单的信息
SELECT * FROM tb_order WHERE id=1;
返回n个字段,Order pojo
--查询某个订单下订单详情信息
SELECT * FROM tb_order_detailWHERE order_id=1;
返回3个字段和3条记录,
数组
解决一条OrderDetail pojo
List<OrderDetail> 数组<泛型>,泛型是告诉我们数组里每个元素的值的类型是谁
Jsp最终获取数据不想去3个对象中获取,就像直接从一个对象中取获取
Order有两个特殊属性标识对象之间关联
对一:门店 Door door;
对多:订单详情List<OrderDetail>
在jsp页面中遍历集合,使用JSTL java支持标签库
开发步骤;
-
引入jar
/yh/WebContent/WEB-INF/lib/jstl-1.2.jar
-
Jsp中先引入taglib
<%@ taglib prefix="c" uri="Oracle Java Technologies | Oracle" %>
-
在Jsp引入 c:forEach
<c:forEach items="${order.orderDetails}" var="o">
Items填写request集合元素,必须el写法
var起每行别名
日期处理
-
修改pojo返回参数类型String printTime;
rs.getDate("print_time") 只返回日期部分
rs.getTimestamp("print_time") 返回时间戳,会多毫秒数
利用格式化函数SimpleDateFormat函数
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
order.setPrintTime(sdf.format(rs.getTimestamp("print_time")));
合计
<c:set var="total" value="0"/> 设置变量,变量名total,设置一个初始值为0
相当于java中的while,遍历一个集合List集合,var设定一个别名,访问方便
<c:forEach items="${order.orderDetails}" var="o">
设置一个total进行累加
<c:set var="total" value="${total+o.price}"/>
<tr>
<td valign="top">${o.num}</td> 直接利用别名来获取属性值
<td>${o.item}</td>
<td valign="top" align="right">${o.price}</td>
</tr>
</c:forEach>
<td width="40" align="right">${total}</td> 合计就是el表达式
小结:
-
和数据库进行查询,查询3次,查询出某个订单,通过这个订单获取door_id,通过door_id获取它门店对象信息,然后在通过订单orderId去找所属的订单详情的一个集合List集合。
-
数据库查询后的返回值
Door door = new Door();
door.setDoorName(rs.getString(“door_name”));
List<OrderDetail> odList = new ArrayList<OrderDetail>();
while(rs.next()){
OrderDetail orderDetail = new OrderDetail();
orderDetail.setNum (rs.getInt(“num”));
。。。。
odList.add(orderDetail);
}
return odList;
Order order = new Order();
while(rs.next()){
order.orderNo(rs.getString(“order_no”));
}
//关联/绑定,订单和门店关系
Door door = getDoor(order.doorId); 从数据库查询出当前订单对应门店
order.setDoor(door);
//关联/绑定,订单和订单详情的关系
List<OrderDetails> odList = getOrderDetails(order.id);
order.setOrderDetails(odList);
pojo
Door
private Integer id;
private String doorName;
private String tel;
OrderDetail
private Integer id;
private Integer num;
private String item;
private Double price;
//最复杂,多一个对象关联关系
Order
//一个订单对应一个门店,对一
private Door door;
//一个订单对应多个订单详情,对多
List<OrderDetail> orderDetails;
private Integer id;
private String orderNo;
….
day07:项目开发设计思路
知识回顾:
-
体现面向对象
Java面向对象开发语言,组织数据结构时和面向过程不同。
实现数学函数,1+1=?思考:x+y=结果,x=1,y=1,1+1=2。顺序思考,只考虑当前一个情况,其他的情况完全不考虑。
SQL,典型面向过程,
查询所有,x=table,y=字段
select id,name from tb_door;
只查询大钟寺门店
select * from tb_door where id=1;
面向对象,pojo组织它考虑非常多并不完全只为满足眼前的需求。
Door
private Integer id;
private String doorName;
private String tel;
面向对象不完全从需求出发,当前的需求出发。它只关心本身这个对象应该有哪些,而不关心是否立即能用到这些内容!
需求改变:
只前用户是不需要id的,但是他突然觉得想在页面上展示id信息。
如果是面向过程,修改原始代码!(pojo,rs也需求修改,页面改变)
如果是面向对象,修改量变小了(页面改变)
面向对象在思考时考虑比较多,但是这样的好处在用户需求变更下,修改的代码量非常小。
Pojo对象关联
订单和门店,多对一,pojo Order 对一 Door door;
订单和订单详情,一对多,pojo Order 对多 List<OrderDetail> orderDetails/odList
怎么完成整个流程?
-
从数据库查询数据,放到pojo对象中
-
从数据库分别查询订单,门店,某个订单详情,3次
-
把它们设置到对一pojo对象中
Order order = new Order();
order.setOrderNo(rs.getString(“order_no”));
//对一
Door door = getDoor(orderId); //从数据库查询数据放入door pojo对象中
order.setDoor(door); //绑定,关联关系
//对多
List<OrderDetail> odList = getOrderDetail(orderId);
数据库的处理
List<OrderDetail> odList = new ArrayList(); //创建完成是一个空数组
while(rs.next()){
OrderDetail od = new OrderDetail();
od.setNum(rs.getInt(“num”));
odList.add(od); //把每个对象加入到数组中
}
order.setOrderDetails(odList);
-
把pojo传递给jsp
-
在jsp中以el表达式,jstl标签库(更复杂)展现
自己总结文档,
典型案例:
-
一对一,单个对象
-
一对多,多个对象关联
-
门店,订单,订单详情;学校,班级,学生
-
日期处理
-
合计
永和门店系统开发过程:
-
需求调研《需求说明书》
-
设计阶段,概要设计《概要设计说明书》,继续细化《详细设计说明书》,PowerDesinger表设计
-
开发,编码,调试(最耗时)
-
测试
-
维护
-
表设计
根据页面获取动态信息,静态直接写死在页面,而动态内容通过数据库维护。
PowerDesigner进行表设计,直观,方便修改,生成建表语句
-
开发
开发步骤:
-
利用表设计创建数据库和表,录入测试数据(正规)
-
先创建pojo对象,Door,OrderDetail,Order
-
Pojo,3点:属性,get,set
-
对象关联
Order
对一,private Door door;
对多,List<OrderDetail> orderDetails
-
创建OrderServlet,使用jdbc访问数据库,把数据封装到pojo对象中(pojo传递数据)
-
创建jsp页面,直接使用美工给的样式表,在页面中通过el表达式来获取数据
-
对日期和c:forEach循环标签来实现日期和合计特殊处理
-
测试,访问servlet,获取数据后转向jsp,最终在浏览器上展现
完成一个大任务时,不要一口气所有代码都写完,再运行,就会出现很多bug,太多时你就不好判断是哪里的问题?一块能独立运行就测试一块,完成后,再继续写下一块的内容。
导入jar包:
-
数据库mysql支持包
-
二维码2个文件,j2se,core
-
jstl.jar
cn.tedu.yhmis.pojo.Order@3da94292 order内存地址
cn.tedu.yhmis.pojo.Door@50408f59 door内存地址
大钟寺北三环店
永和大王数据:
mysql:
/*==============================================================*/
tb_door表
id | door_name | tel |
1 | 大钟寺北三环店 | 010-47472723 |
2 | 火车南站店 | 010-83838718 |
3 | 永和大王(北三环西路店) | 010-62112313 |
/*==============================================================*/
tb_order表
id | door_id | order_no | order_type | persion_num | cashier | create_time | end_time | payment_type | payment | print_time |
1 | 1 | P000021 | 食堂 | 5 | 朱晓霞 | 2018-06-05 11:25:07 | 018-06-05 18:38:11 | 微支付 | 58 | 2018-04-27 07:38:11 |
/*==============================================================*/
tb_order_detail表:
id | order_id | num | item | price |
1 | 1 | 4 | 香菇菜包套餐-ECS<br/>4X --香菇菜包<br/>4X --现磨豆浆(热/无糖)<br/> | 28.00 |
2 | 1 | 2 | 非矾油条 | 10.00 |
3 | 1 | 2 | 鲜肉小馄饨 | 20.00 |
/*==============================================================*/
没有在WEB-INF\classes中生成class文件
1.首先确定project->Build Automatically是否勾选上:
2.然后,再进行测试,能不能进行编译,如果还是不能,则进行手动编译:
project->clean
3.进入clean对话框,选择Clean projects selected below,然后选择OK
4.再次进行测试,如果还是不能编译,那就是项目设置出了问题。项目右键->properties->Java Build Path->Source
将Default output folder设置为Test/WebContent/WEB-INF/classes,点击OK。
5.又再次的进行测试,如果还是不能编译,就检查项目有没有报错,如果报错了,修改掉错误。
6.再次进行测试,如果还是不能编译,就查看其引用的jar包是否报错,如果报错,就remove掉,重新添加即可!
以上几个方法,总有一款适合你!
方法二:
在开始之前,查看Eclipse的problems view,里面可能会告诉相关的错误的原因,一般来说,可能有如下几种情况:
1). 确保 project->build automatically已经被选上.
2). project->clean..->选第2个clean select project, 勾上start build immediatelly
3).删除现在的项目, 重新导入源文件,设置eclipse为保存时编译,然后在保存的时候就可以自动编译了
4).如果项目里引了某个不用的jar包,而那个包又被你删了,就会出现不报错但怎么也编译不出来class文件的情况,可以把所有包都删除,然后一个一个的再引入(需要的),不要一下子把所有包都引入来,没用的可能会引起不良后果.
5). 想删掉某个class文件重新生成,删除class文件后,但classes目录下的文件夹被其它程序打开,比如SublineText。此时编译也不会 通过,在problems下可能会提示“con''t delete classes ……”。关掉其它程序重新编译即可。
6).remove掉 JRE System Library,重新导入即可编译。
7).把build path中所有包都remove掉。然后又add jars,add libraries把需要的加进去。
8).project->properties->java build path->source->.../WEB-INF/src的output folder不要默认,编辑让它指向../WEB-INF/classes然后重新点击build工程即可自动编译。
9).如果你的项目是CVS进行版本控制的项目,查看工程下面是否缺少了work目录,由于CVS控制时不把work加如版本,所以 checkout后没有这个目录,要手工加上有的工程就能自动编译了
作者:Darren
电话:15110448224
QQ:603026148
以上内容归Darren所有,如果有什么错误或者不足的地方请联系我,希望我们共同进步。