您的位置:首页 > 理论基础 > 计算机网络

javaweb之HTTP协议以及servlet

2013-02-26 19:32 323 查看
一、HTTP协议:组成部分及每部分的详细分解

1、HTTP的作用:规范客户端与服务端交互数据的格式的。

2、版本

HTTP1.0:无状态协议。

HTTP1.1:有状态协议。在一次连接基础上可以与服务器多次交互。

3、在访问某个html页面时,如果某些标签有src这样的属性,浏览器都会再次发出请求(自动)

<img src=""/>

<script src=""/>

<link href=""/>

html文件中只能包含文本。

***

4、HTTP协议的组成:

a、请求部分:
a、1请求行:位于第一行
请求方式 请求的资源(URI) 使用的协议
常用的请求方式:
(默认的)GET:表单中的数据会出现在地址栏中,不会出现在请求正文中。
(/App1/b.html?username=admin&password=111111)不安全。有长度限制<1KB
POST:表单中的数据会出现在请求正文中。长度无限。
a、2请求头:从第二行开始至第一个空行结束
a、3请求正文:从第一个空行开始到最后

GET /App1/1.html HTTP/1.1        请求行
Accept: */*
    请求头
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Host: localhost:8080
Connection: Keep-Alive
Header1:h1
Header1:h2
//请求正文

常用请求头含义:
*Accept:浏览器可接受的MIME(协议)类型(MIME Type:Tomcat\conf\web.xml有文件类型与MIME类型的对应关系)
MIME类型:大类型/具体类型               1.html  --->text/html    1.jpg ----->image/jpeg
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
*Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip 
Accept-Language:浏览器所希望的语言种类,
Host:初始URL中的主机和端口 
*Referer:值是一个URL。表示当前页面是由哪个页面转过来的。(防盗链;广告效果)
*Content-Type:内容类型(请求正文的MIME类型)Content-Type: application/x-www-form-urlencoded
对应表单的enctype="application/x-www-form-urlencoded"属性。
If-Modified-Since:是一个时间。利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件。
User-Agent:浏览器类型.
Content-Length:表示请求消息正文的长度 
*****Cookie:这是最重要的请求头信息之一

b、响应部分:
b、1响应行:位于第一行
使用的协议 响应码 响应码描述
响应码:(目前也就用到了30个左右)
200:正常响应
302/307:资源位置移动了
304:未修改
404:资源不存在
500:服务器内部错误

b、2响应头:从第二行开始至第一个空行结束
b、3响应正文:从第一个空行开始到最后
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"43-1353374734312"
Last-Modified: Tue, 20 Nov 2012 01:25:34 GMT
Content-Type: text/html
Content-Length: 43
Date: Tue, 20 Nov 2012 01:32:57 GMT
Warnning:w1
Warnning:w2

welcome to itheima<br/>
<img src="6.jpg"/>

常用响应头:
*Location: http://www.it315.org/index.jsp指示新的资源的位置。结合302/307来使用,实现的请求重定向。 Server:apache tomcat指示服务器的类型
*Content-Encoding: gzip服务器发送的数据采用的编码类型
Content-Length: 80 告诉浏览器正文的长度
Content-Language: zh-cn服务发送的文本的语言
**Content-Type: text/html; charset=GB2312服务器发送的内容的MIME类型
*Refresh:定时刷新。取值是时间,单位为秒。
在指定的时间后,刷新到别处。Refresh:2;URL=/day04/1.html

*Content-Disposition: attachment; filename=aaa.zip指示客户端下载文件
*****Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie
*以下3个头通知客户端不要缓存:
Expires: -1
Cache-Control: no-cache (1.1)  
Pragma: no-cache   (1.0)

2、Servlet概述

3、编写Servlet的开发步骤

a、建立标准的JavaWeb应用目录

FirstApp
WEB-INF
classes
lib
web.xml

b、编写一个类,实现javax.servlet.Servlet接口

package com.itheima;

import javax.servlet.*;

import java.io.*;

public class HelloServlet implements Servlet{
public void destroy(){}
public String getServletInfo(){
return null;
}
public void service(ServletRequest req,

                    ServletResponse res)

             throws ServletException,

                    IOException{
String data = "hello servlet";
res.getOutputStream().write(data.getBytes());
}
public ServletConfig getServletConfig(){return null;}
public void init(ServletConfig config)

          throws ServletException
{}

}

c、进入HelloServlet的目录,执行javac -d . HelloServlet.java进行编译(要把servlet-api.jar加入到classpath中)

d、Servlet映射到某个地址上:修改web.xml
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.itheima.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>

        <servlet-name>HelloServlet</servlet-name>

        <url-pattern>/HelloServlet</url-pattern>

    </servlet-mapping>

e、部署到Tomcat中

f、访问地址:http://localhost:8080/FirstApp/HelloServlet

4、编写Servlet也可以继承javax.servlet.GenricServlet

如果是与HTTP协议有关,也可以继承javax.servlet.http.HttpServlet,至少要覆盖doXXX方法。不能覆盖service方法,他有标准实现。

Tip:

servlet-api.jar:

含两个包:

javax.servlet.*:通用的类放在此处,与具体协议无关

javax.servlet.http.*:专门服务于HTTP协议。

Tip:

修改MyEclipse生成的Servlet模板:

MyEclipse8.5:在安装目录中搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)的文件,打开,

找到Servlet.java文件,修改即可(注意:修改前先备份,推出MyEclipse)

4、Servlet的生命周期

4.1默认情况下,Servlet类在第一次访问时才会被容器实例化,并接着调用init方法进行初始化。

针对用户的每次访问,只初始化一次,但service方法会调用多次。

4.2希望在容器加载应用时就初始化Servlet?

解决办法:

<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.itheima.HelloServlet</servlet-class>
<load-on-startup>2</load-on-startup>   //取值自然整数,标识了Servlet的加载顺序

</servlet>

<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>

</servlet-mapping>

Tip:Servlet的映射细节

a、同一个Servlet可以被映射到多个URL地址上

b、Servlet的映射支持通配符*

通配符写法有2种:

以*开头,以扩展名结尾,比如*.do

以/开头,以*结尾,比如/action/*

知识点:使用通配符时,如果找到多个匹配,到底执行的是哪个Servlet原则:绝对匹配--->从前往后匹配---->/开头的匹配优先级高

如果某个Servlet的映射路径为一个"/",那么称之为默认Servlet。负责处理没有的配置。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。 

5、线程安全问题

实现javax.servlet.SingleThreadModel的Servlet有2中解决线程安全问题的办法:(不同的服务器不同)

a、对资源进行同步处理(不可行)

b、搞了多个Servlet的对象为您服务(不可行):Tomcat的实现了此种方式。

避免资源冲突的原则:尽量使用局部变量;实在局部不了的,一定要做同步处理。同步代码块尽量包围少的代码。

在Servlet尽量使用局部变量。

6、如何得到Servlet中的配置参数:ServletConfig

作用:代表针对Servlet的参数配置。

 <init-param>

    <param-name>encoding</param-name>

    <param-value>GBK</param-value>

    </init-param>

7、ServletContext

7.1ServletContext:当容器加载JavaWeb应用时,会为每一个JavaWeb应用创建对应的ServletContext对象(每个应用只有一个)。

JavaWeb应用的总管。

获取ServletContext对象的引用:ServletConfig.getServletContext()

ServletContext还是一个域对象:域对象实际上其内部维护了一个Map<String,Object>

它的生命周期是整个web应用的生命周期。

a、实现Servlet间的数据共享
b、请求转发
c、读取资源文件的三种方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: