py-01-YongHe

 永和大王


目录:

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      培优课程体系

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>&nbsp;</td>
<td>1 X --非矾油条</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>1 X --现磨豆浆(热/甜)</td>
<td>&nbsp;</td>
</tr>
</table>
</div>
<hr/>
<div>
<table>
<tr>
<td>支付宝花呗一元早餐</td>
<td>1</td>
<td>-3.00</td>
</tr>
<tr>
<td>合计</td>
<td>&nbsp;</td>
<td>4.00</td>
</tr>
<tr>
<td>支付宝</td>
<td>&nbsp;</td>
<td>1.00</td>
</tr>   
<tr>
<td>支付宝补贴</td>
<td>&nbsp;</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>&nbsp;</td>
<td>1 X --非矾油条</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>1 X --现磨豆浆(热/甜)</td>
<td>&nbsp;</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>&nbsp;</td>
<td>4.00</td>
</tr>
<tr>
<td>支付宝</td>
<td>&nbsp;</td>
<td>1.00</td>
</tr>   
<tr>
<td>支付宝补贴</td>
<td>&nbsp;</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>&nbsp;</td>
<td>1 X --非矾油条</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>1 X --现磨豆浆(热/甜)</td>
<td>&nbsp;</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>&nbsp;</td>
<td>4.00</td>
</tr>
<tr>
<td>支付宝</td>
<td>&nbsp;</td>
<td>1.00</td>
</tr>   
<tr>
<td>支付宝补贴</td>
<td>&nbsp;</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 test
public 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>&nbsp;</td>
<td>1 X --非矾油条</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>1 X --现磨豆浆(热/甜)</td>
<td>&nbsp;</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>&nbsp;</td>
<td>4.00</td>
</tr>
<tr>
<td>支付宝</td>
<td>&nbsp;</td>
<td>1.00</td>
</tr>   
<tr>
<td>支付宝补贴</td>
<td>&nbsp;</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/ 项目名称 / 资源名称

5   Eclipse中配置jdk

  


day03

动态技术J2ee Servlet+JSP

知识回顾:
3w1h,对每个知识点要why?
  1. 静态页面技术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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。</div>
特殊字符在html中需要单独标识,如果在html有多个空格,html解析时把多的空格就删除了。特殊字符转换,空格转换&nbsp;,转换的字符&作为开始;分号作为结束
<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差异

  1. 早期系统table布局,自适应;现今使用div+css布局,样式更加灵活,美观
  2. T able布局造成页面加载时,如果这个table很大,只有读取到table的结束标签之后,浏览器才会把这部分展现。短暂白屏,才会全部展现。
  3. D iv出现后,div结束的标签浏览器就会直接展现。
表格常用标签
<table><th><tr><td>,th等价于tr,th专用于表头
HTML标签区分大小写吗?不区分
Java区分大小写吗?严格区分大小写
C SS区分大小写吗?严格区分大小写,自己写时习惯小写
2.样式美化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; }
样式有三种方式
  1. (系统有一个全局的样式表)全局的标准标签body,table,tr
  2. (用的最多)在页面的标签上class= me ,在样式表中.me{},局部修饰,可以多次调用,重用/复用
  3. (form表单使用)在页面的标签上id= me ,在样式表中#{},局部修饰,至少在这个页面中应该保证使用一次  二维码

 3.二维码

直接应用,java培优非常好学,这些东西都是高手写出来,在市场上广泛使用。它的稳定性,性能,安全等等指标,经过千锤百炼! 拿来主义 ,只应用!(适应初级程序员)
N ginx(c), R edis(c),mycat+mysql阿里,rabbotmq(erlang并发,爱立信出品,在银行业和电信业广泛使用)、微服务dubbo(java)阿里、docker(go并发)容器化技术
Hadoop离线分析(java)Spark(实时分析)(scala,下一代java)jdk1.8引入函数式编程
二维码应用
  1. 图片高度和宽度
  2. 生成图片路径
  3. 调用谷歌第三方jar,有两个jar包:放在WebContent/WEB-INF/lib
core-3.3.2.jar\com\google\zxing
javase-3.3.2.jar\com\google\zxing
执行程序的方式:
  1. main函数,public static void main (String[] args){},在main还有static,运行java application
  2. @Test junit单元测试,运行Junit Test,在一个类中可以写多个@Test
@Test
public void getValue(){}    普通方法
解决未知技术应该怎么做呢?
  1. 问人,问同事,问技术好
  2. 百度,推荐demo,如果技术难度比较大,不做读百文多看评论CSDN
  3. 官网,规范,严谨; 不好的地方,写文档的人还不如普通的开发者!
  4. 书,太多垃圾,断片;看补足底蕴。会讲很多理论。
今天任务:
  1. 动态技术J2ee Servlet+JSP
Servlet被SpringMVC Controller
Servlet3.0会使用注解方式 @Web 标签
JSP(用的最多的标签就是HTML标签),EL(${name})+JSTL(taglib c:forEach做循环),
2)创建JavaWeb项目,配置自己的jdk,Servlet和jsp是有运行环境的?Web中间件Tomcat
环境配置:
  1. jdk,怎么给我们的项目指定jdk?
J dk现在有多个版本,jdk1.4,目前jdk1.7,趋向jdk1.8
jdk1.9,jdk1.10,jdk1.11,宣布废弃java
企业追求什么样的技术?
  1. 最新技术
  2. 最稳定、安全的技术(企业最喜欢)
企业技术 落伍
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的版本
修改第三处
为什么我们要改这么多处?
E clipse插件机制,base基础,其它公司可以在这个的基础上增加 插件 按它的规范编写代码,扩充它的功能。
很多公司的很多的插件。
配置Web中间件Tomcat
E clipse做的不好用,配置非常啰嗦,
  1. 有一个单独的窗口来管理Servers
  2. 主流tomcat7怎么配置它,要增加到eclipse
  3. 把tomcat7和项目yh绑定,运行Servlet就放在指定tomcat中运行
没有有效server,没有一个可用server。

 

 

 

 

配置当前项目到tomcat中
先选中项目yh,点击add按钮,把项目添加到tomcat中,
这样在tomcat运行时就会自动启动yh项目,这样可用执行Servlet和JSP。

 

如果已经有tomcat启动,就会报端口冲突

 

E clipse给我们提供了更加方便的修改server.xml的方式
修改3个端口8005,8080,8009,一般加10
访问文件的方式:
通过网络的方式:
http网络协议
localhost本机,测试,ip地址,域名
8090端口号,找到tomcat
y h是项目名称
HelloWorld.html 在WebContext下
它们之间怎么隔开的,用户/
开发步骤:
  1. 保证你有一个绿色解压版的Jdk
  2. 解压到硬盘D:\java\env\ D:\java\env\jdk1.7.0_72
  3. 把jdk和eclipse关联起来 

  4. 把配置的jdk和项目关联起来 
把tomcat配置开发步骤:
  1. 把绿色解压版解压 apache-tomcat-7.0.59
  2. 把tomcat和eclipse关联
3.把tomcat和yh项目关联
运行环境Servlet,JSP
  1. Servlet2.3,SpringMVC Controller
  2. Servlet3.0 注解方式(京淘)@Web
  3. 利用eclipse创建Servlet

 

如果有错,是不能运行的,意味着必须先把所有的错误解决。
错误分为两种:
  1. 编译错误,保存文件时,自动去进行编译
  2. 运行时错误,运行时访问、调用才出错
J avax,jdk,j2ee中规定它行为,没有具体去实现,
交给第三方的Web中间件厂商去实现。
是第三方的就需要导入jar包。
怎么和我们的项目yh关联?
如果把servlet-api.jar直接放入到WebContent/WEB-INF/lib下
在tomcat启动后它就会发现有两个这个jar包,一个在上面项目中,一个在自己的lib目录中,它该调用谁?
它无法解决,就报错。
正确的姿势:

 

 

4.在控制台上打印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");
         }
5.在浏览器上怎么访问
保证项目发布到tomcat中
启动tomcat服务,手动启动(推荐:debug模式)
在浏览器上访问
注意Servlet它特殊,它就不需要后缀

 

什么样的第三方jar使用拷贝jar到WEB-INF/lib下?
什么样的第三方jar使用项目的引用新增额外jar包?
S ervlet.jar引用lib下,是不会被拷贝到最终的tomcat中,它只在eclipse中使用。
二维码,tomcat中有吗?没有,必须放在WEB-INF/lib
剖析servlet3.0结构:
1) @WebServlet("/HelloServlet") 注解
@WebServlet规范中的,目的就是把后面的字符串作为,在浏览器访问时路径值
2.JSP
最早j2ee规范中只有servlet,
简化 HTML标签这种内容
jsp访问地址
放在WEB-INF下的文件不能浏览器直接访问
在外面WebContext这个文件能否直接访问?能
jsp对于html,通吃!html内容在jsp中完全通用。
需求:在jsp中店名变成动态
开发步骤:
  1. 准备数据(准备店名)
  2. 在jsp中获取并展现这个信息
比较
  1. H tml 纯静态,不可改变
  2. S ervlet 后台运行,访问数据库获取数据
  3. J sp 负责展现,把html都拿过来,然后加动态支持el表达式(${name})
小结:
  1. HTML静态网页,通过很多预定义标签<html><body><div>,展示了一个网页,和txt纯文本?txt是只是数据没有修饰,静态网页,可以通过标签+css样式修饰实现页面更加美好,txt不支持图片,HTML图文并茂
  2. HTML缺点,一旦写死就不能变化。出现动态页面技术纯Servlet,里面使用的java语句。
  3. Servlet它要加html标签,代码太混乱,工作量大,重复代码。出现jsp技术
  4. J sp页面全部包容html标签,额外增加了一些el表达式${doorName}
Servlet中:
String doorName = 大钟寺店 ;
request.setAttribute( doorName ,doorName);
转向Order.jsp
Jsp中:
J sp页面可以获取到request对象,这个中放置doorName
Order.jsp加载时看${doorName}
这个内容就会找request中有没有doorName,就把对应值获取到。
内容就可以动态来实现
总结:servlet加工获取数据(业务逻辑)
环境配置:
在eclipse中配置jdk和tomcat
  1. jdk安装版1.8
1.7 add(arg01,arg02)
1.8 add(arg01,arg02,arg03)
1.7 update()  删除线,过期,在后期版本中就可能删除掉
1.8 没有update方法了,
在实际开发中,会规定项目的版本
在实际开发中,项目的jdk版本能升级吗?dubbo
2.怎么指定eclipse对应的jdk版本?
a.在eclipse环境中配置jdk1.7
b.把配置的jdk和项目yh关联
C :\programe files\java
Java 代码解析,c:\\programe%20files\java
3.怎么指定eclipse对应tomcat版本?
T omcat称为web中间件,支持servlet和jsp运行。不管旧三大框架struts2+spring+hibernate,新三大框架springmvc+spring+mybatis都是在servlet和jsp技术上发展起来的。
a.给eclipse配置一个tomcat
b.把tomcat和项目关联
c.访问
http://127.0.0.1:8090/yh/Order
4.创建Servlet3.0 引入注解@WebServlet( /Order
5.Serv let就按java代码来编写,写业务逻辑(加工过程)

 

作业:
  1. 再安装一个jdk1.9
  2. 再安装一个tomcat8
  3. 写一个servlet3.0
  4. 写一个order.jsp
  5. 把html和servlet+jsp请求过程画图

day04

知识回顾:

  1. J dk 一台机器上可以安装多个版本的jdk。企业中有很多项目,旧的项目需要维护jdk1.6;开发新的项目jdk1.7。配置eclipse指定jdk。项目在开发时就会使用我们指定版本。
在eclipse怎么项目的jdk环境?
javaWeb配置3处:a.Build Pach, b.Compile 编译,c. facets(每个功能是不同厂家完成,每个厂家的工具(eclipse 插件)都有自己的配置)

  2.Tomcat web中间件,支持servlet和jsp的运行环境。

J avax,java扩展,很多就不是java自己实现,java只是定义规范,其他厂商为了使用这个东西,就要按照规范来写一个实现。
Tomcat就实现Servlet规范
a.把它在eclipse中创建
b.我们要把tomcat和项目关联 
c.启动tomcat,tomcat就会运行相关项目(部署、发布)

 3.Servlet

动态,可以执行业务逻辑,加工处理
利用eclipse来创建一个Servlet3.0类,利用eclipse提供模板
特点:
a.在它的类上有一个标识,称为一个注解@WebServlet,注解中有一个字符串,和类名完全一致,但是/HelloServlet。
b.类有doGet(直接在浏览器上输入地址),doPost(表单,登录)
c.总有两个参数HttpServletRequest request请求,HttpServletResponse response响应
d.返回 request.getRequestDispatcher("Order.jsp")
            .forward(request, response); 通过request和response对象给jsp传递值
e.传值 request.setAttribute( key,value) ; key唯一,value随便

 4.Jsp

负责数据最后展现
a.完全兼容所有的html标签+css
b.它可以通过servlet准备数据,在jsp中利用EL表达式${doorName},它内部就去遍历request,找key 为doorName的,如果有就返回它里面的值,如果没有就不抛出错误,直接显示空。
c.特点就是动态,它的值可以变化。而html写死。
扩展:
J sp文件放入到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动态呢?
S ervlet是可以做到的,但是它自己不能独立完成,需要数据库来管理数据,它从数据库获取数据。
今日任务:
  1. 数据库,主流数据库mycat+mysql免费(开源),Oracle(性能最好的,收费),sqlServer(最好用好,性能,安全性都一般,闭源)
  2. M ysql基础操作,CRUD,信息维护,增删改查
  1. 数据存储的地方,数据库
概念:
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,有唯一性
M ysql数据库,维护数据
开发步骤:
  1. 有mysql数据库程序服务端
  2. 创建一个数据库store-yhmis,乱码utf-8
  3. 创建一张表tb_door(设计习惯tb_前缀),创建时指定字段,类型,长度,主键
  4. 新增数据Insert
  5. 修改数据(修改电话)Update
  6. 信息无用,删除 Delete
  7. 查询 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
mysq l代表mysql.exe执行程序,数据库给我们提供客户端工具
-u参数,username用户名,后面紧跟用户名,当mysql安装时默认用户名,叫root
-p参数,password密码,设置密码
常用数据库命令:
数据库中命令是以分号结尾
  1. exit;        退出mysql数据库环境
  2. mysql中有哪些数据库?
怎么创建自己的数据库呢?解决乱码问题?
create database yh; 创建完数据库是有问题的,中文存入会乱码。
创建数据库时要设置字符集
create database yh default character set utf8;
创建一个yh数据库,并且设置它的字符集为utf8;
不设置字符集,mysql默认它的字符集lantin1,相当于网页ISO-8859-1
打开要使用的数据库
use yh;     打开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
多个单词之间下划线隔开

 6.查询数据

select * from tb_door;查询所有的数据
7)特殊SQL
drop database yh;    删除yh数据库
drop table tb_door; 删除表tb_door
show create table tb_door; 查看创建表的sql语句
desc tb_door;    查看表的结构
修改信息
把tb_door中id=1数据它的电话修改为112
update tb_door set tel= 112 where id= 1
  1. 备份数据,测试库
  2. 写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
T icket 1张
用户1,1,支付,支付成功买到了票,总票数=0
用户2,0,不能买
高并发情况下,同时很快去操作
用户1,1,支付,啰嗦,密码试了几次,终于找到了,
在用户1尝试过程中,用户2查表,1,动作快,直接支付,总票数1-1=0
用户1密码成功了,开始支付,但是它会没票
多限定了一个where条件,把要修改的旧的值作为一个where条件
W here 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,它可以本地访问。
在实际开发过程,安装测试服务器上,测试库。
M ysql数据库客户端程序,sqlyog/navcat第三方工具

 常见问题:

  1. 端口号,安装时配置,别人要告诉你(系统管理员)
  2. M ysql服务没有启动
查看服务,如果未启动,手动启动即可
  1. 删除数据库

 

注意创建数据库时,如果有中文,必须设置字符集为utf-8;
创建数据库
创建表

 

查看数据
新增数据
 

小结:
  1. why?为什么需要数据库?
CRUD操作,如果有1个月的永和大王大钟寺门店订单。
数据挖掘:(统计查询)
a.这个门店中这个月的销售额
b.畅销产品 order by desc,滞销产品 order by
c.优秀员工,谁卖的多,每个订单收银员,单数和总金额
d.工作效率,结账时间-开单时间,时间越小越好

 2.概念:

a.数据库 database
b.表 table
c.字段 colume/field
d.类型 datatype int/varchar(n)/double/timestamp时间戳
e.主键 primary key,唯一标识一行数据
f.自增 auto_increment +1,底层自动管理

 3.数据库database

数据一个集合,数据会存储下来。 M ysql底层是文件。
M ysql就是默认数据库
M ysql中数据库本质就是file文件。最终保存在磁盘上。
字符集问题,创建库时候指定,默认lantin1=ISO-8859-1,如果存中文就乱码???。
指定数据库
一个项目一个数据库 

 4.表table,一个数据库中隔离业务

create table
注意字段+类型+长度

 5.主键+自增 

 6.常规操作

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=1
select * 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

知识回顾:

  1. 数据库,因为数据方便存储,通过SQL结构化查询语言Struction Query Lanuage。不光完成数据维护(新增、修改、删除),查询(统计查询)
  2. 关系型数据库Oracle、 MySQL 、SqlServer,非关系型数据库no sql Redis (key,value)KV数据,mongodb(json带格式的一个字符串 {abc}),hbase(列式存储)
  3. 概念:
a.数据库database, mysql,隔离不同的项目,yhdb,jtdb
b.表table,在一个项目中有很多的业务:购物车表,订单表
c.字段column,field,一个表中有很多信息,可以划分成很多的字段,字段最小单位不能分拆
d.类型datatype,数据库对不同类型的数据要进行存储
int/tinyint/double/varchar/timestamp
e.主键 primary key,唯一的标识这一条的记录
f.自增 auto_increment(mysql独有的)+1,数据库底层会记录这个表的主键的最大值

 3.基础的SQL语句

g. create database yhdb;   默认的字符集lantin1,相当于iso-8859-1
h. create database yhdb default character set utf8;
i. create table tb_door(id int not null auto_increment,door_name varchar(200),tel varchar(20), primary key(id)); 创建表,3个字段,类型,主键,自增
j. show databases;     展示所有的数据库
k. show tables;        展示某个库的所有的表
l. use yhdb;           打开某个数据库,它就作为当前数据库
m. show create table tb_door;      展现表的创建的sql语句
n. desc tb_door;  展现表的结构
o. drop table tb_door;     删除表,自增管理也被删除了
delete from tb_door;    只删除内容,不会把自增删除。
p. drop database yhdb; 删除库,所有的数据都丢失
5)最常用SQL语句
    CRUD操作,新增,修改,删除,查询
a. 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);
b. update tb_door set tel= 119 where id=1
c. update tb_door set door_name= dzs ,tel= 119 where id=1
d. delete from tb_door where id=1 ;
e. 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; 底下性能比上面的高

 5.使用客户端sqlyog

把门店信息表实现
  1. 表设计,在概要设计时就开始表设计,在详细设计中继续细化,在详细设计完成,表设计就完全完成了。在实际开发中也会局部修改。
  2. 表名tb_door,字段们id,door_name,tel,字段类型,长度
  3. 实现建表SQL语句
在业界有标准表设计工具,PowerDesigner,以图形展现,看着方便直观,可与直接产生建表SQL语句。
安装PD
  1. PowerDesigner15.1汉化破解版.rar
破解
  所有的文件覆盖下面目录即可
C:\Program Files (x86)\Sybase\PowerDesigner 15
然后运行就可以。汉化不彻底。
安装时选择语言(下拉框)选择PRC中文(最长的那个)同意协议,
然后一路next
    
4.录入数据
5.查询数据
在实际开发中怎么使用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
  1. 导入jar
这些对象都选择java.sql下的
No suitable driver found for jdbc:mysql231://localhost:3306/yh
没有匹配驱动,
错误原因:url写错了
解决方案:修改成正常的
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,无效的值
问题:
  1. 有两次数据库访问
  2. 大量的代码重复
优化:
String doorName,String tel
Door对象,有两个属性doorName,tel
开发步骤:
  1. 创建Door对象,有两个属性doorName,tel,一次数据库访问
  2. 可以分别设置doorName和tel。setDoorName,setTel,对象就能保存两个值
  3. 可以从Door对象中获取 getDoorName,getTel
特性:这种对象pojo对象(传递数据)
  1. 它有属性字段
  2. 每个属性有set方法
  3. 每个属性有get方法

 

解决2个问题:
  1. 不能多次访问数据库,合并一次
  2. 方法要返回多个值
解决方法:
不能用普通对象String一次只能一个值
使用java中pojo对象
P ojo对象特点:
  1. 多个属性值 private Integer id/private String doorName/private String tel
  2. 设置这个属性值,通过给每个属性设置set方法
  3. S ervlet中获取这个值,给每个属性增加一个get方法
鼠标右键,source菜单,选择生成get和set方法项,会自动生成相应代码
使用:pojo对象传值,步骤:
1)创建pojo对象 Door door = new Door();
2)调用这个对象set方法给它设置值 door.setId(rs.getInt( id ));
3)在servlet中获取
对象是有作用域,方法内部创建的对象,出了这个方法就不能用了。
while(rs.next()){
}
方法调用过程
小结:
  1. PD powerdesinger设计工具,主要用来表设计
  
文件保存pdm物理数据模型
对初级程序员,会看,会找到建表sql语句
  1. 程序就要从数据库中获取数据
q.写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();
在项目中获取数据库的数据
  1. 在servlet中增加一个获取数据库的方法
public String getDoorName();    //获取数据库的表中的门店数据
public String getTel();      //获取电话
访问数据库的次数太多,重复的代码也太多了。

 2.改造优化下

多个数据库访问合成一个
把内容一次查出,放入一个对象中,一个对象可以有多个属性
在java世界中把这个对象就称为pojo对象。对象就是传递数据的。
P ublic 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
P ojo对象特点:
  1. 多个属性,private修饰符
  2. 对应每个属性设置方法setXxx
  3. 对应每个属性获取方法getXxx
J dbc淘汰,不会直接写这些代码,框架封装,Mybatis

day06

课改:
学习方式:
  1. 按部就班一步一步踏实脚印走(太多啰嗦地方)java面向对象,封装,继承,多态
  2. 另辟蹊径(拔苗助长,我还不会走,老师就让我跑)
田忌赛马
我们学员
资深的技术人员:项目经理,技术经理,架构师,技术副总
弱项:java基础、javaWeb、3大框架
(面试技巧,最重要是表现自己好学和渴望进入这家公司态度)
强项:
J ava1991年17年了,市场上企业中有大把java程序员,在企业中通过非常多的项目来真实锤炼,周期3-20年。真实企业环境。
在培优课程中优势:
  1. 互联网架构为核心
D ocker容器化,1s启动一个服务,瞬间达到百万级别(阿里双11,2017,2018都是运行在docker之上)
N ginx+redis(x)+mycat
R abbitmq+docker+dubbo
J soup 爬虫,薪资9k+
L ucene+solr/es 10K+全文检索工程师,自己百度
2)大数据项目
H adoop,HDFS,flume,hive,storm,zookeeper,kafka
真实项目网络流量日志分析PV,UV,VV
弱项:在工作中接触的技术的面小!越大公司越窄。跳槽!
对新技术消化能力差,(为了现有系统稳定,不可能直接把新的技术引入)但是它渴望,企业渴望!
技术变化非常快!它虽然很难实质推动企业技术变更,但是他希望有人来做这个事情,
大多企业:
大型,互联网架构+大数据
中型,dubbo互联网架构+ssm(springmvc+spring+mybatis)三大框架
小型,ssh(struts2+spring+hibernate)
J sp动态网站,和服务器可以交互。
传递参数,活动,和数据库一结合,这些数据就能从数据库获取。当数据库修改了,这些页面的数据重新加载页面时,就变化成新的内容。
Servlet负责数据准备,传递给jsp页面。
    从数据库获取数据jdbc,数据返回值给变量
    String doorName = getDoorName(去访问数据库返回店名)
     S ervlet是如何把信息传递给jsp(request)
request.setAttribute( key,value);
request.setAttribute( doorName ,doorName)
//把请求转发到order.jsp页面,把参数对应值都传递给jsp页面
request.getRequestDispatcher( /WEB-INF/views/Order.jsp , ).forward(request,response);
J sp负责页面的展现
    展示html标签,tomcat直接翻译,静态页面
    动态的信息doorName,在jsp中如何获取呢(el表达式)
    ${doorName}内部回去request找,key= doorName ,如果找到把value值进行返回。如果没找,就返回空,在页面上就什么也不展示。
R s.getInt( id
getInt而不叫getInteger
在于作者的目的。返回int
在java中两类变量:
  1. 基础变量int,double,long,char,b oo l ean
  2. 对象变量 Integer,Double,Long,String,Boolean
最大的差异:基础变量都有默认值,而对象变量的默认值都是null
int=0;double=0.0
需求:考试,一个学员考试,有成绩。
int =0,(int i=-1)
Integer =null
    基础变量存储的空间小,对象变量存储空间大!内存
Java中尽量使用对象变量(面向对象编程)
如果是在做通信程序,推荐使用简单变量
M ysql数据库实质文件类型。
早期的mysql是直接和mysql/test默认的数据库放在一起的。
现在版本换地方,从一个文件中看到,全局mysql配置文件mysql.ini(ini微软习惯配置信息的一个文件)
M ysql提供数据库所在位置
C:\Program Files\MySQL\MySQL Server 5.5\data\mysql
这是一个隐藏目录!
数据库包括表其实mysql本质文件,它把这些信息组织后,存储成二进制文件。 M ysql数据库自己来维护。
String doorName = 大钟寺门店 ;     单独进行数据库访问写成一个方法(函数)getDoorName(jdbc,返回值string)
String tel = 110 ; 单独进行数据库访问,把上面的方法拷贝,然后修改获取值的地方
缺点:
  1. 大量重复代码
  2. 数据库进行多次链接
解决方案:
  1. pojo对象,因为这个做后,可以支持返回多个值
  2. 查询数据库就合成了一个方法(一次查询),
  3. 返回值就变成pojo,代码怎么设置pojo? Door door = new Door();利用pojo对象每个属性的set方法去设置即可
  4. 需要属性怎么获取,就利用pojo的get方法获取。
找出需求中的动态数据,这些数据就需要放在数据库中,方便维护!

特殊的表名,列名
SELECT * FROM `order`;
''
` 刀秋
创建表的主键
尽量的和业务无关,如果业务唯一性不能保证,我们的表丝毫不受影响!
C har和varchar有什么区别?
C har固定长度,查询的性能高,但是不宜太长,会浪费我们的存储的空间
V arcar变长,长度变化,查询的性能低,存储不会浪费空间
F k  外键 forgein key
表设计
如何从用户原始需求中提炼数据库表?
  1. 原始界面中逐字分析
  2. 把信息分成几类:静态内容和动态的内容。把静态内容就排除在外。
  3. 怎么把信息拆到不同的数据库表中
a. 从上向下分析,如果遇到动态内容,第一遇到先创建一个表
b. “ 店名 这个信息是描述什么的,一般就会以关键信息点作为表名tb_door
c. 遇到 电话 ,首先判断是否属于当前这个表的内容,电话就是属于描述门店信息的,所以就成为这个表的字段。
d. 遇到 账单号 ,也是判断是否属于当前这个表,不属于描述门店的信息,创建新的表。创建订单表。 tb _order
e. “ 账单类型 看它从属我们哪个表,明显属于订单表
f. “ 订单数量 判断是否从事现有的表,它描述的和上面的表的分类都不相同,又创建新表tb_order_detail。如果感觉它也可以属于订单表,可以先放放试试,如果把这个内容放入到订单,其它字段内容,而且大多的字段,内容都重复。如果其中一个修改,这多条数据都有随之修改。如果发生这样的事情,表就设计的有问题,不能大量重复,就把信息拆开,形成了新表。
g. 合计不能放入,要求:如果这个字段的内容可以由其它字段加工而成,这样的内容不能放入到数据库中。合计=数量*单价,累加
h, “ 微支付 要同时多看几张订单,就可以拆除,这个内容含有两个信息,只是表达的比较隐晦。它的值有:微支付和支付宝支付,现今支付。拆成两个字段:支付类型,和支付金额。
i. “ 打印时间 可以放入数据库表(后期对打印时间做统计),也可以不放入(不去统计时,不用放入表)。

 

 

/*==============================================================*/
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;
/*==============================================================*/
M ysql+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_detail
WHERE order_id=1;
返回3个字段和3条记录,
数组
解决一条OrderDetail pojo
List<OrderDetail> 数组<泛型>,泛型是告诉我们数组里每个元素的值的类型是谁
J sp最终获取数据不想去3个对象中获取,就像直接从一个对象中取获取
Order有两个特殊属性标识对象之间关联
    对一:门店 Door door;
    对多:订单详情List<OrderDetail>
在jsp页面中遍历集合,使用JSTL java支持标签库
开发步骤;
  1. 引入jar
/yh/WebContent/WEB-INF/lib/jstl-1.2.jar

2.Jsp中先引入taglib

<%@ taglib prefix="c" uri=" http://java.sun.com/jsp/jstl/core " %>

 3.在Jsp引入 c:forEach

<c:forEach items="${order.orderDetails}" var="o">
I tems填写request集合元素,必须el写法
var起每行别名
日期处理
  1. 修改pojo返回参数类型String printTime;
rs.get Date ("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表达式
小结:
  1. 和数据库进行查询,查询3次,查询出某个订单,通过这个订单获取door_id,通过door_id获取它门店对象信息,然后在通过订单orderId去找所属的订单详情的一个集合List集合。
  2. 数据库查询后的返回值
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

知识回顾:

  1. 体现面向对象
J ava面向对象开发语言,组织数据结构时和面向过程不同。
实现数学函数,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也需求修改,页面改变)
如果是面向对象,修改量变小了(页面改变)
面向对象在思考时考虑比较多,但是这样的好处在用户需求变更下,修改的代码量非常小。
P ojo对象关联
订单和门店,多对一,pojo Order 对一      Door door;
订单和订单详情,一对多,pojo Order 对多  List<OrderDetail> orderDetails/odList
怎么完成整个流程?
  1. 从数据库查询数据,放到pojo对象中
a. 从数据库分别查询订单,门店,某个订单详情,3次
b. 把它们设置到对一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();
     o d. setNum(rs.getInt( num ));
     odList.add(od);     //把每个对象加入到数组中
}
order.setOrderDetails(odList);

 2.把pojo传递给jsp

 3.在jsp中以el表达式,jstl标签库(更复杂)展现

自己总结文档,
典型案例:
  1. 一对一,单个对象
  2. 一对多,多个对象关联
  3. 门店,订单,订单详情;学校,班级,学生
  4. 日期处理
  5. 合计

永和门店系统开发过程:

  1. 需求调研《需求说明书》
  2. 设计阶段,概要设计《概要设计说明书》,继续细化《详细设计说明书》,PowerDesinger表设计
  3. 开发,编码,调试(最耗时)
  4. 测试
  5. 维护
  1. 表设计
根据页面获取动态信息,静态直接写死在页面,而动态内容通过数据库维护。

PowerDesigner进行表设计,直观,方便修改,生成建表语句

 2.开发

开发步骤:
  1. 利用表设计创建数据库和表,录入测试数据(正规)
  2. 先创建pojo对象,Door,OrderDetail,Order
a. P ojo,3点:属性,get,set
b. 对象关联
Order
对一,private Door door;
对多,List<OrderDetail> orderDetails

 3.创建OrderServlet,使用jdbc访问数据库,把数据封装到pojo对象中(pojo传递数据)

 4.创建jsp页面,直接使用美工给的样式表,在页面中通过el表达式来获取数据

 5.对日期和c:forEach循环标签来实现日期和合计特殊处理

 6.测试,访问servlet,获取数据后转向jsp,最终在浏览器上展现

完成一个大任务时,不要一口气所有代码都写完,再运行,就会出现很多bug,太多时你就不好判断是哪里的问题?一块能独立运行就测试一块,完成后,再继续写下一块的内容。
导入jar包:
  1. 数据库mysql支持包
  2. 二维码2个文件,j2se,core
  3. jstl.jar
cn.tedu.yhmis.pojo.Order@3da94292       order内存地址
cn.tedu.yhmis.pojo.Door@50408f59        door内存地址
大钟寺北三环店




爬虫比价器 

              培优  陈子枢- 1920-9520-78

爬虫比价器

内参保密不得外传
达内Java培优方向
陈子枢 主讲
QQ: 1920-9520-78
http://dobetter .tedu.cn
2017
  1. 第一天:爬取新闻网站

    1. 比价器系统

      1. 比价系统功能

  • 利用Jsoup爬取每个页面的商品信息
  • ECharts柱状图、曲线图
2.工作原理
利用每个电商网站的搜索条查询同样的条件,例如:iphoneX,然后发现其规律
通过url传递了查询条件。
抓取步骤:
  1. 用户输入查询条件
  2. 分别到每个电商网站访问,利用其查询出它们网站的对应商品
  3. 获取其列表页面中第一个商品的链接
  4. 利用jsoup爬取每个页面的商品信息
  5. 把商品信息入库并设置爬取时间
  6. 使用ECharts进行进行价格的比较
  7. 拓展:ECharts实现抓取价格柱状图、饼形图、曲线图

 2.涉及的技术点

  1. JavaScript

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。

 2.json

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

3.HttpClient

HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 
注意:不要随意升级版本,每次大版本内容api变化比较大。

 4.Jsoup

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

3.爬虫新闻

 5.Httpclient

package test;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
public class TestPrice {
@Test
public void taobaoItemPrice() throws IOException{
String itemId = "560563554738";
String url = "http://mdskip.taobao.com/core/initItemDetail.htm?isRegionLevel=true&itemTags=385,775,843,1035,1163,1227,1478,1483,1539,1611,1863,1867,1923,2049,2059,2242,2251,2315,2507,2635,3595,3974,4166,4299,4555,4811,5259,5323,5515,6145,6785,7809,9153,11265,12353,12609,13697,13953,16321,16513,17473,17537,17665,17857,18945,19841,20289,21762,21826,25922,28802,53954&tgTag=false&addressLevel=4&isAreaSell=false&sellerPreview=false&offlineShop=false&showShopProm=false&isIFC=false&service3C=true&isSecKill=false&isForbidBuyItem=false&cartEnable=true&sellerUserTag=839979040&queryMemberRight=true&itemId="+itemId+"&sellerUserTag2=306250462070310924&household=false&isApparel=false¬AllowOriginPrice=false&tmallBuySupport=true&sellerUserTag3=144467169269284992&sellerUserTag4=1152930305168967075&progressiveSupport=true&isUseInventoryCenter=false&tryBeforeBuy=false&callback=setMdskip×tamp=1420351892310";
HttpClientBuilder builder = HttpClients.custom(); 
builder.setUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)"); 
CloseableHttpClient httpClient = builder.build(); 
final HttpGet httpGet = new HttpGet(url); 
httpGet.addHeader("Referer", "http://detail.tmall.com/item.htm?id="+itemId+"&skuId=68347779144&areaId=110000&cat_id=50024400&rn=763d147479ecdc17c2632a4219ce96b3&standard=1&user_id=263726286&is_b=1"); 
CloseableHttpResponse response = null; 
response = httpClient.execute(httpGet); 
final HttpEntity entity = response.getEntity(); 
String result = null; 
if (entity != null) { 
result = EntityUtils.toString(entity); 
EntityUtils.consume(entity); 
} 

//商品价格的返回值,需要解析出来价格 

result = result.substring(10, result.length()-1); 
}
}

6.Jsoup

package test;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
public class TestNew {
@Test
public void site() throws IOException{
String url = "http://ent.qq.com/a/20171117/007399.htm";
String html = Jsoup.connect(url).execute().body();

System.out.println(html);
}

@Test
public void title() throws IOException{
String url = "http://ent.qq.com/a/20171117/007399.htm";
Document doc = Jsoup.connect(url).get();
Elements els = doc.select(".hd h1");
Element ele = els.get(0);
String title = ele.text();

System.out.println(title);
}

@Test
public void img() throws IOException{
String url = "http://ent.qq.com/a/20171117/007399.htm";
String imageUrl = Jsoup.connect(url).get()
.select(".Cnt-Main-Article-QQ p img")
.get(0)
.attr("src");

System.out.println(imageUrl);
}
}

7.抓取价格 json

2017年4月,京东开始对价格进行反爬虫控制,访问过多的IP地址会被禁止。
@Test    //价格
public void getItemPrice() throws IOException{
String url = "http://p.3.cn/prices/mgets?skuIds=J_3882469";
String json = Jsoup.connect(url).ignoreContentType(true).execute().body();
JsonNode jsonNode = MAPPER.readTree(json);

//解析完数组,获取数组第一条数据,获取它的p元素值
Double price = jsonNode.get(0).get("p").asDouble();
log.debug(price);
}

8.抓取描述 - jsonp

@Test    //商品描述
public void getItemDesc() throws IOException{
String url = "http://d.3.cn/desc/3882469";
String jsonp = Jsoup.connect(url).ignoreContentType(true).execute().body();
String json = jsonp.substring(9, jsonp.length()-1);      //把函数名去掉
JsonNode jsonNode = MAPPER.readTree(json);

String desc = jsonNode.get("content").asText();
log.debug(desc);
}

 2.第二天:爬取京东商城

4.抓取的五种方式

9.抓取页面

@Test     //抓整个页面
public void html() throws IOException{
String url = "http://tech.qq.com/a/20170330/003855.htm";
//doc代表一个页面
String html = Jsoup.connect(url).execute().body();
System.out.println(html);
}

10.抓取整个网站

@Test   //抓整站,找到所有a链接,然后进行广度优先/深度优先进行遍历
public void getAllATag() throws IOException{
String url = "http://tech.qq.com/a/20170330/003855.htm";
//获取到页面
Document doc = Jsoup.connect(url).get();
//获取到页面中的所有a标签
Elements eles = doc.getElementsByTag("a");
for(Element ele : eles){
String title = ele.text();          //获取a标签的内容
String aurl = ele.attr("href");       //获取a标签的属性
log.debug(title+" - "+aurl);
}
}

 11.抓取标题 - 页面上的内容

可以多级父子样式嵌套
@Test    //京东商城,商品标题
public void getItemTile() throws IOException{
String url = "https://item.jd.com/3882469.html";
Document doc = Jsoup.connect(url).get();
Element ele = doc.select(".itemInfo-wrap .sku-name").get(0);
String title = ele.text();
log.debug(title);
}
@Test    //当当商城,商品标题
public void getDDItemTile() throws IOException{
String url = "http://product.dangdang.com/1052875306.html";
Document doc = Jsoup.connect(url).get();
Element ele = doc.select("article").get(0);
String title = ele.text();
log.debug(title);
}

12.抓取价格 json

2017年4月,京东开始对价格进行反爬虫控制,访问过多的IP地址会被禁止。
@Test    //价格
public void getItemPrice() throws IOException{
String url = "http://p.3.cn/prices/mgets?skuIds=J_3882469";
String json = Jsoup.connect(url).ignoreContentType(true).execute().body();
JsonNode jsonNode = MAPPER.readTree(json);

//解析完数组,获取数组第一条数据,获取它的p元素值
Double price = jsonNode.get(0).get("p").asDouble();
log.debug(price);
}

13.抓取描述 - jsonp

@Test    //商品描述
public void getItemDesc() throws IOException{
String url = "http://d.3.cn/desc/3882469";
String jsonp = Jsoup.connect(url).ignoreContentType(true).execute().body();
String json = jsonp.substring(9, jsonp.length()-1);      //把函数名去掉
JsonNode jsonNode = MAPPER.readTree(json);

String desc = jsonNode.get("content").asText();
log.debug(desc);
}

5.爬取京东

抓取商品先要找到商品ID,有两个方案:
方案一:商品ID是一串数字,猜测它是自增的,于是我们可以是做一个自增的循环。但如果商品的ID不是连续,会造成很多访问无法继续访问,报链接超时。
方案二:找到网站的所有商品的列表页面,解析html找到商品的ID,这个方式解析麻烦些,但商品ID直接可以获得。
所有一般来说都是采用第二种方案。
分类、商品列表、商品详情
那抓取京东网站就变成抓取所有分类,按分类找到商品列表页面,从商品列表页面抓取出商品ID,最终循环商品ID,抓取所有商品详情页面,解析商品详情页面,找到所有商品的详细信息。
断点抓取、离线分析
京东有近 22 个大类 143 个二级分类 ,1286 三级分类, 8615683 种商品,近九百万种商品。如果持续在线抓取,会很快比屏蔽。也不方便测试。所以我们采取断点抓取,离线分析。先将分类抓取,将榨取后的信息保存到磁盘中,后期对磁盘中的文件进行分析入库。

14.抓取商品分类

@Test //抓取商品分类(22,143,1286),http://www.jd.com/allSort.aspx
public void itemCat() throws IOException{
String url = "http://www.jd.com/allSort.aspx";
Document doc = Jsoup.connect(url).get();

Elements level1 = doc.select("h2 span");
log.info("大类总数:"+level1.size());
for(Element ele : level1){
log.info(ele.text());
}

Elements level2 = doc.select("dl dt a");
log.info("二级分类总数:"+level2.size());
for(Element ele : level2){
log.info(ele.text());
}

Elements level3 = doc.select("dl dd a");
log.info("三级分类总数:"+level3.size());
for(Element ele : level3){
log.info(ele.text()+" "+ele.attr("href"));
}
}

@Test    //抓取某个分类下的商品数
public void itemCatCountOne() throws IOException{
String url = "http://list.jd.com/list.html?cat=9987,653,655";
Document doc = Jsoup.connect(url).get();
Elements ele = doc.select(".st-ext span");
log.info(ele.text());
}

@Test //抓取商品分类下商品的数量,去除特殊链接
public void itemCatCount() throws IOException{
Integer total = 0;
String url = "http://www.jd.com/allSort.aspx";
Document doc = Jsoup.connect(url).get();
Elements level3 = doc.select("dl dd a");
log.info("三级分类总数:"+level3.size());
for(Element ele : level3){
log.info(ele.text()+" "+ele.attr("href"));
String urlList = "http:"+ele.attr("href");

if(urlList.indexOf("?cat=")>0){       //有多种链接,只有含有cat才是商品列表页面
Document listDoc = Jsoup.connect(urlList).get();
Elements eleCount = listDoc.select(".st-ext span");
Integer catCount = 0;
try{
catCount = Integer.valueOf(eleCount.text());
}catch(Exception e){
catCount = 0;
}
total += catCount;

Elements elePages = listDoc.select("#J_topPage span.fp-text i");
Integer pages = 0;
try{
pages = Integer.valueOf(elePages.text());
}catch(Exception e){
pages = 0;
}


log.info(ele.text()+" 商品数:"+catCount+" 页数:"+pages);
}
}
log.info("总商品数量:"+total);
}

15.商品列表页面抓取商品编号

@Test    //获取商品详细信息
public void getItemInfo() throws IOException{
String itemId = "1411013";
String url = "http://item.jd.com/"+itemId+".html";
Document doc = Jsoup.connect(url).get();

String title = doc.select(".sku-name").get(0).text();
log.info("标题:"+title);

Elements eleImages = doc.select("div#spec-list li img");
String[] images = new String[eleImages.size()];
for(int i=0;i<eleImages.size();i++){
images[i] = eleImages.get(i).attr("src");
log.info("链接图片["+i+"]:" + images[i]);
}
}

16.抓取商品价格

京东的价格是单独发起ajax请求,返回json数组,一次可以查询多个价格
返回结果为json数组:
[{"id":"J_1411013","p":"3888.00","m":"6699.00"},{"id":"J_1411014","p":"569.00","m":"1398.00"}]

 17.抓取商品卖点

京东的卖点是单独发起ajax请求,返回json格式数据,回显到页面
返回结果为json数组:
[{"ad":"\u53CC\u66F2\u9762\u4FA7\u5C4F\uFF0C\u91D1\u5C5E\u4E0E\u73BB\u7483\u5DE7\u5999\u878D\u5408\uFF0C\u81EA\u52A8\u8FFD\u7126\uFF0C\u667A\u80FD\u9065\u63A7\u5668\u652F\u6301\u7EA2\u5916\u9065\u63A7\u529F\u80FD\uFF01\u003C\u0061\u0020\u0020\u0074\u0061\u0072\u0067\u0065\u0074\u003D\u0022\u005F\u0062\u006C\u0061\u006E\u006B\u0022\u0020\u0020\u0068\u0072\u0065\u0066\u003D\u0022\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0073\u0061\u006C\u0065\u002E\u006A\u0064\u002E\u0063\u006F\u006D\u002F\u0061\u0063\u0074\u002F\u006F\u004C\u005A\u0052\u006C\u0057\u007A\u004D\u0070\u0049\u002E\u0068\u0074\u006D\u006C\u0022\u003E\u9886\u5238\u51CF\u94B1\uFF0C\u4E0B\u5355\u8FD4\u73B0\u003C\u002F\u0061\u003E","id":"AD_1411013"},{"ad":"\u62C9\u6746\u7BB1\u3001\u4E66\u5305\u3001\u53CC\u80A9\u5305\u7B49\u591A\u79CD\u5546\u54C1\u9886\u5238\u6EE1\u0039\u0039\u51CF\u0032\u0030\u3001\u6EE1\u0033\u0039\u0039\u51CF\u0038\u0030\u003C\u0061\u0020\u0068\u0072\u0065\u0066\u003D\u0027\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0073\u0061\u006C\u0065\u002E\u006A\u0064\u002E\u0063\u006F\u006D\u002F\u0061\u0063\u0074\u002F\u006F\u0057\u0073\u007A\u0055\u0033\u006E\u0032\u0059\u0070\u006D\u0074\u0044\u002E\u0068\u0074\u006D\u006C\u0027\u0020\u0074\u0061\u0072\u0067\u0065\u0074\u003D\u0027\u005F\u0062\u006C\u0061\u006E\u006B\u0027\u003E\u5F00\u5B66\u4E0D\u5C06\u201C\u65E7\u201D\uFF0C\u9886\u5238\u4EAB\u6EE1\u51CF\uFF01\uFF01\u901F\u901F\u62A2\u8D2D\u5427\u007E\u003C\u002F\u0061\u003E","id":"AD_1411014"}]

 18.抓取商品描述

京东的商品描述是单独发起ajax请求,返回jsonp格式数据,回显到页面
showdesc({"date":1469167322294,"content":"<div style=\"text-align: center;\"><img data-lazyload=\"//img30.360buyimg.com/jgsq-productsoa/jfs/t2767/259/3526014654/1592287/78020f87/5791889cN81b6b7f9.jpg\" alt=\"\" /><br /></div><div style=\"text-align: center;\"><img data-lazyload=\"//img30.360buyimg.com/jgsq-productsoa/jfs/t2386/186/1517820110/681125/d98ab4ac/56b1b1a3N229b52dc.jpg\" style=\"widows: auto;\" alt=\"\" /><br /></div><br/>"})

 3.第三天:爬取商品价格+报表eCharts

eCharts

6.eCharts

19.饼形图

pie.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/javascript" src="js/echarts-all.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
var json = [ 
{value:30,name:'高圆圆'}, 
{value:26,name:'赵丽颖'}, 
{value:24,name:'关晓彤'}
];

// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['高圆圆','赵丽颖','关晓彤']
},
series: [{
name: '女神',
type: 'pie',
radius: '55%', //饼形图半径大小
data:json
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
</body>
</html>

20.柱状图

bar.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/javascript" src="js/echarts-all.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫"]
},
yAxis: {},
series : [
{
name:'数量',
type:'bar',
barWidth: 50,
data:[200, 152, 100],
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0, 0, 0, 1,[{offset: 0, color: '#2FDE80'},{offset: 1, color: '#2FDECA'}                           ]
)
},
emphasis: {
color: new echarts.graphic.LinearGradient(
0, 0, 0, 1,[{offset: 0, color: '#2FDECA'},{offset: 1, color: '#2FDE80'}]
)
}
}
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
</body>
</html>

21.曲线图

line.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/javascript" src="js/echarts-all.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的dom -->
<div id="main" style="height:400px;width: 600px"></div>
<!-- ECharts单文件引入 -->
<script src="http://echarts.baidu.com/build/dist/echarts-all.js"></script>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts图表
var myChart = echarts.init(document.getElementById("main"));
var option = {
title : {
text: '未来一周气温变化',
subtext: '纯属虚构'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['最高气温','最低气温']
},
//右上角工具条
toolbox: {
show : true,
feature : {
saveAsImage : {show: true}
}
},
calculable : true,
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value',
axisLabel : {
formatter: '{value} °C'
}
}
],
series : [
{
name:'最高气温',
type:'line',
data:[11, 11, 15, 13, 12, 13, 10],
markPoint : {
data : [
{type : 'max', name: '最大值'},
{type : 'min', name: '最小值'}
]
},
markLine : {
data : [
{type : 'average', name: '平均值'}
]
}
},
{
name:'最低气温',
type:'line',
data:[1, -2, 2, 5, 3, 2, 0],
markPoint : {
data : [
{type : 'min', name: '周最低'}
]
},
markLine : {
data : [
{type : 'average', name : '平均值'}
]
}
}
]
};
// 为echarts对象加载数据
myChart.setOption(option);
</script>
</body>
</html>

7.比价器系统

22.京东

京东的价格是单独发起ajax请求,返回json数组,一次可以查询多个价格
返回结果为json数组:
[{"id":"J_1411013","p":"3888.00","m":"6699.00"},{"id":"J_1411014","p":"569.00","m":"1398.00"}]

 23.淘宝

@Test
public void taobaoItemPrice() throws IOException{
String itemId = "560563554738";
String url = "http://mdskip.taobao.com/core/initItemDetail.htm?isRegionLevel=true&itemTags=385,775,843,1035,1163,1227,1478,1483,1539,1611,1863,1867,1923,2049,2059,2242,2251,2315,2507,2635,3595,3974,4166,4299,4555,4811,5259,5323,5515,6145,6785,7809,9153,11265,12353,12609,13697,13953,16321,16513,17473,17537,17665,17857,18945,19841,20289,21762,21826,25922,28802,53954&tgTag=false&addressLevel=4&isAreaSell=false&sellerPreview=false&offlineShop=false&showShopProm=false&isIFC=false&service3C=true&isSecKill=false&isForbidBuyItem=false&cartEnable=true&sellerUserTag=839979040&queryMemberRight=true&itemId="+itemId+"&sellerUserTag2=306250462070310924&household=false&isApparel=false¬AllowOriginPrice=false&tmallBuySupport=true&sellerUserTag3=144467169269284992&sellerUserTag4=1152930305168967075&progressiveSupport=true&isUseInventoryCenter=false&tryBeforeBuy=false&callback=setMdskip×tamp=1420351892310";
HttpClientBuilder builder = HttpClients.custom(); 
builder.setUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)"); 
CloseableHttpClient httpClient = builder.build(); 
final HttpGet httpGet = new HttpGet(url); 
httpGet.addHeader("Referer", "http://detail.tmall.com/item.htm?id="+itemId+"&skuId=68347779144&areaId=110000&cat_id=50024400&rn=763d147479ecdc17c2632a4219ce96b3&standard=1&user_id=263726286&is_b=1"); 
CloseableHttpResponse response = null; 
response = httpClient.execute(httpGet); 
final HttpEntity entity = response.getEntity(); 
String result = null; 
if (entity != null) { 
result = EntityUtils.toString(entity); 
EntityUtils.consume(entity); 
} 

//商品价格的返回值,需要解析出来价格 

result = result.substring(10, result.length()-1); 
}

24.苏宁

25.价格比较柱状图

price .html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/javascript" src="js/echarts-all.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: '各大电商商品价格比价'
},
tooltip: {},
legend: {
data:['iphoneX 64g']
},
xAxis: {
data: ["京东","淘宝","苏宁"]
},
yAxis: {},
series : [
{
name:'数量',
type:'bar',
barWidth: 50,
data:[8316, 6783, 7788],
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0, 0, 0, 1,[{offset: 0, color: '#2FDE80'},{offset: 1, color: '#2FDECA'}                           ]
)
},
emphasis: {
color: new echarts.graphic.LinearGradient(
0, 0, 0, 1,[{offset: 0, color: '#2FDECA'},{offset: 1, color: '#2FDE80'}]
)
}
}
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
</body>
</html>

永和大王数据:

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

QQ:603026148
以上内容归 Darren 所有,如果有什么错误或者不足的地方请联系我 ,希望我们共同进步。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从码农到码到成功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值