javaServlet一

来源:互联网 发布:免费qq群发软件 编辑:程序博客网 时间:2024/06/04 12:53
HTTP:
超文本传输协议,规定了浏览器与服务器之间的通讯规则,http是基于请求/响应模式的,所以分为请求协议和响应协议。
抓包看下请求头和响应头数据


Host:请求的服务器主机名
* User-Agent:客户端浏览器与操作系统相关信息
* Accept-Encoding:客户端支持的数据压缩格式
* Connection:客户端支持的连接方式
* Cookie:客户端发送给服务器的“小甜点”,它服务器寄存在客户端的。如果当前访问的服务器没有在客户端寄存东西,那么就不会存在它!
* Content-Length:请求体的长度
* Referer:当前发出请求的地址,例如在浏览器地址栏直接访问服务器,那么没有这个请求头。如果是在www.baidu.com页面上点击链接访问的服务器,那么这个头的值就是www.baidu.com
> 作用1:统计来源
> 作用2:防盗链
* Content-Type:如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码。



Content-Type:响应正文的MIME类型,例如image/jpeg表示响应正文为jpg图片,例如text/html;charset=utf-8表示响应正文为html,并且编码为utf-8编码。浏览器会通过这一信息来显示响应数据
* Content-Length:响应正文的长度
* Set-Cookie:服务器寄存在客户端的“小甜点”,当客户端再次访问服务器时会把这个“小甜点”还给服务器
* Date:响应时间,可能会有8小时的误差,因为中国的时区问题

  通知客户端浏览器不要缓存页面的响应头:
* Expires:-1
* Cache-Control: no-cache
* Pragma: no-cache

二、什么是Servlet
一个java类,实现了Servlet接口,用来接收客户端发过来的请求,返回请求,处理动态资源。

生命周期:
当Servlet第一次被请求时,或者服务器启动时,服务器会创建一Servlet实例对象,调用init()方法,然后创建一个用于封装HTTP请求消息的HttpServlteRequst对象和代表响应HttpServletResponse的对象,然后调用service()方法,web应用被停止时或者重新启动时,想调用Servlet的destory()方法。
ServletConfig:
上述Servlet调用init()方法时,传的参数,就是ServletConfing,顾名思义,这个对象就是配置信息对象。可以获取到servlet在web.xml中配置的信息。
通过this.getServletConfig()可以获取到servletConfing对象 然后可以获取其他的参数。

Servlet三大域对象 分别为request、session、Appliction(ServletContext)
ServletContext
在Web应用启动的时候,都会创建一个SerletContex上下文对象,在Web服务停止时销毁,作用于整个Web应用,可以用于各个Servlet之间的信息交互;
可以通过ServletCofnig对象来获取ServletContext对象。

Session对象
服务器会为每一个会话创建一个Session对象,所以session对象只能给当前提供会话的所有servlet共享数据。
当用户打开浏览器,即会话开始,关闭是,即是会话结束。
可以通过request.getSession()来获取该对象;

Request
表示一个请求,只在当前请求中有效,可以用于传递参数,request.setAttribute();


关于servlet线程安全问题:
package com;

public class Test implements Runnable
{
private static int i;//静态变量
public void run()
{
i = 4;
System.out.println(Thread.currentThread().getName() +":"
+ i);
i = 10;
System.out.println( Thread.currentThread().getName() +":"
+ i * 2);
}
public static void main(String[] args)
{
Test t = new Test();
for (int i = 0; i < 3000; i++)
{
new Thread(t, "线程" + i).start();
}
}
}
下面每一个线程都可以看做是一个请求,在操作局部变量时不会出现问题,但是操作静态变量,或公共变量时会出现线程的安全问题。
synchronized(this){
业务代码
}
加锁可以避免安全问题;

SUN公司也提供了一个接口,SingThreadModel接口,实现该接口可以避免安全问题,但是不是真正意义上的避免,所以在servlet2.4的时候,该接口被标记为过时。
0 0