Day01. 6
1.myeclipse的介绍... 6
2.xml入门... 7
3.xml乱码【★★★】... 9
4.xml约束... 9
5.xml约束--dtd【☆】... 9
6.名字解释... 12
7.xml约束--schema. 12
8.解析技术... 14
9.JAXP. 14
Day02. 16
1. dom4j(dom for java)(day02)17
2.myeclipse介绍 (day02)17
3.debug【★★★★★】(day02)18
4.jdk5.0特性(day02)19
5.反射(day02)20
6.junit(day02)22
Day03. 22
1.web入门 (day03)24
2.web服务器介绍(day03)25
3.tomcat安装/启动【★】(day03)25
4.tomcat启动异常(day03)25
5.tomcat端口占用【★★】(day03)26
6.tomcat目录介绍(day03)26
7.server.xml文件介绍(day03)28
8.tomcat账号管理(day03)28
9.资源的访问:【☆】(day03)29
10.web项目的结构【★★★】(day03)29
11.myeclipse创建web项目(day03)30
12.虚拟路径(day03)30
13.虚拟主机(day03)31
Day04. 35
1 Servlet介绍(day04)... 37
2.servlet继承关系(day04)... 38
3.servlet编写流程【★★★】(day04)... 38
4.servlet编写实现(day04)... 39
5.servlet的生命周期(day04)... 40
6.servlet进行优化(day04)... 42
7.servlet虚拟路径【☆】(day04)... 43
8 servlet路径总结(day04)... 44
9. 缺省路径(day04)... 45
10.ServletContext(day04)... 46
11.servlet初始化方法(day04)... 47
Day05. 47
1.路径【☆】(day05)49
2.tomcat请求与响应执行流程分析【阅读excel】(day05)50
3.response(day05)51
4.request(day05)52
5.修改myeclipse的servlet模板(day05)54
6.ReuqestDispatcher对象(day05)55
7.案例【★★★★★必须完成】(day05)55
Day06. 56
1.JSP入门(day06)58
2.思考:两个servelt之间数据共享(day06)59
3.会话(day06)59
4.cookie技术(day06)60
5.cookie综合案例:查看商品浏览记录(day06)61
6.session(day06)62
7. URL 重写(day06)63
8.session案例:一次性验证码(day06)63
9.总结(day06)64
Day07. 65
1.JSP指令(day07)66
2.JSP内置对象(day07)68
3.out缓存机制(day07)69
4.总结,jsp的4作用域(day07)69
Day08. 74
1.EL. 75
2. 自定义JSP标签(day08)76
3.tld文件的位置(day08)77
4.tld配置文件的内容:(day08)77
5.JSTL(day08)79
6.EL函数(day08)81
7.BeanUtils(day08)81
8.模式介绍(day08)81
Day09. 82
Day10. 82
1.数据库介绍(day10)83
2.mysql安装(day10)84
3.mysql目录:(day10)84
4.mysql启动与登录(day10)85
5.mysql root账号密码重置(day10)86
6.mysql基本操作命令(day10)86
7.sql介绍(day10)87
8. DDL数据定义语言(day10)87
9、DML数据操纵语言(day10)89
10、DQL 数据查询语言(day10)90
11.中文乱码处理(day10)90
12、mysql异常(day10)90
13.sql文件(day10)91
Day11. 96
1.约束【★★★-- 关键字】(day11)97
2.表与表之间的关系【★★★】(day11)99
3. 数据库的备份与恢复(day11)100
4. JDBC(day11)100
5.JDBC细节分析(day11)101
6.工具类(day11)103
7.重写day09案例,将数据保存到数据(day11)105
8. PreparedStatement对象:预处理对象【★★★--CURD操作--思考CUD】(day11)105
Day12. 106
1.JDBC操作(day12)106
2.事务(day12)107
Day13. 113
Day14. 115
1.带有条件的查询... 116
2.mysql分页... 116
3.国际化... 117
4.监听器Listener117
Day15. 119
1.Filter 过滤器(day15)122
2.Filter过滤路径(day15)124
3.filter-mapping中的dispatcher标签(day15)124
4.案例(day15)125
Day16. 125
1.JavaMail(day16)126
Day17. 132
Day21. 139
1.泛型类型... 139
2.Annotation 注解... 140
3.annotation案例... 144
4.Servlet3.0. 144
5、代理... 146
6.类加载器ClassLoader146
1.struts2入门... 148
2 struts2目录介绍... 148
3. struts2开发流程... 149
4. struts2开发实现--helloworld【★★★★★】... 149
5. struts配置文件们... 150
6.struts.xml详解【★★ 多读】... 151
7.struts.xml配置默认值... 152
8.struts的常量【★ 看看】... 152
9 错误总结... 153
10.Action的编写... 154
11.struts中操作servlet api154
12.结果集的类型... 155
* 版本:10.7
* 阅读:day01/参考/Java培训--MyEclipse操作图解.doc
* 设置
* 工作空间workspace编码设置:/截图/1.设置workspace默认编码.png
* xml:可扩展标记语言,XML(EtensibleMarkup Language)
* xml用途:配置文件、数据存储
* xml涉及的名称:根元素,元素Element,属性Attribute、文本Text
* 语法
* 文档声明
* 通过文档声明确定xml文档的设置
* 格式:
* version:版本,只有一个值 1.0
* encoding:编码,确定当前xml文档的编码
* 注意:值必须使用引号括住
* 编码:【★★★☆】
* ISO-8859-1,拉丁码,只能处理英文。
* GB2312,国标码,只能处理简体中文
* Big5,大5码,只能处理繁体。
* GBK,GB2312升级版,处理繁体
* GB18030,GBK升级版,支持特殊文字(少数名族等)
* UTF-8,万国码,变长1-6字符
* 元素
* 格式2:<名称 /> ,
*名称:自定义
* 注意:
* 2.格式化良好的文档,必须只有一个根标签(根元素)【★】
* 3.xml文档对回车换行、制表符、空格等进行处理
* 4.命名
* 区分大小写【★】
* 不能以数字开头
* 不能使用空格分隔:
* 不能保留字符:冒号(:)
* 属性
* 格式:<元素 属性名称=属性的值 />
* 注意:
* 属性值一定要用双引号(")或单引号(')引起来
* 注释
* 格式:
* 转义字符
* 格式:&名称; -->
* 例如:& --> & <--> < (less than) >--> > (grant than)
* CDATA区
* 存放所有不需要编译的内容
* 格式:
* 处理指令(processinginstruction)(了解)
* 通过解析引擎如果处理xml文档
* 添加样式:
* 乱码产生的原因:编码不统一
* 文件的编码:window默认编码,GBK
* 内容的编码:使用“文档声明”encoding进行设置
* 如果处理:统一编码
* 编写一个文档来约束一个XML文档的书写规范
* 约束分类:dtd、schema
* XML Schema 是基于 XML 的 DTD 替代者
* 文档关联
* 将xml文档与指定的dtd文件进行关联
* 关联方式
* 内部DTD:
* 在xml内部书写dtd内容
* 格式: -->docType
* 外部DTD
* 在xml文档中引用当前系统的DTD文档
* 格式:
* 公共DTD
* 在xml文档中引用互联网中的DTD文档
* 格式:
* 阅读:java web项目1.3版本,WebRoot/WEB-INF/web.xml
* 元素element
* 格式:
* 元素名称:自定义
* 元素内容声明:包含两部分,符号和数据类型
* 符号:
? --> 0 或 1
+ --> >=1
* --> >=0
()--> 分组
| --> 选择
, --> 顺序
* 数据类型
*(#PCDATA) --> 被修饰的元素必须为字符,不能添加子元素
*EMPTY --> 不能有标签体
* 属性attribute
* 前提:必须具有元素
* 格式:
* 属性名称 : 自定义
* 属性类型 :
CDATA --> 字符数据
ID --> 唯一标识,必须字母开头
( | | ) --> 选择
* 约束
#REQUIRED ,required必填
#IMPLIED , implied可选
#FIXED value,fixed固定值
defaultValue,默认值
* 实体entity
* 实体相当于java中的变量
* 分类:
* 内部实体:
* 引用实体:
* 定义位置:dtd文档中
* 定义格式:
* 使用位置:xml文档中
* 使用格式:&名称;
* 参数实体:
* 定义位置:dtd文档中
* 定义格式:
* 使用位置:dtd文档中
* 使用格式:%名称;
* 外部实体:
* 要求
* 基本:会读
* 高级:会写
* URL:统一资源定位符,完整的web路径:http://www.itcast.cn/news/index.html
* URI:统一资源标识符,标记的作用,可以为不完成路径。 URL为URI的子集
* XML Schema 是基于 XML 的 DTD 替代者。
* schema文档就是xml文档。schema的内容为xml内容;扩展名为,*.xsd
* 必须具有一个根元素,名称为:
* 文档关联--命名空间(namespace)【★★★】
* schema文档
* 例如:
targetNamespace="http://www.example.org/books"
xmlns:tns="http://www.example.org/books">
* 1.当前books.xsd是schema文档,根元素为schema
* 2.具有一个已经官方写好的约束文档
* 命名空间:对指定的schema文档进行引用
* 格式1 ## xmlns="URL" (xml namespace),默认命名空间声明
* 例如:xmlns="http://www.w3.org/2001/XMLSchema"
* 根元素为schema,为官方文档的规定
* 格式2 ## xmlns:别名="URL",显示命名空间声明
* 例如:xmlns:xsd="http://www.w3.org/2001/XMLSchema"
* 别名在当前文档必须唯一,名称自定义
* 使用格式:<别名:标签名称>
*例如:
* 官方建议:默认命名空间指向官方文档
* 3.当前schema文档进行命名
* targetNamespace属性给文档进行命名,名称自定义
* 例如:targetNamespace="http://www.itcast.cn/books"
* 例如:官方文档中也使用当前属性,
* 4.定义根元素,通过官方的标签确定元素
* xml文档
* 例如:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/booksbooks.xsd" >
* 5.确定自定义schema文档的位置
5.1 确定使用的schema文档的url,使用约束内容
xmlns="http://www.example.org/books"
5.2 固定内容,进行schema实例化引用,目的使用schemaLocation
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5.3确定schema文档的位置
* 格式:xsi:schemaLocation="schema文档的URL schema文档的位置"
* 例如:xsi:schemaLocation="http://www.example.org/booksbooks.xsd"
* 总结:
*http://www.w3.org/2001/XMLSchema 官方定义schema文档时使用的约束文档,在xsd文档中使用
*http://www.w3.org/2001/XMLSchema-instance 官方规定确定schema文档位置的约束文档,在xml文档中使用
* dom和sax解析技术,Stax(Streaming api for xml)
* 解析器,采用不同的解析技术解析xml文档。不易理解,难以开发
* 解析开发包,封装解析器,提供便捷API
* DOM:DocumentObject Model, 即文档对象模型,w3c标准
* 将xml文档加载到内存,形参一个dom树
* 优点:CURD操作(create update read delete)
* 缺点:文件过大,极易出现内存溢出
* 需要获得document文档
* 所有的内容都可以成为节点Node
* SAX:Simple APIfor XML
* JAXP(Java API for XML Processing ),sun一套XML解析API
* JAXP很好的支持DOM和SAX解析方式
* 设计的包结构
* javax.xml ,java实现类的包目录
* org.w3c.dom ,w3c提供接口
10.jaxp--dom 【★★★】
* 编写流程
* 1. 获得document -->DocumentBuilderFactory -->DocumentBuilder --> Document
* 2. 操作
* R :遍历,getElementsByTagName() , NodeList(getLength(),item(i)) ,getChildNode() , getNodeType() ,getTextContent()
* CUD :
* C , 先创建,后添加
* D , 先获取,再通知父节点,删除当前
* 3. 保存(提阅读供文档,不掌握)
11.jaxp--sax
* 事件驱动的 XML 处理方法,逐行扫描文档,一边扫描一边解析
* 事件驱动,将每一个动作发生时,将自动触发相应的事件(java方法)
* 编写自定义事件处理类,继承基类DefaultHandler
* 元素开始:startElement
* 字符:characters()
* 元素结束:endElement
回顾
* xml
* 扩展名:*.xml
* 文档声明:
* 元素:<名称> <名称 />
* 命名:区分大小写
* 格式化良好的xml文档,只有一个根元素。
* xml约束
* DTD
* 文档关联 --> 相对/ ./当前 ../上一层 绝对d:
* 元素:
* 符号: ? + * , | ()
* 约束:(#PCDATA) EMPTY
* 属性:
* 类型:ID、CDATA、()
* 约束:#REQUIRED / #IMPLIED / #FIXED value / defaultValue
* schema
* 命名空间:
* 对schema文档进行名称:targetNameSpace="唯一名称"
* 默认引用:xmlns="url" --><标签>
* 显示引用:xmlns:别名="url" --> <别名:标签>
* jaxp--dom
* 使用dom解析必须获得document
* 获得document方法:DocumentBuilderFactory.newInstance() --> factory.newDocumentBuilder() --> builder.parse() --> Document
* jaxp--sax
* 读取一行之后,将释放资源。只能读r
* 解析方法:SaxParserFactory--> SaxParser -->parser(file,DefaultHandler)
#####################################################################################################
* 第三方解析xml的工具包
* 需要jar包
* 核心包:dom4j-1.6.1.jar
* 强制转换
* 一般不存在强制转换,只要出现,必须检查导包
* 程序运行时的类型,可以强转为当前类型或父类类型
*%myeclipse%/configuration/.settings/org.eclipse.ui.ide.prefs
* RECENT_WORKSPACES= 设置已经使用的workspace
*SHOW_WORKSPACE_SELECTION_DIALOG=true 运行myeclipse时,是否提示选择workspace
* 快捷键
// alt + / 内容提示
// ctrl + 1 修复【】
// ctrl + / 注释
// ctrl + d 删除
// alt + shift + s 常用操作
// ctrl + L 跳转行
// ctrl + t 显示当前类的继承结构
// ctrl + shift + t 搜索源码
// ctrl + shift + o 整理包【】
* 阅读:day01\参考\Eclipse最实用快捷键.txt, Eclipse快捷键大全.txt
* 程序中提供一种调试程序的功能。
* 断点breakpoint,程序暂定的位置标记
* 快捷键:
* f6 执行一行
* f5 跳入方法
* f7 跳出方法
* f8 执行到下一个断点,如果没有断点,程序结束
* Static Import 静态导入[不讲]
* Annotations 注解@Override,javaweb最后一天[后讲]
* Autoboxing/Unboxing ,自动装箱与拆箱
* 基本类型与相应的包装类型的转换。
* jdk1.4转换
* 基本类型-->包装类型 : new 包装类(基本类型)
* 包装类型-->基本类型 :包装类.基本类型Value()
* Varargs : 可变参数
* 形参格式:类型 ...变量名
* 例如: sum(Integer... arrs)
* 实际参数:个数不定
* 总结:
* jvm 将可变参数当成数组使用
* 当实际参数为数组,数组将被打散,以多个参数的形式进行赋值
* 形参可变参数,必须放置在参数列表的最后一位
* Enhanced for Loop ,增强for循环,foreach
* 格式:for(类型变量名 : 数组 | 集合(Iterable)){}
* 练习:数组、list和map的遍历
* 注意:增强for是iterator的简化,只能进行迭代(遍历),不能直接修改
* Generics : 泛型
* 使用格式:类型<类型,类型,....>
* 注意:
* 前后必须一致
* 基本类型不能在泛型中使用
* 泛型只为编译服务,在class文件不存在泛型。
* 自定义
* 方法: public
* 类 : public class HelloWorld
* Typesafe Enums : 枚举
* 关键字:enum
* 构造方法默认为私有的
* 常量值建议为大写,且必须放置在所有代码之前。如果常量之后没有内容,分号可以不写,建议填写。
* 反射,在运行时操作指定的对象
* Class对象,class文件在内存中的描述对象。
* 获得方法
* 1 已经类的完整路径名(字符串) :Class.forName(..) [常用]
* 2 已经类型:String.class ,确定参数列表
* 3 已经对象:obj.getClass()
* 注意:
* Class提供获得默认构造方法实例对象:newInstance()
* 构造Constructor
* 获得方法
* 公共的构造方法: Constructor
* 已经声明的构造方法:Constructor
* 实例化
*newInstance(Object... initargs) ,可变参数用于确定实际参数列表
* 字段Field
* 获得方法
* 公共:Field getField(String name) ,通过字段名称
* 声明:Field getDeclaredField(String name)
* 操作
* 获得内容:Object get(Object obj)
* 设置内容: void set(Object obj, Object value) ,确定实例对象
* 方法Method
* 获得方法
* 公共:Method getMethod(String name, Class... parameterTypes) 通过方法name获得方法,可变参数为方法的形式参数列表
* 声明:Method getDeclaredMethod(String name,Class... parameterTypes)
* 执行
* Object invoke(Object obj, Object...args) 执行指定对象obj,指定方法,可变参数为方法的实际参数列表
* 单元测试工具类,测试用例
* 测试用例的编写
* 给方法添加@Test注解
* 测试方法必须为,
公共public,
没有返回值void,
非静态的
方法名自定义(建议使用测试方法的名称,在之前添加test)
没有参数
* 其他注解
@Before:在测试方法之前执行
@After:在测试方法之后执行
* 断言Assert,测试方法中进行结果逻辑的判断
回顾
* day01
* xml
# 格式化良好的xml文档,必须有一个根元素
* dtd
# ? + * | ,
* schema
# 命令空间:namespace,用于区分来自不同约束文档的元素或属性等。每一个文档进行名称(唯一,URL字符串)
# 格式:xmlns="URL" 默认引用最多只有一句 , xmlns:别名="URL"显示引用,当前文档别名唯一
* jaxp-dom
# dom解析原理,将xml文档加载到内容,形参一个dom树。CURD操作
* jaxp-sax
# 事件驱动,逐行解析。读取当前行时,将释放之前的内容。使用较小的内存,读取大文件。
* day02
* dom4j:CURD
* 读:SaxReader
* 写:XmlWriter
* 获得根元素:getRootElement()
* xpath ://book[@id='b001'] -->selectSingleNode(xpath)
* jdk5特性:
* 自动装箱与拆箱、可变参数,泛型,增强for。--使用
* for循环(数组、List、Map遍历)
* 枚举enum,简单枚举使用
* 反射:基本操作
* Class 获得
*Method方法
* 获取getMethod(name,...) --确定的形参
* 执行invoke(对象,实际参数)
* debug:不断操作
* junit:@Test使用
#####################################################################################
* 通信模式
* B/S(browser / server) : 浏览器/服务器模式。特殊的C/S模式,服务器升级,浏览器不需要同步
* C/S(client / server) : 客户端/服务器模式,例如:QQ。QQ软件升级
* URL详解:【★★★★★】
* 例如: http://localhost:8080/abc/1.html
* http --> 协议 , ftp:// svn:// https://
* :// --> 分隔符
* localhost --> 本地域名,对应本地IP
* 例如:www.itcast.cn 公网域名(注册)
* IP地址:所有的计算机之间进行通信,必须使用一个唯一标识
* IPv4,将数字使用.进行分隔,
公网IP:211.100.52.213
局域网IP:192.168.1.100 -->10
本地IP:127.0.0.1
* IPv6 : win7支持,6分隔
* DNS:域名解析服务
* 端口:服务器端每一个应用程序都需要占用至少一个端口
* tomcat web服务器,默认端口:8080
* http协议默认端口:80
* abc/1.html : 服务器端的资源
* WebLogic,oracle公司,支持javaee 13核心技术,收费
* WebSphere,IBM公司,支持javaee 13核心技术,收费
* tomcat,apache组织,支持javaee 两个核心技术,Servlet和JSP
* 解压:apache-tomcat-7.0.27.zip
* 注意:解压的目录不建议包含中文和空格
* 启动:
* %tomcat% -->D:\java\tomcat\apache-tomcat-7.0.27tomcat的安装目录
* %tomcat%/bin/startup.bat
* 测试:http://localhost:8080
* 没有配置java_home
* 使用cmd运行,错误提示
Neither the JAVA_HOME northe JRE_HOME environment variable is defined
At least one of theseenvironment variable is needed to run this program
* java_home配置错误
* 错误提示
The JAVA_HOME environmentvariable is not defined correctly.
It is needed to run thisprogram in debug mode.
NB: JAVA_HOME should pointto a JDK not a JRE.
* 错误配置了catalina_home
* 所有startup.bat文件将启动一个tomcat
* 异常提示:Causedby: java.net.BindException: Address already in use: JVM_Bind
* 修改端口
* 文件位置:%tomcat%/conf/server.xml
* 端口位置:
*
*
*
* bin目录:启动/停止服务
* startup.bat启动
* bootstrap.jar,启动引导jar
* bootstrap.jar/META-INF/MANIFEST.MF/
* Main-Class:org.apache.catalina.startup.Bootstrap
* 总结:tomcat是java编写,Bootstrap类main方法
* shutdown.bat停止
* conf目录:配置目录
* server.xml,核心配置文件
* tomcat-users.xml,tomcat的用户配置文件
* web.xml,tomcat管理的所有web项目的基本配置文件。
* lib目录:tomcatjava项目需要的jar文件
* servlet-api.jar,servlet需要的jar文件
* jsp-api.jar,jsp需要的jar文件
* logs目录:tomcat的日志目录
* catalina.*.log,tomcat运行维护日志
* tomcat是以天进行日志记录
* temp目录:临时目录
# *.tmp临时文件
* webapps目录:tomcat管理的所有web项目的目录【★★★★★】
* work目录:tomcat处理jsp的工作目录【★★★★★】
* 端口的配置
* 内容介绍:
* 执行URL:http://localhost:8080/manager/html
* 配置文件的位置:%tomcat%/conf/tomcat-users.xml
* 配置的内容:
* 重新启动
* / 表示的 ROOT目录
* 例如1
* 资源位置:%tomcat%/webapps/ROOT/abc.html
* 访问:http://localhost:8080/abc.html
* 例如2:
* 资源位置:%tomcat%/webapps/demo/dmeo.html
* 访问:http://localhost:8080/demo/demo.html
* 注意:如果出现404提示,说明路径写错
| 项目名称
|-- WEB-INF 目录,tomcat不允许浏览器通过url直接访问
|-- classes目录,等价于java项目的bin目录,存放class文件
|-- lib 目录,存放web项目需要的jar文件
|-- web.xml文件,当前web项目的配置文件
* 注意:%tomcat%/conf/web.xml配置相同,当前文件将覆盖%tomcat%/conf/web.xml文件
* 例如:
* web项目的名称为:demo
* 在web.xml文件中配置--欢迎页面
* 在访问当前web项目时,如果没有书写具体的访问资源名称,将访问欢迎页面
*http://localhost:8080/demo/
* WebRoot目录,中的所有内容将被发布到tomcat中,等价%tomcat%/webapps/项目名称/...
* ContextRoot,表示发布到tomcat中的项目名称
* 如果webapps所在目录空间大小有限,如何将web项目放置到其他盘符?
* %tomcat%/conf/server.xml -->
* 虚拟路径的配置:
* 1 在server.xml配置
*
* path属性:表示浏览器访问的名称,必须使用/开头
* docBase属性:其他目录的web项目的位置
* 必须重启
* 2 %tomcat%/conf/引擎名称/主机名称 配置xml文件
* 位置:%tomcat%/conf/catalina/localhost
* 文件名称(不带扩展名)将为path的内容
* 文件内容:
* 增强
* 不填写web项目的名称 : 将xml文件的名称修改为ROOT
* 不填写资源路径:在项目目录/WEB-INF/web.xml -->配置欢迎页面
* 不填写端口:将端口修改为80
* 将tomcat中配置一个主机
unpackWARs="true"autoDeploy="true">
* 修改window操作系统的hosts文件
* 位置:C:\WINDOWS\system32\drivers\etc\hosts
* 注意:如果localhost不能访问本地资源,hosts没有配置
* 缺少:127.0.0.1 localhost
##############################################################################
1.http协议
* 基于TCP连接(三次握手,建议连接)
* 默认端口:80
* 基于请求--响应模式
2.web资源
* 静态资源:html、image、视频、音频等
* 动态资源:可以动态生成的资源(服务器端程序生成)
3.http版本
* http1.0 ,一次连接只是用一次
* http1.1 ,一次连接可以使用多次
4.http协议--请求request
* 请求格式:请求行、请求头、请求体
* 请求行
* 格式:请求方式 请求资源路径 协议/版本
* 例如:GET/day03_web/1.html HTTP/1.1
* 请求方式:http协议7种请求方式
* 常用:GET、POST【★★★】
* 区别:
* get:将请求参数追加到请求资源路径之后
* 例如:/day03_web/1.html?username=jack&password=1234
* post:将请求参数放置到请求体中
* 比较:
* post安全
* post可以发送大数据,get发送1kb数据(1024字符)
* 请求头
Accept: text/html,image/* --支持数据类型,浏览器可以解析内容
Accept-Charset: ISO-8859-1 --字符集(编码)
Accept-Encoding: gzip --支持压缩
Accept-Language:zh-cn --语言环境
Host: www.itcast.com:80 --访问主机
If-Modified-Since: Tue, 11 Jul2000 18:23:51 GMT --缓存时间
Referer:http://www.itcast.com/index.jsp --来自哪个页面、防盗链
User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT 5.0) --用户的浏览器版本
Cookie --cookie
Connection: close/Keep-Alive --链接状态
Date: Tue, 11 Jul 2000 18:23:51GMT --时间
* 重要:Referer、If-Modified-Since【★】
* 请求体
* 一般没有数据,只存放post请求方式的数据
* “请求体”与“请求头”之间存在一个空行
5.http协议--响应response
* 响应格式:响应行、响应头、响应体
* 响应行:
* 格式:协议/版本 状态码 状态码对象的信息
* 例如:HTTP/1.1200 OK
* 状态码
* 1 1xx,链接进行中
* 2 2xx,正常请求完成。
* 200,正常
* 3 3xx,服务性通知浏览器,浏览器需要进一步操作完成整个过程。
* 304,服务器通知浏览器,读取本地缓存
* 302,服务器通知浏览器,使浏览器去访问指定的资源。(响应头,location,用于确定页面)--跳转(重定向)
* 4 4xx,服务器通知浏览器,浏览器操作异常
* 404,资源没有找到。(浏览器端编写路径有误)
* 5 5xx,服务器通知浏览器,服务器端异常
* 500,服务器端异常(java程序异常)
* 重要:200、302、304、404、500【★★★】
* 响应头
Location:http://www.it315.org/index.jsp --跳转方向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Language: zh-cn --语言环境
Content-Type: text/html; charset=GB2312 --数据类型,解决响应的中文乱码
Last-Modified: Tue, 11 Jul 200018:23:51 GMT --最后修改时间
Refresh:1;url=http://www.it315.org --定时刷新
Content-Disposition: attachment;filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ;path=/search --添加cookie
Expires: -1 --缓存
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
* 注意,在jsp页面查询
Connection: close/Keep-Alive --连接
Date: Tue, 11 Jul 2000 18:23:51GMT --时间
* 重要:Content-Type、Location、Content-Disposition、Content-Encoding、Refresh【★★★】
* 响应体
* 服务器端返回给浏览器的数据
* “响应头”和“响应体”之间存在一个空行
回顾
* tomcat
* B/S(浏览器/服务器)
* URL书写:http://localhost:8080/abc/1.html
* tomcat目录结构
* %tomcat%/bin/startup.bat
* %tomcat%/conf/web.xml , 当tomcat启动时加载web.xml文件,每一个项目的web.xml文件的内容将覆盖全局的内容(内存)
* %tomcat%/webapps
* %tomcat%/work
* web项目目录结构
项目名称
|-- WEB-INF
|--classes
|--lib
|--web.xml
* 虚拟路径
* 扩展web应用的位置 :%tomcat%/conf/Catalina/localhost/demo.xml -->
* URL :http://localhost:8080/demo/....
* 不填写web项目的名称:将文件的名称修改为ROOT --> / ROOT
* URL :http://localhost:8080/....
* 省略资源路径:配置欢迎页面
* web.xml
* URL :http://localhost:8080/
* http协议默认端口80,修改tomcat的端口
* server.xml -->
* URL :http://localhost/
* 虚拟主机
* 在server.xml文件添加
unpackWARs="true"autoDeploy="true">
* name属性:域名
* appBase属性:编写自己的webapps目录,d:/mywebapps (此目录中可以存放多个web项目)
* 模拟域名,修改hosts文件
* 内容:127.0.0.1 www.itcast.cn
* URL : http://www.itcast.cn/
* 思考:http://127.0.0.1
* server.xml文件:
* 默认主机,defaultHost,没有确定主机时使用的主机
* 例如
* window系统 hosts文件 127.0.0.1 www.baidu.com
* http协议
* 请求request
* 请求行--请求方式:GET、POST
* 请求头:referer,if-modifed-since
* 响应response
* 响应行--状态码:200、302、304、404、500
* 响应头:content-type、content-disposition、content-encoding、location、refresh、last-modifed等
##########################################################################
* servlet = Server Applet
* servlet java提供的处理动态web资源的技术
* servelt是一个类,此类必须直接或间接与javax.servlet.Servlet接口有关。
* 特点:单实例,多线程。(servlet存在线程安全)
* servlet必须放置到web容器(web服务器,tomcat)中
* 接口:javax.servlet.Servlet
* 实现类:javax.servlet.GenericServlet
* 实现类:javax.servlet.http.HttpServlet【】 --> 覆写 doGet(get请求处理方法) 、 doPost(post请求处理方法)
* 1.编写实现类(implementsServlet)
* 2.配置servlet(web.xml)
* 3.测试
* 注意:
* tomcat启动时,将加载所有web项目的web.xml文件。
* 启动时异常,有可能xml文件配置错误
* 1.标签名称写错
*2.
* 错误提示:Caused by: java.lang.IllegalArgumentException: Invalid
* 3.
* 错误提示:Caused by: java.lang.IllegalArgumentException: Servletmapping specifies an unknown servlet name OneServlet
* 1.编写实现类(implementsServlet)
public class HelloServletimplements Servlet {
* 2.配置servlet(web.xml)
* 注册servlet,将当前servlet配置给tomcat,使用
* 使用
* 名称自定义,要求当前web.xml文件中唯一
* 使用
* 使用servelt,将注册的servlet与路径进行映射,使用
* 确定注册servlet的名称,使用
* 使用
* 要求必须/开头,名称自定义
* 例如
* 3.测试
* url :http://localhost:8080/day04/hello
* init(ServletConfig),初始化方法【★★★★★本行】
* 完成准备工作
* 执行次数:1
* 执行者(调用者):tomcat,执行过程中,需要传递实际参数
* ServletConfig对象
* 当前servlet的配置对象,获得servlet的名称与初始化内容
* API【★】
* 1 获得servlet的名称 -- web.xml --
StringservletName = config.getServletName();
* 2 通过名称获得初始化参数 ,没有参数返回null
Stringusername = config.getInitParameter("username");
* 3 获得所有初始化参数的名称
Enumeration
while(names.hasMoreElements()){
Stringname = names.nextElement();
Stringvalue = config.getInitParameter(name);
System.out.println("## " + name + " : " + value);
}
* 4 获得第一个特殊对象ServletContext ???
ServletContextsc = config.getServletContext();
* 在web.xml文件中配置初始化参数
*
*service(ServletRequest,ServletResponse),servlet执行方法【★★★★★本行】
* 执行次数:一次请求执行一次
* 执行者:tomcat,执行过程中,需要传递实际参数
* 分析过程:
* request分析
* 接口:javax.servlet.ServletRequest
* 实现类:org.apache.catalina.connector.RequestFacade
* * 继承关系:
* * public class RequestFacadeimplements HttpServletRequest {
* * public interfaceHttpServletRequest extends ServletRequest {
* * 总结:RequestFacade --> HttpServletRequest --> ServletRequest
* ArrayList List Object
* 结果获得对比分析
Object obj =new ArrayList();
List list =(List) obj;
ServletRequestreq = new RequestFacade()
HttpServletRequestrequest = ()req;
* response分析
* 接口:javax.servlet.ServletResponse
* 实现类:org.apache.catalina.connector.ResponseFacade
* * 继承关系:
* * public class ResponseFacadeimplements HttpServletResponse {
* * public interfaceHttpServletResponse extends ServletResponse {
* * 总结:ResponseFacade --> HttpServletResponse -->ServletResponse
* 分析总结:【★★★★★】
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponseresponse = (HttpServletResponse) resp;
* destory(), 销毁方法【★★★★★本行】
* 执行次数:正常关闭服务器时,执行1次
* 执行者:tomcat
* 工具类MyGenericServlet implments Filter,ServletConfig
* GenericeServlet中缓存config对象,方法对config中API调用【★★★】
* 获得ServletContext
this.getServletContext(); //直接获得父类通过config获得Servletcontext
this.getServletConfig().getServletContext(); //父类缓存了config,通过config获得ServletContext
* 提供了一个没有参数的init(),需要进行初始化操作时,仅需要覆写init()方法即可
* 可以覆写init(ServletConfig),但必须在此方法中显示的调用父类的方法,super.init(config)
* this调用方法时,当前运行类(执行方法时,编译看左边,运行看右边)
* 工具类MyHttpServlet
* 强转(使用)
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponseresponse = (HttpServletResponse) res;
* 分流【★★★】
* 提供doGet和doPost方法,分别处理get请求与post请求
* 注意:
* web.xml文件,注册servlet必须出现在映射之前。
* myeclipse自动创建的servlet,所有的注册都在映射之前(历史遗留问题)
* 约束schema -->
* javaee 1.3 dtd约束 --> 使用逗号servlet*,servlet-mapping*
* url-pattern 的配置,三种分类
* 1 完全匹配路径名:必须使用/开头,其他内容自定义
* 例如:/hello ,/abc/hello
* 2 不完全匹配路径名:必须使用/开头,最后必须使用/*结尾
* 例如:
/* , 所有路径
/abc/* , abc路径之下的所有内容(/abc/demoServlet , /abc/helloServlet)
* 3 扩展名匹配:必须*.开头,字符结尾
* 例如:
*.jsp , 所有的jsp文件
*.do ,struts1扩展名
*.action ,struts2扩展名
* 优先级 : 1 > 2 > 3
* 注册一个servlet,可以使用多少次?多次
* 等价于
* 一个路径,可以映射几个servlet?完全匹配路径名需要唯一
* form.html页面,如何执行?
* 执行路径
* web项目的WEB-INF/web.xml文件,查询
* %tomcat%/conf/web.xml文件,查询,没有查询到完全匹配路径,提供一个缺省路径。其他路径都不匹配的情况,将执行的路径。路径必须为:"/"
* 源码
*org.apache.catalina.servlets.DefaultServlet tomcat实现的servlet完成功能
* 如果文件存在,将以流形式发送给浏览器
* 如果文件不存在,将发送404错误信息
* web项目的WEB-INF/web.xml文件的配置内容,将覆盖%tomcat%/conf/web.xml文件配置内容
* ServletContext对象,servlet上下文对象。Servlet的管理者Boss
* tomcat在启动时,会为每一个web项目创建对象(开辟内存),用于管理当前web项目
* ServletContext对象获取引用方式
this.getServletContext() orthis.getServletConfig().getServletContext()
* ServletContext对象创建与销毁
* 创建:tomcat在启动时创建(创建者,创建时间)
* 销毁:tomcat在关闭时销毁
* API
* 管理当前web项目的资源
* 获得真实路径,当前资源在web服务器物理路径:getRealPath(java.lang.String path)【★★】
* 必须/开头
* 获得当前资源在web服务器物理路径对应的流:getResourceAsStream(java.lang.String path) 【★★】
* 扩展内容:
* 获得当前目录下的所有的资源路径:getResourcePaths(java.lang.String path)
* 管理当前对象的内存,管理当前对象的属性(Attribute) -- xxxAttribute【★】
* 将指定对象Object,通过指定的名称name,放置到ServletContext对象属性中:
voidsetAttribute(java.lang.String name, java.lang.Object object)
* 通过给定的名称name获得指定的对象
java.lang.ObjectgetAttribute(java.lang.String name)
* 通过给定的名称name移除指定的对象
voidremoveAttribute(java.lang.String name)
* 总结
* 在不同servlet之间进行数据共享
* 不同用户之间数据共享
* 跨浏览器数据共享
* 不足,如果存放数据过大,长时间暂用内存
* web项目的初始化内容进行管理
* 通过名称获得值:java.lang.String getInitParameter(java.lang.Stringname)
* 获得所有的名称:java.util.Enumeration getInitParameterNames()
* web项目初始化内容,web.xml文件配置
* init() 执行时间,第一次方法时此方法将执行
* web.xml文件的
* 解决问题:当初始化处理时间过长或必须在其他servlet执行之前执行。
* 内容为数字,数字越小,优先级越高,优先启动。
回顾
* servlet继承关系
* javax.servlet.Servlet接口,javaee规定servlet规范
* class GenericServlet implementsServlet,通用servlet实现,所有都可以使用,service没有实现
*this.getServletConfig().getServletName()
* 实现ServletConfig --> this.getServletName()
* class HttpServlet extendsGenericServlet,与http协议有关
* servlet生命周期
* init(ServletConfig) , 执行1次,执行时间(1 第一次调用 2web.xml配置
*service(ServletRequest,ServletResponse) ,一次请求执行1次
* destroy() 服务器正常关闭
* servlet编写流程
* 实现类,继承HttpServlet,并覆写doGet() 或 doPost()
* web.xml配置
* 测试:http://localhost:8080/day05/one
* 配置路径
* 完全匹配:/abc/one
* 不完全匹配:/abc/*
* 扩展名匹配:*.jsp
* 强转
javax.servlet.http.HttpServletRequestrequest = (...)javax.servlet.ServletRequest;
javax.servlet.http.HttpServletResponsereponse = (...)javax.servlet.ServletResponse;
* ServletContext对象
* 获得路径:ServletContext.getRealPath("/")
* 获得资源流:getResourceAsStream("/")
* 对象属性操作:xxxAttribute
###############################################################################
* java项目(回顾)
* 相对路径
* 分类
* 字母开头,例如:book.xml
* "./"开头,当前目录,例如:./book.xml。与“字母开头”等价
* "../"开头,当前目录的上一次目录。例如:../book.xml
* 源码:File file = new File("books.xml");
* cmd -- java命令
* 运行:F:\workspaces\20130605\day05_java\bin>javacn.itcast.HelloWorld
* 结果:F:\workspaces\20130605\day05_java\bin\books.xml
* myeclipse运行
* 结果:F:\workspaces\20130605\day05_java\books.xml
* cmd中等价myeclipse
* 设置classpath
* 运行:F:\workspaces\20130605\day05_java>java -cpF:\workspaces\20130605\day05_java\bin cn.itcast.HelloWorld
* 结果:F:\workspaces\20130605\day05_java\books.xml
* 绝对路径:F:\workspaces\20130605\day05_java\books.xml
* web项目:web必须依赖与web服务器
* 相对路径:
* 字母开头:必须保证“当前页面”之前的内容,与“目标页面”在同一个路径下
* 与"./"等价
* "../"开头:当前目录的上一级目录
* "/"开头【★★★】
* 第一种:浏览器发送给服务器:当前web站点(%tomcat%/webapps, http://localhost:8080)
* 注意:%tomcat%/webapps/ROOT , http://localhost:8080/
* 第二种:服务器发送给服务器:当前web项目(%tomcat%/webapps/day05 , http://localhost:8080/day05)
* 注意:不需要填写web项目的名称
* 完整路径(绝对路径):http://localhost:8080/day05/abc/1.html
* tomcat的request实现类,对http协议的“请求”进行封装
* tomcat的response实现类,对http协议的“响应”进行封装
* 创建时间与销毁时间
* 创建:一次请求的开始
* 销毁:一次请求的结束
* request与response成对出现。先存在request,再存在response
* 接口:javax.servlet.http.HttpServletResponse, 父接口:javax.servlet.ServletResponse
* 总结:HttpServletResponseresponse = (...)ServletResponse
* http响应格式:响应行、响应头、响应体
* 操作
* 1. 响应行的操作:
* 修改状态码:setStatus(int sc) 【☆】
* SC_OK,200
* SC_NOT_FOUND,404
* SC_NOT_MODIFIED ,304
*SC_MOVED_TEMPORARILY ,302
*SC_INTERNAL_SERVER_ERROR ,500
* 2. 响应头的操作:
* 设置响应头,值为字符串:void setHeader(java.lang.String name, java.lang.Stringvalue) 【☆】
* 设置响应头,值为日期:void setDateHeader(java.lang.String name, long date)--> new Date().getTime()
* 设置响应头,值为整型值:void setIntHeader(java.lang.String name, int value)
* 回顾
* 跳转(重定向)
* 状态码:setStatus(302)
* 响应头:setHeader("location", uri);
* 重定向:重新指定方向
* API:sendRedirect(java.lang.String location) 【★★★】
* 3. 响应体操作 : java使用流【★★★★★】
* 字节流:ServletOutputStream getOutputStream()
* 字符流:PrintWriter getWriter()
* 总结
* 所有流最终使用一个方法write(int b)
* getOutputStream() 与 getWriter()两个流不能同时使用
* getOutputStream() 用于处理字节,下载,压缩等
* getWriter() 用于处理字符,与文字有关。处理中文。
* 中文乱码处理
* 在发送中文之前设置编码
* API:response.setContentType("text/html;charset=UTF-8");【★★★】
* text/html,MIME类型,格式:大类型/小类型;参数。charset表示字符集
* text/csscss样式
* 回顾--设置响应头
response.setHeader("content-type","text/html;charset=UTF-8");
* 接口:javax.servlet.http.HttpServletRequest,父接口:javax.servlet.ServletRequest
* 强转:HttpServletRequestrequest = (...)ServletRequest
* http请求格式:请求行,请求头,请求体
* 操作
* 请求行的操作:
* 获得请求方法:request.getMethod(); -- GET
* 获得请求资源的路径
* 实例:http://localhost:8080/day05/request/api?username=jack&password=1234
** 获得协议:request.getScheme() -- http
** 获得域名,如果域名不存在,则显示IP:request.getServerName()-- localhost 或者 127.0.0.1
** 获得端口:request.getServerPort() -- 8080
** 获得发布到tomcat的项目名称:request.getContextPath() -- /day05 【★★★】
** 获得所有的请求参数 : request.getQueryString() -- username=jack&password=1234
** 获得servlet路径:request.getServletPath() -- /request/api 【★★★】
* 与路径有关API
*request.getRequestURL() : http://localhost:8080/day05/request/api
*request.getRequestURI() :/day05/request/api
* 请求头:
* 获得指定名称的值:java.lang.String getHeader(java.lang.String name)
* 获得时间值:long getDateHeader(java.lang.String name)
* 获得整型值:int getIntHeader(java.lang.String name)
* 请求体:【★★★★★】
* 通过表单提供的name属性获得表单提交的第一个数据:
java.lang.StringgetParameter(java.lang.String name)
* 注意:表单提交的数据都是字符串,或者是null,(没有填写值为空字符串)
* 通过表单提供的name属性获得表单提交的所有数据:
java.lang.String[]getParameterValues(java.lang.String name)
* 获得表单提交的数据:java.util.Map
* key,表单中所有的name属性,value,name属性对应的值
* 关系:
*java.util.Map
* 获得指定name的所有值:String[] getParameterMap().get(name)
* 获得指定name的第一个值:String getParameterMap().get(name)[0]
* 中文乱码处理【★★】
* 在获得表单数据之前设置post表单提交的数据编码:setCharacterEncoding(java.lang.String env)
* get请求方式的中文乱码处理
* str = new String(str.getBytes("ISO-8859-1") , "UTF-8")
* 关闭myeclipse
* 查询java文件
* 1.%myeclipse%/myeclipse.ini --> 查询common文件夹
* 2.Common/plugins/com.genuitec.eclipse.wizards_*.jar
* 3. jar/templates/Servlet.java
* 注意:
java项目 -->jar包
web项目 --> war包
jar包与war包的压缩格式相同,且与zip压缩格式相同
* 接口:javax.servlet.RequestDispatcher
* 请求调度器,将服务器端的请求分发给其他资源
* 获得方法:
* 通过request对象获得,ServletRequest.getRequestDispatcher(java.lang.String) 【常用】
* 通过ServletContext对象获得,ServletContext.getRequestDispatcher(java.lang.String),必须使用/开头
* API
* 转发:forward(ServletRequestrequest, ServletResponse response) ,只在浏览器端显示最后一个页面的发送内容【★★★★★】
* 包含:include(ServletRequestrequest, ServletResponse response) ,将所有页面的内容全部显示给浏览器
* request的属性操作:xxxAttribute
* 思考:转发与重定向的对比??
* 1.提供表单html,登录(用户名)
* 2.编写一个servlet处理登录(LoginServlet)
* -1在init()方法中提供数据库的初始化
* 1获得表单提交数据
* 2.servlet提供Map
* 3.将获得数据放置request的属性中,使用转发(ShowServlet)显示数据
* 3.提供一个servlet显示数据(ShowServlet)
回顾
* path路径:
“/开头”:
* 浏览器-->服务器(web站点、必须填写web项目的名称)
* 服务器-->服务器(web项目,不需要项目名称--myeclipse/WebRoot)
* respnse
* 获得流:
* ServletOutputStreamgetOutputStream()
* PrintWriter getWriter()
* 中文乱码
*setContentType("text/html;charset=UTF-8");
* request
* 获得参数
* String getParameter(name)
* String[]getParameterValues(name)
*Map
* API路径
* 获得发布web项目名称:getContextPath() --> /day06
* servlet路径:getServletPath() --> /demo/abcServlet
* post中文乱码
*setCharacterEncoding("UTF-8");
* get中文乱码
* newString(str.getBytes("ISO-8859-1") , "UTF-8");
* 转发与重定向
* 转发:服务器向服务器请求资源,并只显示最后一个页面的发送到浏览器的数据
* 给request的属性添加内容:request.setAttribute(name,value)
* 转发:request.getRequestDispatcher("path").forward(request,response);
* 重定向:服务器通知浏览器,重新改变方向
*response.sendRedirect(location)
* 对比 :用户操作一次,可以涉及多个页面
* 请求次数
* 转发:1次
* 重定向:2次
* 地址栏的变化
* 转发:地址栏不变
* 重定向:地址栏URL改变
* 是否可以获得request属性中的内容
* 转发:可以获得
* 重定向:不能获得第一个请求中的request属性的数据
* 创建request对象的个数
* 转发:2个,对象克隆,数据共享
* 重定向:2个,创建两个不同的对象,数据不共享
############################################################################
* JSP(Java Server Pages)是以Java语言为基础的动态网页开发技术(生成动态web资源)
* 对比
* servlet:在java程序嵌入html程序
* jsp:在html程序嵌入java程序
* jsp页面的扩展名:*.jsp
* JSP执行流程:参考excel
* JSP与servlet的关系?
* jsp也是一个servlet
* jsp注释:
* 格式:<%-- 注释内容 --%>
* html注释:
* 对比
html注释 java注释 jsp注释
html源码 有 无 无
java源码 有 有 无
jsp源码 有 有 有
* JSP脚本元素:嵌入java程序
* 声明:在jsp页面声明java的方法、成员变量等 (jsp程序servlet类的一部分)
* 格式:<%! 声明内容 %>
* 表达式:在jsp页面中嵌入java表达式,并发送到浏览器(jsp程序servlet类中service方法的一条语句)
* 格式:<%= 表达式%>
* 等价于:out.print(表达式);
* 代码片段:在java中方法体的内容(jsp程序servlet类中service方法的一部分)
* 格式:<% 代码片段 %>
* 注意:
* 所有的脚本元素不能嵌套
* 作业:使用jsp脚本元素将99乘法表发送到浏览器。增强:使用table布局
* 如果一次请求:转发,将数据放置到request中
* 使用两次分别请求两个servlet,数据需要共享,如何操作?
* 多次请求一个servlet,数据需要共享,如何操作?
* 将数据放置在request的属性中,数据不共享
* 将数据放置在ServletContext对象。
* 案例:记录每一个人上一次访问时间
* 疑问:如果将数据放置ServletContext对象,所有人都方法,是否可以记录每一个人的上次访问时间?
* 打开浏览器,访问一个站点,访问多次资源,关闭浏览器。整个过程就是一次会话。
* 会话技术
* cookie:浏览器端,保存数据,会话技术
* session:服务器端,保存数据,会话技术
* 类:javax.servlet.http.Cookie
* cookie,服务器可以发送少量的数据给浏览器,进行保存。再次访问时,浏览器将携带cookie信息返回给服务器
* cookie的API
* 发送cookie信息:response.addCookie()
* 创建cookie:new Cookie(name,value)
* 获得所有的cookie:cookie:Cookie[] request.getCookies()
* 注意
* 1 如果没有cookie将返回null
* 2 获得的cookie为当前目录或父目录之下的所有cookie
* 访问路径:http://localhost:8080/day06/a/b/c/servlet
* 获得cookie:
* 当前目录:/day06/a/b/c
* 父目录:
/day06/a/b
/day06/a
/day06
/-->站点
* 注意:http://localhost:8080/day06/a/m 不能访问
* 获得数据 ;名称,getName()值,getValue
* 持久化cookie,将cookie保存到硬盘
* 设置有效时间:setMaxAge ,单位秒
* 删除cookie
* 将有效时间设置为0
* 注意:如果path路径被修改,需要执行path
* 思路:
* 获得cookie
* 设置参数
* 通过浏览器,进行覆盖
* cookie的路径:
* cookie默认使用的当前servlet的路径:例如,localhost/day06/cookie/,通过cookie文件查看
* 设置路径:setPath
* 常用设置:setPath("/") ,使当前web站点都可以访问到指定的cookie
* 注意:
* cookie 默认情况下为会话级cookie。浏览器关闭之后数据流失。数据保存内存
* 同名,同路径的cookie将会别之后的覆盖
* 接口:javax.servlet.http.HttpSession
* session一般情况需要与cookie结合使用,在一次会话中只存在一个session对象
* session获得:HttpServletRequest.getSession()
* 如果request的cookie中没有sessionId,将创建一个新的session
* 例如,http协议request请求头中,JSESSIONID=C2B18200E8FA74A52595C2A56EB85AF7
* 如果request的cookie中存在sessionId,将获得已有的session
* session创建与销毁
* 创建:request不存在相应的session,执行request.getSession()时创建。
* 销毁:
* 1. 当session的过期时将销毁。默认过期时间为30分钟。
* 位置:%tomcat%/conf/web.xml
* 内容:
*2.HttpSession.invalidate() , 销毁当前session
HttpSession.setMaxInactiveInterval(intinterval) ,设置当前session的销毁时间,单位,秒inseconds
* 3.非正常关闭服务器
* 注意:正常关闭session将被服务器保存到硬盘中。
* 保存位置:%tomcat%\work\Catalina\localhost\day06/SESSIONS.ser
* API
* isNew()是否是新创建
* 问题:如果cookie失效,session将无法使用。
* 手动方式:将url中追加session的id信息
* 例如:http://localhost:8080/day06/session/destroy.jsp;jsessionid=1F806FA468E0F028484ABE9F7BF0411B
* URL重写
* 如果浏览器禁用了cookie,tomcat自动设置";jsessionid=1F806FA468E0F028484ABE9F7BF0411B",如果没有禁用,则不设置
* API
* java.lang.StringHttpServletResponse.encodeRedirectURL(java.lang.String url)
* java.lang.StringHttpServletResponse.encodeURL(java.lang.String url)
* 唯一的区别:提供URL如果为空字符串显示结果不同。
* 使用API获得重写后的URL,提供现有的URL即可
* 验证码(了解)
* 一次性(重点)
* 获得数据时,将数据保存到session
* 使用之后将数据移除session
* 实现
* VerifyCodeServlet:1用户获得验证码时,保存session
* LoginServlet处理登录
* 获得用户输入的验证码
* 获得session中缓存的
*判断session是否有值
* 没有值(已经使用)--表单重复提交
* 值 (没有使用)
* 匹配(使用)
* 相同:填写成功
* 不相同:验证码错误
* 将session删除
* 存在xxxAttribute的对象:ServletCotext/ ServletRequest/ HttpSession (servlet 三个作用域对象)
* 作用域(作用范围)
* ServletContext,Servlet上下文对象,范围一个web项目。所有页面可以共享数据,多次会话
* HttpSession,服务器端会话技术,范围一次会话。整个会话中所有页面数据共享,多次请求。常用实例:将登录用户信息保存到session中
* ServletRequest,请求对象,范围一次请求。一般情况涉及一个页面,如果使用转发可以涉及多个页面。常用实例:转发将内容设置到request
* 选择:范围越小,优先选择。
回顾
* jsp入门
* jsp执行流程(tomcat将jsp文件处理成了servlet程序。jsp就是servlet)
* jsp脚本元素
* 声明:<%! 声明类型%> --> class Hello{ .... }
* 表达式:<%= 表达式%> --> out.print(表达式);
* 代码片段:<% %> --> service() { .... }
* jsp注释:<%-- jsp注释内容--%>
* 会话技术
* cookie :服务器通知浏览器保存少量数据,浏览器在用户再次访问时,将携带相应的cookie信息(name和value)
* 创建cookie:new Cookie(name,value)
* 发送cookie:response.addCookie(...)
* 获得cookie:request.getCookies()
* API
* 有效时间:setMaxAge() ,单位秒,如果值为0,表示删除
* 路径:setPath(...) ,如果值为/,表示当前web站点。
* web站点:rul --> http://localhost:8080 ## tomcat --> %tomcat%/webapps
* url -->http://localhost:8080/ %tomcat%/webapps/ROOT (当访问http://localhost:8080路径时,浏览器自动添加/)
* session
* session :服务器端保存会话级的数据
* 前提:默认情况,结合cookie一起使用
* 获得:request.getSession() --> 创建 | 获得
* 销毁:1.过期时间 2 执行session.invalidate() 3.非正常关闭
* 如果cookie失效,可以进行URL重写解决。response.URLEncode(url)
* 作业:99乘法表(参考:/day07/WebRoot/99cfb.jsp)
####################################################################################################
* 用于指示JSP执行某些步骤,用于指示JSP表现特定行为,用来设定JSP网页的整体配置信息
* 格式:<%@指令名称 属性名=属性值 ... %>
* 指令名称分类:page、include、taglib
* page指令(参考:/day07/WebRoot/page.jsp)
* 格式:<%@page属性名=属性值 ... %>
* 编码处理
* pageEncoding属性:当前页面的编码
* contentType属性:jsp页面生成servlet响应给浏览器的编码设置,response.setContentType(...);
* 注意:同个编码一般情况相同
* jsp缓存机制
* buffer属性:当前jsp缓存大小,默认8kb
* autoFlush:设置当前jsp页面的缓存是否自动刷新
* 如果设置为false,将可以参数异常
*java.io.IOException: Error: JSP Buffer overflow,缓存溢出
* jsp错误处理机制(不常用)
* errorPage属性:用于指定错误页面,当前页面如果出项异常,将执行指定的页面
* isErrorPage属性:用于确定是否错误页面。将提供exception内置对象,获得异常信息
* 替代者,web.xml进行“友好页面”的配置
用于确定处理的异常的类型
->
* 常用的属性
* import属性:导包
* 分别导包:<%--@pageimport="java.util.ArrayList"--%> <%--@pageimport="java.util.List"--%>
* 一次导入多个:使用逗号分隔,<%--@page import="java.util.List,java.util.ArrayList"--%>
* isELIgnored属性:表示是否或略el表达式
* session属性:当前jsp页面是否使用session,默认情况自动使用request.getSession()
* 如果值为false,当前页面session不可使用
* include指令[参考:/day07/WebRoot/include]
* 静态包含:将处理jsp生成servlet之前,将内容合并为一个servlet,再编译,再执行
* 格式:<%@includefile=""%>
* file属性:用于确定被包含的页面
* 应用场景:页面的模块化
* taglib指令[标签,下一天]
* 格式:<%@taglib name=value%>
* 指令总结
* 指令书写的位置建议放在文件的最前面,可以在任意位置
* 指令可以书写多个
* 内置对象:jsp可以直接使用的对象。jsp生成一个servlet,servlet提供相应的变量。9种
* 内置对象9种介绍
* page,表示当前类this,一般不使用
* config,servlet配置对象ServletConfig,init(ServletConfig)提供
* application,使用servlet的上下文对象ServletContext, ServletConfig.getServletContext()
* request ,请求对象HttpServletRequest
* response,响应对象HttpServletResponse
* session , 会话session对象 ,request.getSession()
* out , 进行数据发送浏览器,response.getWriter()
* 类型:JspWriter
* exception , 用于处理整个servlet的异常
* pageContext ,jsp的管理者,JSP的上下文对象PageContext
* out的类型为JspWriter,底层调用的out = response.getWriter();
但存在自己的缓存,当自己的缓存内容满或刷新后,将数据发送的PrintWriter的缓存中。
* application,就是servlet中的ServletContext。整个web项目(多次会话)
* session,就是servlet中的HttpSession。一次会话(多次请求)
* request,就是servlet中ServletRequest。一次请求(一般一个页面,转发多个页面)
* page,当前页面this。一个页面(标签,页面开始定义内容,结束时候释放)
5.PageContext对象(day07)(参考:/day07/WebRoot/page_context.jsp)
* JSP的管理者,jsp的上下文对象。
* 可以引用其他8个内置对象:getXxx()
* request : getRequest()
* out : getOut()
* 对作用域属性的操作:xxxAttribute
* jsp默认的作用域为:page
* 对默认作用域进行操作:
* java.lang.ObjectgetAttribute(java.lang.String name)
*removeAttribute(java.lang.String name)
*setAttribute(java.lang.String name, java.lang.Object value)
* 对指定作用域属性进行操作:
* java.lang.ObjectgetAttribute(java.lang.String name, int scope)
*removeAttribute(java.lang.String name, int scope)
*setAttribute(java.lang.String name, java.lang.Object value, int scope)
* 作用域:scope的取值
*PageContext.APPLICATION_SCOPE、PageContext.SESSION_SCOPE、PageContext.REQUEST_SCOPE、PageContext.PAGE_SCOPE
* 通过名称查询属性值,依次从page,request, session 和 application 搜索需要的值
* java.lang.ObjectfindAttribute(java.lang.String name)
* 思考:将PageContext对象已参数的形式传给给其他类,此类将可以当成jsp使用。
6.JavaBean(day07)(参考:/day07/src/cn/itcast/domain/Person.java)
* POJO(Plain OldJava Objects)简单的Java对象,实际就是普通JavaBeans
* JavaBean:一个类,具有一个公共的构造无参方法(默认构造),提供相应的getter(isXxx)或setter方法
* javabean的属性:通过属性提供getter或setter方法
* 如果是getter,属性的首字母大写,前加get ,例如:id ,getId()
* 如果是setter,属性的首字母大写,前加set ,例如:id ,setId(...)
* 成员变量:privateString id2;是当前JavaBean的字段
* 注意:默认情况下,字段名称与属性名称相同
7.内省(day07)(参考:/day07/src/cn/itcast/test/IntrospectorTest.java)【了解】
* jdk提供一个工具类,对javabean进行处理
* 类:java.beans.Introspector
* API
* 获得指定字节码对象的javabean描述对象:BeanInfo getBeanInfo(Class beanClass)
* BeanInfo beanInfo =Introspector.getBeanInfo(Person.class)
* BeanInfo获得属性的描述对象:PropertyDescriptor[] getPropertyDescriptors()
* Method getReadMethod() 获得应该用于读取属性值的方法。
* Method getWriteMethod() 获得应该用于写入属性值的方法。
* 注意:内省的底层就是反射技术。
8.jsp动作标签(day07)
* 支持jsp的编辑器,都可以支持jsp的动作标签
* 使用格式:
* 标签
* 与javabean有关的标签(参考:/day07/WebRoot/javabean.jsp)
* 测试url:http://localhost:8080/day07/javabean.jsp?id=123&name=jack&boss=true
*
* 例如:
* class属性,用于确定javabean的完整路径名
* id属性,给当前的javabean进行命名,将当前javabean对象放置到指定的作用域
* scope属性,用于确定作用域的,默认为page
* 取值范围:page、request、session、application
*
* 例如:
* name属性:用于确定作用域的名称
* property属性:用于确定javabean的属性的名称
* 如果property的值为星号(*),表示表单提交的name值与javabean的属性值进行匹配,并赋值
* param属性:用于确定请求参数的名称,如果与属性名称相同,可以不写
*
* 动态包含
9.EL (day07)(参考:/day07/WebRoot/el.jsp)
* EL 全名为ExpressionLanguage,表达式语言
* EL和JSTL两种结合将替代jsp脚本元素。
* EL功能
* 获得jsp作用域中的数据
* 获取web开发常用对象
* 执行运算
* 调用Java方法
* 使用格式:${...}
* 语法
* el的内置对象:(11个)
* 与作用域有关:pageScope、requestScope、sessionScope、applicationScope
* jsp上下文对象:pageContext
* 运算符
* 执行运算
. 获得数据
[] 获得数据,获得特殊数据
* 其他
* empty:是否为空,对象为null 或空字符串 ,集合为0
* 注意:
* 用户自定义数据,必须放置到域中,el才可以操作
* 如果数据不存在,el将返回空字符串
* 面试题:参考:/day07/WebRoot/demo.jsp
<% i = 5 ;%>
<%=i%>
<% int i = 0 ;%>
<% i = 10 ;%>
<% this.i = 20;%>
<%! int i ;%>
<%=i%>
<%=this.i %>
结果为:5 10 20
结果分析:
<% i = 5;%>
<%=i%>
<% int i = 0 ;%>
<% i = 10 ;%>
<% this.i = 20;%>
<%! int i ;%>
<%=i%>
<%=this.i %>
回顾
* JSP
* JSP脚本元素:
* 声明:<%! ...; %>
* 表达式:<%= ...%>
* 代码片段:<% ...;%>
* JSP的指令
* page <%@page ...%>,对当前jsp页面生成servlet源文件时,继续设置
*include <%@ include file=""%> ,页面可以拆分为多部分,最后拼凑而成。
* taglib <%@ taglib%>标签有关
* JSP的内置对象:9个
* page,config,application, request,response, session,out,exception,pageContext
* PageContext对象
* xxxAttribute(..., intscope) ,PAGE_SCOPE/REQUEST_SCOPE/SESSION_SCOPE/APPLICATION_SCOPE
* findAttrbute(name) 依次从page/request/session/application获得指定名称的内容
* getXxx 可以应用其他的8个内置对象
* JSP4个作用域:
* JSP动作标签:
*
*
*
* EL
* 格式:${}
* 内置对象:11个(5个)
* EL获得4个作用域的内容:(attribute):pageScope、requestScope【】,sessionScope,applicationScope
* EL获得jsp的上下文对象: pageContext【】
##############################################################################################
1.EL(参考:/day08/WebRoot/el.jsp) (day08)
* 内置对象:11个(其他6个)
* 请求参数:
* param,获得指定名称参数的第一个内容:request.getParamter(name) ,格式:${param.name} ***
* paramValues,获得指定名称参数的所有内容 :String[] request.getParamterValues(name)
* 测试路径:http://localhost:8080/day08/el.jsp?username=jack&username=rose
* 请求头
* header ,获得指定名称请求头第一个信息 : request.getHeader(name)
* headerValues,获得指定名称请求头所有信息:request.getHeaders(name)
* 注意:
${header.cookie} 获得请求头中cookie字符串信息,请求头都是字符串
* 其他
* cookie,获得指定的cookie对象【】
${cookie} 获得所有的cookie对象,内存存放在map中 ,key为cookie的名称,value为cookie对象
${cookie.JSESSIONID}
获得value的内容,及cookie对象
${cookie.JSESSIONID.value}
获得cookie的值,cookie的getValue的内容
* 格式:${cookie.自定义名称.value}
* initParam,用于获得web应用的初始化参数,ServletContext.getInitParamter
* 实例
*${pageContext.request.contextPath} 获得发布到tomcat的项目名称
2.自定义JSP标签(day08)
* 引入:在jsp遍历map (参考:/day08/WebRoot/map.jsp)
* 自定义标签的目的:用去替换jsp脚本。编写一个实现类,接收PageContext对象
* 编写流程
* 1.编写实现类
* 简单标签:SimpleTag 接口
* 传统标签:Tag接口(了解)
* 2.编写配置文件tld,将当前标签库注册给tomcat
* tld是taglib description 的缩写,标签库描述文件。基于xml文档,扩展名为tld
* 注册配置文件是,文件的标识全球必须唯一
* 回顾:schema文档
* 3.引用,使用
* 引用: <%@ taglib uri="" prefix=""%>
* uri:用于确定tld文件的标识
* prefix:给当前标签库的前缀进行命名
* 使用:
* 使用格式:<前缀:标签名/>
* 回顾jsp动作标签:
* 实现流程
* 1.编写实现类,实现SimpleTag接口
* public class DateTagimplements SimpleTag{
* 2.编写配置文件tld,将当前标签库注册给tomcat
* tomcat将自动加载tld文件
* 3.引用,使用
* 引用: <%@ taglib uri="" prefix=""%>
* uri:用于确定tld文件的标识
* prefix:给当前标签库的前缀进行命名
* 使用:
* 使用格式:<前缀:标签名/>
* 回顾jsp动作标签:
3.tld文件的位置(day08)
* 必须放置到web项目/WEB-INF目录下,除classes或lib目录。
* 必须放置到web项目/WEB-INF/lib目录中的jar文件里,%jar%/META-INF/*.tld
4.tld配置文件的内容:(day08)
* 配置内容:
* body-content标签的配置:
* empty :表示标签体的内容为空(不允许写标签体)
* scriptless:不支持jsp脚本<%="abc" %>,支持EL表达式${name}作为标签体的内容
* JSP :此设置只能在Tag接口(传统标签)的实现类中进行配置,支持JSP的所有内容
* tagdependent :此标签作为内部使用,(不常用)
* 注意:
byte[] 不是Object[]的子类,但是Object的子类。基本类型的数组都会被单独处理
5.JSTL(day08) (参考:/day08/WebRoot/jstl.jsp)
* JSLT:JavaServerPages Standard Tag Library : jsp标准标签库
* 提供给 JavaWeb 开发人员一个标准通用的标签函数库
* 需要使用JSTL的jar包
* %jstl.zip%/lib/
* jstl.jar : jstl规范,接口
* standard.jar :apache的实现
* web项目,myeclipse提供jar文件(自带jar文件)
*javax.servlet.jsp.jstl.jar 就是jstl.jar
* jstl-impl.jar 就是standard.jar
* 使用myeclipse发布web项目时,将自动添加两个jar
* 使用介绍
JSTL 前缀名称 URI
核心标签库 c http://java.sun.com/jsp/jstl/core
函数标签 fn http://java.sun.com/jsp/jstl/functions
* 核心标签的标签
* 1 out标签:out将指定的内容输出到浏览器,默认情况将发送的内容进行转义(处理特殊字符)
* value属性:提供输出内容,支持EL表达式
* escapeXml属性:确定内容是否需要转义,默认值为true
* default属性:内容为空值时将显示默认值
* 2 set标签:给指定作用域设置内容,默认作用域为page
* var属性:域中的名称
* value属性:域中的内容
* scope属性:确定作用域,page,request,session,application
* 3 remove标签:移除指定作用域的内容,默认移除所有域中指定名称的内容
* var属性:域的名称
* scope属性:作用域
* 4 if标签:条件语句,条件true,将输出标签体的内容
* test属性:用于确定条件表达式,支持EL。字符串true也可以使用
* 5 choose标签:等价java switch {case ... default ...}
* when标签:等价于case
* otherwise标签:等价于default
* 6 url标签:用于在jsp页面中处理链接,url会自动进行url重写
* value属性:用于确定需要处理的url,不需要填写项目名称
* var属性:将处理的结果放置作用域中,名称为var的值
* 7 foreach标签:增强for循环
* begin:开始值
* end:结束值
* step:步长(自增)
* var:将结果放置到作用域page
* items : 确定集合或数组(确定需要遍历的容器)
6.EL函数(day08)(参考:/day08/WebRoot/el_fn.jsp)
* 引用:<%@taglib uri="http://java.sun.com/jsp/jstl/functions"prefix="fn" %>
* 使用:
* 是否包含 : ${fn:contains("abc", "a")} 结果为true
7.BeanUtils(day08)
* apache 的commons组件,对javabean进行数据封装
* 需要jar:
* 核心jar文件:commons-beanutils-1.8.3.jar
* 依赖jar文件:commons-logging-1.1.1.jar
* API
* 给指定的javabean的属性进行赋值
BeanUtils.setProperty(javabean对象, "属性名称",值);
* 特殊类型需要注册转换
* 将字符串与java.util.Date进行执行格式的转换
DateConverter dateConverter= new DateConverter();
dateConverter.setPattern("yyyy-MM-dd"); //确定时间的格式
ConvertUtils.register(dateConverter,Date.class);
* 将表单数据直接封装到指定的Javabean
BeanUtils.populate(JavaBean,request.getParameterMap());
* 要求:表单元素的name属性的值,必须与javabean的属性相同。
8.模式介绍(day08)
* 模式1 : JSP + JavaBean
* 模式2 : JSP + Servlet + JavaBean
* MVC:软件设计模式,它是一种分离业务逻辑与显示界面的设计方法
day10--day15
* day10: mysql数据库,sql语句
* day11: jdbc java链接数据库 入门
* day12: jdbc 事务,数据处理
* day13:DBUtils,连接池,案例:条件查询
* day15:分页、listener监听器、国际化
#############################################################################
* 数据库管理系统(DBMS,DataBase Management System):管理数据库的软件
* 数据库(DB、DataBase):将数据保存到指定的文件中(硬盘,持久化),按特定的数据结构存储数据。
* 关系性数据库管理系统(RDBMS)
* 关系:二维表,描述是实体与实体之间关系。(实体类似于java中的对象)
* 概念
* 元组(记录):一行数据
* 属性(字段、列):一列数据
* 一个列中的数据必须为同一个类型,列存在唯一名称
* 关系数据库分类
* oracle,Oracle公司数据库软件。性能最佳,收费
* db2,IBM公司数据库软件。性能最佳,收费
* ms sql server:是Microsoft公司,不跨平台,收费
*mysql:Oracle公司免费的数据库(mysql,sun)
* 流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP)
* mysql端口:默认端口3306
* 设置么mysql默认字符集(编码)
* latin1编码:ISO-8859-1
* UTF8编码:UTF-8
* mysql默认账号:root
* 在安装mysql时,只需要设置root密码(需要确认密码)
* %mysql%/my.ini 配置文件
* [mysql]default-character-set=utf8 默认字符集
* [mysqld]
port=3306 端口号
basedir="C:/java/MySQL/MySQLServer 5.5/" 安装目录
datadir="C:/java/MySQL/MySQLServer 5.5/Data/" 数据库存放的目录
* bin目录:mysql所有执行命令存放目录
* mysql.exe ,链接mysql服务器命令
* mysqld.exe ,mysql 服务启动命令 (与 tomcat startup.bat等价)
* data目录:my.ini文件配置目录datadir,数据库存放的目录
* my.ini文件:核心配置文件文件
* mysql安装成功之后,默认为启动状态
* mysql启动
* 手动启动:cmd> mysqld --console
* 注意:窗口关闭之后服务器将关闭
* 启动的window(操作系统)的服务: cmd > net start mysql
* 注意:
* win7 net命令不能直接使用。“已管理员运行cmd”
* 后台启动可以关闭命令窗口
* mysql登录
* 查看帮助:mysql--help
* 格式1:mysql [-hIP] -u用户名 -p[密码]
* 例如:cmd > mysql -h192.168.1.200 -uroot -p1234
* 格式2:mysql --host=IP --user=用户名--password[=密码]
* 例如:cmd > mysql --host=192.168.1.200 --user=root--password=1234
* 常用
* cmd > mysql -uroot-p1234 默认连接自己的数据库,提供密码
* cmd > mysql -uroot -p ,执行必须再次填写密码
* 登录成功
mysql> 提示,之后操作都是sql语句
* mysql服务关闭
* “我的电脑”/“管理” -- 服务 (services.msc | 控制面板/管理工具/服务)
* cmd > net stop mysql
* 1使用没有权限验证的方式启动mysql服务器: cmd > mysqld --console --skip-grant-tables
* 2使用root登录: cmd > mysql -uroot
* 3使用mysql数据库: mysql > use mysql;
* 4修改user表中的数据
* 4.1 查询所有 : mysql > select * from user; 修改查询命令,使用4.3命令
* 4.2 查询user表的结构:mysql > desc user;
* 4.3 查询指定的内容:mysql > select host,user,password from user; --> 安装版root密码默认为空
* 4.4 修改密码:update user set password = password('1234') wherehost='localhost' and user='root';
显示当前数据库服务器中的数据库列表 : mysql> show databases;
* %mysql%/data/mysql mysql数据库的核心数据文件,不能删除
使用数据库:mysql> use 库名;
显示数据库中的数据表 : mysql>showtables;
显示当前所使用的数据库名称:mysql>select database();
显示当前数据库的状态: mysql> status;
显示当前数据库中某表的表结构 (DESCRIBE ): mysql> desc user;
显示所支持的字符集: show character set;
* SQL被称为结构化查询语言(structuredquery language)
* 各个数据库生产厂商,要遵循sql标准同时又开发出自己数据特有的特性
* sql分类:
DDL,数据定义语言:create创建、drop删除 、 alter 修改 (区分javascript中的alert,提示框)
DML,数据操纵语言:insert录入,update更新,delete删除(truncate)
DQL,数据查询语言:select查询
* 了解:
* DPL事务处理语言(start transaction 开启,commit 提交,rollback回滚)
* DCL数据控制语言(grant 授权 revoke移除权限)
* 1 数据库的操作 ,DataBase
* 创建数据库:mysql> create database 数据库名称 [character set 字符集] ;
* 例如:mysql> create database itcast;
* 删除数据库:mysql> drop database 数据库名称;
* mysql> drop databaseitcast;
* 2 表的操作 , table
* 创建表 : mysql > create table 表名(字段1的描述,...);
* 字段的描述格式:字段名称 字段类型
* 字段名称:自定义
* 字段类型:api搜索:data types
* 字符串类型: char(长度) , varchar(长度)
* char(5),固定长度的字符串,字符串必须为5个字符。如果设置的内容为abc,将在右侧填充空格 "abc__"
*varchar(5) ,可变长度的字符串,最大允许5个字符串。如果设置的内容为abc,值为 "abc"
* 注意:字符串必须使用引号括住,建议使用单引号
* 数字类型
* int(省略) ,默认长度11,整型
*double(M,D) , 浮点
*M,数字的字符的个数
*D,小数为的位数
* 例如:double(5,2),最大值 999.99
* decimal(M,D) | numeric(M,D) 表示支持所有的数字
* 注意:两个字段的描述之间必须使用逗号,但最后一个字段的描述不能使用逗号
* 例如:
create table user(
idvarchar(32) ,
usernamevarchar(50) ,
passwordvarchar(32)
);
* 删除表:mysql> drop table 表名;
* mysql> drop tableuser;
* 修改表名:mysql> alter table 表名 rename 字段名
*
* 3 字段的操作 :修改表结构(alter table 表名 )
* 添加 : mysql > alter table 表名 add[column] 字段的描述
* mysql> alter tableusers add column money double(5,2);
* 修改 :修改字段的类型或名称
*修改类型 :mysql > alter table 表名 change column 旧字段名 新字段的描述
* mysql> altertable users change money money int;
* 删除 : mysql > alter table 表名 dropcolumn 列名
* 录入数据 : mysql > insert into 表名[(字段名称,...)] values(数据,...);
* 录入一条记录的所有数据
* mysql > insert intousers values('u001','tomasi','jack',18,98);
* mysql > insert intousers(id,firstname,secondname,age,count) values('u002','tomasi','jack',18,98); 【】
* 录入部分数据
* mysql > insert intousers(id,secondname,age) values('u003','jack',18);
* 默认情况如果没有指定数据,值为null
* 更新数据:mysql> update 表名 set 字段名称=值,... [ where sql条件]
* mysql> update users set age =20; 需该所有age的值
* sql条件,一般情况格式:字段=条件值
* mysql> update usersset age = 120 where id='u001';
* 删除数据 : mysql > delete from 表名 [where 条件]
* mysql> delete from userswhere id='u003'; 删除指定的数据
* mysql> delete from users; 删除所有的数据,(建议上班之后慎用)
* 比较:mysql>truncate table users; 也可以清空表中的数据
* truncate 性能比delete快。delete一条一条的删除,truncate将表删掉,再创建一个
* delete 不能删除自动增长列中记录数,truncate能重置记录数(约束--自动增长列--auto_increment)
* mysql > select 字段,... from 表名 [where 条件]
* 字段别名,格式:字段[as] 别名
* 注意:字段处可以使用*替换,表示所有意思,不建议使用,影响性能
* 思路1 :安装是设置的字符集为,latin1编码:ISO-8859-1
* 创建数据时指定字符集 : mysql > create database itcast character set utf8;
* 思路2 :安装是设置的字符集为,UTF8编码:UTF-8
* 再命令窗口cmd中,设置服务器端的参数:set names gbk;
* 查询字符集:mysql>show variables like '%char%';
* mysql服务没有启动
* 提示:ERROR2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
* 登录密码不正确
* 提示:ERROR1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
* 数据库已经存在
* 提示:ERROR1007 (HY000): Can't create database 'itcast'; database exists
* 没有使用数据库
* 提示:ERROR1046 (3D000): No database selected
* 小数位数必须小于等于数字长度
* mysql> alter table users addcolumn money double(5,6);
* 提示:ERROR1427 (42000): For float(M,D), double(M,D) or decimal(M,D), M must be >=D(column 'money').
* 用于存放sql语句的文件:*.sql
* 注释: "#注释内容" "-- 注释内容"
* 回顾 javaweb (day03--day09)
* day03 -- tomcat & http
* tomcat 启动: %tomcat%/bin/startup.bat
* tomcat 配置文件
* %tomcat%/conf/server.xml, tomcat 核心配置文件(设置端口,配置虚拟路径,配置虚拟主机,确定默认主机)
* %tomcat%/conf/web.xml ,tomcat管理所有web项目的基本配置文件。优先使用web项目自己的web.xml文件
* tomcat目录
* webapps目录:tomcat管理的所有web项目存放的目录
* work目录:tomcat处理jsp工作目录
* web项目的目录
-- WEB-INF目录,tomcat过滤此目录中的内容,不允许浏览器直接访问
| -- classes,web项目字节码存放的目录
| -- lib,web项目依赖的jar文件存放的目录
| -- web.xml,web项目配置文件(配置servlet,配置全局的初始化参数,配置友好页面,配置欢迎页面)
* http协议:传输的都是字符串。如果是中文,必须编码之后传递
* 请求request:请求行,请求头,请求体
* 请求方式:GET、POST
* get提交的数据有限,且中文会出现乱码,不安全
* post提交,将提交数据放置到请求体中
* 响应response:响应行,响应头,响应体
* 状态码:200,302,304,404,500
* 响应头:referer防盗链,refresh刷新,location重定向,content-type设置编码,content-encoding压缩,content-disposition下载
* day04
* servlet
* 接口:javax.servlet.Servlet
* 生命周期:init(ServletConfig) , service(ServletRequest,ServletResponse) , destroy()
* 自定义servlet 继承javax.servlet.http.HttpServlet (HttpServlet --> GenericServlet -->Servlet)
* 操作
* 初始化操作,覆盖init()方法
* 获得ServletContext对象:this.getServletContext() -->this.getServletConfig().getServletContext()
* web.xml文件
* ServletContext
* 存储数据范围(最大):xxxAttribute
* 获得web项目中资源路径;servletContext.getRealPath("/...")
* 获得web项目中资源流;servletContext.getResourceAsStream("/...")
* day05
* request
* 处理post中文乱码:request.setCharacterEncoding("");
* 表单数据
* Stringrequest.getParameter(name)
* String[]request.getParameterValues(name)
*Map
* 常用API
*request.getContextPath() 获得发布到tomcat中的项目名称
*request.getServletPath() 获得servlet的路径名称
* request作用域(存放数据):xxxAttribute
* response
* 中文乱码:response.setContentType("text/html;charset=UTF-8");
* 发送数据
* 字节流:ServletOutputStream getOutputSteam()
* 字符流:PrintWriter getWriter()
* 响应头:setHeader(name,value)
* 转发与重定向
* 转发:request.getRequestDispacher(path).forward(request,response);
* 重定向:response.sendRedirect(location)
* day06
* cookie
* 创建:new Cookie(name,value)
* API :setPath("/") ,setMaxAge
* 发送浏览器:response.addCookie(...)
* session
* 获得:HttpSession request.getSession()
* 存储数据:xxxAttribute ,session作用域
* 销毁
* 1 过期,web.xml配置
* 2 执行api,invalidate()
* 3 非正常关闭服务器
* day07
* JSP
* jsp脚本:<%!%> <%%> <%=%>
* jsp内置对象,9种:page、config、application,request,response,session,out,exception,pageContext
* pageContext对象
* 引用其他8个内容
* 快捷的操作域数据 xxxAttribute(name,value,scope)
* jsp作用域:page,request,session,application
* jsp动作标签:
* jsp引用标签:<%@ taglib uri=""prifix=""%>
* EL
* 内置对象:11个
* 作用域:pageScope,requestScope,sessionScope,applicationScope
* pageContext,
* param,paramValues,
*header,headerValues,
* cookie,initParam
* el函数:${前缀:函数(...)}
* 常用:
${pageContext.request.contextPath}
${cookie.cookie名称.value}
* day08
* 自定义标签
* JSTL
* 核心标签:
*
*
*
*
* JavaBean
* POJO ,普通java类
* 默认构造
* 提供getter或setter
* getXxxx setXxxx (错误 GetXxx SetXxx)
* day09
* javaee开发模式:
* 模式1: javabean + jsp
* 模式2: javabean + servlet + jsp
* MVC 软件开发模式:Model模型,View视图,Controller控制器
* 数据处理与数据显示相分离
* web三层体系架构
* 表示层(web层)
* 业务逻辑成(service层)
* 持久层(数据访问层,dao层)
回顾
* 数据库 : create | drop database 数据库名称;
* 表 : create | drop table 表名(字段描述)
* 字段: altertable 表名 add| drop | change 字段。。
* 录入: insertinto 表名(字段..)values(值)
* 更新: update 表名 set 字段=值 ,...where = 条件
* 查询:selectdistinct 字段 | * from 表1,表2 where 语句条件 groupby 字段 having 分组的条件 orderby 字段 asc|desc;
###########################################################################3
sql语句的位置:day11_data.sql
* sql约束,限定表中的数据
* 1 主键约束:
* 关键字:primarykey
* 要求表中被约束的字段中的数据不能重复,且不能为null
* 设置主键约束三种方法
* 1 创建表,声明字段时,直接对当前字段进行约束。
id varchar(32)primary key,
* 2 创建表,声明字段之后,在约束区域进行主键约束
namevarchar(50), -- 之后必须使用逗号
constraint primarykey(id)
* 3 创建表之后,修改表的字段,添加主键约束【】
alter tableprimarykey3 add constraint primary key (id);
* 格式:alter table 表名 add[constraint] primary key [主键唯一名称] (字段1,字段2,...);
* 注意:如果使用了两个字段做为主键,联合主键。两个的值合并在一起唯一 (id1,id2 --> 1,1 --> 1,1不允许 1,2允许的)
* 录入数据
* 删除主键
* alter table 表名 drop primary key;
* 2 唯一约束
* 关键字: unique
* 要求表中被约束的字段中的数据不能重复
* 设置唯一约束三种方法
* 1 创建表,声明字段时,直接对当前字段进行约束。
id varchar(32) unique,
* 2 创建表,声明字段之后,在约束区域进行主约束
name varchar(50), ## 必须填写逗号
constraint unique(id)
* 3 创建表之后,修改表的字段,添加约束【】
alter table unique3add constraint unique(id);
* 格式:alter table 表名 addconstraint [索引号] unique(字段);
* 删除唯一
* alter table 表名 drop index 索引的名称;
* 注意:默认索引号为字段的名称
# 3 非空约束
* 关键字:notnull
* 要求表中被约束的字段中的数据不能为null
* 设置非空约束:创建表,声明字段时,直接对当前字段进行约束。
* id varchar(32) not null,
* 总结: 主键 = 唯一 + 非空
# 4 mysql的自动增长列
* 关键字:auto_increment
* 要求表中被约束的字段中的数据自动的添加编号
* 设置自动增长列:创建表,声明字段时,直接对当前字段进行约束。
* id int primary keyauto_increment,
* 注意:
delete from auto_inc; # 删除数据内容,没有重置“自动增长列”记录数
truncate table auto_inc; #删除表再创建,记录数重置
# 外键约束
* 关键字:foreignkey
* 外键就是在从表中添加一个字段,字段中的数据是主表主键的引用。
* 概念
* 主表:1对多关系中1表
* 从表:1对多关系中多表
* 一般情况外键的名称:主表名称_主表的主键
* 注意:
* 外键的类型必须与主键的类型一致
* 外键的值可以为null
* 1对多、多对1 【★★★★★】
* 主外键关系,描述1对多关系
* 注意:
* 主表数据不能删除,从表已经引用的数据
* 从表数据不能添加,主表中的数据不存在
* 多对多
* 创建中间表,使多对多变成两个1对多
* 中间表成为两个主表的从表
* 在中间表创建两个字段,分别与两个主表形参1对多关系
* 1对1
* 主表中的主键,与从表中的主键(外键),建立主外键关系
* 主表中的主键,与从表中的外键(唯一约束unique),建立主外键关系
* 备份 : cmd --# mysqldump -uroot -p1234 day11 > d:/my.sql
* 格式:mysqldump-u账号 -p密码 数据库名称 > 文件的路径
* 恢复 : cmd --# mysql -uroot -p1234 back_day11 < d:/my.sql
* 格式:mysql -u账号 -p密码 新建创好的数据库名称 < 文件的路径
* 注意:必须手动的创建数据库
* JDBC(Java Data Base Connectivity),java数据库连接,通过JDBC规范(接口)直接操作数据
* 位置:jdk : java.sql javax.sql 包
* 驱动driver:数据库生产厂商提供的可以操作自己数据的程序,jdbc规范的实现类。不需要用户干预实现细节
* 接口:java.sql.Driver。每个驱动程序类必须实现的接口。
* 需要引用jar文件:mysql-connector-java-5.1.22-bin.jar
* JDBC开发流程【★★★--思路,实现CURD】
1.注册驱动
2.获得链接
3.获得语句执行者
4.发送sql语句(执行sql)
5.处理结果
6.释放资源
* 5.1 注册驱动
* 开发代码:Class.forName("com.mysql.jdbc.Driver");
* public classcom.mysql.jdbc.Driver implements java.sql.Driver {
* 源码
static {
java.sql.DriverManager.registerDriver(newDriver());
}
* DriverManager驱动管理工具,管理一组 JDBC 驱动程序的基本服务。
* registerDriver() 注册驱动
*DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议自己书写
* 驱动架加载两次
* 依赖指定驱动(以后将更改驱动,程序不改变)
* 5.2获得链接
* 开发代码:Connectionconn =DriverManager.getConnection("jdbc:mysql://localhost:3306/day11","root", "1234");
* 接口:java.sql.Connection, 与特定数据库的连接(会话)。
* DriverManager驱动管理工具
* getConnection(String url,String user, String password) ,通过指定的参数获得链接
* url参数:格式,大协议:子协议:子名称
* mysql ##jdbc:mysql://mysql主机名:端口/数据库名称 ,例如:jdbc:mysql://localhost:3306/day11
* 简写:jdbc:mysql:///day11 ,省略默认值 localhost:3306
* orcale ##jdbc:oracle:thin:@
* user参数: mysql服务器的登录账号
* password参数:mysql服务器的登录密码
* 5.3 获得语句对象
* 获得语句执行者:Statement createStatement() ,可以指定普通sql语句
* 获得预处理对象:PreparedStatementprepareStatement(String sql) ,可以预先编译sql语句,在设置参数
* 获得存储过程处理对象:CallableStatementprepareCall(String sql) [oracle将涉及]
* 5.4.发送sql语句(执行sql)
* 接口:java.sql.Statement 用于执行静态 SQL 语句并返回它所生成结果的对象。
* boolean execute(Stringsql) , 执行DML (insert update delete) 返回false,执行DQL(select) 返回true
* ResultSetexecuteQuery(String sql) 执行DQL语句,将查询的结果放置ResultSet中
* int executeUpdate(Stringsql) 执行DML语句,当前sql语句影响行数
* xxxx
* 5.5.处理结果
* 接口:java.sql.ResultSet, 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
* 5.6.释放资源
* 资源很珍贵,必须释放
* 获得链接
* 将需要的4个基本配置放置到properties文件中
// 0.1 准备Properties工具对象
Properties props = newProperties();
// 0.2加载配置文件
// ** 通过类加载器获得资源文件 --文件位置src
InputStream is =JdbcUtil.class.getClassLoader().getResourceAsStream("jdbcinfo.properties");
props.load(is);
// 0.3 获得配置信息
String driver =props.getProperty("driver");
String url = props.getProperty("url");
String user =props.getProperty("user");
String password =props.getProperty("password");
* 获得链接
//1注册驱动
Class.forName(driver);
//2获得链接
conn =DriverManager.getConnection(url, user, password);
* 释放资源
* 注意:必须进行非空判断
public static voidcloseResource(Connection conn , Statement st , ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
try {
if(st !=null){
st.close();
}
} catch(SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn!= null){
conn.close();
}
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
* 拷贝jdbcUtil 和 jdbc驱动jar文件
* 创建表放置数据
* 重写dao
* 预先编译sql,用户输入的内容,只是参数的一部分,不作为sql语句进行编译。
* 遍历流程
* 1 提供sql语句,此sql语句中的参数将使用?替换
String sql = "select *from users where username = ?";
* 2 获得预处理对象 ,必须填写sql语句
psmt =conn.prepareStatement(sql);
* 3 设置参数,将?替换继续的实际参数
psmt.setString(1,username);
* 第一个参数:表示?位置,从1开始
* 第二个参数:实际值
* 4 执行sql
rs = psmt.executeQuery();
* 驱动可以不注册
* 可以省略Class.forName(driver);
* 原因:mysql-connector-java-5.1.22-bin.jar/META-INF/services/java.sql.Driver内容com.mysql.jdbc.Driver ,程序将自动加载
* PreparedStatement对象
* sql注入:防止实际参数作为sql语句的一部分。
* 大数据处理
* mysql大数据类型:
* blob :Binary Large Object,二进制大对象。mysql提供blob(64k),longblob(4G)
* java对象api :
*psmt.setBinaryStream(parameterIndex, x) 二进制数据
*psmt.setBlob(parameterIndex, inputStream) blob对象
* clob :Character Large Object字符大对象。mysql提供text(64k),longtext(4G)
* 批处理
* Statement对象
* addBatch(Stringsql) 给批处理缓存中,添加sql语句
* clearBatch() 清空缓存
* executeBatch() 将缓存中的sql语句都执行
* PreparedStatement对象
* 获得对象,提供sql
* addBatch() ,将指定的参数添加到批处理缓存
* 时间处理
* Statement对象,字符串的形式处理或mysql提供时间函数now()
* PreparedStatement对象,getDate(java.sql.Date) getTime(java.sql.Time) getTimeStamp(java.sql.TimeStamp)
* newjava.sql.Date(new java.util.Date().getTime())
* 将一组业务作为一个整体,所有的内容要么全部成功,要么全部不成功。
* 事务的特性:ACID
* 原子性:事务不可分割整体
* 一致性:事务前后数据的一致。
* 隔离性:事务的并发访问
* 持久性:事务完成不可改变,永久性
* 事务的隔离性存在问题
* 脏读:一个事务,读到另一个事务没有提交的数据
* 不可重复读:一个事务,读到另一个事务提交的数据(update更新)
* 虚读(幻读):一个事务,读到另一个事务提交的数据(insert录入)
* 事务操作
* 开启事务
* 事务提交(全部成功)
* 事务回滚(全部不成功)
* 事务的隔离级别
* 读未提交:readuncommitted ,存在所有问题
* 读已提交:readcommitted,解决了脏读问题,其他问题没有解决
* 可重复读:repeatableread ,解决了脏读与不可重复读问题,其他问题没有解决
* 串行化:serializable,等价java同步代码,单线程。解决所有问题
* 数据库默认隔离级别
* mysql的默认值:repeatable read
* oracle的默认值:read committed
* 对比
* 性能: readuncommitted > read committed > repeatable read > serializable
* 安全: readuncommitted < read committed < repeatable read < serializable
* mysql操作
* mysql事务操作
* 开启事务 : mysql > start transaction;
* 事务提交(全部成功) mysql > commit;
* 事务回滚(全部不成功) mysql > rollback;
* 查看mysql 的隔离级别
* 第一种方法:mysql> show variables like '%iso%';
+---------------+-----------------+
| Variable_name |Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
* 第二种方法:mysql > select @@tx_isolation;
* 设置事务方式
* 格式:set session transaction isolation level {readuncommitted | read committed | repeatable read | serializable};
* 通过API,搜索 set transaction 进行查询
* 演示事务的隔离级别
* 读未提交:readuncommitted
* A的隔离级别为read uncommitted
* AB窗口开启事务
* A查询,B更新(没有提交或回滚)
* A再查询(查询到了B没有提交的数据)
* 读已提交:readcommitted
* A的隔离级别read committed
* AB口开启事务
* A查询,B更新,B提交
* A再查询(读到B提交数据)
* 可重复读:repeatableread
* A的隔离级别repeatable read
* AB口开启事务
* A查询,B更新,B提交
* A再查询(A在当前事务中读不到B提交,A读取的数据重复的数据)
* A必须完成当前事务,再查询就可以读到B提交的事务
* 串行化:serializable
* A的隔离级别serializable
* AB口开启事务
* A查询,B更新(等待。。。第一种A完成操作,第二种B等待超时)
3. lost update(day12) (丢失更新)
* AB操作查询(1),A更新(2), B不知晓A已经操作,继续更新(3)
* 数据库锁机制:
* 悲观锁,数据肯定会丢失。使用数据库锁解决 (锁必须放置到事务中才有效)
* 读锁(共享锁):多个读锁可以在事务对一个表进行读取
* 格式:select .... LOCK IN SHARE MODE
* 写锁(排它锁):如果当前表已经被写锁占用,就不可以添加读锁
* 格式:select ... FOR UPDATE
* 注意:update语句默认添加写锁
* 乐观锁,数据肯定不会丢失。在表中添加一个字段(时间戳)记录一个唯一表示,用于区分数据是否更新
4.Java事务操作(day12)
* 开启事务:Connection.setAutoCommit(false),自动提交被取消,需要手动提交
*mysql事务是自动提交
* 提交事务:Connection.commit()
* 回滚事务:Connection.rollback()
* 回滚事务到指定的还原点:rollback(Savepointsavepoint)
* 设置还原点:Savepoint setSavepoint()
* 事务经典代码
Connection conn = null;
try{
//获得链接
//1 开启事务
conn.setAutoCommit(false);
//*****************一组操作(业务)
//2 提交事务
conn.commit();
} catch(Exception e){
//3 回滚事务
conn.rollback();
} finally{
//释放资源
conn.close();
}
* 案例:三层架构完成转账
5.连接池(day12)
* 自定义连接池:close()方法完成将“当前链接归还到连接池”,“装饰设计模式”进行方法增强
* 方法增强三种方式
* 1.继承(需要增强的方法,必须可以new)
* 2.装饰设计模式(5步骤)
* 3.动态代理
* 规范,连接池必须实现javax.sql.DataSource接口
* 连接池实现
* web服务器提供连接池的实现(数据源)
* DBCP,apache提供的第三方开源的连接池
* C3P0,提供的第三方开源的连接池
* DBCP链接池
* 需要jar文件
* 核心jar文件:commons-dbcp-1.4.jar
* 依赖jar文件:commons-pool-1.6.jar
* C3P0连接池
* 需要jar文件
* 核心jar文件:c3p0-0.9.2-pre5.jar
* 依赖jar文件:mchange-commons-java-0.2.3.jar
* 必须在src创建xml文档:c3p0-config.xml
总结
* sql语句
* DDL(数据库,表)
* DML(insert update delete)
* DQL(select)
* 约束
* 表之间的关系(1对多,多对多)
* jdbc
* Statement对象: CURD
* PreparedStatement对象: CURD
* 事务(概念、特性ACID,数据事务的隔离级别) -- 演示可以不练习
* 案例:银行转账demo【】,demo2(ThreadLocal)
* 自定义连接池(了解原理)
* 使用C3P0链接池
回顾
* PreparedStatement对象
* 防止SQL注入:用户填写的内容作为sql语句一部分。
* 预先编译,将实际内容替换?,再编译,再将实际的内容替换回?。实际参数不再是sql语句语法一部分。只是参数
* 处理时间:setXxx
* setDate(java.sql.Date)
* setTime(java.sql.Time)
*setTimeStamp(java.sql.TimeStamp)
* 都是java.util.Date的子类。newjava.sql.Date(new java.util.Date().getTime)
* 处理大数据
* 字节:BLOB(mysql --> blob , longblob等)
* 字符:CLOB(mysql --> text , longtext等)
* 批处理
* Statement,可以处理多条sql语句,编译多次
* PreparedStatement,只能处理一条sql,编译1次,但可以执行多次
* 事务transaction
* 事务:一组操作,要么成功,要么不成功
* 事务的特性:ACID,原子性、一致性、隔离性、持久性
* 事务并发将问题:脏读、不可重复读、幻读
* 数据库的隔离级别:
* 读未提交 read uncommitted
* 读已提交 read committed
* 可重复读 repeatable read
* 串行化:serializable
* mysql操作
* 开启事务:start transaction; | set @@autocommit = 0 (mysql事务自动提交)
* 事务提交:commit
* 事务回滚:rollback
* jdbc操作
* conn.setAutoCommit(false);
* conn.commit()
* conn.rollback()
* 连接池
* 接口:javax.sql.DataSource(数据源)
* 方法:getConnection()获得链接
* 第三方连接池
* DBCP,apache 连接池开源工具 (*.propertis文件)
* C3P0,开源连接池工具(ComboPooledDataSource)
* 设置基本4项
* 使用配置文件:c3p0-config.xml文件 %c3p0.zip%/c3p0-0.9.2-pre5/doc/index.html#c3p0-config.xml
#####################################################################################
回顾
* DBUtils:JDBC简化工具包
* 核心工具类:QueryRunner
* 默认构造:new QueryRunner() ,获得此对象,但需要手动指定链接
* 参数构造:new QueryRunner(DataSource) ,获得此对象传递数据源,内部维护链接Connection
* DML操作
* update(Connectionconn,String sql , Object ... params) 手动的设置链接,必须手动释放资源
* update(Stringsql,Object... params) 使用参数构造进行dml操作
* DQL操作
* query(Connection conn,String sql,ResultSetHandler handler , Object ... params)手动的设置链接,必须手动释放资源
* query(Stringsql,ResultSetHandler handler , Object ... params) 通过给定参数params,执行sql语句,并将结果封装成指定的handler的类型
* ResultSetHandler结果集处理类的实现类
* BeanListHandler,将数据封装到JavaBean中,再将JavaBean添加到list集合中,将list集合返回
* BeanHandler,将数据封装到JavaBean中,将JavaBean返回
* ScalarHandler,将结果存放到一行一列
* API查询:%commons-dbutils-1.4%\apidocs\index.html
* 修改查询所有的servlet。带有条件查询,如果没有传递任何条件,进行查询所有操作。
* 修改的目标:
* servlet接受查询条件
* dao过滤提交数据,如果数据为空(null ""),sql将不在添加条件,where 。。。
* 总结:
* 多条件sql处理方便,在sql语句添加 where 1=1 ,之后的条件语句直接填and 。。。
* 多条件为了支持多参数,用时List对参数进行缓存,list是有序的。保证 ? 与参数的对应
* 格式:select.... limit 参数1,参数2
* 参数1:查询的索引号,从0开始
* 参数2:查询分页的显示个数
* Page JavaBean
?
?
?
?
?
?
* i18n:Internationalization
* properties文件,国际化资源配置文件
* 扩展名:文件名.properties
* 文件名:基名
* 格式:baseName_语言_国家|地区.properties
* baseName自定义
* 例如:
* 中文简体,message_zh_CN.properties
* 中文繁体,message_zh_TW.properties
* 英文,message_en.properties
*位置:src目录 --> WEB-INF/classes/...
* 注意:只支持英文
* Locale类
* Locale 对象表示了特定的地理、政治和文化地区
* 构造方法:Locale(String language, String country)
* 监听原理
* 1 被监听对象(事件源)【】
* 2 事件,(关闭按钮,触发监听)
* 3 监听对象(监听器)【】
* 4 绑定事件【】
* 5 事件对象,让监听对象可以获得被监听对象
总结:
* day13 : day13_customer_update.rar (查询所有,修改)
* day14 : day14_condition.rar (带条件的查询)
* day14 : day14_page.rar (分页分析)
* day14 : day14_page_end.rar(分页使用Page对象,用于封装数据)
* CURD,面向对象(封装)
* day14 : day14_page_final.rar(使用javascript进行表单优化,不建议学)
* 如果,只练习
* Statement对象: CURD
* PreparedStatement对象: CURD
回顾(JDBC案例应用)
* 条件查询(模糊查询)
* 格式:select... where 条件
* 条件
* 相等 字段 = 值
* 匹配 字段 like '%值%' 或 字段 like '_值_'
* 恒定的条件:where1=1
* 追加条件
* 条件: and 字段 = 值 ?
* 参数:使用List进行缓存(list有序)
* 分页查询
* 不同的数据库分页语句不同
* mysql格式:select .... limit 开始索引startIndex,每页显示的个数pageSize
* 页面可以提供的值:pageSize,pageNum当前页数
* 分页的JavaBean对象
* int pageNum 当前页数(浏览器传递)
* int pageSize 每页显示的个数(浏览器传递,固定值)
* int totalRecord 数据库中总记录数(查询数据库count(1)获得)
* int startIndex 开始索引(计算获得)
* 算法:startIndex = (pageNum - 1) * pageSize
* int totalPage 总页数(计算获得)
* 算法1:totalPage = (totalRecord + pageSize - 1) /pageSize
* 算法2:
if(totalRecord % pageSize == 0 ){
totalPage= totalRecord / pageSize
} else {
totalPage= totalRecord / pageSize + 1 //表示半页
}
* List data 查询数据
* 扩展(动态的显示列表数)
* int start 列表的开始数
* int end 列表的结束数
* 算法
* 1 初始化值 (默认显示10列表)
start= 1;
end = 10;
* 2 处理数据--依据是否有10列表页
if(totalPage <= 10){
end= totalPage;
}else {
//大于10分页数
//* 当前页 前显示4页,后显示5页
start= pageNum - 4;
end= pageNum + 5;
//** 处理数据(首页与尾页 临界值需要特殊处理)
if(start < 1){
start= 1;
end= 10;
}
if(end> totalPage){
end= totalPage;
start= totalPage - 9;
}
}
* i18n国际化
* 资源文件:baseName_语言_国家|地区.properties文件
* 默认配置文件:baseName.properties ,其他都不符合,将使用默认
* 解析方式(获得内容)
*ResourceBundler.getBundler(baseName,new Locale("语言","国家")) ,一般语言小写,国家大写
* 其他工具类
* DateFormate时间类
* NumberFormate 数字类(货币、数字、百分比等)
* MessageFormate 消息类 ( "你好{0}")
* listener监听器
* servlet,获得动态资源技术(完成功能,获取资源),能做什么
* listener,监听被监听对象,在做什么
* javaee 共8个
* 3个域对象本身和属性的监听器 6
* 特殊的javabean在session属性的监听器
*javax.servlet.http.HttpSessionBindingListener , 当javabean实现了接口,此javabean被添加到session的属性时。
* voidvalueBound(HttpSessionBindingEvent event) ,添加到属性时触发
* voidvalueUnbound(HttpSessionBindingEvent event) ,从属性中移除时触发
*javax.servlet.http.HttpSessionActivationListener,当javabean实现了接口,
* 此javabean被添加到session的属性,如果服务器正常关闭,将javabean保存文件中,服务器启动再添加到session属性中。
* voidsessionDidActivate(HttpSessionEvent se) 活化,从文件中在读到内存
* voidsessionWillPassivate(HttpSessionEvent se) 钝化,将对象保存文件
* 注意:此javabean,必须实现java.io.Serializable,序列号 (内存 硬盘转换)
* 不需要再web.xml文件中进行注册
###################################################################################################################
* 访问服务器中的资源,是否允许访问
* 接口:javax.servlet.Filter
* Filter编写流程
* 1实现类 Filter接口
* 2配置 web.xml
* * Filter编写实现
* 1实现类 Filter接口
* public classEncodingFilter implements Filter {
* 2配置 web.xml
* 过滤器的注册 ,
* 注册的名称:
* 过滤器的实现类:
* 过滤器映射(使用),
* 使用的过滤器的名称,必须为已经注册的内容,
* 过滤器准备拦截的路径:
/* 表示拦截所有的路径
* 初始化内容的读取
* 服务器启动时,将执行初始化方法
public voidinit(FilterConfig filterConfig) throws ServletException {
// 获得web.xml文件中配置的过滤器的初始化参数
this.encoding= filterConfig.getInitParameter("encoding");
System.out.println("init--> " + encoding);
}
* 过滤器的放行语句:chain.doFilter(request,response);
* 建议:编写过滤器时首先先放行
* 完全匹配: /a/demo
* 不完全匹配: /a/*
* 通配符匹配: *.jsp
* Filter 过滤器拦截的servlet的路径
* 用于配置filter过滤器进行拦截资源的位置
* 取值
* REQUEST,request:当前过滤器对请求进行拦截,默认值为request
* FORWARD,forward:当前过滤器将对转发的内容进行拦截
* INCLUDE,include:当前过滤器将对包含的内容进行拦截
* ERROR,error:当前过滤器将对页面执行"友好页面"将进行拦截 (修改状态码)
* ASYNC,async: 当前过滤器将对servlet发送异步内容时进行拦截 (servlet3.0异步)
* 比较:同步synchronized
* 1 分ip统计网站的访问次数
* 2.1不缓存动态页面!
* 需要添加三个头,支持不同的浏览器。(不同的浏览器对三个响应头的支持程度不同)
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setHeader("expires","0");
* 2.2设置静态web资源的有效日期!
* 3.权限管理
* 细粒度权限管理(daoinsert,update等,与链接关联)[项目涉及]
* 粗粒度权限管理
* 是否登录
* 比较大概权限
* 4.统一POST和GET中文编码问题(后天,4天案例)
* 5.页面静态化
* 使用java程序发送电子邮件
* 应用场景
* 生日祝福邮件
* 资料订阅
* 用户注册的激活
* 邮件服务器涉及的协议
* SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 发送邮件的协议。默认端口:25
* POP3(Post Office Protocol 3)即邮局协议,接受邮件的协议。默认端口:110
* 了解
IMAP (Internet Mail AccessProtocol ) 交互邮件访问协议(interactive mail access protocol)发送邮件的协议
* IMAP协议运行在TCP/IP协议之上,使用的端口是143。
* 它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作
* javamail需要jar文件
* 核心文件:mail.jar 来自javamail1_4_5.zip
* 依赖文件:activation.jar来自jaf-1_1_1.zip,用于封装数据(用不到)
* 发送邮件步骤
* 1 获得会话Session
* 2 编写消息Message
* 3 发送消息Transport
* 发送邮件详细步骤
// 0.1 获得会话的基本参数(服务器地址)
Properties props = newProperties();
// ### 确定服务器地址
props.setProperty("mail.host","127.0.0.1"); //smtp.163.com
// ### 确定服务是否需要账号与密码验证
props.setProperty("mail.smtp.auth","true");
// 0.2 设置权限(账号密码)
Authenticator authenticator = newAuthenticator(){
@Override
publicPasswordAuthentication getPasswordAuthentication() {
return newPasswordAuthentication("admin","123456");
}
};
//* 1 获得会话Session
Session session =Session.getDefaultInstance(props, authenticator);
// ### 将发送邮件的信息打印到控制台
session.setDebug(true);
//* 2 编写消息Message
Message message = newMimeMessage(session); //mime类型, text/html
// * 2.1 发件人
message.setFrom(new InternetAddress("[email protected]"));
// * 2.2 收件人 (TO 接收人 CC 抄送人 BCC 暗送)
message.setRecipient(RecipientType.TO,new InternetAddress("[email protected]"));
// * 2.3 主题
message.setSubject("第一个封邮件");
// * 2.4 正文
message.setContent("这是内容", "text/html;charset=UTF-8"); //mime类型
//* 3 发送消息Transport
Transport.send(message);
2.JavaMail案例:(day16)注册登录与激活
* 注册
* 激活
* 登录
3.Base64编码(day16)
编码
BASE64Encoder base64Encoder = newBASE64Encoder();
String username =base64Encoder.encode("username".getBytes())
解码
BASE64Decoder base64Decoder = newBASE64Decoder();
byte[] nameByte =base64Decoder.decodeBuffer("aXRjYXN0X2x0");
4.文件上传/下载(day16)
* 文件实现
* 1,提供表单
*
*
* enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码
* 属性值
*application/x-www-form-urlencoded 在发送前编码所有字符(默认)
* 【multipart/form-data】 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
* text/plain 空格转换为 "+" 加号,但不对特殊字符编码。
*