一、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、读取资源文件的三种方式