HTTP-------Servlet

一.     HTTP概述

用于定义web客户端与web服务端的数据交换的过程及数据本身的格式。

分为:

HTTP1.0:客户端与服务端建立连接后,发送一次请求后,连接关闭。

HTTP1.1:建立连接后,可以发送N次请求。

 

二.     HTTP协议的组成部分

请求行和响应行位于第一行,消息头与正文间有一个空行

1.     请求消息

a)    请求行(请求方式 请求资源的路径 使用的协议)

请求方式:GET和POST

GET请求会将数据放在请求资源路径后面,缺点:会暴露数据,而且有限制,不能超过1k的数据。

POST请求会将数据放在请求正文中,安全,数据量无限制。用于表单提交method

 

b)   请求消息头

Accept:告知服务器客户端可接收的MIME类型。

        Web中通过MIME类型来区分内容。(Tomcat/conf/web.xml中有MEMI的类型对应关系)。

Accept-Charset:告知服务器客户端所支持的字符集

Accept-Encoding:告知服务器客户端所支持的解码的方式,如GZIP

Referer:取值为一个URL,跳转至当前页面之前的页面地址。

Content-Type:告知服务器,所传递的数据类型。

        表单的enctype默认的值为application/x-www-form-urlencoded。表单表单为普通数据。

f-Modifed-Since:缓存的页面最后修改的时间。

User-Agent:客户端浏览器的类型。

Content-Length:告知服务器,请求正文的长度。

Cookie:向服务器传送cookie,会话技术。

 

c)    请求正文

 

2.     响应消息

a)    响应行(请求协议类型 状态码 状态描述)

b)   响应消息头

Location:结合302,307响应码实现客户端的请求重定向。

Content-Encoding:告知客户端响应正文所采用的压缩编码。

Content-Type:告知客户端响应正文的MIME类型。默认为:text/html

Refresh:控制客户端定时刷新,及转向另一个页面:Refresh:3;URL=xxx/xxx/xx.html

Content-Disposition:告知客户端内容以下载的方式打开。

               Content-Disposition:attachment;filename=1.jpg

Set-Cookie:设置cookie

 

告知客户端不要缓存

Expires:-1

Cache-Control:no-cache(http1.1)

Pragma:no-cache(http1.0)

 

缓存原则:静态数据(html/css/js/css/image)的一般需要缓存,而动态资源不要缓存。

 

c)    响应正文

 

三.     Servlet

Servlet必须实现javax.servlet.Servlet接口。

此接口已知的实现类GenericServlet、HTTPServlet类。

我们编写Servlet时,如果不需要覆盖Servlet接口所有的方法。这时就可以继承GenericServlet类,覆盖所需的方法。

如果针对HTTP编写Servlet,只需要继承HTTPServlet类,覆盖doGet,doPost方法。

如果doPost请求处理的方式和doGet方法中一样,可在doPost方法中调用doGet方法,传入request,response。

 

编译:编译Servlet时,需要导入Servlet-api.jar包。此包在tomcat/lib目录中存在。只需要修改classpath环境变量的值指向%classpath%;tomcat/lib/Servlet-api.jar即可编译。

 

1.     Servlet编写步骤

a)     编写一个类,实现javax.servlet.Servlet接口

b)     把代码写到service方法中。

c)     编译

d)     web.xml中添加映射

 

2.     Servlet映射

需要修改应用中web.xml文件,此文件中可复制tomcat/conf/web.xml文件的头和尾。然后加入如下:

<servlet>

         <servlet-name>HelloWorld </servlet-name>

         <servlet-class>com.itheima.HelloWorld.class</servlet-class>

</servlet>

<servlet-mapping>

         <servlet-name>HelloWorld </servlet-name>

         <url-pattern>/Hello </ur-pattern>

</servlet-mapping>

该应用如果为MyApp,访问路径则是:http://localhost:8080/MyApp/Hello

 

可以设置多个映射地址。如:

<servlet-mapping>

         <servlet-name>HelloWorld </servlet-name>

         <url-pattern>/Hello </ur-pattern>

         <url-pattern>/HelloWorld </ur-pattern>

         <url-pattern>/*</ur-pattern>

</servlet-mapping>

 

映射URL可以使用通配符 * 。

两种写法:*.扩展名:以*开头,以扩展名结尾

                /前缀/*:以/开头,以*结尾

 

3.     缺省Servlet

如果某个Servlet的URL映射地址为 / ,那么它就是一个缺省的Servlet,tomcat中本身就有一个默认的缺省Servlet(tomcat/conf/web.xml),如果重新定义了一个缺省Servlet,那么默认的将会被覆盖掉。

缺省Servlet的作用:

用户请求的URL在web.xml中找不到匹配的地址时,会交由缺省的Servlet负责处理。

 

4.     Servlet-api.jar

a)     javax.servlet.*:Servlet规范中通用的接口和类,与任何协议无关。

b)     javax.servlet.http.*:规范中与HTTP相关的接口和类。

5.     编写HTTP的servlet时一般继承javax.servlet.http.HttpServlet类。不应覆盖它的service方法,而是覆盖它的doGet、doPost方法。

 

6.     更改servlet模板

在MyEclipse安装目录中找到*wizard*.jar(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar),打开,templates/Servlet.java

 

7.     Servlet的生命周期

1.    客户端向服务端建立连接

2.    客户端向服务端发送请求消息

3.    服务端解析客户端发送过来的请求消息,得到要访问的主机、应用、资源

4.    服务端第一次调用Serivet,需创建Servlet实例,驻留于内存

5.    调用Servlet对象的init();方法

6.    服务器创建封装消息的HTTPServletRequest,HTTPServletResponse对象,并调用service方法将其传入。

7.    通过service中的request可获取客户端发送过来的信息,可用.method方法获取请求类型而调用对应的doXxx方法。

8.    在response中封装给客户端响应的数据。

9.    服务器会查看response中有无数据,有则取出response中的数据,返回给客户端。

10.  客户端接收到服务端响应。

11.  服务器停止或重启之前,Servlet引擎会卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

 

8.     Servlet的线程问题

1.    对于可能出现资源共享的代码进行同步处理。此种方法导致程序变慢

2.    弄一个对象池

3.    尽量将变量的声明为局部变量

SingleThreadModel过时的。实现该接口的Servlet可以避免资源竞争问题。采取了同步或对象池的方式。到底是采用的同步还是对象池,根据不同的服务器实现而不同了。

Tomcat是采用对象池的形式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值