1.1 Java Web編程的主要組件技術
一個完整的Java Web應用軟件通常是由多種組件技術構成的,一般由表示層組件、控制層組件、業務邏輯層組件及數據訪問層組件組成。表示層組件通常由HTML和JSP頁面構建,控制層組件一般是Servlet,業務邏輯層組件是JavaBeans或EJB,數據訪問層組件是JDBC,Hibernate或CMP。此外,Java Web應用的各個組件需要在XML格式的配置文件中進行聲明,然后打包,部署Java Web服務器(例如Tomcat)中運行。
1.1.1 Servlet
Servlet(Java服務器小程序)是由Java編寫的服務器端程序,是由服務器端調用和執行的、按照Servlet自身規范編寫的Java類。
Servlet可以處理客戶端傳來的HTTP請求,并返回一個響應。它是一個Java類,具有可移植、功能強大、安全、集成、模塊化和可擴展性好等特點。
例1-1:
package chap1;
import javax.servlet.*;
import java.io.*;
public class Servlet extends GenericServlet{
public void service(ServletRequest request,ServletResponse response)throws IOException
{
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1>Hello World</h1>");
out.println("</body>");
out.println("</html>");
}
}
Servlet需要部署在Web容器中,它的生命周期由Web容器管理,可以分為以下幾個階段:
1. 裝載Servlet:這項操作一般是動態執行的。有些服務提供了相應的管理功能,可以在啟動的時候就裝載Servlet,并能夠初始化特定的Servlet。
2.創建一個Servlet實例。
3.調用Servlet的init()方法。
4.服務:如果Web容器接收到對此Servlet的請求,那么它調用Servlet的service()方法。
5.銷毀:銷毀實例,通過調用Servlet的destroy()方法來銷毀Servlet。
Java對Servlet的支持是通過javax.servlet和javax.servlet.http兩個軟件實現的,其中javax.servlet.http是一個子軟件包。
javax.servlet軟件包包含Servlet常用的接口和類,如GenericServlet,ServletConfig,ServletRequest,ServletResponse和RequestDispatcher等。
javax.servlet.Servlet接口提供了創建Servlet的一般框架。Servlet可直接實現此接口,或者間接地通過擴展javax.servlet.GenericServlet類或javax.servlet.http.HttpServlet類來實現此接口。javax.servlet.GenericServlet類可用于創建與任何協議一起使用的Servlet.
而javax.servlet.http軟件包除了繼承以上的接口和類外,還包含了一些針對HTTP協議的方法、特殊請求和響應對象,如HttpServlet,HttpServletRequest,HttpServletResponse,HttpSession和HttpDispatcher等。
1. HttpServlet類提供了處理不同HTTP請求類型(有GET,POSTH和PUT等)的方法,其中兩種最常見的HTTP請求類型是GET和POST,它們分別是由doGet()和doPost()方法進行處理的:
protected void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException;
protected void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException;
2. HttpServletRequest接口提供了處理客戶請求的方法。使用這些方法,Servlet可從客戶頁面窗體中取得數據。例如,從客戶頁面窗體取得用戶名(username)的方法如下:
HttpServletRequest request;
String name=request.getParameter("username");
3. HttpServletResponse接口提供了以HTML頁面形式把請求發送給客戶的方法,主要方法有setContentType(),sendRedirect()等。例如,把請求轉發給下一個頁面next.jsp的實現方法如下:
HttpServletResponse response;
respinse.sendRedirect("next.jsp");
4. HttpSession接口用來記錄當前Servlet中的用戶會話。例如:在Web站點上注冊的每個用戶自動與HttpSession對象關聯。Servlet可用此對象來存儲關于用戶會話的信息。可使用HttpSession接口的putValue()和getValue()等方法把數據寸入HttpSession對象中,或從該對象中取出數據。通過HttpServletRequest對象的getSession()方法可生成一個HttpSession對象,如下面的代碼所示:
HttpServletRequest request;
HttpSession session=request.getSession(true);
5. RequestDispatcher接口可以把Servlet的請求提交或委派給另一個資源,如Servlet,HTML文件或JSP頁面。在這種情況下,源Servlet進行同樣處理并把請求委派給另一個Servlet。RequestDispatcher接口封裝指向特定資源(Servlet,HTML文件或JSP頁面)的URL。用此接口的forward(HttpServletRequest request,HttpServletResponse response)方法委派任務到特定資源。RequestDispatcher對象可通過HttpServletRequest對象的getRequestDispatcher()方法生成。例如:
RequestDispatcher td=request.getRequestDispatcher("reply.jsp");
rd.forward(request,response);
例1-2:
MyJsp.jsp:
<FORM name="form1" method="get" action="MyFirstServlet">
MyFirstServlet.java:
package chap1;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.*;
public class MyFirstServlet extends HttpServlet{
public void doPost(HttpServletRequest request,HttpServletResponse response){
String name=request.getParameter("username");
RequestDispatcher rd;
try{
try{
if(name.equals("Tom")){
HttpSession session=request.getSession(true);
session.setAttribute("nm",name);
response.sendRedirect("servlet/reply.jsp");
}
else{
rd=request.getRequestDispatcher("servlet/error.jsp");
rd.forward(request,response);
}
}catch(ServletException e){System.out.println(e);}
}catch(IOException e){System.out.println(e);}
}
public void doGet(HttpServletRequest request,HttpServletResponse response){
doPost(request,response);
}
}
在Java Web應用程序中,Servlet常用做控制器組件。當Servlet部署到Web服務器中時,需要Web配置文件Web.xml中進行聲明。
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>chap1.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>