day01XML上
1、XML的作用
2、XML的基本语法
3、DTD约束
4、DTD的基本语法(看懂DTD就ok)
5、XML的解析方式:原理
6、JAXP的DOM方式解析基本练习
7、JAXP的DOM方式解析案例
day02XML下
1、JAXP进行DOM解析的案例做完
2、JAXP进行SAX解析的原理和实际应用
3、DOm4J简介和基本练习
4、Junit单元测试
5、Xpath
6、Dom4J改写原有的案例
7、Debug调试
8、Schema约束
day03基础加强
java基础加强
1、JDK5.0介绍
2、静态导入
3、自动装箱和拆箱
4、增强for循环
5、可变参数
6、枚举
7、反射
8、内省
9、泛型
day04Web开发入门
一、泛型
二、Web开发的基本概念
三、Web开发需要的服务器
四、Tomcat的安装与启动遇到的问题
五、Tomcat的目录结构
六、JavaWeb应用的目录结构
七、如何部署自己的应用到Tomcat中
八、Tomcat组成部分详解:
虚拟目录
虚拟主机
连接器
day05Http协议及Servlet入门
*****一、HTTP协议
1.1协议的作用及版本
1.2协议的组成
1.3协议详细讲解
二、Servlet概述
*****三、编写第一个Servlet案例应用
*****四、Servlet的生命周期
*****五、Servlet的孩子们(模板方法设计模式)
** 六、Servlet配置
*****七、Servlet中的线程安全问题
*****八、ServletContext对象
day06ServletContext及HttpServletResponse
****一、Servlet中的线程安全问题
***二、Servlet的配置对象:ServletConfig
*****三、ServletContext详解
插入:ServletAPI中的主要接口或类的核心类图
**四、请求和响应对象概述
*****五、HttpServletResponse详解
5.1输出中文数据:
字节流:
字符流:
5.2控制不要缓存
5.3控制缓存时间
5.4动态生成随机验证码图片
5.5定时刷新
5.6文件下载(中文文件名的文件下载)
5.7HttpServletResponse细节
1.response向客户端发送数据,可以通过page指令的contentType属性或是setContentType()方法来设置传送文件。
2.public void flushBuffer() throws IOException 强制将response缓冲区中的数据发送到客户端。
3.Int set/getBufferSize()返回缓冲区的大小,以字节为单位。没有缓冲区返回0;
4.String set/getCharacterEncoding() 获字符集名称。
5.String set/getContentType()返回response中mime类型。
6.getOutputStream();获取一个在response中写入二进制数据的输出流ServletOutputStream。Jsp页面不建议用,数据位文本数据。
7.getWriter()获取一在response中写入文本数据的PintWriter对象。
8.sendRedirect() 用于进行页面重定向 public void sendRedirect()(String location) throws IOException
*****六、HttpServletRequest详解
6.1常用简单方法
6.2获取请求消息头
6.3获取请求参数(内省)
6.4常用表单数据的获取
6.5域对象
6.6请求转发和重定向
6.7转发和重定向细节(实际开发中知道一个原则)
day07HttpServletRequest和Cookie入门
*****一、HttpServletRequest详解
6.1常用简单方法
public abstract interface javax.servlet.http.HttpServletrequest extends javax.servlet.Servlet Request;
1.getAttribute() 参数name的属性值作为对象返回
2.getAttributeNames() 得到Enumeration对象,对象中包括此次请求中可用的属性的值得名称。
3.getCharacterEncoding() 返回请求的字符编码的名称,如果未指定,返回null;
4.getContentType() 返回请求的mime类型,如果类型未知,返回null
5.getContentPath()得到请求URL中请求的应用上下文路径。如果web应用就是Tomcat安装目录的wwebapps子目录中国的ROOT,getcontentPath();返回“”;如果为其他目录,则返回相对于Web应用服务器的根目录的子目录。如果当前Web应用
为webapp,则getContextPath()方法返回值是“webapp”。
6.getlocalAddress() 返回接受请求web服务器的地址。
7.getLocalName() 返回接收请求的服务器名。
8.getMethod() 得到请求所用的Http请求类型。get put post
9.getParameter() name参数,得到请求中指令的参数值。
10.getParameterMap 得到请求中所有参数的一个Map对象。参数为键 字符串数组作为值。
11.getParamterNames() 获得所有请求中参数名称的枚举。
12.getParameterValues() 一个请求参数值数组 内容为请求中指定参数name的多个值。如果找不到那么参数 返回null
13.getProtocol() 返回请求所用协议的名称和版本,如 HTTP/1.1
14.getQueryString() 返回请求URL中所包含的位于路径之后的查询字符串
15.getRemoteAddr()返回客户端IP
16.getRemoteHost() 返回客户端机器名
17.getRemotePort()客户端代理端口号
18.getRequestUri()返回请路径uri
19.getRequestUrl()返回请路径url
20.getServerPort() 接受请求服务器的端口号
21.getServletPath() URI中表示Servlet的部分
22.getSession() 得到与当前请求相关联的httpsession对象,如果请求没有回话,就会创建回话并返回会话对象。
23.removeAttribute()参数name 从请求中删除指定名称name的属性。
24.setAttribute() 参数name 将指定的属性对象attribute用名称name保存于请求中。
public void setAttribute(String name,Object attribute)
25.setCharacterEncoding() 设置读取请求数据时所使用的字符编码,此方法必须在调用request的所有其他方法之前调用,其后才能行读取参数。
6.2获取请求消息头
6.3获取请求参数(内省)
6.4常用表单数据的获取
HTML表单通过post get 方法,post较常用。使用request对象的getParameter()方法得到表单中数据项的值
6.5域对象
6.6请求转发和重定向
1、请求转发:(当前应用内转)
方式一:
ServletContext.getRequestDispatcher(String path):path必须以"/"开头,表示绝对路径
方式二:
ServletRequest.getRequestDispatcher(String path):path如果"/"开头,表示绝对路径;如果不以"/"开头,表示相对路径
2、转发的细节:AServlet(源组件)--->BServlet(目标组件)
**转发前会清空response的正文。
转发页面上只会输出目标组件的输出,源组件的任何页面输出都无效。
原则:转发前,不要刷新或关闭response的输出流。
3、包含:RequestDispatcher
AServlet(源组件)--->BServlet(目标组件):AServlet包含BServlet的输出内容
目标组件所有设置的头都无效,正文有效。
6.7转发和重定向细节(实际开发中知道一个原则)
*****二、会话概述
三、Cookie和HttpSession简介
四、Cookie详细介绍
五、Cookie案例:
5.1记住用户最后一次的访问时间
5.2记住用户登录时的用户名
5.3电商网站:记住用户商品的历史浏览记录
day08Cookie的案例及HttpSession
一、Cookie的案例:记录用户最近商品的访问记录
二、HttpSession概述及原理探讨
三、HttpSession案例:
完成用户的一次性登录(随机验证码验证)
简单购物原理案例
防止表单的重复提交(Base64编码)
四、客户端禁用Cookie后的会话数据保存问题
五、HttpSession对象的状态及转换(序列化)
day09JSP入门及语法
****
一、JSP概述
1、JSP:Java Server Pages(运行在服务器端的页面)。就是Servlet。
学习JSP学好的关键:时刻联想到Servlet即可。
2、JSP的原理
JSP会被Tomcat翻译成一个Servlet。该Servlet在Tomcat\work\catalina\locahot\day09\....
3、JSP、Servlet开发的最佳实践:
Servlet:一般作为控制组件,处理业务逻辑
JSP:一般作为显示组件,显示数据
二、JSP的语法
1、JSP的模板元素:(先写HTML)
就是JSP中的那些HTML标记
作用:页面布局和美化
2、JSP的Java脚本表达式:
作用:输出数据到页面上
语法:<%=表达式%>(实际上就是调用输出流打印到页面上)
3、JSP中的Java脚本片段:(实际开发中,应做到JSP中不能出现一行Java脚本片段)
作用:书写Java代码逻辑
语法:<%
语句1;
语句2;
%>
原理:其中的语句会原封不动的被服务器翻译到对应的Servlet的service方法中。
4、JSP的声明:(了解其原理)
作用:定义类的成员
语法:<%!
你的Java代码
%>
5、JSP的注释:
作用:注释Java脚本代码
语法:<%--这是注释--%>
三、JSP的指令:给JSP引擎用的(服务器用的)
基本的语法格式:<%@ 指令名称 属性1="值1" 属性2="值2" ....%>
作用:告诉服务器,该如何处理JSP中除了指令之外的内容的。
3.1page
作用:定义JSP页面的各种属性
属性:
language:指示JSP页面中使用脚本语言。默认值java,目前只支持java。
extends:指示JSP对应的Servlet类的父类。不要修改。
*import:导入JSP中的Java脚本使用到的类或包。(如同Java中的import语句)
JSP引擎自动导入以下包中的类:
javax.servlet.*
javax.servlet.http.*
javax.servlet.jsp.*
注意:一个import属性可以导入多个包,用逗号分隔。
*sessioin:指示JSP页面是否创建HttpSession对象。默认值是true,创建
*buffer:指示JSP用的输出流的缓存大小.默认值是8Kb。
autoFlush:自动刷新输出流的缓存。
isThreadSafe:指示页面是否是线程安全的(过时的)。默认是true。
true:不安全的。
false:安全的。指示JSP对应的Servlet实现SingleThreadModel接口。
*errorPage:指示当前页面出错后转向(转发)的页面。
目标页面如果以"/"(当前应用)就是绝对路径。
配置全局错误提示页面:
web.xml
*isErrorPage:指示当前页面是否产生Exception对象。
*contentType:指定当前页面的MIME类型。作用与Servlet中的response.setContentType()作用完全一致
*pageEncoding:通知引擎读取JSP时采用的编码(因为要翻译)
还有contentType属性的作用。
*isELIgnored:是否忽略EL表达式。${1+1}。默认值是false。
page指令最简单的使用方式:<%@ page pageEncoding="UTF-8"%>
3.2include(静态包含,开发中能用静的不用动的)
作用:包含其他的组件。
语法:<%@include file=""%>file指定要包含的目标组件。路径如果以"/"(当前应用)就是绝对路径。
原理:把目标组件的内容加到源组件中,输出结果。
动态包含:
采用动作元素:
3.3taglib
作用:引入外部的标签
语法:<%@taglib uri="标签名称空间" prefix="前缀"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
四、JSP的内置对象(9个JSP内置对象)
JSP的内置对象引用名称 对应的类型
request HttpServletRequest
response HttpServletResponse
session HttpSession(有开关的:page指令的session属性的取值)
application ServletContext
config ServletConfig
page this(当前Servlet对象)
exception java.lang.Throwable(有开关的:page指令的isErrorPage属性改为true)
out JspWriter
pageContext javax.servlet.jsp.PageContext非常重要
有三大作用:
1、本身是一个域对象。同时还能操作其他三个域对象(PageContext ServletRequest HttpSession ServletContext)
本身表示的域范围是本页面。
void setAttribute(String name,Object value)
void removeAttribute(String name)
Object getAttribute(String name)
操作其他的三个域对象
void setAttribute(String name,Object value,int scope)
void removeAttribute(String name,int scope)
Object getAttribute(String name,int scope)
参数int scope是由PageContext类提供的静态变量规定的。
PageContext.PAGE_SCOPE:页面范围(是PageContext本身中的那个Map,代号page)
PageContext.REQUEST_SCOPE:请求范围(是ServletRequest中的那个Map,代号request)
PageContext.SESSION_SCOPE:请求范围(是HttpSession中的那个Map,代号session)
PageContext.APPLICATION_SCOPE:请求范围(是ServletContext中的那个Map,代号application)
(非常有用)Object findAttribute(String name):依次按照page request session application范围搜索指定名称的对象,找到为止。
2、获取其他8个隐式对象
3、提供了转发和包含的方便方法
RequestDispatcher rd = request.getRequestDispatcher("/url");
rd.forward(request,response);
pageContext.forward("url");
pageContext.include("url");
*****五、四大域对象(两个资源之间互传数据)
JSP中隐式对象的名称 范围名称 具体的类型
pageContext page javax.servlet.jsp.PageContext
request request javax.servlet.ServletRequest (显示完数据就没有用了)
session session javax.servlet.http.HttpSession (显示完数据了,过一会自己还要用)
application application javax.servlet.ServletContext (显示完数据了,大家都要用。不建议使用,如果使用,必须同步处理)
六、JSP常用的动作元素
六、如何调试JSP出现的错误
day10JavaBean及EL
*****一、JavaBean的概念
1、JavaBean就是一个遵循特殊写法的普通类
2、特殊写法
a、必须有默认的构造方法
b、所有字段定位私有的
c、提供公有的getter或setter方法,属性
d、一般实现java.io.Serializable
3、一定要符合Java的命名规范。
***4、应用场景:
在企业级开发中,JavaBean是用来传递数据的。
*****二、JavaWeb的开发模型
模型一:了解
JSP+JavaBean
模型二:开发实际应用
程序中
M:厨师 JavaBean:模型
V:上的菜 JSP:显示页面
C:服务台 Servlet:控制器
MVC+三层架构
***三、JSP中操作JavaBean的动作元素
jsp:useBean
作用:用于在指定域范围内查找指定名称的JavaBean对象,找到了就直接使用;没有找到,创建一个,并放到指定的域范围内。
属性:
id:必须的。JavaBean的名称
class:JavaBean的完整类名
scope:域范围。默认是page范围。可选值:page request session application
注意:如果该标签有主体内容,只在创建新对象时才会执行。
jsp:setProperty(必须先使用useBean)
作用:调用JavaBean的setter方法。还能自动类型转换,仅限基本类型
属性:
property:必须的。属性名称。比如setName,名称是name。
可以使用通配符*。使用前提是请求参数的名称与属性的名称完全一致。
name:必须的。哪个对象的?即jsp:useBean中的id的取值。
value:属性的取值。支持直接量;支持表达式(<%=表达式%>)。
param:请求参数名
jsp:getProperty
作用:调用JavaBean的getter方法。
property:必须的。属性的名称。比如getName,名称是name。
name:必须的。哪个对象的?即jsp:useBean中的id的取值。
*****开发原则:JSP页面中不能出现一行Java脚本<%%>和Java表达式<%=%>
Java脚本:替代方案,自定义标签。
Java表达式:替代方案,EL表达式。 Struts2框架:OGNL表达式。
*****四、EL表达式
它只是JSP中的表达式,不是一种开发语言。
基本语法:${EL表达式}
4.1获取数据
*****EL表达式只能获取四大域中的数据。
EL表达式获取的对象如果是null,页面不会显示数据。因此,EL表达式中永远不会出现空指针异常
p.name:调用域中名称为p对象的getName方法,点运算符是用于获取属性的取值的。
.运算符:
[]运算符:.运算符能做的,[]也能做。[]能做的,.不一定能做。
比如${p.name}===${p['name']}==${p["name"]}
优秀在可以取不符合Java命名规范的东东。
4.2数学逻辑运算:
empty运算符:如果判断的对象是null或者空字符串,都返回true。对于集合,即使集合对象本身不是null,没有任何元素,也返回true。
EL表达式不支持字符串连接操作。
4.3获取JSP的内置对象(11大EL内置对象):难点,不要与JSP的内置对象和范围名称搞混
11大EL隐式对象中,其中一个是表示自身对象外,其余都是表示的Map结构
EL隐式对象名称 Java类型 备注
pageContext javax.servlet.jsp.PageContext 与JSP中的内置对象完全相同
剩余的都是代表的Map集合
pageScope java.util.Map 代表着PageContext页面范围域那个Map
requestScope java.util.Map 代表着ServletRequest请求范围域那个Map
sessionScope java.util.Map 代表着HttpSession会话范围域那个Map
applicationScope java.util.Map 代表着ServletContext应用范围域那个Map
param java.util.Map 代表着请求参数。key:请求参数的名称。value:请求参数的值,它是一个字符串。
paramValues java.util.Map 代表着请求参数。key:请求参数的名称。value:请求参数的值,它是一个字符串数组。
header java.util.Map 代表着请求消息头。key:头名称。value:头值,它是一个字符串。
headerValues java.util.Map 代表着请求消息头。key:头名称。value:头值,它是一个字符串数组。
cookie java.util.Map 代表客户端提交的Cookie的Map。key:cookie的name。value:cookie对象本身
initParam java.util.Map 代表着全局初始化参数(web.xml中context-param).key:参数名称。value:参数值
4.4调用普通类的静态方法(EL函数)
编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤):
a、编写一个普通的java类,提供一个静态方法
public class FunctionDemo {
public static String toUpperCase(String str){
return str.toUpperCase();
}
}
b、在JavaWeb应用的WEB-INF目录下建立一个扩展名是tld(taglib definition)的XML文件(参考Tomcat中的示例)。内容如下:
version="2.0">
c、(可选步骤)前提是把tld文件放到了WEB-INF目录下。
告知应用,tld文件和tld中的uri的对应。修改web.xml,增加以下内容:
d、在JSP中使用
用taglib指令,引入自定义的EL函数库
<%@ taglib uri="http://www.itcast.cn/myfn" prefix="myfn"%>
${myfn:toUppercase(p)}
**五、SUN提供的标准EL函数库
JSTL标准标签:(Jsp Standard Tag Libary)
***Core:核心
**Fmt:国际化
SQL:数据库操作
XML:xml操作
**fn:EL函数库
导入JSTL的jar包。standard.jar jstl.jar
*****六、JSTL中的核心标签库(替换掉JSP中的Java脚本)
c:if
作用:判断是否为true,如果为true,那么标签的主体内容就会显示。
属性:
test:必须的。要求必须是boolean的。支持表达式(EL或Java表达式)
var:保存test运算结果的变量
scope: 保存的域范围。默认是page
c:forEach
遍历:数组、List、Set、Map
属性:
items:要遍历的目标对象。支持表达式
var:变量名。指向当前遍历的集合中的一个元素
begin:开始的索引(含)
end:结束的索引(含)
step:步长。默认是1
varStatus:取一个名字,引用了一个对象。
该对象有以下方法:
int getIndex():当前记录的索引号。从0开始
int getCount():当前记录的顺序。从1开始
boolean isFirst():是否是第一条记录
boolean isLast():是否是最后一条记录
day11简单购物车
阶段编码实战小案例
案例:
一、大家书写小实例时遇到的主要问题
1、书写代码要仔细认真,符合规范。
2、编写代码要一步步来做。
3、会调错。多用debug,看异常堆栈。
简单购物车
难点:购物车的构建
技术架构:JSP+Servlet。
MVC+三层架构
要求:JSP中不能出现一行Java脚本和Java表达式
一、搞清楚你要做什么?需求。
二、搭建开发环境:拷贝jar包。
jstl.jar standard.jar
三、实际的开发。
day12用户注册与登录
1、技术要求:
MVC+三层架构
JSP+Servlet
JSP页面不能出现一行Java脚本和Java表达式
数据库采用XML来担当
保留好每一个实现的单元测试
要求系统的反应不能超过500毫秒。
day13MySQL及SQL入门
约定:
shell>window下输入的命令
mysql>进入MySQL程序后,输入的MySQL的命令
一、SQL简介
1、SQL:Structured Query Language结构化查询语言
他是客户与数据库打交道的通道
2、SQL是有工业标准的。ANSI
符合工业标准的SQL,称之为普通话。
不同的数据库都在SQL工业标准的基础上进行扩展,扩展的部分称之为方言。
3、验证安装是否成功
shell>mysql -u root -p
mysql>SHOW DATABASES; //显示目前有几个库
二、DDL:数据定义语言 Data Definition Language
作用:定义数据库或者表结构的。
操作的对象:数据库或表的结构的。
关键字:CREATE ALTER DROP
创建一个名称为mydb1的数据库。
mysql>CREATE DATABASE mydb1;
查看数据库的创建细节
mysql>SHOW CREATE DATABASE mydb1;
创建一个使用gbk字符集的mydb2数据库。
mysql>CREATE DATABASE mydb2 CHARACTER SET gbk;
创建一个使用gbk字符集,并带校对规则的mydb3数据库。
mysql>CREATE DATABASE mydb3 CHARACTER SET gbk COLLATE gbk_chinese_ci;
查看当前数据库服务器中的所有数据库
mysql>SHOW DATABASES;
查看前面创建的mydb2数据库的定义信息
mysql>SHOW CREATE DATABASE mydb1;
删除前面创建的mydb3数据库
mysql>DROP DATABASE mydb3;
创建表之前一定先选择数据库
mysql>USE test;
创建一个员工表
mysql>CREATE TABLE employee(
id int,
name varchar(200),
gender varchar(10),
birthday date,
entry_date date,
job varchar(200),
salary float(8,2),
resume text
);
显示当前数据库中的所有表格
mysql>SHOW TABLES;
在上面员工表的基本上增加一个image列。
mysql>ALTER TABLE employee ADD image blob;
查看表结构的定义
mysql>DESC employee;
修改job列,使其长度为60。
mysql>ALTER TABLE employee MODIFY job varchar(60);
删除image列。
mysql>ALTER TABLE employee DROP image;
表名改为user。
mysql>RENAME TABLE employee TO user;
查看表的创建细节
mysql>SHOW CREATE TABLE user;
修改表的字符集为gbk
mysql>ALTER TABLE user CHARACTER SET gbk;
列名name修改为username
mysql>ALTER TABLE user CHANGE name username varchar(100);
三、DML:Data Manipulation Language 数据操作语言
作用:操作表中的数据的。
关键:INSERT UPDATE DELETE
特别注意:日期或字符串、字符要使用单引号引起来。
查看表中的所有记录
mysql>SELECT * FROM user;
使用insert语句向表中插入三个员工的信息。
建议:mysql>INSERT INTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES (1,'zql','0','1991-09-07','2013-04-12','CTO',10000.00,'beauty');
mysql>INSERT INTO user VALUES (2,'gfy','1','1987-09-07','2013-04-12','CEO',10000.00,'hand');
mysql>INSERT INTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES (3,'王翔云','1','1989-09-07','2013-04-12','UFO',10000.00,'good boy');
插入中文时的问题:(编码问题)
查看数据库目前的各种编码:
mysql>SHOW VARIABLES LIKE 'character%';
通知服务器客户端使用的编码字符集
mysql>SET character_set_client=gbk;
显示时乱码
mysql>SET character_set_results=gbk;
将所有员工薪水修改为5000元。
mysql>UPDATE user SET salary=5000;
将姓名为’王翔云’的员工薪水修改为3000元。
mysql>UPDATE user SET salary=3000 WHERE username='王翔云';
将姓名为’王翔云’的员工薪水修改为4000元,job改为CMO。
mysql>UPDATE user SET salary=4000,job='CMO' WHERE username='王翔云';
将zql的薪水在原有基础上增加1000元。
mysql>UPDATE user SET salary=salary+1000 WHERE username='zql';
删除表中名称为’王翔云’的记录。
mysql>DELETE FROM user WHERE username='王翔云';
删除表中所有记录。
mysql>DELETE FROM user;(一条一条的删除)
使用TRUNCATE删除表中记录。
mysql>TRUNCATE user;(摧毁整张表,然后重建表结构)
四、DQL简单的:Data Query Language
关键字:SELECT
查询表中所有学生的信息。
mysql>SELECT * FROM student;(不建议使用)
mysql>SELECT id,name,chinese,english,math FROM student;
查询表中所有学生的姓名和对应的英语成绩。
mysql>SELECT name,english FROM student;
过滤表中重复数据。
mysql>SELECT DISTINCT english FROM student;
SELECT语句支持一些基本的运算
在所有学生数学分数上加10分特长分。
mysql>SELECT id,name,math+10 FROM student;
统计每个学生的总分。
mysql>SELECT name,chinese+english+math FROM student;
使用别名表示学生分数。
mysql>SELECT name AS 姓名,chinese+english+math 总分 FROM student;
查询姓名为王五的学生成绩
msyql>SELECT name,english,chinese,math FROM student WHERE name='王五';
查询英语成绩大于90分的同学
msyql>SELECT name,english,chinese,math FROM student WHERE english>90;
查询总分大于200分的所有同学
mysql>SELECT name,chinese+english+math FROM student WHERE (chinese+english+math)>200;
WHERE语句支持运算表达式
查询英语分数在 80-90之间的同学。
mysql>SELECT * FROM student WHERE english BETWEEN 84 AND 85;
查询数学分数为89,90,91的同学。
mysql>SELECT * FROM student WHERE math IN (89,90,91);
查询所有姓李的学生成绩。
mysql>SELECT * FROM student WHERE name LIKE '李%';
查询数学分>80,语文分>80的同学。
mysql>SELECT * FROM student WHERE math>80 AND chinese>80;
对数学成绩排序后输出。
mysql>SELECT * FROM student ORDER BY math;//默认是升序
对总分排序后输出,然后再按从高到低的顺序输出
mysql>SELECT name,chinese+english+math FROM student ORDER BY (chinese+english+math) DESC;
对姓李的学生数学成绩排序输出
mysql>SELECT name,math FROM student WHERE name LIKE '李%' ORDER BY math;
五、数据完整性
三个方面:
1、实体完整性:规定表中的一行在表中是唯一的实体。
一般是通过定义主键的形式来实现的。
关键字:PRIMARY KEY
特点:不能为null,必须唯一
CREATE TABLE SHANG_HAI1(
id int PRIMARY KEY,
name varchar(100)
);
//实际开发中不建议使用。
CREATE TABLE shanghai2(
id int PRIMARY KEY auto_increment,
name varchar(100)
);
insert into shanghai2 (name) values('aa');
2、域完整性
指数据库表的列(即字段)必须符合某种特定的数据类型或约束。
NOT NULL:不能为空
UNIQUE:必须唯一
CREATE TABLE shanghai3(
id int PRIMARY KEY,
name varchar(100) NOT NULL,
idnum varchar(100) unique
);
关于主键:
(建议)逻辑主键:给编程人员用的。与具体业务无关
业务主键:用户也可以用。与具体业务有关了。
3、参照完整性(多表设计)
一对多
create table department(
id int primary key,
name varchar(100)
);
create table employee(
id int primary key,
name varchar(100),
salary float(8,2),
dept_id int,
constraint dept_id_fk foreign key(dept_id) references department(id)
);
多对多
create table teacher(
id int primary key,
name varchar(100),
salary float(8,2)
);
create table student1(
id int primary key,
name varchar(100),
grade varchar(10)
);
create table teacher_student1(
t_id int,
s_id int,
primary key(t_id,s_id),
constraint t_id_fk foreign key(t_id) references teacher(id),
constraint s_id_fk foreign key(s_id) references student1(id)
);
一对一
create table human(
id int primary key,
name varchar(100)
);
create table idcard(
id int primary key,
num varchar(100),
constraint huanm_id_fk foreign key(id) references human(id)
);
***一、表的复杂查询
1、连接查询
1.0连接的基本语法格式:
from TABLE1 join_type TABLE2 [on (join_condition)][where (query_condition)]
TABLE1:左表
TABLE2:右表
join_type:连接的类型。交叉、内连接、左外连接、右外连接
on:设置连接条件
where:对连接查询的结果进步一的筛选
1.1交叉连接
select * from CUSTOMER cross join ORDERS;
或者
select * from CUSTOMER,ORDERS;
select c.name,o.order_number from CUSTOMER c,ORDERS o;
1.2内连接:
隐式内连接:(不使用on关键字,使用where)
select * from CUSTOMER c,ORDERS o where c.id=o.customer_id;
显式内连接:(使用on关键字)
select * from CUSTOMER c inner join ORDERS o on c.id=o.customer_id;
1.3外连接:
左外连接:(返回符合连接条件的所有记录,同时还返回左表中其余的所有记录)
select * from CUSTOMER c left outer join ORDERS o on c.id=o.customer_id;
右外连接:(返回符合连接条件的所有记录,同时还返回右表中其余的所有记录)
select * from CUSTOMER c right outer join ORDERS o on c.id=o.customer_id;
2、子查询(嵌套查询)
查询“陈冠希”的所有订单信息
查询“陈冠希”的客户id select id from customer where name='陈冠希';
查询订单信息: select * from orders where customer_id=1;
子查询: select * from orders where customer_id=(select id from customer where name='陈冠希');
3、联合查询
SELECT * FROM orders WHERE price>200 UNION SELECT * FROM orders WHERE customer_id=1;
取两条语句的并集,并去除重复的记录。
4、报表查询(合计函数)(使用原来的test数据库)
统计一个班级共有多少学生?
select count(*) from student;
统计数学成绩大于90的学生有多少个?
select count(*) from student where math>=90;
统计总分大于250的人数有多少?
select count(*) from student where (chinese+math+english)>250;
统计一个班级数学总成绩?
select sum(math) from student;
统计一个班级语文、英语、数学各科的总成绩
select sum(chinese),sum(english),sum(math) from student;
统计一个班级语文、英语、数学的成绩总和
select sum(chinese+english+math) from student;
统计一个班级语文成绩平均分
select sum(chinese)/count(*) from student;
求一个班级数学平均分?
select avg(math) from student;
求一个班级总分平均分
select avg(chinese+english+math) from student;
Tips:如果要使用关键字作为表名,要使用`(Esc按键下面的)包围起来。
对订单表中商品归类后,显示每一类商品的总价
select product,sum(price) from orders group by product;
查询购买了几类商品,并且每类总价大于100的商品
select product,sum(price) from orders group by product having sum(price)>100;
二、MySQL的数据库的备份与恢复
数据库的备份:(不会备份数据库名)
shell>mysqldump -u root -psorry test>c:/test.sql
恢复数据库:(数据库名必须存在)
方式一:
shell>mysql -u root -psorry test
方式二:
mysql>USE test;
mysql>SOURCE c:/test.sql;
day14JDBC入门
三、JDBC概述
JDBC:Java DataBase Connectivity(Java连接数据库的标准。SUN制定的)
JDBC和数据库的驱动是什么关系?JDBC是规范,抽象层,数据库驱动是具体的实现。
JDBC规范由一些抽象类和接口组成,一般放在java.sql.*或javax.sql.*包中(JDK中带)
*****四、JDBC编码的步骤
准备:把数据库的驱动加入到构建路径中
1、加载驱动程序并注册驱动
2、获取与数据库的连接
3、得到代表SQL语句的对象,并发送SQL给数据库
4、如果有查询结果,得到封装了查询结果的对象
5、遍历结果
6、释放占用的资源
五、JDBC中常用接口和类的详细讲解
1、DriverManager
作用:注册驱动,得到数据库的连接
注册驱动:
DriverManager.registDriver(new com.mysql.jdbc.Driver());(不可取)
原因:1、严重依赖具体的数据库驱动。2、会导致驱动注册2遍。
替代方案:
获取数据库的连接:
static Connection getConnection(String url,String user,String password):
url:数据库的连接串。
mysql:jdbc:mysql://localhost:3306/day14数据库名或者jdbc:mysql:///day14(连接本地默认端口上的mysql数据库)
user:数据库的用户名
password:数据库的密码
static Connection getConnection(String url,Properties info)
static Connection getConnection(String url)
2、Connection
所有与数据库交互都必须建立在连接的基础上
3、Statement
作用:代表着SQL语句
常用的方法:
ResultSet executeQuery(String sql):sql是DQL语句
int executeUpdate(String sql):sql是DML语句。或者是没有返回结果的DDL也可以。返回值,代表着语句影响到的行数。
boolean execute(String sql):sql可以是任何的sql语句。如果有结果集返回,返回true。否则返回false。
4、ResultSet
boolean next():下移一行
boolean previous():上移一行
void absolute(int row):第一行的记录就是1
void beforeFirst():移动到第一行的前面
void afterLast():移动到最后一行的后面
5、释放资源
六、利用JDBC对数据库进行CRUD
七、利用JDBC改写原有的用户注册和登录的案例
八、SQL的注入及防范
PreparedStatement:(尽量使用它,就不要再使用Statement)
作用:
1、预编译SQL语句,数据库执行效率高。
2、防止SQL注入
3、支持参数占位符"?"
day15客户系统及大数据分页;大数据的存取及批处理
九、客户管理系统(Web项目CRUD)
day16调用存储过程;事务入门;隔离级别;数据库连接池的原理;开源数据源;编写自己的JDBC框架
一、获取数据库自动生成的主键
二、如何调用存储过程
***三、事务入门
*****四、事务的特性(隔离级别)
*****五、数据库连接池原理
*****六、编写标准的数据库连接池
编码难题
*****包装设计模式
*****默认适配器设计模式
*****基于接口的动态代理
***七、开源的数据源使用
DBCP
C3P0
**八、数据库元信息的获取(编写框架时使用)
*****九、编写属于自己的JDBC框架(反射)
策略设计模式
day17使用DBUtils框架;实际开发中的事务控制;多表操作
一、小结
(必须练一遍会用)1、DBUtil的QueryRunner的基本使用
(必须练一遍会用)2、DBUtil中的所有结果处理器
(必须理解)3、实际开发中的事务控制
(必须明白)4、ThreadLocal
(必须明白类与数据库的设计关系,必须做一遍)5、多表操作
day18自定义标签
一、小结
(理解)1、自定义标签的作用
(记住)2、自定义标签的编写步骤
(记住)3、传统标签的原理
(有什么用)4、传统标签的附加功能
(记住)5、JSP中的标签继承体系
(会用,基本练习)6、简单标签的附加功能实现
(会写)7、标签案例及发布标签库
(会用)8、JSTL中的剩余核心标签
day19国际化及过滤器概述,案例
一、什么是国际化
二、国际化处理需要的类
Locale
文本:ResourceBundle
日期时间:DateFormat
数字货币:NumberFormat
批量格式化:MessageFormat
三、简单介绍国际化的JSTL标签库
四、过滤器概述
五、编写过滤的步骤
六、过滤器的执行过程
七、过滤器简单案例:3个
八、过滤器的高级配置
九、巩固包装设计模式
十、过滤器高级案例:
全站Gzip压缩(相当有难度)
day20包装设计模式;过滤器高级案例;权限拦截
一、包装设计模式:BufferedReader的readLine()方法增加行号
二、过滤器高级案例:
中文乱码过滤器
脏话过滤器
HTML特殊标记过滤器
全站压缩过滤器(超难)
三、基于URL的权限拦截过滤器
day21文件上传下载;监听器
一、文件上传的原理
二、利用第三方组件实现文件上传
三、文件上传中要注意的9个问题
四、监听器概念
五、观察者设计模式
六、Servlet中提供的监听器(8个)
七、监听对象的创建和销毁的监听器
八、自定义HttpSession扫描器
Timer
TimerTash
九、监听域对象变化的监听器
十、感知型监听器
十一、统计在线用户,能踢人。
day22JavaMail开发
JavaMail开发:JavaEE技术之一
一、邮件的学习目标
二、邮件开发相关的概念
三、邮件开发用到的协议:SMTP、POP、RFC822、MIME
四、手工发送邮件和接收邮件(熟练SMTP等协议的)
五、冒充别人发送邮件
六、JavaMail的核心API简介
七、创建邮件:(卫星)
只有文本的邮件
既有文本,文本中还内嵌图片的邮件
既有文本,文本中还内嵌图片的邮件,还有附件的邮件
八、发送邮件:(火箭)
*****九、案例:用户注册,发送激活邮件