web2

来源:互联网 发布:2017上半年进出口数据 编辑:程序博客网 时间:2024/06/05 03:28


servlet请求路径的问题:
在form的action属性中,直接写servlet的url路径,默认是在当前目录下查找。一旦网页在子目录中,那么会在提交路径中加上
 子目录的名称,可以通过../回到上一级目录。
如果目录比较深,频繁用../很繁琐,而且移植性不好,可以在url路径中,以/开始,表示回到webapps根目录,再加上部署名,
 再书写servlet请求路径  eg: <form action="/testWeb/test">


servlet的url路径书写的方式:
1、精确映射  /abc   表示只能以/abc路径查找servlet

2、扩展映射  *.action  表示凡是以.action结尾的请求,都能访问servlet

3、路径映射  /abc/*   表示凡是在/abc/路径下的请求,都能访问servlet


servlet生命周期
1、启动tomcat,读取conf/server.xml文件,以确定启动端口和web应用程序的部署目录
2、读取部署目录中所有的web应用程序中的web.xml,并解析。所以一旦有一个web应用程序中的web.xml书写错,那么解析失败,
 从而抛出解析异常。正确解析web.xml,可以确定部署的web组件信息。
3、加载并实例化servlet。加上<load-on-startup>标签,如果该标签的值为0或正数,表示web容器一启动就实例化。如果该标签不写
 或为负数,表示第一次访问再实例化。
4、调用init()方法完成初始化。
5、当请求到达后,调用service()完成业务。
6、销毁阶段。调用destory()完成清理。

在整个生命周期中,1/2/3/4/6都只执行一次。只有5才是每次请求都会执行。而且servlet对象只有一个,是单实例多线程的类。 


在注册servlet时,可以加入
<init-param>
 <param-name>aaa</param-name>
 <param-value>111</param-value>
</init-param>
进行servlet初始化信息的描述,可以通过servletConfig配置对象中的getInitParameter()根据参数名称,得到参数值。
但该初始化参数只能在当前servlet中使用,不能在别的servlet使用。



状态行分为http协议、状态码和状态描述三个部分

http状态码:
100-199:表示信息性代码,标示客户端应该采取的其他动作,请求正在进行。
200-299:表示客户请求成功
300-399:表示用于已经移走的资源文件,指示新的地址
400-499:表示由客户端引发的错误
500-599:表示由服务器端引发的错误

设置状态码
注意,在使用PrintWriter向客户端输出信息之前,设置状态码


通过响应对象httpServletResponse的serHeader()可以设置响应头,但是响应头必须要被浏览器识别才有意义。
 所以通常会把响应头的设置封装成响应对象的方法,比如:setContentType(),addCookie()....

由于只有http协议才会有响应头,所以serHeader()只存在于httpServletResponse中。


httpServletResponse响应对象有两个方法可以向客户端输出数据。
getWriter(),得到打印字符流,可以向客户端输出文本数据
getOutPutStream(),得到输出字节流,可以向客户端输出二进制数据


重定向工作流程:
客户端访问服务器,服务器调用response.sendRedirect(),产生响应时,会产生302状态码,同时产生location响应头。
 客户端浏览器在接收到响应信息之后。发现是302状态码,那么就会读取location响应头的内容,
 然后将该内容更新浏览器地址栏,再向服务器发出第二次请求。


get方式:
用户在网页上点击一个超链接
用户提交在网页上填好的表单
用户在浏览器地址栏中输入url地址并回车
默认情况下都是使用http协议的get方式提交请求

post方式:<form method='post'>


get/post方式的区别:
1.流格式的区别
 get方式表单数据附加在url后面,而post方式表单数据在消息体中,所以get方式没有消息体。

2、用途的区别
 get方式主要用于资源的查找,而post方式主要用于数据的传输。

3、传输性能的区别
 get方式只能传输文本数据,而post方式可以传输文本和二进制数据
 get方式不能传输大数据。而post方式可以传输大数据。
 get方式的表单数据附加在url后面,所以表单数据会在浏览器地址栏中显示出来,而post方式的表单数据在消息体中
  所以浏览器地址栏不会显示,相对get方式数据安全一些。

4、get方式的数据会在浏览器中缓存,而post方式不会缓存


超链接的href、表单的action、重定向如果以/开始,必须加上部署名   /webTest/all

获得真实路径getRealPath、内部转发,如果以/开始,应该写相对于web应用程序的路径,不加部署名


请求转发:在服务器内部做资源调配,客户端只发出一次请求。


request请求对象中,也提供了setAttribute和getAttribute方法,不过,在请求对象中封装的对象,作用范围只在一次请求范围内。


在servlet中转发页面有两种方式:重定向和内部转发
他们的区别在于:
 1、重定向由response发出,而内部转发由RequestDispatcher发出
 2、重定向,客户端发出两次请求,而内部转发,客户端只发出一次请求。所以,内部转发可以共享request请求对象中
  封装的数据,而重定向不行。
 3、内部转发只能转发服务器内部的资源,但是重定向可以在第二次请求时,转向别的服务器。


状态跟踪:http协议是一种无状态的协议,当请求和响应完成后,会断开连接,以释放服务器的内存资源。所以服务器无法保存客户端
 的状态,服务器会认为每次请求的客户端都是新用户。但是,很多时候,我们需要得到客户端的状态,完成一系列的商务活动,
 这时就需要状态跟踪。

状态跟踪有四种解决方案:
 1、隐藏表单
 2、cookie
 3、session
 4、URL重写


cookie工作流程:
客户端访问服务器,服务器调用response.addCookie()方法,产生响应时,会产生set-cookie响应头,将cookie文本发送给客户端。
客户端会将cookie的文本保存起来。当客户端再次请求服务器时,会产生cookie请求头,将之前服务器发送的cookie信息,再发送给
服务器。服务器就可以根据cookie信息跟踪客户端的状态。


cookie的分类:
1、存放在客户端浏览器的缓存中。浏览器不关闭,cookie信息一直存在,浏览器一关闭,cookie消失。
2、存放在客户端的文件中,并可以设置cookie的过期时间。过期时间之内,即使浏览器关闭,也可以将cookie信息发送给服务器。
 超过过期时间,cookie消失。


cookie信息是以文本方式存放在客户端的,所以容易引起一些安全隐患,所以不要把隐秘信息以cookie方式保存。


session的工作流程:
客户端访问服务器,服务器产生调用request.getSession()产生session对象,用于跟踪用户的状态。同时,给session对象分配
 一个唯一标识sessionId。为了管理session对象,以sessionId为键,以session对象为值,封装成map集合。
 产生响应时,将sessionId以cookie方式发送给客户端,存放在客户端浏览器的缓存中。当客户端再次请求服务器,会将
 sessionId以cookie请求头的方式发送给服务器。服务器得到sessionId后,从map集合中,得到session对象,从而跟踪状态。
一个客户端只有一个session对象。


session是服务器端用于保存客户端相关状态的对象。由于http协议是一种无状态的协议,所以,客户端是否关闭浏览器,服务器
并不知道。这就是意味着,客户端即使关闭浏览器下线,服务器也会一直保存session对象。这样会极大的耗费服务器的内存资源。
所以服务器应该及时的清理过时的session,以释放服务器的内存资源。

session的销毁有三种方式:
1、设置超时时间
2、调用session对象的invalidate(),强行销毁
3、应用服务器崩溃


cookie和session的区别:
1、cookie信息是存放在客户端的,session信息是以对象方式存放在服务器的。
2、cookie信息存放的是文本数据,而session对象可以绑定对象共享。
3、客户端和服务器之间传递cookie,传递的是具体的数据。而使用session时,传递的只是sessionId,所以使用session安全性比较好。


URL重写:
当客户端禁用了cookie之后,这时,服务器发送给客户端的sessionId,客户端就不能通过cookie方式进行保存了。这样,客户端
请求时,也不能将sessionId,以cookie请求头方式,提交给服务器。服务器得不到sessionId,也就无法取出session对象,从而
不能跟踪状态。

解决方案是:当客户端禁用了cookie之后,在URL后面,强行附加sessionId。
<a href="/lovobook/WriteURL;jsessionid=JIAFIWFI9389SFJ939">Click</a>
这样,客户端无论是否禁用cookie,服务器都可以得到sessionId,从而跟踪状态。






















0 0
原创粉丝点击