1. 程式人生 > 程式設計 >Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

一、什麼是Servlet?

Servlet是在伺服器上執行的小程式,也就是一個Java類,但比較特殊,不需要new,自動就可以執行。也有建立、垃圾回收和銷燬過程。Servlet是JavaWeb的三大元件之一(Servlet、Filter、Listener),它屬於動態資源。Servlet的作用是處理請求,伺服器會把接收到的請求交給Servlet來處理,在Servlet中通常需要:

  • 接收請求資料;
  • 處理請求;
  • 完成響應。

例如客戶端發出登入請求,或者輸出註冊請求,這些請求都應該由Servlet來完成處理。Servlet需要我們自己來編寫,每個Servlet必須實現javax.servlet.Servlet介面。Servlet物件駐留在伺服器記憶體中。

1、編寫一個Servlet程式

寫一個java類,實現Servlet介面,實現了該介面,該類就不是普通的類了。

Servlet開發JavaWeb工程示例詳解

package servletdemo;
 
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {
 
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("Hello Servlet");
 
  }
 
  @Override
  public ServletConfig getServletConfig() {
    return null;
  }
 
  @Override
  public void service(ServletRequest servletRequest,ServletResponse servletResponse) throws ServletException,IOException {
 
  }
 
  @Override
  public String getServletInfo() {
    return null;
  }
 
  @Override
  public void destroy() {
 
  }
}

部署應用到tomcat伺服器。

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

測試:http://localhost:8080/MyMavenHome_war/servlet 在IDEA控制檯輸出 hello servlet,初體驗成功!

二、Servlet的生命週期

例項化-->初始化-->服務->銷燬

      出生:(例項化-->初始化)第一次訪問Servlet就出生了(預設情況下)。(說明我可以改變它的出生時機,比如讓servlet在伺服器啟動時就建立)

      活著:(服務)應用活著,servlet就活著。(Servlet是單例項,其中的service()方法是多執行緒的。)

      死亡:(銷燬)應用被解除安裝了,servlet就銷燬了。

package servletdemo;
 
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {
 
  //Servlet生命週期的方法:例項化方法(new 物件,無參構造)
  //在servlet第一次被訪問時呼叫
  public servletDemo() {
    System.out.println("*******servletDemo執行了");
  }
 
  //Servlet生命週期的方法:初始化方法
  //在servlet第一次被訪問時呼叫
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("*********init執行了");
 
  }
 
  @Override
  public ServletConfig getServletConfig() {
    return null;
  }
 
  //Servlet生命週期的方法:服務方法
  //每次訪問時都會被呼叫
  @Override
  public void service(ServletRequest servletRequest,IOException {
    System.out.println("*******service執行了");
  }
 
 
  @Override
  public String getServletInfo() {
    return null;
  }
 
  //Servlet生命週期的方法:銷燬方法
  //當應用被解除安裝時呼叫
  @Override
  public void destroy() {
    System.out.println("*******destroy執行了");
  }
}
 

Servlet開發JavaWeb工程示例詳解

三、實現Servlet的方式

實現Servlet有三種方式:

  • 實現javax.servlet.Servlet介面;
  • 繼承javax.servlet.GenericServlet類;
  • 繼承javax.servlet.http.HttpServlet類;

自定義Servlet類的繼承結構,如下圖:

Servlet開發JavaWeb工程示例詳解

1、實現javax.servlet.Servlet介面(參見:編寫一個servlet程式) 

2、繼承javax.servlet.GenericServlet類(抽象類)(介面卡模式)    

GenericServlet類(抽象類)已經實現了Servlet介面,我們用哪個方法就呼叫哪方法,不用再去全部實現了,哪怕是全部的空實現。

Servlet開發JavaWeb工程示例詳解

3、繼承javax.servlet.http.HttpServlet類(抽象類)(模板方法設計模式)    

模板是HttpServlet類中的私有service()方法(開發中常用方式)    

HttpServlet類(抽象類)繼承了GenericServlet類(抽象類)

package servletdemo;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
@WebServlet("/servlet1")
public class servlet extends HttpServlet {
  //具體實現1
  @Override
  protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {
    System.out.println("******MydoGet*******");
    System.out.println(req.getRemoteAddr());
  }
 
  //具體實現2
  @Override
  protected void doPost(HttpServletRequest req,IOException {
    System.out.println("*******MydoPost******");
  }
 
}

Servlet開發JavaWeb工程示例詳解

注意:不要重寫父類Httpservlet中的service()方法,因為該方法會呼叫Httpservlet中私有的service()方法,

   而該私有的service()方法會根據不同的提交表單的方式,會呼叫相應的doGet()、doPost()、doHead()等方法。

    我們去重寫這些不同的表單提交的方法即可。

      Servlet(介面) -->GenericServlet(抽象類/介面卡) -->HttpServlet(功能抽象類/模板)-->(繼承HttpServlet,具體實現類,重寫其功能)

4、公牛表白的故事

此故事純屬本人腦洞虛構

故事內容:草原上有一頭公牛喜歡一頭母牛,但是公牛不敢直接向母牛表白,有一天公牛找到一頭小牛,想讓小牛把他想對母牛說的話說給母牛聽,小牛答應了,劇情很雞血,就這樣,看我用servlet實現

Servlet開發JavaWeb工程示例詳解

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>公牛表白準備</h2>
<a href="/servlet2" rel="external nofollow" >去表白</a>
</body>
</html>

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

package com.demo.servlet;
 
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet2")
public class ServletDemo2 extends GenericServlet {
  @Override
  public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException {
    System.out.println("我是草原上的公牛");
    System.out.println("我讓小牛把我對母牛的愛傳給她");
    System.out.println("該說的話我給小牛說了,小牛聽到了給我回復收到,並把我說的話傳給母牛");
    ServletContext application = this.getServletContext();
    application.setAttribute("name","母牛");
    application.getRequestDispatcher("/servlet3").forward(req,res);
     
  }
}

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

package com.demo.servlet;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
 
@WebServlet("/servlet3")
public class ServletDemo3 extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req,IOException {
 
    doPost(req,resp);
    System.out.println("我是小牛");
    //設定輸出格式和字元編碼
    resp.setContentType("text/html;charset=utf-8");
    //向頁面輸出內容
    PrintWriter out = resp.getWriter();
    out.println("<h1>我是小牛</h1>");
    ServletContext application = this.getServletContext();
    String name = (String) application.getAttribute("name");
    System.out.println("收到的名字:"+name);
    out.println("收到的名字:"+name);
    System.out.println("小牛收到");
    application.setAttribute("love","公牛說他愛你");
    application.getRequestDispatcher("/servlet4").forward(req,resp);
 
  }
 
  @Override
  protected void doPost(HttpServletRequest req,IOException {
 
    System.out.println("我是dopost");
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    out.println("<h1>我是servlet33</h1>");
  }
 
  @Override
  protected void service(HttpServletRequest req,IOException {
    super.service(req,resp);
    System.out.println("我是service333");
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    out.println("<h1>我是servlet333</h1>");
  }
}

Servlet開發JavaWeb工程示例詳解 

Servlet開發JavaWeb工程示例詳解

package com.demo.servlet;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/servlet4")
public class Servlet4 extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req,IOException {
    doPost(req,resp);
    System.out.println("我是母牛");
    String love = (String) this.getServletContext().getAttribute("love");
    System.out.println(love);
    resp.setContentType("text/html;charset=utf-8");
    //向頁面輸出內容
    PrintWriter out = resp.getWriter();
    out.println("收到的表白:"+love);
    System.out.println("母牛收到");
  }
 
  @Override
  protected void doPost(HttpServletRequest req,IOException {
 
  }
}

5、servlet的對映細節    

 1、servlet的對映細節一:

一個servlet可以配置多個對映路徑(或者說:多個對映路徑可以指向同一個servlet),只要是name是一樣的就行

Servlet開發JavaWeb工程示例詳解

2、servlet的對映細節二:

 萬用字元*代表任意字串

url-pattern:*.xxx 以.xxx結尾的請求都可以訪問 注:不要加/

url-pattern:/* 以任意字串結尾的請求都可以訪問

url-pattern:/xxxx/*以/xxxx/開頭的請求都可以訪問

Servlet開發JavaWeb工程示例詳解

6、對servlet配置有兩種方法

1、在web.xml中對servlet進行配置

2、利用註解進行配置

在servlet類的上面寫入註解@WebServlet("/hello")

7、例項一——在web.xml中配置

1、在Web.xml中配置路徑和引數

Servlet開發JavaWeb工程示例詳解

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
 
<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <servlet>
  <servlet-name>Servletdemo1</servlet-name>
  <servlet-class>com.demo.servlet.Servletdemo1</servlet-class>
  <init-param>
   <param-name>name</param-name>
   <param-value>tom</param-value>
  </init-param>
  <init-param>
   <param-name>password</param-name>
   <param-value>1234</param-value>
  </init-param>
 
 </servlet>
 <servlet-mapping>
  <servlet-name>Servletdemo1</servlet-name>
  <url-pattern>/servlet</url-pattern>
 </servlet-mapping>
 
 <context-param>
  <param-name>k</param-name>
  <param-value>xxxxxxxx</param-value>
 </context-param>
</web-app>

Servlet開發JavaWeb工程示例詳解

2、在servlet中獲取引數和值

package com.demo.servlet;
 
import javax.servlet.*;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
 
 
public class Servletdemo1 implements Servlet {
  private ServletConfig servletConfig;
 
  @Override
  public void init(ServletConfig config) throws ServletException {
    servletConfig=config;
    System.out.println("init呼叫了");
 
  }
 
  @Override
  public ServletConfig getServletConfig() {
    return servletConfig;
  }
 
  @Override
  public void service(ServletRequest req,IOException {
    //設定輸出格式和字元編碼
    res.setContentType("text/html;charset=utf-8");
    //向頁面輸出內容
    PrintWriter out = res.getWriter();
    out.println("我是service"+"<br>");
    System.out.println("我是service");
 
    //方法一
    String name = servletConfig.getInitParameter("name");
    String password = servletConfig.getInitParameter("password");
 
    System.out.println("在控制檯輸出資訊:");
    System.out.println("name:"+name+"password:"+password);
 
    out.println("name:"+name+" "+"password:"+password+"<br>");
 
    //方法二
    Enumeration<String> en = servletConfig.getInitParameterNames();
    while (en.hasMoreElements()){
      String names = en.nextElement();
      String values = servletConfig.getInitParameter(names);
 
      System.out.println("在控制檯輸出資訊:");
      System.out.println(names+" "+values);
      out.println(names+" "+values+"<br>");
    }
 
    String k = servletConfig.getServletContext().getInitParameter("k");
    System.out.println("在控制檯輸出資訊:");
    System.out.println("k:"+k+"<br>");
    out.println("k"+k);
  }
 
  @Override
  public String getServletInfo() {
    return null;
  }
 
  @Override
  public void destroy() {
 
  }
}

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

8、例項二——利用註解配置

package com.demo.servlet;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
 
@WebServlet("/hello")
public class Servlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req,resp);
    ServletContext servletContext = this.getServletContext();
    servletContext.setAttribute("user","Tom");
    String user = (String)servletContext.getAttribute("user");
 
    //從請求的位址列或表單中獲取資訊
    String user2 = req.getParameter("user");
 
    System.out.println("獲取Context容器中的資訊:"+user);
    System.out.println("在控制檯輸出從訪問的位址列獲取的資訊:"+user2);
    resp.setContentType("text/html");
    resp.setCharacterEncoding("utf-8");
 
    PrintWriter out = resp.getWriter();
    out.append("<!DOCTYPE html>")
        .append("<html><head></head><body>")
        .append("使用者是"+user)
        .append("</body></html>");
 
  }
 
  @Override
  protected void doPost(HttpServletRequest req,IOException {
 
  }
}
 

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

四、Servlet的執行緒安全

    整個生命週期是單例項,但每次訪問時為多執行緒。

      一:單例項變成多例項,但過時了,因為耗費資源多,伺服器壓力大。

      二:加執行緒鎖,但資料會重複出現(沒有同步機制),且執行效率低。

      三:解決執行緒安全問題的最佳辦法:不要寫全域性變數,而寫區域性變數(即改變變數的作用域)。

五、ServletContext物件(重要)

    ServletContext:代表的是整個應用。一個應用只有一個ServletContext物件。單例項。

一個專案只有一個ServletContext物件,伺服器會為每個應用建立一個ServletContext物件,我們可以在N多個Servlet中來獲取這個唯一的物件,使用它可以給多個Servlet傳遞資料,與Tomcat同生同死。

  • ServletContext物件的建立是在伺服器啟動時完成的
  • ServletContext物件的銷燬是在伺服器關閉時完成的。

ServletContext物件的作用是在整個Web應用的動態資源直接共享資料。例如在AServlet中向ServletContext物件中儲存一個值,然後在BServlet中就可以獲取這個值,這就是資料共享。

1、獲取ServletContext

在Servlet中獲取ServletContext物件:

在void init(ServletConfig config)中:

ServletContext context = config.getServletContext();

public class DemoServlet implements Servlet {
 
  public void init(ServletConfig config) throws ServletException {
 
    ServletContext context = config.getServletContext();
 
  }
 
}

GenericServlet類有getServletContext()方法,所以可以直接使用this.getServletContext()類獲取。在GenericServlet或HttpServlet中獲取ServletContext物件:

public class HttpServletDemo extends HttpServlet {
 
  @Override
 
  protected void doPost(HttpServletRequest req,HttpServletResponse resp)
 
      throws ServletException,IOException {
 
    ServletContext context = this.getServletContext();
 
  }
 
}
 

HttpSession中也可以通過getServletContext()方法來獲得

2、域物件的功能

ServletContext是JavaWeb四大域物件之一:

  • PageContext
  • ServletRequest
  • HttpSession
  • ServletContext

所有域物件都是有存取資料的功能,因為域物件內部有一個Map,用來儲存資料,下面是ServletContext物件用來操作資料的方法:

void setAttribute(String name,Object val):用來儲存一個物件,也可以成為儲存一個域,引數分別為域的屬性名和屬性值,如果多次呼叫該方法,並且使用相同的name,那麼就會覆蓋上一次的值,這一特性與Map相似。Object getAttribute(String name):用來獲取ServletContext中的資料,當前在獲取之前需要先儲存。void removeAttribute(String name):用來移除ServletContext中的域屬性,如果引數name不存在,那麼該方法什麼都不做。Enumeration getAttributeNames():獲取所有域屬性的名稱。

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

2.獲取全域性配置資訊:

 方法:public String getInitParamenter(String name)// 根據配置檔案中的key得到value

3、讀取簡單的資原始檔(即只包含key=value的形式):

  方法:public StringgetRealPath(Stringpath)//根據資源名稱得到資源的絕對路徑,可以得到當前應用任何位置的任何資源。

public class AServlet extends HttpServlet {
  public void doGet(HttpServletRequest request,HttpServletResponse response)
      throws ServletException,IOException {
 
    //獲取帶有碟符的路徑
    String path = this.getServletContext().getRealPath("/a.txt");
     
    //獲取資源路徑後,再獲取輸入流物件
    InputStream is = this.getServletContext().getResourceAsStream("/a.txt");
     
    //獲取當前路徑下的所有資源路徑
    Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");
     
  }
}

4、Servlet的轉發與重定向

轉發和重定向都能讓瀏覽器獲得另外一個URL所指向的資源,但兩者的內部執行機制有著很大的區別。

1、轉發:有兩種方式獲得轉發物件(RequestDispatcher):一種是通過HttpServletRequest的getRequestDispatcher()方法獲得,一種是通過ServletContext的getRequestDispatcher()方法獲得;

以前的request範圍中存放的變數不會失效,就像把兩個頁面拼到了一起。 例如:

request.getRequestDispatcher (“demo.jsp"). forward(request,response);//轉發到demo.jsp

詳解:假設瀏覽器訪問servlet1,而servlet1想讓servlet2為客戶端服務。此時servlet1呼叫forward()方法,將請求轉發給servlet2。但是呼叫forward()方法,對於瀏覽器來說是透明的,瀏覽器並不知道為其服務的Servlet已經換成Servlet2,它只知道發出了一個請求,獲得了一個響應。瀏覽器URL的位址列不變。

2、重定向:HttpServletResponse的sendRedirect()方法。

伺服器根據此請求尋找資源併發送給客戶,它可以重定向到任意URL,不能共享request範圍內的資料。例如:response.sendRedirect(“demo.jsp");//重定向到demo.jsp

詳解:假設瀏覽器訪問servlet1,而servlet1想讓servlet2為客戶端服務。此時servlet1呼叫sendRedirect()方法,將客戶端的請求重新定向到Servlet2。接著瀏覽器訪問servlet2,servlet2對客戶端請求作出反應。瀏覽器URL的位址列改變。

3、主要區別:

(1)sendRedirect()方法不但可以在位於同一個主機上的不同Web應用程式之間進行重定向,而且可以將客戶端重定向到其他伺服器上的Web應用程式資源。而forward()方法只能將請求轉發給同一Web應用的元件。

(2)sendRedirect()方法不能轉發到“/WEB-INF/”路徑下的jsp頁面資源,而getRequestDispatcher().forword()可以重定向到“/WEB-INF/”路徑下的jsp頁面資源。如request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);

(3)轉發:瀏覽器URL的位址列不變。

重定向:瀏覽器URL的位址列改變。

5、實現Servlet的請求轉發:

    方法:public RequestDispatchergetRequestDispatcher(String path)//引數表示要跳轉到哪去

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

Servlet開發JavaWeb工程示例詳解

6、依賴和關聯

  如果是通過引數傳過來的物件,就叫依賴。

  通過方法得到的物件,就叫關聯。

Servlet開發JavaWeb工程示例詳解

六、HTTP請求與響應

1、HTTP請求常用方法

Cookie[] getCookies()
返回一個數組,包含客戶端傳送該請求的所有的 Cookie 物件。

Enumeration getAttributeNames()
返回一個列舉,包含提供給該請求可用的屬性名稱。

HttpSession getSession()
返回與該請求關聯的當前 session 會話,或者如果請求沒有 session 會話,則建立一個。

HttpSession getSession(boolean create)
返回與該請求關聯的當前 HttpSession,或者如果沒有當前會話,且建立是真的,則返回一個新的 session 會話。

String getRequestedSessionId()
返回由客戶端指定的 session 會話 ID。

Object getAttribute(String name)
以物件形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。

String getCharacterEncoding()
返回請求主體中使用的字元編碼的名稱。

String getContentType()
返回請求主體的 MIME 型別,如果不知道型別則返回 null。

String getContextPath()
返回指示請求上下文的請求 URI 部分。

String getQueryString()
返回包含在路徑後的請求 URL 中的查詢字串。

String getRemoteUser()
如果使用者已通過身份驗證,則返回發出請求的登入使用者,或者如果使用者未通過身份驗證,則返回 null。

int getParameterMap()
將引數封裝成 Map 型別。

2、設定HTTP響應頭的方法

void reset()
清除緩衝區中存在的任何資料,包括狀態碼和頭。

void resetBuffer()
清除響應中基礎緩衝區的內容,不清除狀態碼和頭。

void setCharacterEncoding(String charset)
設定被髮送到客戶端的響應的字元編碼(MIME 字符集)例如,UTF-8。

void setStatus(int sc)
為該響應設定狀態碼。

void setIntHeader(String name,int value)
設定一個帶有給定的名稱和整數值的響應報頭。

HTTP Header 響應例項:

//匯入必需的 java 庫
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/Refresh")
//擴充套件 HttpServlet 類
public class Refresh extends HttpServlet {
  // 處理 GET 方法請求的方法
   public void doGet(HttpServletRequest request,HttpServletResponse response)
        throws ServletException,IOException
   {
     // 設定重新整理自動載入時間為 5 秒
     response.setIntHeader("Refresh",5);
     // 設定響應內容型別
     response.setContentType("text/html;charset=UTF-8");
     
     //使用預設時區和語言環境獲得一個日曆 
     Calendar cale = Calendar.getInstance(); 
     //將Calendar型別轉換成Date型別 
     Date tasktime=cale.getTime(); 
     //設定日期輸出的格式 
     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     //格式化輸出 
     String nowTime = df.format(tasktime);
     PrintWriter out = response.getWriter();
     String title = "自動重新整理 Header 設定 - 菜鳥教程例項";
     String docType =
     "<!DOCTYPE html>\n";
     out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n"+
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + title + "</h1>\n" +
      "<p>當前時間是:" + nowTime + "</p>\n");
   }
   // 處理 POST 方法請求的方法
   public void doPost(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException {
     doGet(request,response);
   }
}

  以上測試例項是位於 TomcatTest 專案下,對應的 web.xml 配置為:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
 <servlet> 
   <!-- 類名 --> 
  <servlet-name>Refresh</servlet-name> 
  <!-- 所在的包 --> 
  <servlet-class>com.runoob.test.Refresh</servlet-class> 
 </servlet> 
 <servlet-mapping> 
  <servlet-name>Refresh</servlet-name> 同上面的類名
  <!-- 訪問的網址 --> 
  <url-pattern>/TomcatTest/Refresh</url-pattern> 
  </servlet-mapping> 
</web-app>

現在,呼叫上面的 Servlet,每隔 5 秒會顯示當前系統時間。

3、HTTP狀態碼

404:伺服器無法找到所請求的頁面。

403:禁止訪問所請求的頁面。

401:所請求的頁面需要使用者名稱和密碼。

405:在請求中指定的方法是不允許的。

307:所請求的頁面已經臨時轉移到一個新的 URL。

500:未完成的請求。伺服器遇到了一個意外的情況。

  下面的方法可用於在 Servlet 程式中設定 HTTP 狀態碼。這些方法通過HttpServletResponse物件可用。

public void setStatus ( int statusCode )
該方法設定一個任意的狀態碼。setStatus 方法接受一個 int(狀態碼)作為引數。如果您的反應包含了一個特殊的狀態碼和文件,請確保在使用PrintWriter實際返回任何內容之前呼叫 setStatus。

public void sendError(int code,String message)
該方法傳送一個狀態碼(通常為 404),連同一個在 HTML 文件內部自動格式化併發送到客戶端的短訊息。

// 設定錯誤程式碼和原因
response.sendError(407,"Need authentication!!!" );

4、Servlet介面&訪問方式介紹

  Servlet是實現了javax.servlet.Servlet介面的類,這個介面規定了特定的方法來處理特定的請求,我們只需要實現Servlet相關的方法,Servlet規範是建立在HTTP協議上的,http1.1規範支援OPTIONS/GET/POST/HEAD/PUT/DELETE/TRACE等7種訪問方式。下面我們重點介紹Get/Post。

1、GET:表示查詢資訊,URL中附帶少量引數資訊,URL總長度不超過255個字元,引數還會在瀏覽器的位址列中顯示

2、POST:表示提交資訊,一般用於提交大資料資訊或者檔案,提交的內容不收長度限制,也不會在位址列中顯示。

3、HEAD:表示查詢文件頭資訊,伺服器返回的檔案型別,長度,最後修改時間等等,該方式較少使用。

4、OPTIONS /PUT /DELETE /TRACE:是被聲明瞭但還沒有被使用web訪問方式,幾乎不用。

到此這篇關於Servlet開發JavaWeb工程示例詳解的文章就介紹到這了,更多相關Servlet開發JavaWeb內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!