一. 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是采用对象池的形式。