JavaWEB中web.xml和servlet不得不說的祕密。
阿新 • • 發佈:2019-02-03
上班兩年多,今天突然溫習一下基礎知識,發現已經忘記很多,細思極恐,趕快重新練習下,記錄在CSDN也希望能幫助到各位小夥伴。
- 建立web專案
我這邊使用的是Eclipse,不多說話,我堅信用圖比文字更直觀!
選擇File然後再點選二級選單中的Other。
選擇Dynamic Web project。
輸入專案名稱。然後點選next
如果不更改路徑,就直接點選next
這裡如果打上勾就會自動建立XML,以及上面的Content directory 這裡可以根據個人喜好改WebRoot,然後點選finish就建立成功了。
完整的WEB基礎專案結構是這樣的
- XML各元素解析
初始的WEB.XML裡面包括了:xmlns:xsi(xml遵循的標籤規範),xmlns(XML名稱空間)等等,具體自行百度。
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:
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檔案是不可移植的。 - 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。實現的結果就是