当前位置: 代码迷 >> Web前端 >> JavaWeb之Servlet(1)
  详细解决方案

JavaWeb之Servlet(1)

热度:132   发布时间:2012-09-14 11:53:44.0
JavaWeb之Servlet(一)

一、什么是Servlet

?

? ? ? ? ?Servlet(Server Applet),是一种运行在服务器中的小应用程序,由Java语言编写,但与传统的在命令行下运行的Java程序有所不同,那就是Servlet是由web服务器调用的。

?

二、与Servlet相关的核心类体系结构

?


?

? ? ?以Tomcat6.0(tomcat6.0支持Servlet2.5、Jsp2.1)为服务器,写一个简单的

? ? Servlet程序:

?

? ? ??import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置输出流编码
		response.setContentType("text/html;charset=UTF-8");
		// 取得一个HttpServletResponse对象的输出流
		PrintWriter out = response.getWriter();
		out.println("Hello Servlet!");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
?

? ? 在浏览器中输入 http://localhost:8080/helloServlet/hello后会在页面打印

? ? 出Hello Servlet!

?

三、Tomcat服务器解析HTTP请求并响应的过程


? ? ? ? ?对该过程进行更为详细的分析:

?

? ? ? ?1、当客户端通过浏览器向服务器发出 ?

? ? ? ? ? ? http://localhost:8080/helloServlet/hello,此时服务器会对该http请

? ? ? ? ? ? ? ? ??求进行解析:如下形式:

?

? ? ? ? ? ? ? ? ? ? ? ? ? 1.1、GET /helloServlet/hello HTTP/1.1

? ? ? Accept:image/gif,image/jpeg,image/pjpeg ...

? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ?Accept-Language:zh-cn

? ? ? ?User-Agent:Mozilla/4.0

? ? ? ?Accept-Encoding:gzip,deflate

? ? ? ? ? ? ? ?Host:localhost:8080

? ? ? ?Connection:Keep-Alive

?

? ? ? ? ? ? ??2、服务器查找$CATALINA_HOME/conf/server.xml文件,查找

? ? ? ? ? ? ? <Host>节点中name="localhost"所对应的appBase属性的值,如下:

?

?

<Server port="8005" shutdown="SHUTDOWN">
	<Service name="Catalina">
		<Connector port="8080" protocol="HTTP/1.1"
			connectionTimeout="20000" redirectPort="8443" />
		<Engine name="Catalina" defaultHost="localhost">
			<Host name="localhost" appBase="webapps" unpackWARs="true"
				autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
			</Host>
		</Engine>
	</Service>
</Server>
??

??3、根据<Host>的appBase属性的值到webapps的目录下查找名为

? ? ? ? ? ? ? ? ? ? ??helloServlet的这个web应用。

?

? ? ? ? ? 4、Tomcat服务器查询helloServlet/WEB-INF/web.xml文件(web应

? ? ? ? ? ? ? ?用的部署描述符),查询的具体过程如下:

?

<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
?

? ? ? ? ? ? ? ? 4.1、先根据<servlet-mapping>元素中的<url-pattern>元素的值找

? ? ? ? ? ? ? ? ? ? ?到<servlet-name>元素的值

?

? ? ? ? ? ? ? ? ? ?4.2、根据<servlet-mapping>元素中找到的<servlet-name>映射到

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<servlet>元素中的<servlet-name>的值,再找到对应的

? ? ? ? ? ? ? ? ? ? ?<servlet-class>元素的值,即为/hello所对应的HelloServlet

?

? ? ? ? ?5、Tomcat服务器查找并加载class文件的顺序:

?

? ? 5.1、首先到到com.itheima.servlet的路径下查找并加载

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??HelloServlet.class文件。

?

? ? ? ? ? ? ? 5.2、如果没有找到会继续查找helloServlet/WEB-INF/lib目录中查找

? ? ? ? 并加载HelloServlet.class文件。

?

? ? ? ? ? ? ? 5.3、如果还没有找到,Tomcat服务器会去$CATALINA_HOME/lib目

?录中继续加载,如果找不到就会抛出类找不到的异常

?

? ? ? ? ? 6、Tomcat服务器将处理后的数据写入HttpServletResponse对象之中

? ? ? ? ? ? ? ? ? ? ? ?并返回给客户端

?

?

?四、Servlet的生命周期? ? ? ? ????

?

? ? ? ? ? ? ? ?1.Servlet程序是供其他Java程序(Servlet引擎)调用的Java类,一个

? ? ? ? ? ? ? ? ? ??Servlet不能单独运行,它的运行完全有Servlet引擎来控制和调用。

?

? ? ? ? ? ? ? ? 2.对于客户端的多次Servlet请求,通常服务器只会创建一个Servlet的实

? ? ? ? ? ? ? 例,即一旦创建一个Servlet实例,该实例就会驻留在内存,为后续的

? ? ? ? ? ? ? 请求服务直到web容器推出,该servlet实例才会销毁.

?

? ? ? ? ? ? ? ? ?3.在Servlet的整个生命周期中,Servlet的init()方法只会被调用一次而

? ? ? ? ? ? ? ? ? ? ? 每一次Servlet的请求都会使Servlet引擎调用一次service()方法,创

? ? ? ? ? ? ? ?建一个新的用于封装HTTP请求消息的HttpServletRequest对象和一

? ? ? ? ? ? ? ?个用于封装HTTP响应消息的HttpServletResponse对象,然后会将这

? ? ? ? ? ? ? ? ? ?? 两个对象作为参数传递给service(HttpServletRequest request,

? ? ? ? ? ? ? ?HttpServletResponse response)方法,然后根据具体的请求方式

? ? ? ? ? ? ? ?(如:GET、POST等方式)调用doXXX()方法。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  相关解决方案