javaweb之HTTP协议以及servlet

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值