1.HTTP协议
约束浏览器和服务器交互的格式
所有的www域名都遵守了http协议
特点:请求响应模式 但有局限
协议默认端口80
使用1.1版本
2.http协议抓包查看:
页面按f12 ——网络选项卡——开始捕获——地址栏输入URL——详细视图——抓包信息
4.浏览器和服务器的数据交互方式
1.超链接:?参数 中文乱码问题(new String(byte[],"utf-8"))
2.表单 :POST方式 中文乱码问题(request.setCharacterEncoding("utf-8"))
3、JS方式:location.href="";替换地址,放在JQuery的事件里
给form表单一个id,JS、jq获取对象.submit/submit() 提交整个表单。可以提交一行数据
5.ajax
$.get(url,[params],[fn],[type]):发送了一个get请求
$.post(url,[params],[fn],[type]):发送一个post请求
http协议:
协议:规定内容的格式.
http协议:超文本传输协议(HTTP,HyperText Transfer Protocol)
是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
包含:
客户端发送给服务器的内容 请求
服务器返回给浏览器的内容 响应
请求的格式:
请求行 请求头 请求体
响应的格式:
响应行 响应头 响应体
请求:封装了客户端的所有的请求数据
请求行
请求信息的第一行
格式:
请求的方式 请求的资源 协议/版本
例如:
GET /day33/1.html HTTP/1.1
请求方式:
常见的两种 get和post
get请求,会将参数追加在地址栏上,参数大小有限制 http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值
post请求,不会将参数追加在地址栏,请求的参数在请求体中,请求参数的大小无限制.较为安全
格式:
参数名称=值&参数名称=值
文件上传:
默认上传,只上传编码后文件名无内容 type=file
enctype=“text/plain”:不进行编码处理只上传文件名。
值可以去W3C-HTML-表单-encotype中查找表单中查
enctype=“multipart/form-data”:多部件/表单数据。按照当前表单输入项分部分上传。上传文件名及内容
请求头
格式: key/value的格式 (value可以为多个值的)
常见的请求头
Accept: text/html,image/* --支持数据类型
Accept-Charset: ISO-8859-1 --字符集
Accept-Encoding: gzip --支持压缩
Accept-Language:zh-cn --语言环境
Host: www.itcast.cn:80 --访问主机(请求的服务器主机名)
If-Modified-Since: Tue, 11 Jul 2000 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
Connection: close/Keep-Alive --链接状态
重要的头:
Referer User-Agent Cookie If-Modified-Since
请求体
和请求头之间有一个空行
post请求的参数:只有表单提交的时候明确了method="post"这时候是post请求,其他的都是get请求
参数名称=值&参数名称=值
referer作用:告诉服务器我是哪个页面跳转来的 应用:防盗链。数据统计
String referer = request.getHeader(“Referer”);
If(!referer.contains(“localhost”)||referer==null){
Response.sendRedirect(“其他页面”); 重定向到其他页面
}else{
Syso(“hello”)
}
常用方法:
★request.getContextPath():获取请求的服务程序名称。可以动态的获取当前程序即项目名称。可用于form表单的路径,更灵活
★request.getMethod():请求方式
request.getRemoteAddr():请求的客户IP地址,若为Tomcat的则是默认的00000001
request.getProtocol():获取请求协议和版本
★request.getHeader(“User-Agent”):客户端浏览器以及操作系统信息
request.getHeader("referer") :获取页面的来源
int getIntHeader(String name)
long getDateHeader(String name)
request.getHeaderNames():获取所有请求头 返回Enumeration<String>迭代器
遍历:while(headerNames.hasMoreElements)headername.nextElement(
★request.getParameter(“键”) 文本或密码等
★request.getParameterValues(“键”) 复选框的值
★request.getParameterMap():返回map集合。
泛型为<String,String[]> {username=[tom],password=[123],hobby=[smoking,drinking]}
request.getQueryString():获取路径中的参数
request.getRequestURI():获取请求路径(不带参数) /day36/index.html
请求乱码问题:
原因(提交路径)
地址栏的数据会使用url编码(页面的编码),提交到服务器的时候,tomcat(6和7)默认使用的编码是 iso-8859-1,获取数据要进行解码
编码和解码用的不一样,所以产生了乱码问题
post情求(在页面单击表单或链接):utf-8 即你页面的编码
1) request.setCharacterEncoding(“utf-8”):只告诉Tomcat
get请求(在地址栏中直接给出参数)也适用与post请求
2)先获取西欧字符value值 ,再转换为字节,再将字节按utf-8转换
String value = request.getParameter(“属性”)
byte[] buffer = value.getByte(“ISO-8859-1‘’)
String name = new String(“buffer”,”utf-8”)
响应: HttpServletResponse(服务器返回给浏览器的信息)
组成部分:
响应行 响应头 响应体
响应行
响应信息的第一行
格式:
版本/协议 响应的状态码 状态码说明
例如:
HTTP/1.1 200 OK
状态码:
1xx :请求已发送
2xx :响应已完成
200:响应成功(请求成功)
3xx :需要浏览器进一步操作才可以完成
302:重定向(配合location头使用)
304:读缓存
4xx :用户访问错误
404:用户访问的资源不存在
5xx :服务器内部错误
500:服务器内部异常
响应头
格式: key/value的格式 (value可以为多个值的)
常见的响应头
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 --数据类型(MIME类型) 大类型/小类型 text/css text/javascript image/jpeg image/bmp
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间
Refresh: 1;url=http://www.it315.org --定时刷新
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1 --缓存
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
Connection:Keep-Alive --连接
重点的头:
Set-Cookie Location Content-Type Refresh Content-Disposition Last-Modified
常见的响应头:
location:重定向
方式1:
setStatus(302);
setHeader("location","跳转路径的绝对路径");
方式2:推荐
sendRedirect("跳转路径的绝对路径");
重定向特点:
发送了2次请求,第二次请求是自动发送的
第二次请求可以是站外资源
地址栏会发生变化,是第二次请求的地址
refresh:定时刷新(可以实现定时跳转)
格式:
在java代码中写法
response.setHeader("refresh","秒数;url=跳转路径的绝对路径");
在html代码中写法:伪http响应头 定时器
<meta http-equiv="refresh" content="3;url=/day35/index.html">
http-equiv:响应头
content:响应头的内容
content-type:设置mime类型,还可以设置响应的字符集
response.setContentType("text/html;charset=utf-8");
Response.setContentType(mimeType);
content-disposition
response.setHeader("content-disposition","attachment;filename="+文件名)
若为中文,火狐需要base64编码;其他浏览器为utf-8
常用方法:
★setStatus(int 状态码):针对于1 2 3 (没有错误) 重定向使用
Response.sendError(”状态码”,“错误提示”):码和值,返回服务器的错误提示 4 5
★setHeader(String name,String value);设置一个字符串类型的头
常用方法(了解):
setHeader(String key, String value):设置字符串形式的响应头
setIntHeader(String key, String value):设置整型的响应头
setDataHeader(String key, String value):设置时间的响应头
addHeader(String key, String value):添加至字符串形式的响应头,之前设置过则追加,若没有设置过则设置
addIntHeader(String key, String value):添加整型的响应头
addDataHeader(String key, String value):添加时间的响应头
响应体
和响应头之间有一个空行
浏览器解析的内容
操作响应体
api:
response.getWriter():字符流
response.getOutputStream():字节流
注意:
1.我们自己编写的内容用字符流 其他用字节流
2.俩流互斥
3.响应流可以不关闭,若没有关闭,servlet容器(服务器)会帮我们关闭 底层是一个缓冲流
建议:若文件下载 建议自己手动关闭流
响应体乱码:
代码使用utf-8,而Tomcat使用的是ISO-8859-1。
<meta>可代替响应头
<meta http-equiv=”Content-Type” content=“text/html;charset=”utf-8”>
推荐方案:
respnse.setHeader("content-type","text/html;charset=utf-8");放在响应头时浏览器会读取,两个都告诉
response.setCharacterEncoding(“编码集”):只告诉Tomcat,只作用请响体和POST请求,也就是对发送出去(getWriter)的改变
★response.setContentType("text/html;charset=utf-8");
1.设置文件的类型为 text/html
2.设置响应流的编码 utf-8 setCharacterEncoding()只设置响应流的编码
3.告诉浏览器用utf-8解码
禁用浏览器缓存: 设这三个值就行
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“pragma”,”no-cache”);
response.setDateHeader(“expires”,”-1”)
缓存思想:长久不变的,本地浏览器保存页面信息。
页面改变:第一次访问把文件的时间戳发送到浏览器,浏览器保存此时间戳,并且缓存文件.
之后访问:浏览器吧时间戳带到服务器,服务器把时间戳和该文件的最后修改 时间比较,如果一样,告诉浏览器直接使用缓存文件。如果不一样就将新文件发送给服务器浏览器。
请求转发与重定向:
请求转发:请求一次,地址栏不变,请求转发的时候只能在服务器项目内部转发到本项目其他Servlet。 效率高 用于页面跳转
需要在下一个Servlet中获取request域中的数据,必须要使用转发!
转发:request.getRequestDispatcher(“/跳转到的Servlet”).forward(request,Response)
将A的request和Response都带到B setAttribute,和getAttribute获取值,
转发路径为内部路径:不带项目名
/dis2
/index.html
重定向:请求两次,地址栏改变,重定向不只能重定向到本项目的其他。 用于页面跳转,跳转到外网
重定向:response.sendRedirect(/request.getContextPath()/Servlet地址“”)
重定向和请求转发区别:
重定向发送两次请求;转发发送一次请求
重定向地址栏会发送改变;转发不会改变
重定向可以访问任意资源;转发只能是项目内部资源
重定向是response的方法;转发是request的方法
重定向不能使用request属性操作;转发可以使用request属性操作.
常见的重定向场景:
访问站外资源;登录成功的时候;
若要使用request属性操作的时候,只能使用转发
Servlet
request和response都是Tomcat创建并管理我们只是操作API
1. Servlet: 运行在服务端的Java小程序,Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),且最重要。
2. Tomcat可以存储动态资源,动态资源是程序生成的,每一次访问肯能都不一样,生成动态资源的程序在Java叫servlet.
3. Servlet的作用:
获取客户端(HTML或JSP)请求数据
处理请求
完成相应
4.servlet的体系架构:(了解)
Servlet:接口
|
GenericServlet:(抽象类.除了service方法没有实现之外,实现了servlet的其他方法)
|
HttpServlet:(抽象,实现了servlet的所有方法,处理http请求的)
|
我们自己编写的类
5.serlvet接口:
★
void init(ServletCofig config):初始化
void service(ServletRequest request,ServletResponse response): 处理逻辑
void destroy():销毁
理解:
ServletConfig getServletConfig() :获取当前servlet的配置对象
了解
String getServletInfo() :获取serlvet信息
GenericServlet:
除了service方法没有实现之外,实现了servlet的其他方法
实现了init方法 将config对象付给了成员变量
void init(ServletCofig config){
this.config = config;
init();//调用重载方法
}
init()方法中是空实现,留给编程者使用.需要在servlet初始化的时候做些操作就可以重写这个方法;否则就不用
4.Servlet路径配置
<servlet>
<servlet-name>s</servlet-name> servlet-name:给servlet起个名称 名称自定义,保证唯一
<servlet-class>s.s</servlet-class> servlet-class:serlvet的全限定名(包名+类名)
</servlet>
<servlet-mapping>
<servlet-name>s</servlet-name> 复制上面已注册好的名字servlet-name:在servlet标签中给servlet起好的名称
<url-pattern>/s</url-pattern> url-pattern:路径 暂时都以"/"开头
</servlet-mapping>
url-pattern的配置
★方式1:完全匹配 /a/b/hello 以"/"开始
方式2:目录匹配 以"/"开始 以"*"结尾 例如: /a/*
方式3:后缀名匹配 已"."开始,后面写后缀名 例如: .jsp .action .....
注意:
一个路径只能对应一个servlet
一个servlet可以对应多个路径
tomcat中的默认的servlet
作用:
处理别人都处理不了的请求.例如 404 ,500
了解:
defaultServlet 在tomcat的conf/web.xml中配置的
我们的项目文件,除了自己的web.xml(优先)还有tomcat的web.xml
5.servlet生命周期 (第一次访问时创建对象,服务器关闭时销毁)
Init——创建对象时,就掉用的方法。
Service——每次访问时,都调用一次service方法
Destroy——服务器关闭时,会调用destory
一般情况: init()和destroy()不做任何实现,只实现service(),提供真正的服务
初始化方法:
调用的时机:默认第一次访问该serlvet
调用的次数:一次
调用者:web服务器(tomcat)
访问方法:
调用的时机:每次访问的时候
调用的次数:请求一次执行一次
调用者:web服务器(tomcat)
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("6666666666666666666");
}
销毁方法:
调用的时机:当项目移除或者服务器正常关闭的时候
调用的次数:一次
调用者:web服务器(tomcat)
总述:★★★
serlvet是单实例多线程.
默认第一次请求来的时候,服务器创建servlet对象,且服务器调用servlet的init方法实现初始化操作,还要调用一次service方法
每次请求来的时候,服务器会获取一个线程,服务器调用servlet的service方法执行逻辑
当项目移除或者服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作.
5.表单传送数据:form表单的action=要关联servlet地址,servlet获取请求数据,并执行。
*HTML中的Servlet页面路径:
http:/localhost/项目名/servlet路径 (带协议和主机的绝对路径(访问站外资源))
/项目名/servlet路径 (不带协议和主机的绝对路径(访问站内资源 ★))
servlet路径(相对路径,相对于当前文件夹)
*Servelet解析表单带来数据可以使用当前方法的参数HttpServletRequest request 获取
获取单个:request.getParameter(“键”) 文本或密码等
获取多个值:String[] values = request.getParameterValues(“键”) 复选框的值
获取表单中所有的值: Map getParameterMap() 文本、密码、复选等
*Servelet往浏览器输出内容(HttpServletResponse response)
PrintWriter out = response.getWriter() out.print() 输出到页面
ServletOutputStream 但是两个流不能同时用
response对象获取输出流,然后向流写内容。流无需我们关闭。
处理响应乱码:
方式1:response.setHeader("content-type","text/html;charset=utf-8");
设置各种响应头的方法
setHeader("响应头","值");
方式2:response.setContentType("text/html;charset=utf-8");
7. Servlet相关配置:
1.servlet一运行就调用init(),第一次访问时调用,如果init()耗时间长。可在Tomcat启动时,直接创建servlet,并调用init()。
设置:设置servlet配置文件中标签:在Tomcat的web.xml中配置或某一个Servlet中
<load-on-startup></load-on-startup>
正整数:整数越小,加载的优先级越高
负数是第一次访问才加载
2.url-pattern配置:设置servlet访问路径,映射servlet地址
格式:
默认:与类名相同
自定义: 优先级:完路>目录>后缀>完全匹配
完全路径(/A/B/C):访问的时候必须完全匹配
目录匹配:(/目录/*)访问时只要目录匹配即可
扩展名匹配:(*.后缀名)访问时只要后缀名一致。切记前不可有/
全部匹配:(/)几乎不用
3.ServletConfig:
获取配置信息:
String servletName = request.getServletConfig().getServletName();
获取初始化参数:
<context-param>
<param-name>名 </param-name>
<param-value>值 </param-value>
</context-param >
String servletparam = request.getServletConfig().getInitParam(”键”)
8. Servlet三大作用域:多个资源之间传送数据(Servlet 与JSP之间)
*ServletContext(域对象):全局管理者(一个项目就唯一一个)
作用:
资源共享
获取文件的路径
获取文件的mime类型
获取全局的初始化参数(spring)
创建:服务器在启动的是时候会为部署在Tomcat的项目创建一个ServerContext对象
销毁:服务器正常关闭或项目移除的时候ServletContext
作用域:当前整个项目
1.该对象是内置好的不能new
2.获取全局配置信息:数据库连接配置信息 C3p0 Servlet配置信息。但是此专指web.xml(在spring中用)
<context-param>
<param-name>名 </param-name>
<param-value>值 </param-value>
</context-param >
通过方法:
String getInitParameters(String name); 通过名称获取一个初始化参数
(了解)Enumration getInitParameterNames();获取所有初始化参数的名称
3.获取ServletContext 对象
ServletContext getServletContext():获取上下文对象 this.getServletContext()
4.设置属性
Void setAttribute(“键”,“值”):
Object getAttribute(”键”):获取ServletContext
Void removeAttribute(String name):移除值
5.资源:项目上线时内置的一些数据,放在webContent下,供用户下载。获取资源需要流
6.获取项目下资源的方法:
InputStream getResourceAsStream(/资源在的文件夹/资源名):通过流获取资源方式一
注意:若路径不存在,返回一个null
String getRealParh((/资源在的文件夹/资源名):获取资源在服务器下的绝对路径(Tomcat下的路径)通过IO流输出。
注意:若路径写错了 也可以返回一个路径 只是这个路径不存在
FileInputStream():获取流对象,读取资源 方式二
7.获取文件的mime类型★
getMimeType(String 文件名称) 例如: 1.jpg index.html Mime类型的组成: 大类型/小类型 image/jpeg text/html
Response.setContentType(mimeType)
8.获取文件对应流
方案1:InputStream 类名.class.getClassLoarder.getResourceAsStream(“文件名”):应用于配置文件,特点是这些配置文件都在src下
方案2:InputStream appication.getResourceAsStream(“文件路径”):一些被下载的数据,都存储在webcontent下
*HttpSession:私有数据。
创建:服务器第一次调用getSession()时,服务器创建Session对象
销毁: 非正常关闭服务器,正常关闭不销毁。还能拿到
Session过期了,默认时间是30分钟
手动调用Session的invalidate方法
作用域:一次会话始终是同一个session
*HttpServletRequest:针对一次请求。使用该对象保存数据,一次请求(请求转发多个页面)内数据有效。
方法:
xxxAttribute();
创建:浏览器只要访问服务器都会创建request,每访问一次就创建一次
销毁:服务器为这次请求作出响应之后,销毁request
作用域:一次请求,多次转发资源之间可以使用
作用:
在一次请求中多个servlet或者jsp中进行通信(信息共享)
*三个作用域对象操作的API相同
存放数据:setAttribute(name,value)键值都随意
获得数据:getAttribute(name)返回值是Object类型
删除数据:removeAttribute(name)
8.Servlet模板的创建
window - preferences-搜索Templates--添加模板
package ${enclosing_package};
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ${primary_type_name} extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
9.文件下载知识点
Get请求是根据浏览器GBk编码提交的
POST:请求是按utf-8编码提交的
1.Response只是写一段文本时,浏览器行头体都有。Tomcat给写的对于我们屏蔽
2.下载方式:
1.超链接下载:
<a href="/day35/1.jpg">1.jpg</a>
注意:
每个文件都是mime类型,若浏览器能解析这种类型,则在浏览器打开.
若浏览器不能解析这种类型,就会出现下载框.
2.编码下载,通过Servlet
<a href=“/目录/Servlet路径?name=文件名”> </a> ?name=:表示匹配哪个文件
A.设置文件的mime类型
ServletContext context = this.getServletContext();
String mimeType = context.getMimeType(文件名)
Response.setContentType(mimeType)
B.设置下载头信息content-disposition
String filename= request.getParameter(“name”)
Response.setHeader(“content-disposition”,”attachment;filename=”+文件名称);
C.提供一个输出流
InputStream is = context.getResourceAsStream(“/servlet路径/文件名”)
Response.getOutputStream();
IOUtils.copy(is,os);
代码: String name = request.getParameter("filename");
name = new String(name.getBytes("iso-8859-1"),"utf-8"); 解决页面中文乱码问题
response.setHeader("Content-Type",this.getServletContext().getMimeType("/ziyuan"+name));
String namedownload = new String(name.getBytes("GBK"),"iso-8859-1");
response.setHeader("Content-Disposition", "attachment;filename="+namedownload); //解决下载文件的文件名乱码问题
InputStream in = this.getServletContext().getResourceAsStream("/ziyuan/"+name);
OutputStream out = response.getOutputStream(); //读入写出
byte[] b = new byte[1024];
int length;
while((length = in.read())!=-1){
out.write(b,0,length);
}
in.close();
乱码:
原因:
firefox浏览器要求文件名称返回的 base64编码
其他浏览器要求文件名称返回的 utf-8编码
//解决中文乱码问题
//获取用户的浏览器内核版本(明天讲)
String agent = request.getHeader("user-agent");
System.out.println(agent);
//b.设置文件下载头
response.setHeader("content-disposition", "attachment;filename="+DownLoadUtils.getName(agent, s));
DownloadUtils:
public class DownLoadUtils {
public static String getName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
12.验证码
注意:验证码必须要在路径后面添加一个动态数据,要不然会去缓存中找之前的响应内容
用Servlet生成图片 故图片链接地址是<img id="tupian" src="/day14_code/CodeServlet"/>
具体代码找现成的,并且添加单击事件换验证码。
代码:
<script type="text/javascript">
$(function(){
$("#tupian").click(function(){
$(this).prop("src","/day14_code/CodeServlet?test="+new Date().getTime());
});
})
</script>
11.案例:用户注册
6.UUID类: 自动生成一串不重复的值
String randomUUID(); 生成一个36位的字符串 中间有-,需要去除
String uid = UUID.randomUUID().toString().replace(“-”,””);
8.将数据组织成一个Bean对象 应用:BeanUtils.populate(对象,map)
GetParameter()获取参数 > 创建对象 > 对象.set属性()
优化:BeanUtils
*时间解析器:
创建时间解析器对象:DateConverter dc = new DateConverter();
设置可以解析的时间格式:
dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd"})
注册解析器:ConvertUtils.register(解析器对象,(要转换成的类型)Date.class);
)
*导两个包,且要结合.getParameterMap()使用
*将获取HTML的值存入user对象:BeanUtils.populate(user,request.getParameterMap)
*BeanUtils设置对象会将基本数据类型转换为所需类型。时间类型要用时间解析器
Cookie 和 Session
1 修改jsp页面的编码 window——jsp——jsp File
1.会话:一次交互流程,交互开始会话开始,交互结束会话结束。
2.web中 :浏览器连接到服务器,会话开始,浏览器结束,会话结束。
3.Cookie和session是保存会话中产生的数据,
Cookie——是保存在浏览器(客户端),生命周期可设置。
Session——是保存在服务器 生命周期是会话结束终止使用,但是存在于服务器中。
4.Cookie的API
Cookie C = new Cookie(”键name”,”值”)键自定义
response.addCookie(C):将cookie发送到浏览器
request.getCookies():获取Cookie数组对象
cookie.setPath(“路径”):给cookie自定义添加路径
cookie.setMaxAge(“时间”):给cookie 设置生存时间
cookie.getName():获取cookie的名字
cookie.getValue():获取cookie的值
5.Cookie生命周期
默认:浏览器关闭Cookie死亡
设置:cookie.setMaxAge(“时间”),浏览器关时会将Cookie写到磁盘,第二次打开使用
6. Cookie使用:
服务器创建cookie对象:Cookie C = new Cookie(”键name”,”值”)键自定义
注意:一个Cookie是保存少量信息的键值对,路径相同 重名,则覆盖
Cookie被服务器发送到浏览器:response.addCookie(C)
本质是设置响应头:set—Cookie name=value
Cookie由浏览器保存
以后请求,Cookie会被带到服务器,请求体携带过来。
服务器获取:
Cookie[] Cs = request.getCookies();
If(cs !=null){
For(Cookie c :cs){
c.getName()+c.getValue()
}
}
7.注意事项:
*除了name,value其余属性为可选属性
*Cookie存储数量是有限的,一般浏览器300是上限,针对于单个服务器20个
*cookie大小有限制4kb
*cookie也可以由浏览器产生
8.session :域对象。由服务器创建,存在服务器,结合Cookie使用。可以跨多个也面请求
9.sessionAPI:
HttpSession hs = request.getSession():
hs.setAttribute():给Session设置值
hs.getAttribute():获得Session设置的值
hs.removeAttribute():移除session的数据
Session.invalidate():移除session则连其中的数据一起移除
10.第一次访问Servlet会生成session,
HttpSession hs = request.getSession()创建Session对象
给Session设置属性,再在其他页面取出属性值
创建完Session之后会给浏览器发送一个Cookie,这个Cookie JSESSIONID=字符串这个Cookie值和上面Session对应。
第二次访问服务器,携带Cookie到服务器
获取Session对象,根据cookie的ID获取到已经存在的Session
操作Session
注意:同一个Session,可以实现不同页面的共享,对于同一个访问者,Session唯一,不同访问者不唯yi
11.Session生命周期:
出生:可以理解为getSession时(但是实际是访问页面的时候就已经创建了)
死亡:服务器非正常关闭 、invalidate、session如果不适用30分钟服务器会自动将其销毁
12.Cookie和Session使用时机:
数据安全性高:用Session
多个页面要实现复杂的数据共享:使用Session
Cookie一般用于数据短小安全性不高的场合。
13.浏览器端的会话技术: cookie
存储完交互产生的数据保存在浏览器端
浏览器(自动): 接收cookie---保存cookie--传递cookie
服务器(重点): 创建cookie---传递cookie---接收cookie
创建cookie: new cookie("","");
传递cookie: addCookie(cookie对象);
接收cookie: Cookie[] getCookies();
JSP页面想获得cookie就必须要用重定向,跟浏览器交互后才有Cookie
14.默认情况: 会话级别 只要关闭浏览器 cookie销毁
持久化: setMaxAge(默认是秒值开始的)
0 移除cookie
>1 设置申明周期
-1 会话级别
15.服务器端的会话技术: session
存储完交互产生的数据保存在服务器端
session是一个域对象
xxxAttribute("",object)
作用域:
一次会话中有效
*(重点) request.getSession()
如何去保证一次会话中使用的是同一个session?
jsid ---session基于cookie
为什么浏览器关闭就不是同一个session?
浏览器关闭 cookie销毁
案例一: 统计一个servlet的访问次数
需求:
有一个servlet(countServlet),每访问一次这个servlet,将访问的次数+1,
当我们访问另一个servlet(showServlet),展示访问CountServlet的次数
技术分析:ServletContext对象
ServletContext: 上下文对象(全局管理者)
服务器启动的时候就会为每一个项目创建一个全局管理者--ServletContext对象
ServletContext的作用:
2 .获取全局的初始化参数
3 .获取一个文件的MIME类型( 例如:一个html文件 mime类型:text/html text/css img/jpeg)
4 .管理文件 (例如:获取文件路径,根据文件获取流)
1 .资源共享(在本项目下的所有servlet都可以共享它)
获取ServletContext:
方式1:
ServletContext getServletConfig().getServletContext()
方式2:
ServletContext getServletContext()
获取ServletConfig对象和ServletContext对象
直接在自己的servlet里面调用
this.getServletConfig()
this.getServletContext()
常用的方法:
获取全局的初始化参数
String getInitParameter(String name):获取指定的初始化参数
获取一个文件的MIME类型
getMimeType(String filename):获取文件的mime类型
管理文件
getRealPath(String path):获取当前项目在tomcat服务器中的根路径
InputStream is=new FileInputStream(new File(path)) 之前的获取方式
getResourceAsStream(String path):根据文件获取流
资源共享的方法(可以把他当成一个map集合) (掌握)
setAttribute(String key,Object value):储存值
Object getAttribute(String key):获取值,若没有则返回一个null
removeAttribute(String key):移除值
ServletContext资源共享的方法:可以被多个servlet共
---------------------------------------------------------------------------------------------------
步骤分析:
1 需要2个servlet(countServlet和showServlet)
2 在countServlet
1 创建servletContext对象
2 从servletContext取值
无:count=1
有:count=count+1
3 在将设置完的值存到servletContext
3 在showServlet
1 创建servletContext对象
2 从servletContext取值
无: 直接响应页面 没有访问过
有: 直接取值,响应给页面访问次数
---------------------------------------------------------------------------------------------------
案例二: 文件下载
需求:
在页面上有几个连接,点击连接就可以下载相应的文件了
技术分析: response---响应对象
作用:
通过他可以往浏览器输出内容
响应的组成:
响应行 响应头 响应体
1 操作响应行
格式:
协议/版本 状态码 状态码说明 HTTP/1.1 200 OK
常用的方法:
操作状态码:5种状态码
1 2 3 :正常的响应
4 5:有问题的响应
(理解)setStatus(状态码):针对的是 1xx 2xx 3xx
setStatus(302)
需要一个头
(了解)sendError(int code):针对的是 4xx 5xx
2 操作响应头(重点)
格式:
key:value(value可以是多个值)
常用的方法:
★setHeader(String key,String value):设置字符串形式的响应头
(了解)
addHeader(String key,String value);添加字符串形式的响应头
若没有设置则设置,若设置过则添加
常用的响应头:
1 location:重定向
重定向方式1(了解)需要配合302状态码一起使用
response.setStatus(302);
response.setHeader("location", "/servlet02/helloServlet7");
重定向方式2(掌握)
常用方法:
★response.sendRedirect("url");
2 refresh:定时刷新
response.setHeader("refresh","秒数;url=跳转的路径");
3 content-type:设置文件的mime类型 并且通知浏览器用什么编码打开
(了解)response.setHeader("content-type","文件的mime类型;charset=utf-8");
(重要)response.setContentType("文件的mime类型;charset=utf-8");
response.setContentType("文件的mime类型")
4 content-disposition:文件下载
response.setHeader("content-disposition","attachment;filename="+文件名称);
3 操作响应体
页面上要展示的内容
常用方法:
PrintWriter getWriter():字符流
ServletOutputStream getOutputStream():字节流
注意:
若是能写的出来的内容用字符流,其他全用字节流
中文乱码问题
字符流和字节流不能同时出现
服务器会自动帮我们关闭流.