一、Servlet容器、Servlet接口、Servlet實現類
客戶端通過瀏覽器,以可以交互的Html頁面,對Web服務器發送請求。Web應用程序發佈、運行在服務器上。Web服務器通過調用Web應用中的服務(方法),實現客戶請求。並通過Web服務器,返回響應結果。過程如下:
在.net,確實將應用程序發佈在了IIS中。得以讓用戶進行訪問。同樣JavaWeb中也一樣,Drp中Web服務器是Tomcat。以下針對JavaWeb應用進行討論。
那Web服務器是如何調用Web應用程序的呢?——中介方Servlet接口。Servlet接口是一組標準,它規定了:
1.Web服務器可以訪問任意一個Web應用中實現Servlet接口的類。
2.Web應用中被Web服務器調用的程序代碼在Servlet接口的實現類中。
此時把發佈、運行JavaWeb應用的Web服務器稱爲Servlet容器。以Tomcat作爲Servlet容器爲例:
二、Servlet接口
在Servlet中定義了5個方法。其中3個方法都由Servlet容器來調用。容器在Servlet的生命週期的不同階段調用特定的方法。
1.init(ServletConfigconfig):負責初始化Servlet對象。容器在創建Servlet對象後,就會調用該方法。
2.service(ServletRequestreq,ServletResponse res):負責響應客戶的請求,爲客戶提供響應服務。當容器接收到客戶端要求訪問特定Servlet對象的請求時,就會調用該Servlet對象的service()方法。
3.destory():負責釋放Servlet對象佔用的資源。當Servlet對象結束生命週期時,容器會調用此方法。
三、Servlet的生命週期
Servlet的生命週期也由Servlet容器來控制。Servlet的生命週期可以分爲3個階段。
1.初始化階段
(1)加載Servlet類
(2)創建ServletConfig對象
(3)創建Servlet對象
(4)調用Servlet對象的init(ServletConfig config)方法。
2.運行階段
這個階段,Servlet隨時響應客戶端的請求。當Servlet容器接收到要求訪問特定Servlet的客戶請求時,Servlet容器會創建針對於這個請求的ServeltRequest,ServletResponse對象。然後調用響應Servlet對象的service()方法。Service()方法從ServletRequst對象中獲得客戶請求信息並處理該請求,在通過ServletResponse對象生成響應結果。當Servlet容器把Servlet生成的響應結果發送給客戶,Servlet容器就會銷燬ServletRequest對象和ServletResponse對象。
3.銷燬階段
當Web應用程序被終止時,Servlet容器會先調用Web應用中所有Servlet對象的Destory()方法。然後再銷燬這些Servlet對象。
四、實例應用——根據日期範圍查詢學生
1.UML圖分析
2.查詢頁面——query_student_con.jsp:
<%@ page language="java" contentType="text/html;charset=GBK"%>
<html>
<head>
<title>學生信息</title>
</head>
<body>
<form action="SearchStudentServlet" method="post">
出生日期:<input type="text" name="beginDate">至<input type="text" name="endDate">
<input type="submit" value="查詢學生">
</form>
</body>
</html>
結果頁面——student_list.jsp:
<%@ page language="java" contentType="text/html;charset=GBK"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%@ page import="com.bjpowernode.exam.model.*"%>
<%@ page import="com.bjpowernode.exam.manager.*"%>
<html>
<head>
<title>學生信息</title>
<style type="text/css">
/*表格寬度爲1px,實線,黑色*/
table{
border:1px solid black;
border-collapse:collapse;
}
td {
border:1px solid black;
border-collapse:collapse;
}
</style>
</head>
<body>
<table border="1">
<tr>
<td>學生代碼</td>
<td>姓名</td>
<td>性別</td>
<td>出生日期</td>
<td>聯繫電話</td>
<td>家庭住址</td>
<td>班級名稱</td>
<td>年齡</td>
</tr>
<%
//List<Student> studentList = (List)request.getAttribute("student_list");
List<Student> studentList = (List)session.getAttribute("student_list");
for (Iterator<Student> iter=studentList.iterator(); iter.hasNext();) {
Student student = iter.next();
%>
<tr>
<td><%=student.getStudentId()%></td>
<td><%=student.getStudentName()%></td>
<td><%=student.getSex()%></td>
<td><%=new SimpleDateFormat("yyyy-MM-dd").format(student.getBirthday())%></td>
<td><%=student.getContactTel()%></td>
<td><%=student.getAddress()%></td>
<td><%=student.getClasses().getClassesName()%></td>
<%
long b = 1000L*60L*60L*24L*365L;
long a = System.currentTimeMillis() - student.getBirthday().getTime();
%>
<td><%=a/b%></td>
</tr>
<%
}
%>
</table>
</body>
</html>
3.Web.xml配置
<?xml version="1.0" encoding="ISO-8859-1"?>
<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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>SearchStudentServlet</servlet-name>
<servlet-class>SearchStudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SearchStudentServlet</servlet-name>
<url-pattern>/SearchStudentServlet</url-pattern>
</servlet-mapping>
</web-app>
4.servlet代碼
import java.text.*;
import java.util.*;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import com.bjpowernode.exam.model.*;
import com.bjpowernode.exam.manager.*;
public class SearchStudentServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String sBeginDate = request.getParameter("beginDate");
String sEndDate = request.getParameter("endDate");
Date beginDate = new Date();
Date endDate = new Date();
try {
beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(sBeginDate);
endDate = new SimpleDateFormat("yyyy-MM-dd").parse(sEndDate);
}catch(Exception e) {
e.printStackTrace();
}
StudentManager studentManager = new StudentManagerImpl();
List<Student> studentList = studentManager.findStudentList(beginDate, endDate);
//將studentList放到session中
HttpSession session = request.getSession();
session.setAttribute("student_list", studentList);
//重定向,不會共享request
response.sendRedirect(request.getContextPath() + "/student_list.jsp");
}
}
總結:
通過以上介紹、實例,明白了Servlet容器、Servlet接口、Servlet之間的關係。它們更像是餐館招聘服務員。餐館就是Servlet容器,Servlet接口就是中介,Servlet就是等待上崗的鐘點工。餐館需要鐘點工上菜、佈菜、刷盤子。鐘點工在中介登記了可以做什麼樣的工作,這樣餐館只需要告訴中介自己需要什麼樣的人就可以了。