1. 程式人生 > >JavaWEB中web.xml和servlet不得不說的祕密。

JavaWEB中web.xml和servlet不得不說的祕密。

上班兩年多,今天突然溫習一下基礎知識,發現已經忘記很多,細思極恐,趕快重新練習下,記錄在CSDN也希望能幫助到各位小夥伴。

  1. 建立web專案
    我這邊使用的是Eclipse,不多說話,我堅信用圖比文字更直觀!
    選擇File然後再點選二級選單中的Other。
    建立WEB專案
    選擇Dynamic Web project。
    選擇Dynamic Web project
    輸入專案名稱。然後點選next
    專案名稱
    如果不更改路徑,就直接點選next
    更改路徑
    這裡如果打上勾就會自動建立XML,以及上面的Content directory 這裡可以根據個人喜好改WebRoot,然後點選finish就建立成功了。
    建立XML

    完整的WEB基礎專案結構是這樣的
    專案結構
  2. XML各元素解析
    初始的WEB.XML裡面包括了:xmlns:xsi(xml遵循的標籤規範),xmlns(XML名稱空間)等等,具體自行百度。
    webxml
    icon icon元素:指出IDE和GUI工具用來表示Web應用的一個和兩個影象檔案的位置。
    display-name display-name元素:提供GUI工具可能會用來標記這個特定的Web應用的一個名稱。
    description description元素:給出與此有關的說明性文字。
    context-param context-param元素:宣告應用範圍內的初始化引數。
    filter 過濾器元素:將一個名字與一個實現javax.servlet.Filter介面的類相關聯。
    filter-mapping :一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。
    listener servlet API:的版本2.3增加了對事件監聽程式的支援,事件監聽程式在建立、修改和刪除會話或servlet環境時得到通知。Listener元素指出事件監聽程式類。
    servlet :在向servlet或JSP頁面制定初始化引數或定製URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。
    servlet-mapping :伺服器一般為servlet提供一個預設的URL:
    http://localhost/web/servlet/ServletName
    。但是,常常會更改這個URL,以便servlet可以訪問初始化引數或更容易地處理相對URL。在更改預設URL時,使用servlet-mapping元素。
    session-config :如果某個會話在一定時間內未被訪問,伺服器可以拋棄它以節省記憶體。可通過使用HttpSession的setMaxInactiveInterval方法明確設定單個會話物件的超時值,或者可利用session-config元素制定預設超時值。
    mime-mapping :如果Web應用具有想到特殊的檔案,希望能保證給他們分配特定的MIME型別,則mime-mapping元素提供這種保證。
    welcom-file-list welcome-file-list元素:指示伺服器在收到引用一個目錄名而不是檔名的URL時,使用哪個檔案。
    error-page error-page元素:使得在返回特定HTTP狀態程式碼時,或者特定型別的異常被丟擲時,能夠制定將要顯示的頁面。
    taglib taglib元素:對標記庫描述符檔案(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD檔案的位置,而不用編輯使用這些檔案的JSP頁面。
    resource-env-ref resource-env-ref元素:宣告與資源相關的一個管理物件。
    resource-ref resource-ref元素:宣告一個資源工廠使用的外部資源。
    security-constraint security-constraint元素:制定應該保護的URL。它與login-config元素聯合使用
    login-config :用login-config元素來指定伺服器應該怎樣給試圖訪問受保護頁面的使用者授權。它與sercurity-constraint元素聯合使用。
    lsecurity-role security-role元素:給出安全形色的一個列表,這些角色將出現在servlet元素內的security-role-ref元素的role-name子元素中。分別地宣告角色可使高階IDE處理安全資訊更為容易。
    lenv-entry env-entry元素:宣告Web應用的環境項。
    ejb-ref ejb-ref元素:宣告一個EJB的主目錄的引用。
    ejb-local-ref ejb-local-ref元素:宣告一個EJB的本地主目錄的應用。
    以上的列表給出了所有可直接出現在web-app元素內的合法元素所必需的次序。例如,此列表說明servlet元素必須出現在所有servlet-mapping元素之前。請注意,所有這些元素都是可選的。因此,可以省略掉某一元素,但不能把它放於不正確的位置。另外需要注意的是:XML 元素不僅是大小寫敏感的,而且它們還對出現在其他元素中的次序敏感。例如,XML頭必須是檔案中的第一項,DOCTYPE宣告必須是第二項,而web- app元素必須是第三項。在web-app元素內,元素的次序也很重要。伺服器不一定強制要求這種次序,但它們允許(實際上有些伺服器就是這樣做的)完全拒絕執行含有次序不正確的元素的Web應用。這表示使用非標準元素次序的web.xml檔案是不可移植的。
  3. web.xml和servlet互動
    上面說了那麼多,本遍的主題終於到了。廢話不多說,最簡單的表達方式
 <servlet>  
        <servlet-name>
        HelloServlet
        </servlet-name>
        <servlet-class>
            com.ruitu.firstweb.HelloServlet
        </servlet-class>
  </servlet>
  <servlet-mapping>
        <servlet-name>
            HelloServlet
        </servlet-name>
    <url-pattern>
        /servlet/HelloServlet
    </url-pattern>
/*以下是註釋*/
   <servlet></servlet>指明瞭Servlet類路徑以及名稱。
   <servlet-mapping></srvlet-mapping>指明瞭訪問制定名稱的Servlet的URL。
   例如,程式碼行<url-pattern>/servlet/HelloServlet</url-pattern>指明瞭訪問該Servlet的路徑為:http://localhost:8080/firstWeb/servlet/HelloServlet(路徑中“/firstWeb“為該web應用程式的名稱)

配置好了上面的程式碼,我們開始書寫java程式碼:

package com.ruitu.firstweb;

import java.io.IOException;
import java.io.PipedWriter;
import java.io.PrintWriter;

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 HelloServlet
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        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
        response.setCharacterEncoding("utf-8");//設定字符集為utf-8
        request.setCharacterEncoding("utf-8");//設定字符集為utf-8
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();//獲得out物件
        //輸出到客戶端瀏覽器
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8 \">");
        out.println("<HEAD> <TITLE> 這是第一個</TITLE></HEAD>");
        out.println("<BODY>");
        String requestURL =request.getRequestURI();
        out.println("<form action=' "+requestURL+" ' method='post'>");
        out.println("請輸入你的名字:<input type='text' name='name' />");
        out.println("<input type='submit'/>");
        out.println("</from>");
        out.println("");
        String name =request.getParameter("name");
        if(name != null && name.trim().length() > 0 ){

            out.println("您好,<b>"+name+"</b>.歡迎來到Java web的世界。");

        }
        out.println("</BODY>");
        out.println("</html>");
        out.flush();
        out.close();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

這只是一個簡單的前端請求Servlet。實現的結果就是
這裡寫圖片描述
這裡寫圖片描述