(2)Servlet运行原理:
当web服务器接收到一个HTTP请求时,它会先判断请求的内容----如果是静态网页数据,web服务器将会自行处理,然后产生响应信息;如果牵扯到动态数据,web服务器会将请求转交给Servlet容器。此时Servlet容器会找到相应的处理该请求Servlet实例来处理,结果会送回到web服务器,再由web服务器传回到客户端。针对同一个Servlet,Servlet容器会在第一次收到HTTP请求的时候创建一个Servlet实例,然后启动一个线程。第二次收到HTTP请求的时候,Servlet容器无需再创建相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程的服务方式不仅可以web应用程序的执行效率,也可以降低web服务器的系统负担。
(3)Servlet如何被加载和实例化
Servlet容器可以在Servlet容器加载时对Servlet进行加载和实例化,可以在Servlet响应请求时执行,也可以在两者之间的任何时候执行。Servlet容器加载完之后,首先必须要初始化Servlet,初始化的时候调用init()方法。
(4)Servlet如何处理请求
Servlet在被初始化之后就处于就绪状态,每一个Servlet都有一个请求的Servlet Request对象和响应的Servlet Response对象。当处理客户端的请求时,Servlet容器会将Servlet Request对象和Servlet Response对象转发给Servlet。这两个对象以参数的形式传给Service方法。
相应的代码案例:
package javaweb;
import java.io.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset = utf-8");
PrintWriter out = response.getWriter();
out.print("这是我的第一个Servlet");
}
public void init(){}
public void destory(){}
}