《JavaWeb与Tomcat》——3.Servlet&JSP
时间:2023-02-23 00:30:00
第 4 章
本章主要介绍Servlet技术
1. Servlet能干什么?
(1)动态生成html文档(也可跳转.jsp);
(2)把request转发给其他Servlet;
(3)从客户端读取Cookies,写入Cookies发送给客户端;
(4)访问服务器资源(如DataBase、服务器本地文件等);
2. 与Servlet几个相关类别?
(1)请求对象ServletRequest或HttpServletRequest,在service方法内处理,可读取客户端请求信息;
(2)响应对象ServletResponse或HttpServletResponse,在service方法内处理,可产生发送给客户端的响应;
(3)Servlet配置对象ServletConfig,当Servlet初始化一个Servlet时,会向Servlet对象提供对应ServletConfig对象,Servlet对象通过ServletConfig对象获取初始化信息和ServletContext对象;
(4)Servlet上下文对象ServletContext,这个ServletContext的范围比较广,Servlet对象访问容器为当前应用程序提供的各种资源;
3. Servlet接口?方法?相关类别?
Servlet接口下的方法:
我们实现了这三种方法Servlet容器在Servlet自动调用不同生命周期阶段;
另外两个接口:GenericServlet接口(需要实现service方法)、HttpServlet接口(实现doGet/doPost方法);一般HttpServlet用的多;
请求和响应接口:
(1)HttpServletRequest接口;是ServletRequest子类接口;通过ServletRequest获取请求中的信息,包括HTTP请求信息(长度、编码、请求文本输入流)、服务器信息(主机、端口)、http请求的URL请求范围内的信息和访问共享数据;
HttpServletRequest接口下的方法:
eg:
小结:以上API作用是从Servlet如何分析请求中获取的信息?HTTP报文任务交给Servlet所有要求的信息都包装在容器中request在对象中,我们只需要调整对象API方法即可从request提取所需信息;
(2)HttpServletResponse接口(与HttpServletRequest接口对应,类似);包括设置响应编码、长度和响应文本MIME类型,设置响应文本的缓冲区,提供Writer/OutputStream将字符(串)流/字节流输出到客户端,清空缓冲区/手动向客户端发送响应;
Response显示客户端发送的响应主要是HTTP响应文本部分;
HttpServletResponse接口下的方法(设置响应头,设置状态码信息,如404、403等。Cookies):
通过从response在对象中获得PrintWriter,类似的可以写入客户端html页面;
Eg:
image.png
4. ServletConfig对象;
方法包括:
image.png
在web.xml中配置一个Servlet包含这个的时候Servlet一些配置信息(我们手动web.xml)这些信息包装在中间ServletConfig在对象中,可以通过ServletConfig取出对象,包括Servlet名称,获取ServletContext对象、Servlet内定义的param对象属性;
Eg:
手动配置xml:
读取配置信息:
5. ServletContext对象
这是一个非常强大的对象,在一个Servlet所有的容器Servlet共享一个对象ServletContext对象,它的作用领域非常广泛,涵盖了整个领域Servlet可访问的容器Servlet容器信息(和ServletConfig功能相似,也能读写共享属性(xml手动配置文件),访问Servlet容器下的一切Web应用资源,访问当前资源Web目前应用资源Web在应用范围内存取多个应用程序Web应用之间的共享信息、其他的包括输出日志、访问服务器端的文件系统;可以说非常强大的一个对象;
Eg:
读取/输出信息:
6. JavaWeb的生命周期
启动阶段-运行阶段-终止;
(1)启动阶段
通过第(4)点web.xml配置文件,让Servlet在Tomcat启动阶段是初始化的(一般来说,是第一次Servlet只有在发起请求时才初始化这一点Servlet,包括编译生成.class、读取.class);
配置方法:
(2)运行阶段
image.png
(3)终止
image.png
可以通过Tomcat的后台管理(localhost:8080/manager)在当前Tomcat容器下所有Web应用程序的开始/终止/卸载;
7. Servlet的生命周期
初始化init-提供服务service-销毁destroy;
(1)Servlet初始化
也可以配置xml让Servlet预初始化;
(2)运行时状态
(3)销毁阶段
Web当应用程序终止时,它将销毁一切Servlet对象,包括在初始化阶段与之相关的对象ServletConfig对象;
8. 再谈ServletContext的生命周期
当启动一个Web应用程序将生成唯一的应用程序ServletContext对象,他的生命周期和这个Web应用相同;
作用:访问Web应用范围内的所有资源——即在一定范围内共享数据,如具有特定功能JavaBean(只要这个Web应用还存活);
Eg:
应用:如 统计网站访问次数(通过ServletContextListener监听Web生命周期);
9. Servlet的service异常处理方法?
该方法本身可以在定义时抛出异常,如下:
- 可以抛出IOException和ServletException两种;
- 通过在service手动抛出方法内部,使用throw XXException语句;
- 捕获/处理异常:Servlet容器,他捕获异常,客户反馈异常处理结果;
10. 关于Cache?
指浏览器页面的缓存,如自动填充的用户名或密码,尽管刷新了页面,但仍然存在;
为什么使用浏览器?Cache?
——为了快速显示用户要求的页面(可以通过浏览器设置),将服务器响应的页面(或某些页面信息)存储在缓存中。当多次要求相同的页面时,浏览器从缓存中取出,而不是再次向服务器发送请求;
由于涉及到用户要求的信息的安全性,一般用于保存服务器的静态网页和不敏感信息;该信息来自服务器response因此,可以设置中提取物response来关闭cache;
Eg:(“Pragma适用于选项HTTP1.0的浏览器)
第 5 章
这一章主要讲Servlet的一些应用场景(高级用法、功能)
Servlet的高级用法包括:
这些操作都是在service方法内部操作request/response;
1.提供给用户下载(发送文件到客户端)
(1)在服务器本地打开文件输入流(读取本地文件);开启response的输出流;
(2)设置response的响应头(文件信息),正文类型;
(3)将文件流读到byte[ ] buffer缓冲区里面;
(4)读出缓冲区内容,通过response的输出流out.write写入数据;
Eg:
2.供用户上传文件到服务器(上传功能)
(略)
3.动态生成图像
(略)
4.*读写Cookies
什么是Cookies?
——Cookies是放在客户端的,它是服务器在客户端(浏览器)存放的信息;举个例子,服务器像是一个健身馆,他给每个来访问它的客户(这里指的就是使用浏览器访问Web服务器的用户)发了一张”会员卡”,这个卡就是Cookies,目的是保存用户的信息,用户以后每次来访问,服务器都可以根据这个”会员卡”识别用户的身份(用户信息),而用户每次在发送请求的时候,request里面就放着这个”会员卡Cookies”;
Cookies的原理如下:
(P139 图5-9)
Cookies的原理
既然Cookies在浏览器和Web服务器之间(具体的讲,指的是某个Web的应用,如一个Servlet对象)作为传递用户信息的载体,他要求浏览器和Web服务器分别有对应的功能:
image.png
怎么使用?(给个例子,只关系怎么在Servlet里面操作Cookies,不用关心浏览器的如何读取本地Cookies并将其添加到请求中、如何解析服务器的response中的Cookies)
(1)读取request中的Cookies
(2)写入response中的Cookies
通过cookies.setMaxAge(int secs)设置Cookies在本地(浏览器)硬盘上的保存时间;
Cookie既然是Web应用的某个插件X与浏览器之间的产物,那么对于Web服务器中其他的应用,是否有访问其他应用存在浏览器的本地Cookies?
可以控制Cookies的作用域:仅适用于指定的一个Web应用的指定路径下的插件、仅适用于指定的一个Web应用、在Web服务器中各个应用间共享Cookies;
*Cookie与Session的区别?
会话(Session)跟踪是Web程序中常用的技术。常用的会话跟踪技术包括Cookie和Session。二者最主要的区别是:Cookie作用于客户端(本地浏览器),而Seesion作用于服务器端(Web项目),通过记录信息来确定用户身份。
- Cookie原理:当浏览器(客户端)访问服务器时,如果服务器要记录用户状态,则会生成一个用户标识,也就是Cookie;随后通过响应response将Cookie发送给浏览器,而浏览器会把Cookie存在本地。当下次浏览器访问该Web服务器时,浏览器会将请求的url网址连同
对应的Cookie一同发送给服务器。服务器可以在Request中获取Cookie及其内容,并且可以修改Cookie,然后再发送给浏览器。不同浏览器具有不同形式的Cookie,而且Cookie不跨域名。
- Cookie的应用:如账号密码免登陆;但一般直接将账号密码放在Cookie里面是不安全的,可以使用一定的加密算法,将账号密码加密后再存于Cookie;服务器端将受到的账号密码存于数据库中,下次该浏览器访问服务器时,会查询数据库,若匹配则直接认证用户信息,不需要在浏览器重新输入账号密码。
(还有一种改进方法:只将账号按照某种加密规则加密,然后将原始账号连同加密后的账号一起存于Cookie发送给服务器端,服务器只需要验证加密方式是否能匹配即可,即能将加密后的账号解密还原成原始账号,这样就不需要查询数据库。)
-
Session原理:与Cookie相比,Session作用于服务器端。当浏览器(客户端)访问服务器时,服务器将客户端信息以Session的方式记录,并存放于服务器的内存中(为了存取速度),当客户端再次访问时,只需要和服务器的Session查询匹配即可确认身份。
-
Session工作原理:客户端(浏览器)在初次访问服务器时,服务器为该客户端生成一个唯一的Session ID,并将这个Session ID写入Cookie,然后发送给客户端;当浏览器再次访问服务器并请求Session时,服务器会读取浏览器传来的Cookie中的Session ID,通过这个Session ID读出相应Session中的值,然后发送给浏览器;
Session是有生命周期的,默认30分钟,可以通过:主页面、Web项目的xml、Tomcat的XML设置。
5.Servlet调用另一个Servlet——转发和包含
Servlet能否直接调用另一个Servlet的service方法,即将传入自己的service方法内的request和response参数传过去,让另一个Servlet去处理请求/响应呢?
不可以直接调用,因为拿不到其他Servlet对象的引用;通过前面说的一个Servlet强大的对象——serviceContext,他与整个Web应用绑定,因此”有权限”调用其他的Servlet;
将传入一个Servlet的service方法的request和response参数传给另一个Servlet去处理请求/响应,包括两种方式:(1)请求转发;(2)包含;
区别:
意思就是,”请求转发”在转发给其他Servlet操作时,自己对用户的响应是无效的,只能由第二个Servlet来响应;而”包含”与其相反,就可以实现分别响应;
二者相同点:
可知:
- 当前Servlet和目标的request和response是同一组对象;
- 转发的对象不仅仅是Servlet,也可以是其他Web组件(Servlet、JSP、html文档);
- 需要一个中间类实现,即RequestDispather对象;
具体实现的方法?
通过一个RequestDispather接口,这个接口对象和目的Web组件的path绑定,调用forward或者include方法;RequestDispather对象通过ServletContext对象来得到;
Eg:
(1)请求转发
看到对request对象加了个属性,并且在response里面发出了响应;然后将request/response对象传给了下一个/output(映射OutServlet.java) 来处理;
forward() 方法的流程:
(P150 图5-14)
注意:
因此无论是在forward() 方法前或者后调用第一个Servlet的response对象向客户端响应,最终都只有第二个Servlet的response响应;如果在调用forward() 方法之前就关闭(也可以说是响应了)了结果,如close()/flushBuffer()方法,则会抛出异常;对于forward方法,为request添加属性(setAttribute)可以在多个Web应用插件间”共享属性”;
(2)包含
最终的response结果由所有的转发者按照顺序共同生成;
Eg:
第一个Servlet打印了部分html,中间include几个其他Web应用插件(htm文档、其他Servlet),最终response结果由以上4个Web应用插共同构成;
与forward方法相比,include方法也有一些特点:
也就是说,二者的特性相反;forward方法的结果只由最后一个response响应(前面的对response的响应无效),而include方法的request相当于是”同时并行的”发送给其他的Web应用插件,彼此对request的修改被”忽略”(无效),最终的response是一个”求和”的关系;
Eg:结果如下,4个response的结果(按顺序)共同生成了一个页面
6.重定向
这个response.sendDir()操作与forward有点类似,也是让response结果由另一个Servlet来处理,特点如下:
总结就是:
(1)无论在response.sendDir()前后,源response都不会生效;
(2)request不共享,无法传递属性;
(3)范围上,不局限于当前Web应用的插件,可以是Internet上任意资源;
7.访问同一个Servlet容器下的其他Web应用
通过当前web应用的ServletContext去获得同一个Servlet容器下的其他Web应用的ServletContext,eg:
实现了当前Web应用的Servlet往同一个Servlet容器下的另一个Servlet跳转;
8.Servlet涉及的线程安全问题
因此,对于会被访问和修改的Servlet类的属性(如在xml里面 这一章主要讲JSP技术; 1.HTML、Servlet和JSP都能向用户返回页面,区别: (1)HTML静态页面 即访问的静态页面就是一个固定的资源(文件),”不会动”——无法动态展示一些信息,如数据、图像等; (2)动态的Servlet 即Servlet可以通过service方法从request取出请求中的信息,并且通过response”动态的”返回用户请求的结果; 缺点: Servlet与html刚好相反,它的主要结构是个.java文件,但又通过print来打印生成html构成的页面; (3)更加灵活的JSP JSP可以做到显示的html代码和负责逻辑的java代码(或者其他插件脚本,如JS)分离; ![JSP可以看成特殊的Servlet(它是个.jsp文件,首次被访问会生成对应的.java文件,这一步相当于是”把JSP翻译成.java的Servlet类”(这个类会write...html页面,但这一过程不需要我们实现,而是由Servlet容器实现),并且被编译成.class文件),不用再以out.print的方式输出html页面,它的主体是html,但通过一些java代码片段动态生成数据,相当于是”把动态的数据嵌入到静态的HTML页面”; 这个所谓的插在html中的标签,可以是: 将处理业务逻辑的java代码放到JavaBean中;在JSP里面通过简洁的JSP标签来访问JavaBean,调用业务代码,可以简化JSP,实现显示界面与业务逻辑的分离; 1.JavaBean长什么样? 就是一个普通的Java类;属性+getter/setter;其他方法; 2.怎么在JSP中用JavaBean对象(获取对象,调用方法/属性)? 导入;类似导包; 声明;类似A a = new (); 调用; 3.JavaBean的作用域? (1)page:页面范围,默认值; (2)request:请求范围,如作为request的Attribute属性; (3)session:会话范围,同上,随会话销毁; (4)application:Web应用范围;第 6 章