HTTP和servlet初学

 1 HTTP协议特点

  1)客户端->服务端(请求request)有三部份

a)请求行

b)请求头

c)请求的内容,如果没有,就是空白字符  

  2)服务端->客户端(响应response)有三部份

a)响应行

b)响应头

c)响应的内容,如果没有,就是空白字符  

 

*2 HTTP请求头和响应头含义

  1)请求(客户端->服务端[request])

    GET(请求的方式) /books/java.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)

    Accept: */*(客户端能接收的资源类型)

    Accept-Language: en-us(客户端接收的语言类型)

    Connection: Keep-Alive(维护客户端和服务端的连接关系)

    Host: localhost:8080(连接的目标主机和端口号)

    Referer: http://localhost/links.asp(从来于哪里)

    User-Agent: Mozilla/4.0(客户端版本号的名字)

    Accept-Encoding: gzip, deflate(客户端能接收的压缩数据的类型)

    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(缓存时间)

    Cookie(客户端暂存服务端的信息)

    Date: Tue, 11 Jul 2000 18:23:51 GMT(客户端请求服务端的时间)

  2)响应(服务端->客户端[response])

    HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)

    302重定向,客户端请求服务端,但服务端没有对应的资源,服务端要客户端再次请求找其它的服务端,即客户端二次请求,重定向)

    307转发,客户端请求服务端,但服务端没有对应的资源,服务端自行再次请求找其它的服务端,即客户端一次请求,转发)

    304客户端请求服务端,此时客户端缓存中有,无需再从服务端下载新的内容,服务端叫客户端自行找缓存,优化

500(客户端请求的资源,服务端存在,但在执行时出错

404请求资源不存在

    Location: http://www.baidu.com(服务端需要客户端访问的页面路径)

    Server:apache tomcat(服务端的Web服务端名)

    Content-Encoding: gzip(服务端能够发送压缩编码类型)

    Content-Length: 80(服务端发送的压缩数据的长度)

    Content-Language: zh-cn(服务端发送的语言类型)

    Content-Type: text/html; charset=GB2312(服务端发送的类型及采用的编码方式)

    Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务端对该资源最后修改的时间)

    Refresh: 1;url=http://www.it315.org(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)

    Content-Disposition: attachment; filename=aaa.zip(服务端要求客户端以下载文件的方式打开该文件)

    Transfer-Encoding: chunked(分块传递数据到客户端)  

    Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务端发送到客户端的暂存数据)

    Expires: -1//3(服务端禁止客户端缓存页面数据)

    Cache-Control: no-cache(服务端禁止客户端缓存页面数据)  

    Pragma: no-cache(服务端禁止客户端缓存页面数据)   

    Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系)  

    Date: Tue, 11 Jul 2000 18:23:51 GMT(服务端响应客户端的时间)

  

  3)总结

    想让浏览器有何种行为,服务端只能通过响应头的方式来设置

    想让服务器知道何种行为,浏览器只能通过请求头的方式来设置

  

 

  2)常用的提交方式

    a)GET

特点:请求参数无论多少,都会根着URL后传递到服务端,以明文方式传递

      GET方式传递有大小限制

      GET方式传递信息不安全

 

    b)POST

特点:

      请求参数无论多少,都不会根着URL后传递到服务端,而是以参数形式在请求体中传递到服务端

      POST方式传递无大小限制

      POST方式传递信息相对安全

 

              

*3 Servlet入门

  1ServletSUN公司基于Java技术的一个开发动态资源支持的规范,以接口的形式出现,最终的实现类与服务器有关

  2Servlet是一种特殊的Java类,运行时服务端/容器中,接收每一个客户端的请求并响应,尊循HTTP协议

  3Servlet手工开发过程,参见<<手工创建Servlet的全过程.txt>>

一般使用IDE工具进行开发,此作为了解

1 tomcat/webapps/目录下创建web应用mail

  目录结构如下

  tomcat/webapps

  |

  mail

  |                  |

  WEB-INF            index.html(静态资源)

  |        |

  web.xml  classes

   |

   cn.itcast.java.web.servlet.MyServlet.class

 

2 tomcat/webapps/mail/目录下写一个类MyServlet实现Servlet接口。

 

3 进入cmd命令台,加入servlet-api.jar[tomcat中有]支持

  set classpath=%classpath%;D:\apache-tomcat-6.0.29\lib\servlet-api.jar

 

4 进入MyServlet.java所在的目录,编译MyServlet

  javac -d . MyServlet.java

 

5 部置mail应用到tomcat/webapps/目录下,并启动Tomcat

 

6.一定要在web.xml文件中配置MyServletWeb动态资源

  <servlet>

<servlet-name/>

<servlet-class/>

  </servlet>

  <servlet-mapping>

<servlet-name/>

<url-pattern/>

  </servlet-mapping>

 

7 通过浏览器访问MyServlet这个动态Web资源

  IE:http://localhost:8080/mail/my

   

 

 

*4 开发Servlet,三种方法

  1) 实现 Servlet接口 + web.xml中配置

<servlet>

     <servlet-name>Demo11[servlet名字,可以任意]</servlet-name>

     <servlet-class>cn.itcast.web.servlet.Demo11[servlet全路径]</servlet-class>

  </servlet>

        <servlet-mapping>

    <servlet-name>Demo11[servlet名字,必须和上述一致]</servlet-name>

    <url-pattern>/qq[/开头,提供外界用户访问的路径]</url-pattern>

        </servlet-mapping>

  2) 类 扩展 GenericServlet + web.xml中配置

     如果需要输出中文,需要在Servlet中如下设置:

//服务端通知浏览器以指定的编码方式来显示中文

response.setContentType("text/html;charset=UTF-8");

response.getWriter().write("欢迎学习JavaServlet程序");

 

  3) 类 扩展 HttpServlet + web.xml中配置

     HttpServlet已经覆写service()方法,程序员无需再次覆写,只需覆写doXxxx()方法

一般使用3)中方法,重写doGet()方法或者重写doPost()方法

5 Servlet工作原理和生命周期

 HTTP和servlet初学

1)当浏览器第一次访问Servlet时,服务器会根据浏览器访问的路径,例如/Demo2,在web.xml文件中找到该Servlet的全路径,进行反射,创建对象。

  2)调用init()Servlet作初始化工作

  3)调用doXxxxx()为浏览器响应

  4)如果浏览器再次访问相同的Servlet,直实现从服务端维护的Servlet实例集合中取得对应的实现,为浏览器响应

  5)同一个Servlet实例,在服务端只有一个

  6)服务器在决定销毁Servlet实例之前,调用destory()方法,每个Servlet实例只会调用一次。在重新部署情况下 ,会销毁该实例。

 

 HTTP和servlet初学


Servlet调用图

http://localhost:8080/day05/FirstServlet---|IE浏览器

1、根据DNS(域名解析)服务器那里查询ip,连上web服务器

2、发送HTTP请求

GET /day05/FistServlet HTTP/1.1

    Accept: */*(客户端能接收的资源类型)

    Accept-Language: en-us(客户端接收的语言类型)

    Connection: Keep-Alive(维护客户端和服务端的连接关系)

    Host: localhost:8080(连接的目标主机和端口号

3、服务器从HTTP请求中解析出要访问的主机名

4、解析要访问的web应用

5、解析出要访问的资源

6、找到对应的Servlet创建实例对象

7、调用对象的init方法,完成对象的初始化

8、调用service方法,响应客户端的请求

9service方法执行,向response写出客户端输出数据

10web服务器从response取出数据打给浏览器

 

  HTTP和servlet初学

 

*6 Servlet细节

  1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头

  2)一个Servleturl-pattern可以是1个或多个,有二种形式;

a*.xx

        b/xx/*

        注意:/*不能一起直接使用

  3)/**.do的映射关系,*.do最后

  4)程序员编写的Servlet其实是由tomcat容器中的Servlet引擎来处理的,引擎会产生对应的HttpServletRequest

    HttpServletResponse对应传入到ServletdoXxxx()方法中

  5)通过在web.xml文件中配置代码,让Servlet在部署时就创建

    <servlet>

      <servlet-name>Demo21</servlet-name>

      <servlet-class>cn.itcast.web.servlet.Demo21</servlet-class>

      <load-on-startup>1</load-on-startup>

  </servlet>

  数字小的先加载,数据大的后加载,最小为0,如果为负数和没有设置一样,需要在浏览器第一次访问时创建

  6)url-pattern/servlet是一个缺省的servlet,用于处理当前web应用下,访问路径错误的请求

    任何web服务端都有一个缺省的servlet来处理

  7)每个线程会共享同一个Servlet的实例变量,所以要对敏感数据加锁

    产生线程安全条件如下:

a)单例

   &&

b)实例变量

   &&

        c)实例变量进行修改操作

    通过加锁的方式,对敏感数据块进行代码同步(正道)

    

    如果你实现SingleThreadModel来解决线程安全有二个不足之处:

aSingleThreadModel接口的值与web服务器最多接收的线程数有关,可能会出现大值变小值的情况

bSingleThreadModel接口如果发现某个线程正在占用该Servlet实例,会自动创建一个新的Servlet实例为浏览器服务,

   这就违背了Servlet单例的原则

   

 

7 ServletConfig对象

  1)想让当前Servlet读取一些在web.xml文件配置的初始化参数,可以使用ServletConfig对象,它是Servlet运行时的配置对象

  2)init(ServletConfig)方法由Web容器调用,调用时,会传入与容器相关的ServletConfig接口的实现。