servlet服务程序
2016-07-10 16:59
218 查看
servlet请求路径的问题
在form的action属性中,直接写servlet的url路径,默认是在当前目录下查找,一旦网页在子目录中,那么会在提交路径中加上子目录的名称,可以通过../回到上一级目录。如果目录比较深,频繁用../很繁琐,而且一移植性不好,可以在url路径中,以/开始,表示回到webapps根目录,再加上部署名,在书写servlet请求路径 form action = "/testWeb/test"
servlet的url路径书写方式
精确映射 /abc 表示只能以/abc路径查找servlet扩展映射 *.action 表示凡是以.action结尾的请求,都能访问servlet
路径映射 /abc/* 表示方式在/abc/路径下的请求,都能访问servlet
servlet生命周期
启动tomcat,读取conf/server.xml文件,以确定启动端口和web应用程序的部署目录读取部署目录中所有的web应用程序中的web.xml,并解析,所以一旦有一个web应用程序中的web.xml书写错误,那么解析失败,从而抛出解析异常。正确解析web.xml,可以确定部署的web组件信息。
加载并实例化servlet。加上<load-on-startup>标签,如果该标签的值为0或正数,表示web容器一启动就实例化,如果该标签不写或为负数,表示第一次访问再实例化。
调用init()方法完成初始化。
当请求到达后,调用service()方法完成业务。
销毁阶段,调用destory()方法完成清理工作。
在整个生命周期中,1,2,3,4,6都只执行一次,只有个5才是每次请求都会执行,而且servlet对象只有一个,是单实例多线程的类。
在注册servlet时,可以加入
<init-param><param-name>aa</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 的setHeader()可以设置响应头,但是响应头必须要被浏览器识别才有意义。所有通常会把响应头的设置封装成相应对象的方法,比如:setContentType(),andCookie()
由于只有http协议才会有响应头,所以setHeader()只存在于HttpServletResponse中
HttpServletResponse响应对象有两个方法可以向客户端输出数据。getWriter(),得到打印字符流,可以向客户端输出文本数据,getOutputStream()得到输出字节流,可以向客户端输出二进制数据。
重定向工作流程:客户端访问服务器,服务器调用response.sendRedirect(),产生响应时,会产生302状态码,同时产生location响应头,客户端浏览器在接受到响应信息之后,发现是302状态码,那么就会读取location想应头的内容,然后将该内容更新浏览器地址栏,在向服务器发送第二次请求。
cannot call sendRedirect() after the response has been ……不能重复请求response方法
GET/POST提交方法
浏览器向web服务器发送http请求用户在网页上点击一个超链接
用户提交在网页上填写好的表单
用户在浏览器地址栏中输入url地址并回车
默认情况下都是使用http协议的get方法提交请求
定制浏览器行为
<form name = 'loginform' method='post' action='/loginServlet'>
GET/POST方式的区别
流格式的区别。get方式表单数据附加在url后面,而post方式表单数据在消息体中,所以get方式没有消息体。
用途的区别
get方式主要用于数据的查找,而post方式主要用于数据的传输。
传输性能的区别
get方式只能传输文本数据,而post方式可以传输文本和二进制数据。
get方式不能传输大数据。而post方式可以传输大数据。
get方式的表单数据附加url后面,所以表单数据会在浏览器地址栏中显示出来,而post方式的的表单数据在消息体中,所以浏览器地址栏不会显示,相对get方式数据安全一些。
get方式的数据会在浏览器缓存,而post方式不会缓存。
超链接,表单的action,重定向
如果以 / 开始,必须加上部署名 /webTest/all真实路径getRealPath,内部转发
如果以 / 开始,应该书写相对于web应用程序的路径,不加部署名getParameterValues返回字符串数组,得到一个表单名对应的所有值
在Servlet中转发页面有两种方式:重定向和内部转发
它们的区别在于:重定向由response发出,而内部转发由requestdispatcher发出。
重定向,客户端发出两次请求,而内部转发,客户端只发出异常请求,所以,内部转发可以共享request请求对象中的封装数据,而重定向不行
内部转发只能转发服务器内部的资源,但重定向可以在第二次请求时,转向别的服务器。
状态跟踪:http协议是一种无状态的协议,当请求和响应完成后,会断开连接,以释放服务器的内存资源。所有服务器无法保存客户端的状态,服务器会认为每次请求的客户端都是新用户,但是很多时候,我们需要得到客户端的状态,完成一系列的商务活动,这时候需要状态跟踪
状态跟踪有四种解决方案
隐藏表单cookie
session
URL重写
cookie工作流程
客户端风味服务器,服务器调用response.addcookie()方法,产生响应时,会产生set-cookie响应头,将cookie文本发送给客户端,客户端会将文本保存起来,当客户端再次请求服务器时,会产生cookie请求头,将之前服务器发送的cookie信息,在发送给服务器,服务器就可以根据cookie信息跟踪客户端的状态cookie的分类
存放在客户端浏览器的缓存中,浏览器不关闭,cookie信息一起存在,浏览器一关闭,cookie消失存放在客户端的文件中,并可以设置cooki的过期时间,过期时间之内,即使浏览器关闭,也可以将cookie信息发送给服务器,超过过期时间,cookie消失
cookie信息是以文本方式存放在客户端的,所以容易引起一些安全隐患,所以不要把隐秘信息以cookie方式保存
session工作流程
客户端访问服务器,服务器调用request.getsession()产生session对象,用于跟踪用户的状态,同时,给session对象分配一个唯一标识sessionId。为了管理session对象,以sessionId为键,以session对象为值,封装成Map集合。产生响应时,将sessionId以cookie方式发送给客户端,存放在客户端浏览器的缓存中。当客户端再次请求服务器,会将sessionId以cookie请求头的方式发送给服务器。服务器得到sessionId后,从Map集合中,得到session对象,从而跟踪状态
对象作用域:
Servletcontext(上下文):整个web应用程序
httpsession(会话):一个会话交互过程
servletrequest(请求):一次请求过程
session是服务器用于保存客户端相关状态的对象。由于http协议是无状态的协议,所以,客户端是否关闭浏览器,服务器并不知道,这就是意味着,客户端即使关闭浏览器下线,服务器也会一直保存session对象。所以服务器应该即使清理过时的session,以释放服务器的内存资源
session销毁有三种方式
设置超时时间调用session对象的invalidate(),强行销毁
应用服务器崩溃
cookie和session区别
cookie信息是存放在客户端的,session信息学是以对象方式存放在服务器的cookie信息存放的事文本数据,而session对象可以绑定对象共享
客户端和服务器之间传递cookie,传递的事具体的数据,而使用session时传递的只是sessionId,所有使用session安全性比较好。
url重写
当客户端禁用了cookie之后,这时,服务器发送给客户端的sessionId,客户端就不能通过cookie方式进行保存了,这样客户端请求时,也不能将sessionId,以cookie请求头方式,提交给服务器,服务器得不到sessionId。也就无法取出session对象,从而不能跟踪状态解决方法:当客户端禁用了cookie之后,在url后面,清醒附加sessionId<a href="/book?WriteURL;jsessionid=F7A5D5B85C8036D46371D7D3B1E9D2D6" Click这样,客户端无论是否禁用cookie,服务器都可以得到sessionId,从而跟踪状态
相关文章推荐
- leetcode.368. Largest Divisible Subset
- 开源项目管理当中最为常见的十类糟糕实践
- 【PHP面向对象(OOP)编程入门教程】12.重载新的方法(parent::)
- 【PHP面向对象(OOP)编程入门教程】11.类的继承
- C语言标准库函数qsort排序的介绍与使用
- Session和cookie的区别(进行对比)
- 希尔排序
- 整数中1出现的次数(从1到n整数中1出现的次数)
- 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用
- 探究绑定事件的this指向以及event传参的小问题
- jQuery.ajax()
- leetcode 373 Find K Pairs with Smallest Sums java
- SQL Server中将日期转换成字符串
- WebView的简单使用
- 回弹效果HorizontalScrollview
- 递归
- μCOS/II v2.85内核OSSemPend()和OSSemPost()函数工作原理
- Ncs
- 排序复杂度分析
- html初学1