Servlet笔记

在观看了动力节点视频后的一些笔记整理

、什么是Web开发:Web通信,指的是俩台计算机通过网络进行资源共享活动。

web前端开发
web后台开发:由于后台开发使用的编程语言是Java,所以我们可以称为“javaweb开发程序员”。

二、资源文件:

1.从理论上说,计算机上所有的文件都是资源共享文件。

2.分类
静态资源文件:文件内容是固定的,不能随着请求变化而发生变化,有图片,html,doc等
特点:服务器计算机直接将静态资源文件推送给客户端计算机,所有被共享的静态资源最终是在客户端计算机运行。

动态资源文件:文件内容可以根据用户提供需求变化而产生不同变化内容。有Java文件等
特点:服务端计算机会调用执行动态资源文件,服务端计算机将动态资源文件的运行结果交给客户端计算机。

三、web通信中,俩台计算机如何进行通信:

C/S:针对个人用户
优点:可以有效的保护服务端计算机,可以分摊服务端计算机工作压力
缺点:增加客户获得服务的成本,增加服务器维护成本。

B/S:针对企业用户
优点:升级方便,不会增加客户获得服务的成本,不会增加服务端维护的成本
缺点:无法有效保护服务端计算机,无法通过客户端计算机分摊服务器计算机压力。

四、网络协议包:
1、定义:用于包裹在网络种传输二进制数据,网络协议包存在固定空间,用于存放特定数据,便于接受方分析得到数据。

2、分类:FTP http

3、B/S通信方式中:到目前为止的B/S通信结构中,只使用http网络协议包。

五、HTTP网络协议包内部结构:
1、HTTP请求协议包:
1)是浏览器在发送请求时,负责创建的。
2)是浏览器负责将请求信息,写入到请求协议包
3)HTTP请求协议包内部自上而下有四层结构
【请求行】{url:请求的资源文件地址
协议版本号
method:浏览器采用的请求方式}
【请求头】{浏览器希望获得资源文件类型【html/png】
浏览器希望获得资源文件内容的依赖字符集
如果浏览器采用get方式发送请求,本次关联请求参数需要保存在请求头}
【空白行】{隔离层 }
【请求体】{如果浏览器采用post方式发送请求,本次关联请求参数需要保存在请求体}

2、http响应协议包:
1)在服务端计算机的资源调度软件准备推送文件时,负责创建的
2)响应协议包内容可以由资源调度软件写入,可以由Java命令(response)写入。
3)HTTP请求协议包内部自上而下有四层结构
【状态行】{状态码}
【响应头】{返回文件内容类型(doc,text,html/text,html)
返回文件内容依赖字符集,浏览器需要使用这个字符集,对接收内容进行解码}
【空白行】{ }
【响应体】{静态资源文件也可能时动态资源文件
运行结果(二进制形式)}

客户端计算机上浏览器管理

一、如何命令浏览器向指定网站发送请求:
1、通过from表单命令
2、通过超链接命令 <ahref=“http://www.163.com”>163.com< /a>
3、浏览器的地址栏对象 window.location=“http://www.sina.com”;

二、请求方式【post/get】
1、get方式:
1)要求浏览器发送请求时,携带请求参数数量不能超过4K;
2)要求浏览器将请求参数写入到【请求头】;
3)要求浏览器将请求参数信息在地址栏上显示出来;
4)要求浏览器对接收的的资源文件必须缓存到内存。【静态资源文件】
只能提交字符串数据,文件上传必须使用post
什么时候使用post:
-有敏感数据
-传送数据不是普通字符串
-传送的数据非常多
-这个请求是为了修改服务器资源

2、post方式:
1)不会限制浏览器发送请求时,携带请求参数数量;
2)要求浏览器将请求参数写入到【响应体】;
3)要求浏览器将请求参数信息在地址栏隐藏;
4)要求浏览器对接收的文件不能保存到缓存【阅后即焚】【动态变化内容,车票信息,股票价格】
浏览器将资源缓存之后,缓存的资源是和某个特点的路径绑定在一起的,只要浏览器再发送这个相同的请求路径,这个时候会去缓存中获取资源,不再访问服务器,以这种方式降低服务器的压力,提搞用户的体验。但是有的时候,我们不希望走缓存,希望每一次都访问服务器,可以再请求路径后面添加时间戳,例如:http://ip:port/oa/system/logout?timestamp=12312313131
JS怎么获取毫秒:new Date().getTime();

三、如何控制浏览器采用的请求方式
1、让浏览器发送请求时,采用【get】方式
1)超链接标签命令,一定会要求浏览器采用get方式
2)location对象,一定会要求浏览器采用get方式
3)form标签命令中method属性可以控制浏览器采用get方式
默认

2、采用post方式,只有一种:

四、如何命令浏览器在发送请求时,携带指定请求参数。
1、超链接标签命令,可以命令浏览器携带请求参数
baidu

2、location对象,可以命令浏览器携带请求参数
window.location=“http://www.baidu.com?name=sky&sex=man”
*以上俩种方式存在弊端,请求参数内容时固定,无法根据客户具体要求来改变

3、表单域标签可以接收用户输入的内容,作为请求参数内容
1)表单域标签分类:input select textarea
2)表单域标签作为请求参数条件:
第一个条件:表单域标签必须声明在当前form标签内部
第二个条件:表单域标签必须声明【name属性】,这个属性作为【请求参数名】

1、什么是API?包括什么?
应用程序编程接口(这里所描述的接口,不是interface)
包括:源码、字节码、帮助文档

2、什么是JavaSE?
——SUN公司为Java程序员提供的一套基础类库。
这套基础类库包括:基础语法、面向对象、异常、IO、集合、反射、线程。。。

3、什么是JavaSE?
——Java企业版
SUN公司为Java程序员准备另一套庞大的类库,帮助程序员完成企业级项目开发。

浏览器 》http》 Web服务器 》Servlet》 服务器端小Java程序 》jdbc》 数据库
Browser webServer 未开发JavaEE规范 DBServer
Servlet:俩个英语单词的合并,Serv 表示服务器端,let 表示小程序。

SUN公司规定的Servlet规范,
项目名,可以放html、css、js、WEB-INF,WEB-INF里放class(字节码)、lib(jar包)、web.xml(请求路径和servlet类名之间的绑定关系)

关于Servlet生命周期

1、什么是生命周期?
生命周期表示一个Java对象从最初被创建到最终被销毁,经历的所有过程。

2、Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?
Servlet对象的生命周期,javaweb程序员是无权干涉的,包括该Servlet对象的相关方法的调用,javaweb程序员也是无权干涉的。
Servlet对象从最初的创建开始,方法的调用,以及最后对象的销毁,整个过程,是由Web容器来管理的。
Web Container管理Servlet对象的生命周期

3、“默认情况下”,Servlet对象在Web服务器启动阶段不会被实例化。

4、描述Servlet对象生命周期
1)用户在浏览器地址栏输入URL:http://localhost:8080/prj-servlet-03/test
2)web容器截取请求路径/prj-servlet-03/test对应的Servlet对象
3)web容器在容器上下文中找请求路径/prj-servlet-03/test对应的Servlet对象
4)若没有找到对应的Servlet对象
4.1)通过web.xml文件中相关的配置信息,得到请求路径/test对应的Servlet完整类名
4.2)通过反射机制,调用Servlet类的无参构造方法完成Servlet对象的实例化
4.3)web容器调用Servlet对象的init方法完成初始化操作
4.4)web容器调用Servlet对象的service方法提供服务
5)若找到对应的Servlet对象
5.1)web容器直接调用Servlet对象的service方法提供服务
6)web容器关闭的时候/webapp重新部署的时候/该Servlet对象长时间没有用户再次访问的时候,web容器会将该Servlet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。

5、总结:
5.1)Servlet类的构造方法只执行一次
5.2)Servlet对象的init方法只执行一次
5.3)Servlet对象的service方法,只要用户请求一次,则执行一次
5.4)Servlet对象的destroy方法只执行一次

6、注意:
init方法执行的时候,Servlet对象已经被创建好了,
destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁。

7、Servlet对象是单例,但是不符合单例模式,只能称为伪实例。真单例的构造方法是私有化的,Tomcat服务器是支持多线程的。所以Servlet对象在单实例多线程的环境下运行的。那么Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。

8、若希望在web服务器启动阶段实例化Servlet对象,需要在web.xml文件中进行相关的配置,例如:
主要是配
0

数字越小优先级越高。
9、Servlet对象实例化之后,这个Servlet对象被存储到哪里了?
大多数的web容器都是将该Servlet对象以及对应的url-pattern存储到Map集合中了;
在Web容器中有这样一个Map集合
Map<String,Servlet>集合
key value

/login loginServlet对象引用

10、服务器在启动时就会解析各个webapp的web.xml文件,做了什么?
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了;
Map<String,String>集合
key value

/login com.servlet.LoginServlet

【UML图】

属于整个软件工程学
1、什么是UML?
a)统一建模语言,1997年OMG组织制定的图标式语言,在系统设计阶段由系统分析师使用的语言,使用这些图标语言体现设计思想;
b)后期程序员开发的依据就是这些设计图;
c)UML和任何一个编程语言无关,是一个独立的学科;
d)UML属于软件工程学
2、UML建模工具?
a)StarUML b)Rational Rose。。。
3、UML图都有哪些?
a)类图:描述类的信息以及类和类之间的关系
b)时序图:描述一个程序的执行过程
c)用例图:站在系统用户的角度分析系统中存在哪些功能
d)状态图:描述一个对象的生命周期
e)。。。

11、Servlet接口中的这些方法中填写什么代码?什么时候使用这些方法?
1)无参构造方法

2)init方法
以上两个方法执行时间几乎是相同的,执行次数都是一次,构造方法执行的时候对象正在创建,init方法执行的时候对象已经创建;
若系统要求在对象创建时刻执行一段特殊的程序,这段程序尽量写到init方法中。
为什么不建议将代码写到构造函数中呢?
存在风险!
当程序员编写构造方法的时候,可能会导致无参构造方法不存在。
一个类不编写任何构造函数,默认有一个无参数的构造方法,但是一旦编写一个有参数的 构造方法之后,系统则不再提供无参数构造方法。
Servlet中的init方法是SUN公司为javaweb程序员专门提供的一个初始化时刻,若希望再初始化时刻执行一段特殊的程序,这个程序可以编写到init方法,将来会被自动调用。

3)service方法
这个方法是必然要重写的,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
而且这个方法中的代码是最有价值的。
也是最难写的,因为最难编写的就是业务逻辑代码。

4)destroy方法
这个方法也是SUN公司为javaweb程序员提供的一个特殊的时刻,这个特殊时刻被称为对象销毁时刻,若希望在销毁时刻执行一段特殊的代码,需要将这段代码填写到destroy方法中,自动被容器调用

回顾:
类加载时刻执行程序,代码写道静态代码块中
结论:
SUN公司为我们程序员提供了很多个不同的时刻,若在这个特殊时刻执行特殊程序,这些程序时有位置编写的。

Tomcat服务器是一个实现了Servlet规范和JSP规范的容器。

ServletConfig接口
ServletContext接口到底是什么?
答:
一个webapp只有一个web.xml文件,web.xml文件服务器启动阶段被解析
一个webapp只有一个ServletContext对象,ServletContext在服务器启动阶段被实例化
–ServletContext在服务器启动阶段被实例化
–ServletContext在服务器关闭的时候会被销毁
–ServletContext对应的是web.xml文件,是web.xml文件的代表。
–ServletContext是所有Servlet对象四周环境的代表(在同一个webapp中,所有的Servlet对象共享同一个四周环境对象,该对象就是ServletContext)。
–所有的用户若想共享同一个数据,可以将这个数据放到ServletContext对象中。
–一般放到ServletContext对象中的数据不建议涉及到修改操作的,因为ServletContext是多线程共享的一个对象,修改的时候会存在线程安全问题。

Servlet、ServletConfig、ServletContext之间的关系?
-一个Servlet对应一个ServletConfig
100个Servlet对应100个ServletConfig
–所有的Servlet共享一个ServletContext对象

1、欢迎页面设置:
1)假设在WebRoot目录下创建login.html,想让login.html作为整个webapp的欢迎页面,应该做这样的设置,编写web.xml文件:

login.html

2)假设在WebRoot目录下创建html目录,html目录中创建login.html,想让login.html作为整个webapp的欢迎页面,应该做这样的设置,编写web.xml文件:

html/login.html

2、为什么设置欢迎页面?
-为了访问更方便,为了提高用户的体验。
-设置欢迎页面之后,直接在浏览器地址栏上访问webapp即可,自动定位到欢迎页面,例如:
http://localhost:8080/prj-servlet-06

3、可以设置多个。

4、注意:欢迎页面设置的时候,路径不需要以“/”开始。

5、一个webapp的欢迎页面可以是任意web资源,比如servlet

6、欢迎页面包括全局配置和局部配置。(就近原则)
全局配置:CALATINA_HOME/conf/web.xml
局部配置:CATALINA_HOME/webapp/webapp/WEB-INF/web.xml
若一个页面的名称是:index.html, index.htm, index.jsp,这些都是默认的欢迎页面,在全局配置中已经配置过了。

在webapp中常见的错误代码:
404:Not Found 资源未找到:请求的资源路径写错了
500:Server Inner Error 服务器内部错误,这种情况一般都是Java程序出现异常
200:正常HTTP协议状态码
是HTTP协议状态码
可以在web.xml中添加错误信息

404
/error/error.html

路径总结:
两类: 第一类:以/开始,加webapp名称
第二类:以/开始,不加webapp名称
除以上两类之外,欢迎页面设置比较特殊,不以/开始,不加webapp的名称

适配器模式:缺省适配器,代码优雅,当一个接口有多个方法,类去继承时只需继承一部分方法,另建一个抽象类去继承一部分方法,然后其它类再继承该抽象类。
设计模式的分类:
创建型:解决对象的创建问题
行为型:该模式与方法、行为、算法有关的设计模式
结构型:更多类,更多的对象组合成更大的结构解决某个特定的问题
-Gof95(1995年,四人组提出的23种设计模式)
*单例模式
*工厂模式
*适配器模式
*迭代模式【集合】
*策略模式【集合】
*装饰器模式【io流】
。。。
-JavaEE设计模式

1、我们目前所有的Servlet类直接实现了javax.servlet.Servlet接口,
但是这个接口中有很大方法时目前不需要的,我们可能只需要填写service,直接
实现Servlet接口代码丑陋,有必要再中间添加一个适配器,以后所有的Servlet
类不再直接实现Servlet接口,应该去继承适配器类。
2、适配器除了可以让代码优雅之外,我们还可以再适配器中提供大量的方法,子类继承之后,
可以在子类中直接使用,方便编程。
!!!031个视频

1、HTTP协议的详细内容
2、GET请求和POST请求的区别
3、安装httpwatch工具,进行HTTP协议的监测

1、前端的页面发送的请求方式应当和服务器端需要的请求方式一致
-服务器需要前端发生POST请求,那前端就应该发送POST请求,若发送GET请求,服务器应当提示错误信息。
-服务器需要前端发生GET请求,那前端就应该发送GET请求,若发送POST请求,服务器应当提示错误信息。
怎么完成:使用Java语言中if语句判断
怎么获取:
HTTP的请求协议全部信息被自动封装到javax.servlet.http.HttpServletRequest对象中
在HttpServletRequest接口类型中有一个方法叫做:String getMethod();可以获取请求方式。
将ServletRequest,ServletResponse强制转换为带有HTTP的接口类型

重点:编写一个Servlet类应当继承javax.servlet.http.HttpServlet,get请求请重写doGet方法,post请求请重写doPost方法
-doPost/doGet方法可以等同看做main方法。
当浏览器发送的请求方式和后台的处理方式不同的话,会出现一个错误,代号:405

HttpServlet体现了什么设计模式:模板方法设计模式
不同类的核心算法骨架相同,这样代码冗余
模板方法设计模式,可以做到,在不改变算法的前提之下,可以重新定义算法步骤的具体实现

面试官问:你知道模板方法设计模式吗?
知道的,你在项目中哪里见过?
Servlet规范中的:HttpServlet
HttpServlet是一个典型的模板方法设计模式
HttpServlet是一个模板类
其中的service(HttpServletRequest,HttpServletRespose)方法是典型的模板方法
在该方法中定义了核心算法骨架,doGet,doPost。。。具体的实现步骤延迟到子类中完成。
——模板方法设计模式的特点:
doXXX
doYYY
doZZZ
——模板方法设计模式属于:行为型设计模式
——模板方法设计模式主要作用:
1、核心算法得到保护
2、核心算法得到复用
3、在不改变算法的前提之下,却可以重新定义算法步骤的具体实现。

【038】
1、javax.servlet.http.HttpServletRequest接口
2、继承关系:public interface HttpServletRequest extends ServletRequest{}
3、HttpServletRequest接口的实现类是WEB容器负责实现的,Tomcat服务器有自己的实现,但是程序员还是只需要面向HttpServletRequest接口调用方法相同,不需要关心具体的实现了。
4、HttpServletRequest这个对象封装了哪些信息?
封装了HTTP请求协议的全部内容:请求方式、URI、协议版本号、表单提交的数据。。。
5、什么是一次请求:在网页上点击超链接,到最终网页停下来,这就是一次完整的请求。

!!!
6、HttpServletRequest接口中常用的方法:
-表单提交的数据,会自动被封装到request对象中,request对象中有Map集合存储这些数据:Map集合的key是name,value是一个字符串类型的一维数组
——String getParameter(String name) //通过key获取value这个一维数组中的首元素通常情况这个数组中只有一个元素,
//下面这个方法适合取checkbox中数据
——String[] getParameterValues(String name) //通过Map集合key获取value
——Map getParameterMap() //获取整个Map集合
——Enumeration getParameterNames() //获取整个Map集合的所有key

例:String username = request.getParameter(“username”);
获取所有的兴趣爱好:
String[] interests = request.getParameterValues(“interest”); for…

-String getRemoteAddr() //获取客户端IP地址
-String getContextPath() //获取上下文路径webapp的根路径
-String getMethod() //获取浏览器的请求方式
-String getRequestURI() //获取请求URI
-StringBuffer getRequestURL()//获取请求URL
-String getServletPath() //获取servletpath

-void setAttribute(String name,Object o) //向request范围中添加数据
-Object getAttribute(String name) //从request范围中读取数据
-void removeAttribute(String name) //移除request范围中的数据

-RequestDispatcher getRequestDispatcher(String path) //获取请求转发器,让转发器对象指向某个资源

-void setCharacterEncoding(String env)

-Cookie[] getCookies() //后面讲Cookie的时候讲
-HttpSession getSession() //后面讲Session的时候讲

——ServletContext是Servlet上下文对象,该接口中也有这样的几个方法:
-void setAttribute(String name,Object o) //向ServletContext范围中添加数据
-Object getAttribute(String name) //从ServletContext范围中读取数据
-void removeAttribute(String name) //移除ServletContext范围中的数据
ServletContext是一个怎样的范围?
所有用户共享的一个范围对象,我们一般把ServletContext变量命名为:application
可见这个对象代表一个应用,一个webapp只有一个这样的对象,范围极大!

HttpServletRequest是一个怎么样的范围?
——HttpServletRequest类型的变量通常命名为:request,代表当前的本次请求
一次请求对应一个request对象,100对应100
请求范围是极小的,request只能完成在同一次请求中传递数据。

跳转,执行完AServlet之后,跳转到BServlet执行,将AServlet执行和BServlet执行放到同一个请求中,必须使用转发技术
forward【转发】
1、获取请求转发器对象
RequestDispatcher dispatcher= request.getRequestDispatcher("/b");
2、调用请求转发器的forward方法即可完成转发
dispatcher.forward(request,response);
合并:request.getRequestDispatcher("/b").forward(request,response);

关于范围对象的选择:
-ServletContext 应用范围,可以跨用户传递数据
-ServletRequest 请求范围,只能在同一个请求中传递数据【可以跨Servlet传递数据,但是这多个Servlet必须在同一个请求当中】
优先选择request范围。

关于项目中出现的中文乱码问题:
1、乱码经常出现在什么位置上?
*数据传递过程中的乱码
*数据展示过程中的乱码
*数据保存过程中的乱码
2、数据保存过程中的乱码?
-最终保存到数据库表中的时候,数据出现乱码
-导致数据保存过程中的乱码包括以下两种情况:
——第一种:在保存之前,数据本身就是乱码,保存到数据库表中的时候一定是乱码。
——第二种:保存之前,数据不是乱码,但是由于本身数据库不支持简体中文,保存之后出现乱码
3、数据展示过程中的乱码?
-最终显示到网页上的数据出现中文乱码。
-经过执行Java程序之后,Java程序员负责向浏览器响应的时候,中文出现乱码,怎么解决?
*设置响应的内容类型,以及对应的字符编码方式:
response.setContextType(“text/html;charset=UTF-8”);
-没有经过执行Java程序,直接访问html页面,出现中文乱码,怎么解决:
*

4、数据传递过程中的乱码?
——将数据从浏览器发送给服务器的时候,服务器接收到的数据是乱码。
——ISO-8859-1是国际标准码,不支持中文编码,兼容ASCII码,又被称为Latin1编码
——不管是哪个国家的文字,在浏览器发送给服务器时,都会采用ISO-8859-1 的编码方式发送。
——发送给web服务器之后,web服务器不知道这些数据之前时什么类型的文字。
解决数据传递过程中的乱码:
1)万能方式,既能解决POST请求乱码,又能解决GET请求乱码
先将服务器中接收的数据采用ISO-8859-1 的方式解码,回归原始状态
再给定一种支持简体中文的编码方式重新编码组装。
2)只支持POST请求,因为这种方式只对请求体编码
request.setCharacterEncoding(“UTF-8”);

3)专门解决GET请求,因为这种方式只对请求行编码。
修改配置。

//String value = request.getParameter(name); //从表单上获取数据
//Object obj = request.getAttribute(name); //从request范围中获取数据(之前一定调用过setAttribute)

Servlet线程安全问题:
1、Servlet时单实例多线程环境下运行的。
2、什么时候程序存在线程安全问题?
-多线程并发
-有共享的数据
-共享数据有修改操作
3、再JVM中,有哪些数据可能会存在线程安全问题?
-局部变量内存空间不共享,一个线程一个栈,局部变量再栈中存储,局部变量不会存在线程安全问题
-所有线程共享一个堆
*堆内存中new出来的对象在其中存储,对象内部有“实例变量”,所以实例变量的内存多线程是共享的。实例变量多线程共同访问,并且涉及到修改操作的时候就会存在线程安全问题。
-所有线程共享一个方法区
*方法区中有静态变量,静态变量的内存也是共享的,若涉及到修改操作,静态变量也存在线程安全问题。
4、线程安全问题不止是体现在JVM中,还有可能发生在数据库中,例如:多个线程共享同一张表。
解决:
第一种:在Java程序中使用synchronized关键字,线程排队执行,自然不会再数据库中并发
第二种:行级锁
第三种:事务隔离级别:例如:串行化
第四种:乐观锁

5、怎么解决线程安全问题
5.1)不使用实例变量,尽量使用局部变量
5.2)若必须使用实例变量,那么我们可以考虑将该对象变成多例对象,一个线程一个Java对象
5.3)若必须使用单例,那就只能使用synchronized 线程同步机制,线程一旦排队执行,则吞吐量降低,降低用户体验。

6、Servlet怎么解决线程安全问题?
6.1)不使用实例变量,尽量使用局部变量
6.2)Servlet必须是单例的。使用synchronized

关于web系统中资源跳转:
转发:forward
重定向:redirect :多次请求
2、代码完成:
转发: request.getRequestDispatcher("/b").forward(request,response);
重定向: response.sendRedirect(request.getContextPath()+"/b");

3、转发和重定向的相同点和不同点:
-相同点:都可以完成资源跳转
-不同点:转发是request对象触发的
重定向是response对象触发的
转发是一次请求,浏览器地址栏上地址不会变化【/a】
重定向是俩次请求,浏览器地址栏上的地址发生变化【/a,/b】
重定向的路径需要加webapp的根路径
转发是再本项目内部完成资源跳转
重定向可以完成跨app跳转资源

4、跳转的下一个资源可以是什么?
——任意资源:HTML,jsp,Servlet
5、什么时候采用转发,什么时候采用重定向?(大部分情况下到使用重定向)
-若想完成跨啊app跳转,必须使用重定向
-若在上一个资源中向request范围中存储了数据,希望在下一个资源中从request范围中将数据取出,必须使用转发。
-重定向可以解决浏览器的刷新问题。

6、重定向的原理是什么?
——response.sendRedirect("/jd/login");

7、这句话不一定对:在浏览器上点击一个超链接,到最终网页停下来时一次请求。
因为有重定向

!!!
Cookie
1、Cookie是什么?Cookie作用?
-Cookie可以保存会话状态,但是这个会话状态是保留在客户端上。
-只要Cookie清除,或者Cookie失效,这个会话状态就没有了。
-Cookie是保存在浏览器客户端上的
-Cookie可以保存在浏览器的缓存中,浏览器关闭Cookie消失
-Cookie也可以保存在客户端的硬盘文件中,浏览器关闭Cookie还在,除非Cookie失效

2、Cookie只有在javaweb中有吗?
-Cookie不止是在javaweb中存在
-只要是web开发,只要是B/S架构的系统,只要是基于HTTP协议,就有Cookie的存在
-Cookie这种机制是HTTP协议规定的。

3、Cookie实现的功能,常见的有哪些?
-保留购物车商品的状态在客户端上
-十天内免登录
。。。

4、在Java中Cookie被当做类来处理,使用new运算符可以创建Cookie对象,而且Cookie由两部分组成,分别是Cookie的name和value,name和value都是字符串类型String。

5、在Java程序中怎么创建Cookie?
Cookie cookie = new Cookie(String cookieName,String cookieValue);

6、服务器可以一次向浏览器发送多个Cookie。

7、默认情况下,服务器发送Cookie给浏览器之后,浏览器将Cookie保存在缓存当中,只要不关闭浏览器,Cookie永远存在,并且有效。当浏览器关闭之后,缓存中的Cookie被清除。

8、在浏览器客户端无论是硬盘文件中还是缓存中保存的Cookie,什么时候会再次发送给服务器呢?
-浏览器会不会提交发送这些Cookie给服务器,和请求路径有关系。
-请求路径和Cookie是紧密关联的。
-不同的请求路径会发送提交不同的Cookie

9、默认情况下Cookie会和哪些路径绑定在一起?
/prj/test/servlel //请求服务器,生成Cookie
这个浏览器中的Cookie会默认和test/这个路径绑定在一起。
也就是说,以后只要发送test/请求,Cookie一定会提交给服务器。
绑定最后一个/

10、其实路径是可以指定的,可以通过Java程序进行设置,保证Cookie和某个特定的路径绑定在一起。
假设,执行了这样的程序:cookie.setPath(“prj/king”);
那么:Cookie将和 “prj/king” 路径绑定在一起。
只要发送“/prj/king”请求路径,浏览器才会提交Cookie给服务器。

11、默认情况下,没有设置Cookie的有效时长,该Cookie被默认保存在浏览器的缓存当中,只要浏览器不关闭Cookie存在,只要关闭浏览器Cookie消失,我们可以通过设置Cookie的有效时长,以保证Cookie保存在硬盘文件当中,但是这个有效时长必须是大于0的。
cookie.setMaxAge(60*60);

12、浏览器提交Cookie给服务器,服务器这么接收Cookie?
Cookie[] cookies = request.getCookies();

13、浏览器可以禁用Cookie,什么意思?
-表示服务器发送过来的Cookie,我浏览器不要,不接收。
-服务器还是会发送Cookie的,只不过浏览器不再接收。

【关于url-pattern的编写方式和路径的总结】
1、路径的编写形式:
-
-
-重定向:response.sendRedirect("/项目名/资源路径");
-转发:request.getRequestDispatcher("/资源路径").forward(request,response);
-欢迎页面:

资源路径

-servlet路径:
/资源路径
-Cookie设置path
cookie.setPath("/项目名/资源路径");
-ServletContext
ServeltContext application = config.getServletContext();
application.getRealPath("/资源路径");

【Session】
1、在Java中会话对应的类型是:javax.servlet.http.HttpSession
2、Cookie可以将会话状态保存在客户端,Session可以将会话状态保存在服务器端
3、HttpSession对象是一个会话级别的对象,一次会话对应一个HttpSession对象。
4、什么是一次会话?
”目前“可以这样理解,用户打开浏览器,在浏览器上发送多次请求,知道最终关闭浏览器,表示一次完整的会话。
5、在会话进行过程中,web服务器一直为当前这个用户维护者一个会话对象/HttpSession
6、在WEB容器中,WEB容器维护了大量的HttpSession对象,换句话说,在WEB容器中应该有一个”Session列表“。
——为什么当前会话中的每一次请求可以获取到属于自己的会话对象?session的实现原理?
-大开浏览器,在浏览器上发送首次请求
-服务器会创建一个HttpSession对象,该对象代表一次会话
-同时生成HttpSession对象对应的Cookie对象,并且Cookie对象的name是JSESSIONID,Cookie的value是32位长度的字符串
-服务器将Cookie的value和HttpSession对象绑定到session列表中
-服务器将Cookie完整发送给浏览器客户端
-浏览器客户端将Cookie保存到缓存中
-只要浏览器不关闭,Cookie不会消失
-当再次发送请求的时候,会自动提交缓存当中的Cookie
-服务器接收到Cookie,验证该Cookie的name确实是:JSESSIONID,然后获取该Cookie的value
-通过Cookie的value去session列表中检索对应的HttpSession对象。

7、和HttpSession对象关联的这个Cookie的name是比较特殊的,在Java中就叫做jsessionid。

8、浏览器禁用Cookie会出现什么问题?
浏览器禁用Cookie,则浏览器缓存中不再保存Cookie
导致在同一个会话中,无法获取到对应的会话对象
禁用Cookie之后,每一次获取的会话对象都是新的
——浏览器禁用Cookie之后,还想拿到对应的Session对象,必须使用URL重写机制
。。。;jsessionid=xxxxxxxxx
重写URL会给编程带来难度/复杂度,所以一般的web站点时不建议禁用Cookie。

9、浏览器关闭之后,服务器对应的session对象会被销毁吗?为什么?
-浏览器关闭之后,服务器不会销毁session对象
-因为B/S架构的系统基于HTTP协议,而HTTP协议是一种无连接/无状态的协议
-什么是无连接/无状态?
*请求的瞬间浏览器和服务器之间的通道是打开的,请求响应结束之后,通道关闭
*这样做的目的是降低服务器的压力。

10、session对象在什么时候被销毁?
-web系统中引入了session超时的概念。
-当很长一段时间(这个时间可以配置)没有用户再访问该session对象,此时session对象超时,web服务器自动回收session对象。
-可配置:web.xml文件中,默认是30min。

11、什么是一次会话?
-一般多数情况下,是这样描述的?用户打开浏览器,在浏览器上进行一些操作,然后将浏览器关闭,表示一次会话结束。
-本质上是从session对象创建到session对象超时销毁,是一次完整的会话。

12、关于javax.servlet.http.HttpSession接口中常用方法:
-void setAttribute(String name,Object value)
-Object getAttribute(String name)
-void removeAttribute(String name)
-void invalidate() //销毁session

13、ServletContext、HttpSession、HttpServletRequest接口得对比:
1)都是范围对象,分别是:应用范围、会话范围、请求范围
2)三个范围得排序:
application>session>request
3)application完成跨用户共享数据、
session完成跨请求传递数据,但是这些请求必须在同一个会话当中。
request完成跨Servlet共享数据,但是这些Servlet必须在同一个请求当中【转发】
4)使用原则:由小到大尝试,优先使用小范围
例如:登录成功之后,已经登录得状态需要保存起来,可以将登录成功得这个状态保存到session对象中。不能保存到request,因为一次请求对应一个新得request对象,不能保存到application范围中,因为登录成功是属于会话级别得,不能所有用户共享。

14、补充HttpServletRequest中得方法:
HttpSession session=request.getSession(); //获取当前得session,获取不到,则新建session
HttpSession session=request.getSession(ture); //获取当前得session,获取不到,则新建session
HttpSession session=request.getSession(false); //获取当前得session,获取不到,则返回null

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sky丶Mamba

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

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

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

打赏作者

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

抵扣说明:

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

余额充值