HTTP协议
HTTP协议是构建于tcp/ip协议上的一个协议,基于request和response序列的会话结构。
Request的基本要素包含:HTTP方法,访问页面的URL以及表单的参数。
Response的基本要素包括:状态码(表示请求是否成功),content-typ(文字,图片以及HTML)以及具体的content.
HTTP最常用的两个方法就是get和post
Get用于从服务器获取资源。Get方法只能发送有限个字符作为参数,这些发送的参数直接显示在地址URL后面。
Post用于向服务器发送数据。一般向服务器提交数据表单或者某些重要的数据,需要对数据进行加密。
Servlet
Servlet是由服务器的容器调用的代码,它本身不包含main()函数。
一、Servlet容器请求处理过程
Servlet容器处理请求的过程如下:(假设我们连接一个servlet)
1. 容器发现针对某个servlet的请求,于是创建两个对象HttpServletRequest、HttpServletResponse
2. 容器发现对应的servlet,针对该请求创建一个线程,然后将创建的request和response对象作为参数传递给该线程。
3. 容器调用servlet的service()方法,基于请求的类型,service()方法根据客户端发送的是HTTP Get或Post请求调用doGet()或doPost()方法。
4. 通过调用相应的方法生成动态页面并返回,生成的页面作为response对象的一部分返回。
5. service()方法结束,线程要么结束要么返回到线程池中。容器销毁request和response对象。
二、Servlet映射
见如下代码:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>SimpleHello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
其中<servlet>项用来将完整的类名和内部表示名字映射起来。<servlet-class>表示完整的类名,<servlet-name>表示映射的内部名字。
<servlet-mapping>将内部名字和公共的URL映射起来。<url-pattern>表示公共的URL。所以在示例中虽然真正的类为SimpleHello,但是可以通过/hello来访问它。
三、Servlet类层次结构
Servlet类层次结构如图1:
图1:servlet层次结构
1. Servlet接口包含有生命周期的三个方法。
2. GenericServlet是抽象类,实现了servlet接口的大多数基本方法。
3. HttpServlet也是一个抽象类,实现了service()方法,以及HTTP协议的相关方法。
4. MyServlet所做的就是覆写相关的HTTP方法来提供所需要的功能。
Servlet生命周期:
Servlet生命周期的所有方法都是由容器调用,在一定条件下可以手动覆写部分方法。
方法 | 调用时机 | 用途 | 是否需要覆写 |
init() | 在创建servlet实例之后,在实例可以处理任何客户端请求之前。 | 在处理客户端请求前可以做一些初始化的工作。 | 如果有一些需要初始化的代码(比如获取数据库连接)则需要覆写init()方法。 |
service() | 第一个客户端请求到达时。 | 该方法根据请求确定HTTP方法(doGet(),doPost()等),调用匹配的servlet。 | 一般应该覆写doGet或doPost而不应覆写service() |
doGet()/doPost() | service()方法根据HTTP方法调用doGet或doPost | 自定义功能的起始点。 | 至少覆写一个方法。 |
容器通过装载类,调用servlet的无参构造函数并调用servlet的init()方法来初始化一个servlet.
init()方法使得servlet可以访问ServletConfig, ServletContext对象来获取相关的配置信息。
Servlet可访问的对象:
1. ServletConfig
每个servlet都包含一个ServletConfig,用于传递布署信息(比如数据库或bean的查找名)。参数一般配置在部署描述中。
2. ServletContext
每个web应用都有一个ServletContext。用于访问整个WEB应用的参数,也配置在部署描述中。用于获取服务器的相关信息。
Request和Response:
Request和Response是HttpServlet一些方法的参数。比如(doGet(), doPost())他们本身都是interface.
HttpServletRequest的方法主要处理HTTP相关的事情,比如cookie,head,session
四、getServerPort(),getLocalPort()和getRemotePort()的区别
因为这些方法都是ServletRquest的,所以getRemotePort()表示获取客户端的port。getServerPort()表示客户端的请求最初是送给哪个端口。而getLocalPort()表示请求最终终止于哪个端口。