资讯详情

《JavaWeb与Tomcat》——3.Servlet&JSP

第 4 章

本章主要介绍Servlet技术

(1)动态生成html文档(也可跳转.jsp); (2)把request转发给其他Servlet; (3)从客户端读取Cookies,写入Cookies发送给客户端; (4)访问服务器资源(如DataBase、服务器本地文件等);

(1)请求对象ServletRequest或HttpServletRequest,在service方法内处理,可读取客户端请求信息; (2)响应对象ServletResponse或HttpServletResponse,在service方法内处理,可产生发送给客户端的响应; (3)Servlet配置对象ServletConfig,当Servlet初始化一个Servlet时,会向Servlet对象提供对应ServletConfig对象,Servlet对象通过ServletConfig对象获取初始化信息和ServletContext对象; (4)Servlet上下文对象ServletContext,这个ServletContext的范围比较广,Servlet对象访问容器为当前应用程序提供的各种资源;

Servlet接口下的方法:

我们实现了这三种方法Servlet容器在Servlet自动调用不同生命周期阶段;

另外两个接口:GenericServlet接口(需要实现service方法)、HttpServlet接口(实现doGet/doPost方法);一般HttpServlet用的多;

请求和响应接口:

(1);是ServletRequest子类接口;通过ServletRequest获取请求中的信息,包括HTTP请求信息(长度、编码、请求文本输入流)、服务器信息(主机、端口)、http请求的URL请求范围内的信息和访问共享数据;

HttpServletRequest接口下的方法:

eg:

小结:以上API作用是从Servlet如何分析请求中获取的信息?HTTP报文任务交给Servlet所有要求的信息都包装在容器中request在对象中,我们只需要调整对象API方法即可从request提取所需信息;

(2)(与HttpServletRequest接口对应,类似);包括设置响应编码、长度和响应文本MIME类型,设置响应文本的缓冲区,提供Writer/OutputStream将字符(串)流/字节流输出到客户端,清空缓冲区/手动向客户端发送响应;

Response显示客户端发送的响应主要是HTTP响应文本部分;

HttpServletResponse接口下的方法(设置响应头,设置状态码信息,如404、403等。Cookies):

通过从response在对象中获得PrintWriter,类似的可以写入客户端html页面;

Eg:

image.png

方法包括:

image.png

在web.xml中配置一个Servlet包含这个的时候Servlet一些配置信息(我们手动web.xml)这些信息包装在中间ServletConfig在对象中,可以通过ServletConfig取出对象,包括Servlet名称,获取ServletContext对象、Servlet内定义的param对象属性;

Eg:

手动配置xml:

读取配置信息:

这是一个非常强大的对象,在一个Servlet所有的容器Servlet共享一个对象ServletContext对象,它的作用领域非常广泛,涵盖了整个领域Servlet可访问的容器Servlet容器信息(和ServletConfig功能相似,也能读写共享属性(xml手动配置文件),访问Servlet容器下的一切Web应用资源,访问当前资源Web目前应用资源Web在应用范围内存取多个应用程序Web应用之间的共享信息、其他的包括输出日志、访问服务器端的文件系统;可以说非常强大的一个对象;

Eg:

读取/输出信息:

启动阶段-运行阶段-终止;

(1)启动阶段

通过第(4)点web.xml配置文件,让Servlet在Tomcat启动阶段是初始化的(一般来说,是第一次Servlet只有在发起请求时才初始化这一点Servlet,包括编译生成.class、读取.class);

配置方法:

(2)运行阶段

image.png

(3)终止

image.png

可以通过Tomcat的后台管理(localhost:8080/manager)在当前Tomcat容器下所有Web应用程序的开始/终止/卸载;

初始化init-提供服务service-销毁destroy;

(1)Servlet初始化

也可以配置xml让Servlet预初始化;

(2)运行时状态

(3)销毁阶段

Web当应用程序终止时,它将销毁一切Servlet对象,包括在初始化阶段与之相关的对象ServletConfig对象;

当启动一个Web应用程序将生成唯一的应用程序ServletContext对象,他的生命周期和这个Web应用相同;:访问Web应用范围内的所有资源——即在一定范围内共享数据,如具有特定功能JavaBean(只要这个Web应用还存活);

Eg:

:如 统计网站访问次数(通过ServletContextListener监听Web生命周期);

该方法本身可以在定义时抛出异常,如下:

  • 可以抛出IOException和ServletException两种;
  • 通过在service手动抛出方法内部,使用throw XXException语句;
  • 捕获/处理异常:Servlet容器,他捕获异常,客户反馈异常处理结果;

指浏览器页面的缓存,如自动填充的用户名或密码,尽管刷新了页面,但仍然存在;

——为了快速显示用户要求的页面(可以通过浏览器设置),将服务器响应的页面(或某些页面信息)存储在缓存中。当多次要求相同的页面时,浏览器从缓存中取出,而不是再次向服务器发送请求;

由于涉及到用户要求的信息的安全性,一般用于保存服务器的静态网页和不敏感信息;该信息来自服务器response因此,可以设置中提取物response来关闭cache;

Eg:(“Pragma适用于选项HTTP1.0的浏览器)

第 5 章

这一章主要讲Servlet的一些应用场景(高级用法、功能)

Servlet的高级用法包括:

这些操作都是在service方法内部操作request/response;

(1)在服务器本地打开文件输入流(读取本地文件);开启response的输出流; (2)设置response的响应头(文件信息),正文类型; (3)将文件流读到byte[ ] buffer缓冲区里面; (4)读出缓冲区内容,通过response的输出流out.write写入数据;

Eg:

2.供用户上传文件到服务器(上传功能)

(略)

3.动态生成图像

(略)

——Cookies是放在客户端的,它是服务器在客户端(浏览器)存放的信息;举个例子,服务器像是一个健身馆,他给每个来访问它的客户(这里指的就是使用浏览器访问Web服务器的用户)发了一张”会员卡”,这个卡就是Cookies,目的是保存用户的信息,用户以后每次来访问,服务器都可以根据这个”会员卡”识别用户的身份(用户信息),而用户每次在发送请求的时候,request里面就放着这个”会员卡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?

可以控制:仅适用于指定的一个Web应用的指定路径下的插件、仅适用于指定的一个Web应用、在Web服务器中各个应用间共享Cookies;

*

会话(Session)跟踪是Web程序中常用的技术。常用的会话跟踪技术包括Cookie和Session。二者最主要的区别是:Cookie作用于客户端(本地浏览器),而Seesion作用于服务器端(Web项目),通过记录信息来确定用户身份。

  • Cookie原理:当浏览器(客户端)访问服务器时,如果服务器要记录用户状态,则会生成一个用户标识,也就是Cookie;随后通过响应response将Cookie发送给浏览器,而浏览器会把Cookie存在本地。当下次浏览器访问该Web服务器时,浏览器会将请求的url网址连同

对应的Cookie一同发送给服务器。服务器可以在Request中获取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设置。

Servlet能否直接调用另一个Servlet的service方法,即将传入自己的service方法内的request和response参数传过去,让另一个Servlet去处理请求/响应呢?

不可以直接调用,因为拿不到其他Servlet对象的引用;通过前面说的一个Servlet强大的对象——serviceContext,他与整个Web应用绑定,因此”有权限”调用其他的Servlet;

将传入一个Servlet的service方法的request和response参数传给另一个Servlet去处理请求/响应,包括两种方式:(1)请求转发;(2)包含;

区别:

意思就是,”请求转发”在转发给其他Servlet操作时,自己对用户的响应是无效的,只能由第二个Servlet来响应;而”包含”与其相反,就可以实现分别响应;

二者相同点:

可知:

  1. 当前Servlet和目标的request和response是同一组对象;
  2. 转发的对象不仅仅是Servlet,也可以是其他Web组件(Servlet、JSP、html文档);
  3. 需要一个中间类实现,即RequestDispather对象;

通过一个RequestDispather接口,这个接口对象和目的Web组件的path绑定,调用forward或者include方法;RequestDispather对象通过ServletContext对象来得到;

Eg:

看到对request对象加了个属性,并且在response里面发出了响应;然后将request/response对象传给了下一个/output(映射OutServlet.java) 来处理;

forward() 方法的流程:

(P150 图5-14)

注意:

因此无论是在forward() 方法前或者后调用第一个Servlet的response对象向客户端响应,最终都只有第二个Servlet的response响应;如果在调用forward() 方法之前就关闭(也可以说是响应了)了结果,如close()/flushBuffer()方法,则会抛出异常;对于forward方法,为request添加属性(setAttribute)可以在多个Web应用插件间”共享属性”;

最终的response结果由所有的转发者按照顺序共同生成;

Eg:

第一个Servlet打印了部分html,中间include几个其他Web应用插件(htm文档、其他Servlet),最终response结果由以上4个Web应用插共同构成;

也就是说,二者的特性相反;forward方法的结果只由最后一个response响应(前面的对response的响应无效),而include方法的request相当于是”同时并行的”发送给其他的Web应用插件,彼此对request的修改被”忽略”(无效),最终的response是一个”求和”的关系;

Eg:结果如下,4个response的结果(按顺序)共同生成了一个页面

这个response.sendDir()操作与forward有点类似,也是让response结果由另一个Servlet来处理,特点如下:

(1)无论在response.sendDir()前后,源response都不会生效; (2)request不共享,无法传递属性; (3)范围上,不局限于当前Web应用的插件,可以是Internet上任意资源;

通过当前web应用的ServletContext去获得同一个Servlet容器下的其他Web应用的ServletContext,eg:

实现了当前Web应用的Servlet往同一个Servlet容器下的另一个Servlet跳转; 

因此,对于会被访问和修改的Servlet类的属性(如在xml里面<servlet定义的param),尽量放在service()方法内定义,因为局部变量作用域到当前方法结束,若定义在Servlet类的成员变量,则可能发生并发问题;

第 6 章

这一章主要讲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应用范围;

标签: p150光电传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台