黑马程序员技术交流社区
标题:
【石家庄校区】JDBC到JavaWeb学习笔记
[打印本页]
作者:
syc123
时间:
2018-2-4 15:14
标题:
【石家庄校区】JDBC到JavaWeb学习笔记
JDBC到JavaWeb学习笔记
JDBC篇
为什么装饰者设计模式要实现相同的接口????
答: 保证被装饰对象全部功能
还有一个设计模式通常和装饰者一起使用, 适配器设计模式
为了解决,超多的方法重写而存在的!!!!!
MYSQL:
* 数据库的概述:指的是一个文件系统,这个文件系统通过SQL访问.
* 关系型数据库:数据库中存放的是实体之间的关系.
* 常见的关系型数据库:MYSQL,Oracle,DB2,SQLServer,SQLite,SyBase
SQL的分类:
* DDL:数据定义语言.create,alter,drop...
* DML:数据操纵语言.update,insert,delete
* DCL:数据控制语言.grant,if,...
* DQL:数据查询语言.select
SQL对数据库中表的记录的操作:
* update,insert,delete
* Select ... From ... Where ... Group by ... Having ... Order by ...;
SQL的多表设计:
* 一对多:在多的一方创建外键执向一的一方的主键.
* 多对多:创建中间表,至少两个字段作为外键执向多对多双方的主键.
* 一对一:唯一外键对应,主键对应.
SQL的多表的查询:
* 连接查询:
* 交叉连接:
* 内连接:
* 显式内连接:inner join
* 隐式内连接:
* 外连接
* 左外连接:left outer join
* 右外连接:right outer join
【JDBC的概述】
? JDBC:Java DataBase Connectivity Java数据库的连接.
* 是SUN公司统一提供的一套接口规范(JDBC).各个数据库生产商提供实现.
? 驱动:两个硬件设备之间通信的桥梁.
【JDBC的开发步骤】
? 注册驱动:
? 获得连接:
? 获得执行SQL语句对象:
? 释放资源:
* 增强一个Java类中的某个方法有几种方式???
* 一种方式:继承的方式.
* 能够控制这个类的构造的时候,才可以使用继承.
* 二种方式:装饰者模式方式.
* 包装对象和被包装的对象都要实现相同的接口.
* 包装的对象中需要获得到被包装对象的引用.
***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.
* 三种方式:动态代理的方式.
* 被增强的对象实现接口就可以.
为什么装饰者设计模式要实现相同的接口????
答: 保证被装饰对象全部功能
还有一个设计模式通常和装饰者一起使用, 适配器设计模式
为了解决,超多的方法重写而存在的!!!!!
0.封装DButils小框架的的原理:获取元数据 设置参数 ()增删改)
1.每次进行JDBC的增删改查的操作的时候,有很多的代码相似,可以抽取工具类,完成一些通用性的代码
2.SQL和设置参数不一样
把一样的用参数形式传进来
3.【JDBC的元数据MetaData】(了解)-- 编写通用性较高的代码.
1.数据库元数据
DatabaseMetaData:可以获取数据库的信息,获得数据库表的信息
* 获得数据库元数据:Connection中getMetaData();
2.参数元数据:?
ParameterMetaData:获得SQL中的参数的个数及类型.
* 获得参数元数据:PreparedStatement中getParameterMetaData()
3.结果集元数据:
?ResultSetMetaData:获得结果集中的列名及列的类型.
* 获得结果集元数据:ResultSet中getMetadata() 获得字段名称以及类型
1.使用XML作为配置文件的方式完成模拟Tomcat
0.需求
现在有一套页面,这套页面想被其他人访问到.端口号可以进行修改的-(不修改源码的基础上).
Java基础的网络编程
;
1.XML 允许用户自定义标签的(可扩展的标记语言)
作用:传输(json)和存储数据(数据库) 作为框架的配置文件
2.XML使用语法:
* XML必须有关闭标签
* 区分大小写
* 属性需要有引号
* 标签必须正确嵌套.
3.XML的文档声明
* 文档声明:通常出现在XML的第一行第一列的位置!!!
* 写法:
* <?xml 属性名=”属性值” 属性名=”属性值” ...?>
* version :必须的. 使用”1.0”
*** encoding :字符集. 是使用浏览器打开的时候采用的默认的字符集的编码.
* standalone :描述XML文档是否需要依赖其他的文件.
3.XML的解析获得XML文档中的数据
1.XML解析
* DOM解析:DOM:Document Object Model. 文档对象模型
* SAX解析:Simple Api for XML.
(面试题)*区别:DOM将文档加载进内存,形成树形结构,然后进行解析
缺点:文档过大,导致内存溢出 优点:解析比较清晰,可以对XML进行增删改操作
SAX:事件驱动的方式,逐行进行解析;
缺点:不能对文档进行增删改操作 优点:文档特别大,不会导致内存溢出
?2.针对这两种解析的方式,不同的公司提供了不同的API的实现类.
* JAXP :SUN公司提供的一套XML的解析的API.
* JDOM :开源组织提供了一套XML的解析的API-jdom.
* DOM4J :开源组织提供了一套XML的解析的API-dom4j. 支持xpath需要导一个包在dom4j包下的lib夹下的1.1包,才能使用xpath的那两个方法
* pull :主要应用在Android手机端解析XML.
?XPath:
* dom4j支持XPath的jar包.
* jaxen-1.1-beta-6.jar
* dom4j的XPath支持的API:
* List document.selectNodes(String xPath);返回一个;list集合
* Node document.selectSingleNode(String xPath);返回一个节点
3.DOM4J
DOM4J的入门案例步骤: 在dom4j的使用手册中
* 【步骤一】导入jar包.dom4j-1.6.1.jar
* 【步骤二】创建解析器 SaxReader
* 【步骤三】解析文档获得代表文档的Document对象. —— SAXReader 的 read()方法获取Document。
* 【步骤四】获得跟节点.——通过Document对象的getRootElement()得到根节点
* 【步骤五】从跟节点下查找其他的节点. 使用根节点获取他下面的节点element() elements(“标签名称”)
xpath入门案例步骤
导包
创建解析器
4 * XML的CDATA区:(CDATA:Character Data)
* <![CDATA[ 内容 ]]>
pcdata 可以加特殊符号 可被解析
6.xml约束《基本用不上,看懂就行》
?XML的约束的概述:
* 什么是XML的约束 :就是用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数.
* XML的约束 :用来规范XML的写法.
***** XML的约束的种类及区别?(面试题)
* DTD 和 Schema
* 区别:
1.DTD语法是自成一体的.Schema语法就是XML的语法.
2.Schema的语法就是XML的语法所以更容易被解析器所解析.
3.Schema支持名称空间.
4.Schema有比DTD更加强大的语义和语法的约束.
5.在一个xml 中只能引入一个DTD,而能映入多个Schema
Schema
Schema约束的步骤:
1.引入W3C名称空间;标示这个文档是被约束文档
2.定义的元素或属性绑定一个名称空间
3.定义元素和属性
*找找有多少个元素
*区分元素是简单的还是复杂的
*复杂需要确定是否有序,出现次数。。。
XML约束的步骤
4.引入W3C的实例文档的名称空间;标示这个文档的约束文档
5.引入的约束的文档的名称空间
6.引入约束文档的位置
7.编写XML文档
xml的作用:
传输和存储数据
软件的配置文件
xml的语法
xml的文档声明 xml的第一行第一列
? XML的约束的额概述:
* 什么是XML的约束 :就是用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数.
* XML的约束 :用来规范XML的写法.
***** XML的约束的种类及区别?
* DTD 和 Schema :
* 区别:
1.DTD语法是自成一体的.Schema语法就是XML的语法.
2.Schema的语法就是XML的语法所以更容易被解析器所解析.
3.Schema支持名称空间.
4.Schema有比DTD更加强大的语义和语法的约束.
1.Tomcat
1.安装Tomcat
--1.JAVA_HOME要配置正确
--2.端口号冲突的问题要自己会解决---->去conf-->server.xml去找Connectioner的标签里面去修改
2.要会在Tomcat中发布自己的项目
--1.直接拷贝
--2.在conf--->server.xml中找Host--->Context的标签--->重要的两个属性-->(path(虚拟路径),docBase(实际路径))
--3.在conf--->引擎文件夹中---主机文件夹中---->创建以.xml结尾的文件(xml的文件名是虚拟路径)--->Context的标签-->一个重要的属性docBase
2.STS关联Tomcat
如何关联????
window-->prefer--->server--->runtime--->add--->apache7.0--->关联本地tomcat路径
server--->new Server--->apache7.0--->open---将默认的项目发送地址给成webapps
【HTTP协议的详解】
? 请求部分
* 请求行
* 提交方式:
* 提交方式有很多,常用的GET和POST:
* GET和POST的区别:
* GET的提交的参数会显示到地址栏上,而POST不显示.
* GET往往是有大小限制的,而POST没有大小的限制.
* GET没有请求体,而POST有请求体.
* 提交路径:
* 协议版本:
* 请求头
* 都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.
* User-Agent :代表浏览器的类型. --- 文件下载:下载中文文件:IE使用URLEncodor进行编码,而Firefox使用Base64编码.
* Referer :代表的是网页的来源. --- 防盗链.
* If-Modified-Since :通常与响应中的头Last-Modified一起使用查找本地缓存.
* 请求体
* 就是POST提交方式的提交的参数.
? 响应部分
* 响应行:
* 协议版本
* 状态码 :
* 200 :成功
* 302 :重定向
* 304 :查找本地缓存
* 404 :资源不存在
* 500 :服务器内部错误
* 状态码描述
* 响应头:键值对,一般一个key对应一个value,也有一个key对应多个value.
* Last-Modified :与请求中的If-Modified-Since一起使用查找本地缓存.
* Content-Dispostion :文件下载的使用使用的一个头信息.
* Location :重定向的跳转的路径.
* Refresh :定时刷新/定时跳转.
* 响应体:显示浏览器的页面的内容.
3.Http协议
1.0(已经淘汰了)
1.1这个不是立马断开连接
请求:
1.请求行
1.请求方式(get和post)
2.请求资源路径
3.协议的版本
2.请求头(消息报头)
User-agent--->用来解决浏览器版本不一致的问题
Referer--->防盗链
if-modify-since-->查找本地缓存
3.请求体(get方式没有请求体)
响应:
1.响应行
1.协议版本
2.状态码
200(成功)
302(重定向)
304(请求本地缓存)
404(请求的资源找不到)
500(服务器内部错误)
3.状态码描述
2.响应头
last-modify:查缓存
Location--->专门用来重定向用的
Content-disposition--->专门用来下载用的--->让浏览器以下载的方式打开文件
Refresh--->页面定时跳转用的
3.响应体
4.Servlet
用什么用?
运行在服务端的小程序
作用:
用来接受请求,处理请求的
使用方式:
1.定义一个类实现 servlet的接口
2.用去web.xml中配置虚拟路径
Servlet
Servlet-mapping
Servlet将请求封装成了ServletRequest对象,将响应封装成了ServletResponse对象
ServletRequest这个对象可以接受浏览器传来的数据
getParameter...这一类方式
乱码问题:
我们解决post的乱码
request.setCharaterEnconding("UTF-8");--->专门设置请求体中编码,如果不设置默认编码是ISO8859-1的编码,
get的方式不是这种解决方案
* String getParameter(String name); ---用于接收一个名称对应一个值的数据.
* String[] getParameterValues(String name);---用于接收一个名称对应多个值的数据.
* Map getParameterMap(); ---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
1.Servlet
什么是Servlet??
运行在服务器端的小程序
作用???
用来处理用户的请求并作出响应
定义方式:
1.定义一个类去实现Servlet接口---->现在是定义一个类去继承 HttpServlet---->要求会模板创建就行了
2.以前需要去web.xml自己手动配置, 现在不需要--->要求大家能够配置
Servlet的声明周期
1.什么时候创建????
第一个人访问Servlet的时候,服务会创建Servlet对象,而且是单例的;并且创建的时候 init(只有第一次执行)方法执行,
所有的访问service方法会执行, 服务器关闭或者项目被移除Servlet销毁并且destroy的方法会执行
注意事项:
1.url-pattern虚拟路径的编写???
1.完全路径 例如:/DemoServlet
2.目录匹配 例如:/aaa/*
3.后缀名匹配: 例如 *.txt
完全路径 >目录匹配>后缀名匹配
2.编写的a的访问路径或者是form的访问路径的问题
相对路径和绝对路径: 不能以/开头
建议以后都使用绝对路径 ; 例如 /项目名称/资源目录
2.案例--->服务器定时跳转
1.设置响应头
响应头属性名:Refresh 响应头属性值 "秒数;url=要跳转的绝对路径"
2.可以调用JS中Location对象中href属性;
3.在页面添加meta的标签
<meta http-equiv="Refresh" content="3;url=/day12/WEB01/index.html">
4.重定向:
需要设置响应码 302
需要设置一个头 Location的头 --- 值是要跳转的绝对路径
3.ServletContext
是一个域对象:
ServletContext的生命周期
出生: 服务器启动的时候为每一个web工程创建单独的一个ServletContext的域对象有且仅有一个,这个被整个工程所共享
死亡: 服务器关闭或者项目被移除
作用:
1.获取全局参数
2.获取文件mime类型
3.存储全局变量
setAttribute , getAttribute , removeAttribute
4.读取web下的文件
getResouceAsStream("服务器路径(不加工程名)")
1.2.4.1 Servlet的生命周期:(*****)
? 生命周期:就是一个对象从创建到销毁的过程.
? Servlet生命周期:Servlet从创建到销毁的过程.
* 何时创建:用户第一次访问Servlet创建Servlet的实例
* 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
? 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.
任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的
方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,
或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
2.1 注解概述
什么是注解:Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、
接口、枚举是在同一个层次
对比注释:注释是给开发人员阅读的,注解是给计算机提供相应信息的。
注解的作用:
1. 编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如:@Override
2. 代码分析:通过代码里标识注解,对代码进行分析,从而达到取代xml目的。
3. 编写文档:通过代码里标识注解,辅助生成帮助文档对应的内容
2.2 JDK常见注解
2.2.1 常见注解
@Deprecated 表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用。
一般被标记位过时的方法都存在不同的缺陷:1安全问题;2新的API取代
@Override JDK5.0表示复写父类的方法;jdk6.0 还可以表示实现接口的方法
@SuppressWarnings 表示抑制警告,被修饰的类或方法如果存在编译警告,将被编译器忽略
deprecation ,或略过时
rawtypes ,忽略类型安全
unused , 忽略不使用
unchecked ,忽略安全检查
null,忽略空指针
all,忽略所有
2.3 自定义注解
自定义注解--定义与使用
定义注解使用关键字: @interface
定义类: class
定义接口:interface
定义枚举:enum
定义属性步骤
1
注解中属性定义的格式:修饰符 返回值类型 属性名() [default 默认值]
其中修饰符:默认值 public abstract ,且只能是public abstract。
2
其中返回值类型:基本类型、字符串String、Class、注解、枚举,以及以上类型的一维数组
3.
其中属性名:自定义
4.
其中default 默认值:可以省略
2.4 注解使用的注意事项:
1. 注解可以没有属性,如果有属性需要使用小括号括住。例如:@MyAnno1 或 @MyAnno1()
2. 属性格式:属性名=属性值,多个属性使用逗号分隔。例如:@MyAnno2(username="rose")
3. 如果属性名为value,且当前只有一个属性,value可以省略。
4. 如果使用多个属性时,k的名称为value不能省略
5. 如果属性类型为数组,设置内容格式为:{ 1,2,3 }。例如:arrs = {"itcast","itheima"}
6. 如果属性类型为数组,值只有一个{} 可以省略的。例如:arrs = "itcast"
7. 一个对象上,注解只能使用一次,不能重复使用。
2.5
自定义注解--解析和元注解
解析
如果给类、方法等添加注解,如果需要获得注解上设置的数据,那么我们就必须对注解进行解析,
JDK提供java.lang.reflect.AnnotatedElement接口允许在运行时通过反射获得注解。
常用方法:(都是从字节码调用这些方法)
boolean isAnnotationPresent(Class annotationClass) 当前对象是否有注解
T getAnnotation(Class<T> annotationClass) 获得当前对象上指定的注解
Annotation[] getAnnotations() 获得当前对象及其从父类上继承的,所有的注解
Annotation[] getDeclaredAnnotations() 获得当前对象上所有的注解
有了这些还是不够因为,我们发现注解的东西即使通过字节码也不能获取,因为注解有自己的作用范围
如何去调整注解的作用范围呢???,那么就需要JDK提供的元注解来控制我们的自己写的注解
2.6
元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)
JDK提供4种元注解:
@Retention 用于确定被修饰的自定义注解生命周期
RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。用途:提供给编译器使用。
RetentionPolicy.CLASS 被修饰的注解只能存在源码和字节码中,运行时内存中没有。用途:JVM java虚拟机使用
RetentionPolicy.RUNTIME 被修饰的注解存在源码、字节码、内存(运行时)。用途:取代xml配置
@Target 用于确定被修饰的自定义注解 使用位置
ElementType.TYPE 修饰 类、接口
ElementType.CONSTRUCTOR 修饰构造
ElementType.METHOD 修饰方法
ElementType.FIELD 修饰字段
@Documented 使用javaDoc生成 api文档时,是否包含此注解 (了解)
@Inherited 如果父类使用被修饰的注解,子类是否继承。(了解)
request&response篇
【Response的概述】
? Response:代表响应的对象.从服务器向浏览器输出内容.
【文件下载的方式】
? 一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持.
? 二种:手动编写代码的方式完成文件的下载.
* 设置两个头和一个流:
* Content-Type :文件的MIME的类型.
* Content-Disposition :以下载的形式打开文件.
* InputStream :文件的输入流.
response输出响应内容的方法:
向页面响应的方法:
* getOutputStream();
* getWriter();
* 这两个方法是互斥的.
* 做出响应的时候只能使用其中的一种流响应.
* 输出中文乱码的处理:
* 字节流:
* 设置浏览器默认打开的编码:
* resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置中文字节取出的时候编码.
* “中文”.getBytes(“UTF-8”);
* 字符流:
* 设置浏览器打开的时候的编码
* resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置response的缓冲区的编码
* response.setCharacterEncoding(“UTF-8”);
***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”);
处理request接收参数的中文乱码的问题:
现在无论是GET还是POST提交中文的时候,都会出现乱码的问题.
解决:
? POST的解决方案:
* POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
* 设置request的缓冲区的编码:
* request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.
? GET的解决方案:
* 1.修改tomcat的字符集的编码.(不推荐)
* 2.使用URLEncoder和URLDecoder进行编码和解码的操作.
* 3.使用String的构造方法:
Request作为域对象存取数据:
使用request对象存取数据:
* setAttribute(String name,String value);
* Object getAttribute(String name);
request的作用范围:
* 作用范围就是一次请求的范围.
* 创建和销毁:
* 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
* 销毁:当服务器对这次请求作出了响应之后.
1.4.4.3 重定向和转发的区别:(redirect和forward的区别)
* 1.重定向的地址栏会发生变化,转发的地址栏不变.
* 2.重定向两次请求两次响应,转发一次请求一次响应.
* 3.重定向路径需要加工程名,转发的路径不需要加工程名.
* 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
Response
* 通过response设置状态码:setStatus(int status);
* 通过response设置响应头:setHeader(String name,String value);,setIntHeader(String name,int value),setDateHeader(String name,long date);
* 通过response设置响应体:getOutputStream(),getWriter();
* response的其他的API:
* sendRedirect(String path);
* response输出中文的乱码问题:
* 字节流输出中文:
* 设置浏览器的字符集编码. response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置输出内容的字节数组的字符集编码. “”.getBytes(“UTF-8”);
* 字符流输出中文:
* 设置浏览器字符集编码. response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置response的缓冲区的编码. response.setCharacterEncoding(“UTF-8”);
* response完成了文件下载功能:
Request
* 使用request获得客户机的信息. getRemoteAddr(),getMethod(),getRequestURI(),getRequestURL()
* 获得请求参数:getParameter(),getParameterValues(),getParameterMap()
* 作为域对象存取数据:setAttribute(),getAttribute(),removeAttribute();
* 接收参数的中文乱码的处理:
* GET :new String(“”.getBytes(“ISO-8859-1”),”UTF-8”)
* POST :request.setCharacterEncoding(“UTF-8”);
* request何时创建和销毁的?
* 创建:从客户端向服务器发送请求.那么服务器创建一个request对象.
* 销毁:服务器为这次请求作出了响应之后,服务器就会销毁request对象.
* 作用范围:一次请求.
* 转发和重定向区别?
* 转发是一次请求一次响应,重定向两次请求和两次响应.
* 转发地址栏不变,重定向会变化.
* 转发的路径不需要加工程名,重定向需要加工程名.
* 转发只能在本网站内部,重定向可以定向到任何网站.
乱码问题
浏览器向服务器携带中文?
get方式
get的参数都藏在请求行中,请求行中编码是固定ISO8859-1
解决方案: 通过String的构造方式来解决 例如: 文件名是filename---> new String(filename.getByte("ISO8859-1"),"UTF-8");
post方式
post的方式参数藏在请求体中,将请求体中的编码改成UTF-8就行了
request.setCharacherEnconding("UTF-8");
服务器向浏览器输出中文的时候乱码解决???
设置响应头
响应头的编码是固定的ISO-8859-1,所有我们需要给浏览器能看懂的东西
if(header.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
设置响应体
getOutputStream
getWriter
setContextType("text/html;charset=UTF-8")---> setHeader("Context-Type","text/html;charset=UTF-8 ") setCharaterEnconding("UTF-8");
路径的编写
1.浏览器端如果想直接访问Servlet的话
路径的编写:使用: /工程名/servlet的虚拟路径
2.浏览器如果想要直接访问.html.jsp或者其他静态资源
路径的编写:使用: /工程名/资源所在的路径
3.servlet A想要跳转其他servlet B
1.重定向
路径的编写:使用: /工程名/B对应的虚拟路径
2.请求转发
路径的编写:使用: /B对应的虚拟路径
4.servlet A想要跳转到 .html或者.jsp
1.重定向
路径的编写:使用: /工程名/.jsp或者.html所在的子路径
2.请求转发
路径的编写:使用: /.jsp或者.html所在的子路径
5.servlet想要读取项目下文件
1.需要用ServletContext的对象来读取
1.ServletContext.getResouceAsStream("资源路径(不用再加工程名)")
2.ServletContext.getRealPath("资源路径(不用再加工程名)")
Cookie
什么是Cookie???
是一种会话技术;
能够做什么???
能够存用户私有的数据
怎么学好它??
其实就是一个键值对的容器
添加
response.addCookie()来添加
删除
setPath("路径")
setMaxAge(0)
创建
new Cookie("键","值");
获取
request.getCookies();
JSP
什么是jsp
其实本质上就是一个Servlet
能够干什么?
能够嵌入java代码
<%! %>//写到成员位置,用的不多,因为有线程安全问题
<% %> //这个是在Service方法里面书写的代码
<%=%> //相当于out.print(); 这里书写不准有分号
【会话技术】
? 什么是会话 :用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话.
? 常见的会话技术:
* Cookie :将数据保存到客户端浏览器.
* Session :将数据保存到服务器端.
? 为什么使用会话技术?
* 私有的数据,购物信息数据保存在会话技术中.
【Cookie技术的使用】
? 向浏览器保存数据:
HttpServletResponse有一个方法:
* void addCookie(Cookie cookie);
? 获得浏览器带过来的Cookie:
HttpServletRequest有一个方法:
* Cookie[] getCookies();
? 创建一个Cookie对象:
* Cookie(String name,String value);
【JSP的简单概述】
? 什么是JSP :Java Server Pages(Java服务器端页面).JSP = Java代码 + HTML的元素 + JSP内置东西
? SUN公司为什么推出JSP动态网页开发技术:
* SUN公司推出的Servlet技术进行动态网页开发.发现Servlet自身有不足没有办法与ASP,PHP技术竞争.想在动态网页中输出表单.在Servlet中获得PrintWriter out = response.getWriter();
* out.println(“<form action=’’ method=’’>”);
* out.println(“</form>”);
* SUN又推出了动态的网页开发技术就是JSP.
? JSP的执行过程:
* JSP会被翻译成Servlet,编译成class进行执行的.
? JSP的嵌入Java代码:JSP的脚本元素
* <%! %> :翻译成类中的成员部分. 定义变量,定义方法,定义类.Servlet是线程不安全的,尽量少在类中定义成员属性!!
* <% %> :翻译成类的service方法内部的内容. 定义变量,定义类,直接写代码块.
* <%= %> :翻译成service方法内部的out.print();
? Cookie的常用的API:
* getName();
* getValue();
* setDomain(String domain); -- 设置Cookie的有效域名. //
www.baidu.com
music.baidu.com
* setPath(String path); -- 设置Cookie的有效路径.
* setMaxAge(int maxAge); -- 设置Cookie的有效时间.
? Cookie的分类有关:
* 会话级别的Cookie:默认的Cookie.关闭浏览器Cookie就会销毁.
* 持久级别的Cookie:可以设置Cookie的有效时间.那么关闭浏览器Cookie还会存在. 手动销毁持久性Cookie. setMaxAge(0)---前提是有效路径必须一致.
【Session的概述】
Cookie本身是有大小和个数的限制.Session没有限制.Cookie的数据保存在客户端,Session数据保存在服务器端.
? Session的执行原理:基于Cookie的.
? 使用Session:
* 获得Session:
* request.getSession();
session何时创建和销毁?作用范围:
* 创建:服务器端第一次调用getSession()创建session.
* 销毁:三种情况销毁session:
* 1.session过期. 默认过期时间为30分钟.
* 2.非正常关闭服务器.如果正常关闭session序列化到硬盘.
* 3.手动调用session.invalidate();
* 作用范围:多次请求.(一次会话)
jsp
html + java + 内置对象 + 指令 + 动作标签
java
<% service方法内部 %><%! 成员位置 %><%= 输出语句,不能有分号 %>
指令
page
ContextType---->设置浏览器默认打开的编码
pageEnconding --->用来设置JSP生成servlet的保持时用的编码
import ---->用来导包的,可以出现多个,也不用我们担心
include
能够将其他页面包含进来
file --->用的相对路径
taglib--->明天讲
内置对象
request HttpServletRequest
1.作为域对象 2.获取客户机相关的信息(请求方式,请求路径,请求的id地址,请求头,)
session HttpSession
1.作为域对象--->会话技术
注意:需要使用一把钥匙才能打开session,这个钥匙其实就是Cookie这个cookie的名字是JSESSIONID
application
1.获取全局参数 2.获取mime类型 3.作为全局域对象 4. 读取web的资源文件
pageContext
1.获取其他八个内置对象
2.可以向四个域中存储东西
requestScope
sessionScope
applicationScope
pageScope
3.findAttribute --->从小范围开始找
response
1.设置响应头
2.设置响应体
3.设置状态码
page
了解一下,他代表的就是jsp生成Servlet的对象,他是单例的
out
JSPWriter 和 response.getWriter()是有区别的
response.getWriter()才能正真的设置响应体
config
exception
exception.printStackTrice();
动作标签
用来简化我们的书写
<jsp:forword>用于转发
<jsp:include>用于包含
静态包含和动态包含的区别
:静态包含相当于复制原码(相当于多个jsp在同一个类中)
:动态包含只要运行结果(多个jsp分别在不同类中)
<jsp:param name="" value="">
作用:一般和有路径结合使用
携带参数
<jsp:useBean>
<jsp:setProperty>
<jsp:useProperty>
1.el
叫做表达式语言
作用:简化jsp中有些代码
1.获取四个域对象中的数据${ 属性名|变量名 }
2.执行普通的运算(逻辑运算,关系运算,三元运算...)
3.操作el中的对象
1.四个域 pageScope requestScope sessionScope applicationScope
2.一对专门用来接受参数 param paramValues
3.获取请求头的一对: header headerValues
3.获取全局参数: initParam
4.获取cookie: cookie.库克的名称
5.pageContext: 可以获取jsp中其他八个内置对象
获取工程名: pageContext.request.contextPath
4调用java的代码,需要自定义标签库(目前先放一放)
2.jstl
jsp standard tag lib
标签库需要引入
<%@ taglib uri ="地址" prefix="缩写"%>
核心标签库:
1.0和1.1,1.2
1.1,1.2是支持el表达式
c:if 可以条件的筛选
c:set(了解)
c:out(了解一下)
c:forEach
var --->遍历出的元素的变量名
items--->要遍历的对象
begin
end
step
varStatus
JSTL的标签库:包含了五类标签.
* core(核心标签),fmt(国际化标签),xml(XML标签),sql(SQL标签),fn(JSTL提供EL函数库)
? 使用JSTL:
* 引入JSTL的相关的jar包.
* 在页面中引入标签库.<%@ taglib uri=”” prefix=””%
函数库
就是处理字符串相关的东西
${ fn:split }
${ fn:subString }
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2