7,servlet

1,servlet的概念?

servlet是什么?

动态网页。

servlet的本质?

运行在服务器端的java小程序。
可以接收和处理来自客户端请求,并且做出动态应答。

servletd的特点?

没有main方法,整个生命周期都是由服务器来管理。

2,xml:extendsible markup language.

一颗标签树.
dtd/schema

声明servlet:
<servlet>
<servlet-name>date</servlet-name>
<servlet-class>com.bjpowernode.servlet.DateServlet</servlet-class>
</servlet>
给servlet分配任务:
<servlet-mapping>
<servlet-name>date</servlet-name>
<url-pattern>/showDate</url-pattern>
</servlet-mapping>

3,servlet的生命周期

当请求第一次到来时,服务器会创建servlet对象(实例化),自动调用init()方法进行初始化,然后调用service()方法处理请求;
当请求再次到来时,不再进行实例化和初始化,而是直接调用service()方法处理请求。
当servlet被销毁时,服务器会调用destroy()方法做一些收尾工作。

4,http

HTTP:应用层协议,是客户端和服务器端请求和响应数据的标准。
请求协议:
      请求行:请求方式 URI 协议版本(HTTP 1.0)
       消息报头
       空白行
       请求体:
响应协议:
      状态行: 状态编码 协议版本
       响应报头
       空白行
       响应体:(HTML)

状态编码:200--响应成功
404--资源未找到
500--服务器内部程序错误

HTTP的特点:
HTTP协议是一个基于请求和响应的协议,而且是请求驱动的。
HTTP协议是一种无状态的协议。(

协议对于事务处理没有记忆能力【事物处理】【记忆能力】 
对同一个url请求没有上下文关系【上下文关系】 
每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况【无直接联系】【受直接影响】 
服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器【状态】)

HTTP规定,客户端向服务器发送请求的方式:GET和POST。
只有<form method="POST">一种请求是POST方式,其它所有情况都是GET方式。

地址栏直接访问
超级链接
<form>默认是GET
<form method="GET">

GET方式和POST方式有什么区别?
GET:把参数放在URL后边提交到服务器, 参数会显示在地址栏,数据安全性低,对参数的长度有限制;
效率高。
POST:把参数放在请求体中提交到服务器,参数不会显示在地址栏,数据安全性高,理论上对参数长度没有限制;
效率低。

5,

//获取客户端提交的参数
String value=request.getParameter("age");

6,

请求转发:把客户端发送的请求从一个servlet转给另一个servlet。
RequestDispatcher dispatcher=request.getRequestDispatcher("/资源名称");
dispatcher.forward(request,response);

请求转发的特点:
1>,forward可以把多个servlet连接在一起,但是只有最后一个servlet的输出内容会被送到浏览器。
2>,请求转发整个过程发生在服务器内部,无论是浏览器还是坐在浏览器前的用户都不知道。
浏览器只发出了一次请求,地址栏不会改变。

7,

数据传递:
request.setAttribute("name",Object);
Object request.getAttribute("name");

8,

cookie:服务器保存客户端浏览器上的一小段数据(string)。
cookie是随着响应一起到达客户端浏览器的。
根据HTTP协议的规定,客户端浏览器每次向服务器发送请求,都会把它所存储的 本应用的 所有的 cookie 发送到服务器,
不管服务器需不需要。

cookie编程:
1,javax.servlet.http.Cookie
|->name:cookie的名字。
|->value:cookie的值.
|->maxAge:cookie在浏览器上的最大生命周期。(单位:s)
60*60*24*7
-1:cookie的最大生命周期是和浏览器绑定的。默认值。
0 :删除cookie。
Cookie c=new Cookie("name","value");
c.setMaxAge(111);
2,如何向客户端浏览器写cookie:
response.addCookie(c);
3,如何获取来自客户端的cookie:
Cookie[] cs=request.getCookies();
for(Cookie c:cs){
if("test".equals(c.getName())){
//c
}
}

cookie的局限性:

1,暴露用户的隐私
2,用户可以删除cookie,清空cookie,禁用 cookie,甚至篡改cookie。

实现:只有登录过的用户才能查看网页
LoginServlet
QueryEmpServlet

http://127.0.0.1:8080/empmgr/login.html

8,

session:服务器为每一个用户都开辟一小块 私人 存储空间。

javax.servlet.http.HttpSession

session编程:
1>,如何获取HttpSession对象:
HttpSession session=request.getSession(true);

2>,如何对session对象存取数据:
session.setAttribute("name",Object);
Object session.getAttribute("name");

session的特点:跟用户(浏览器)绑定的。

session的实现原理:session是通过cookie实现的.

保存sessionId的cookie叫会话cookie:
系统cookie,名称是固定的 JSESSIONID,值就是sessionId,最大生命周期是-1。
系统cookie不能手动修改。

1,一般情况下,浏览器不会禁用cookie。
2,session还有另一种实现机制:
 

比较request和session:
生命周期:
request:
-创建:用户的请求到达服务器的时候创建。
-销毁:本次请求的应答返回到浏览器的时候销毁。
短。
session:
-创建:(懒汉式)用户的请求第一次调用getSession(true)的时候创建。
-销毁:超时策略。
两级超时:
内存---->磁盘
从磁盘上销毁.
长。
共享范围:
request:由forward连接起来的多个servlet之间可以共享。
A--(f)-->B--(f)-->C--(f)-->D
session:同一个浏览器发出的多次请求之间 可以共享。
适合存储什么样的数据:
request:不会频繁重复使用的数据。(错误提示信息)
体积较大的数据,虽然会重复使用,也要存放到request里。(用户列表)
session:用户私人的数据(登录标记,权限信息,用户的基本信息....)
会频繁重复使用的数据.
*体积较大的数据 要慎重!

9,

ServletContext:代表整个web.xml的配置信息。
全局初始化参数:
<context-param>
<param-name>pName</param-name>
<param-value>1234567890</param-value>
</context-param>
ServletConfig config=getServletConfig();
ServletContext context = config.getServletContext();
String pName=context.getInitParameter("pName");

*ServletContext的特点:全局唯一,所有用户共享。

ServletContext:可以作为存储命名属性作用域。

context对象也具有request和session的能力,也可以存取数据库,传输数据。
context.setAttribute("name",Object);
Object context.getAttribute("name");

数据源中的数据改变了,数据源中的数据和缓存中的数据不一致?
a,缓存到context中的数据都是稳定的数据。
b,同步缓存:
重启服务器;
使用程序同步缓存。

三个作用域对象:
request:
session:
context:
生命周期:
-创建:服务器启动的时候创建。
-销毁:服务器关闭,服务器重启或者应用重新加载的时候销毁。
最长。
共享范围:
全局唯一,所有用户共享。
适合存储:
被所有用户频繁重复使用的数据,
不会频繁修改的数据。
* 体积较大的数据 要慎重!

10,

重定向:

请求转发:跳转过程在服务器内部完成,
浏览器只发出一次请求,
浏览器地址栏不改变,
无论是浏览器还是坐在浏览器前的用户,都不知道跳转的过程,
在两个servlet之间可以使用request,session和context传递数据,
只能在本应用内跳转。
重定向:跳转过程在浏览器和服务器之间完成,
浏览器发出了两次请求,
浏览器地址栏会改变,
浏览器知道跳转的过程,但是坐在浏览器前的用户是不知道的,
在两个servlet之间不能使用request传递数据,但是可以使用session和context传递数据,
可以跨应用跳转。

response.sendRedirect("url");//浏览器根据指定的URL重新申请一个网址,发出请求。

如何选取请求转发和重定向?
如果两个servlet是完成同一个任务的,使用请求转发;
如果两个servlet是完成不同任务的,使用重定向。

猜你喜欢

转载自www.cnblogs.com/ngy-712533/p/9880496.html