1. 程式人生 > >【Java Web初級系列教程】Web基礎知識

【Java Web初級系列教程】Web基礎知識

前言:剛上手Java Web的時候,想尋找好一點的網上教程,發現網上資源魚龍混雜,框架滿天飛,對於新手剛開始就希望從基礎的原理性的開始一步步瞭解,索性自己蒐集材料開始寫。

      本系列教程專門為Java Web初級開發者設計,階梯式的循序漸進,沒有用到任何框架,都是基礎篇,一步步帶你揭開Java Web應用的面紗,這是第一篇。

       背景說明

            任何事物的產生都是有原因的,為什麼會有Java Web應用程式呢?

            話說女媧補石、盤古開天闢地。。算了,不扯蛋了,認真講,Java Web應用程式解決了一件事:建立可互動的動態網頁。為什麼這麼說?如果你想建立一個靜態網頁,用HTML就可以了,不用建立Java Web應用,HTML是超文字標記語言,直接存在伺服器上,一個URL定位到HTML檔案就好了,但是要想產生動態互動,你就需要Java Web應用。Java Web應用呢,就是通過Servlet和JSP來實現動態互動的。好,大家暫且先記住:1.Java Web是用來建立動態網頁的;2.Java Web通過Servlet和JSP來建立動態網頁。後面我會慢慢解釋。

     目錄:

           1.Web伺服器和客戶端

           2.HTML和HTTP

           3.URL

           4.為什麼是Servlet和JSP?

           5.通過Servlet和JSP實現的第一個Web應用(***)

           6.Web容器

           7.Web應用目錄結構

           8.釋出描述Web.xml

  1.Web伺服器和客戶端  

Web伺服器說白了就是個軟體,這個軟體能夠處理來自客戶端的請求,能夠將客戶端想要的東西發給客戶端。就是這麼地簡單,例如:Apache就是用的很廣泛的Web伺服器,伺服器軟體是執行在物理機上的,同時一直監聽著某個埠,這個埠就是客戶端傳送資料過來的入口。

         客戶端就更簡單了,瀏覽器就是我們最常用的客戶端軟體,Chrome、Safari、火狐等等。客戶端的作用就是將我們的請求發給伺服器,最常見的比如通過URL(瀏覽器位址列輸入網址),然後將伺服器傳送回來的資料解析後展現出來,方便我們看,我們現在看到的網頁都是瀏覽器解析後展現出來的。

  2.HTML和HTTP

     有了Web伺服器和客戶端,他們需要交流互動啊!這二個是不同的軟體,就好像是二個不同國家的人,他們之間怎麼溝通呢?這個時候就需要一種互相都能理解的語言,對二個不同國家的人,通用的語言就是英語,對於Web伺服器和客戶端,通用的語言就是HTML(HyperText Markup Language)超文字標記語言,比簡單文字說的多就叫“超文字”,那這二個人約定好語言之後,又有了新的問題,他們不站在一起,一個在中國,一個在美國,怎麼溝通呢?客戶端和伺服器也是一樣,約定好語言之後,還需要一套協議,定義好誰先開始講話,說什麼話,另一個人應該怎麼迴應?那這套講話的標準就是HTTP,HTTP就規定了客戶端先開始講話,先說的內容包括:HTTP Method、URL等等,告訴伺服器我想通過什麼樣的方法(get/post)從你這取什麼資料(URL),下面是一個客戶端請求的例子:
GET /FirstServletProject/jsps/hello.jsp HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache
伺服器接收到通過HTTP講話方式講的話之後,也通過HTTP方式迴應客戶端,包括有:狀態碼、日期、伺服器型別、內容長度、內容型別等,例子如下:
200 OK
Date: Wed, 07 Aug 2013 19:55:50 GMT
Server: Apache-Coyote/1.1
Content-Length: 309
Content-Type: text/html;charset=US-ASCII

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=Wed Aug 07 12:57:55 PDT 2013
</h3>
</body>
</html>
注意,伺服器按照HTTP方式在迴應客戶端時候,有一項
Content-Type: text/html;charset=US-ASCII
“Content-Type”是告訴客戶端我講的是什麼型別的話,chartset就是話的規範,就好像說我用的美式英語跟你講的,伺服器你要注意切換一下聽的方式。

3.URL

   URL是Universal Resource Locator (通用資源定位符),URL就是用來定位伺服器上資源的。伺服器上的每一個資源都有它唯一的地址,URL就是找到它的線路。讓我們看一條URL: http://localhost:8080/FirstServletProject/jsps/hello.jsp
http://  - 這部分是URL的第一部分,就是我們上面說的伺服器和客戶端溝通的標準(協議); localhost  -這部分是伺服器的標識,很多時候是IP地址或者域名,域名(例如www.baidu.com)最後也會被DNS(域名解析服務)轉成IP,是用來定位資源在哪臺伺服器的。
8080 -這個也是我們上面提到過的Web伺服器會監聽一個網路埠,看這個埠是否有資料進來,這個埠是可選的,如果我們不提供的話,客戶端的請求資料會根據使用的協議進預設的埠(HTTP協議是80,HTTPS是443,FTP是21),這些提前規定好的埠0-1023是系統保留埠。
FirstServletProject/jsps/hello.jsp  -這個就是被請求的資源。他可以是靜態的資源,例如html、pdf,也可以是動態的,例如JSP、Servlet、PHP等。

4.為什麼是Servlet和JSP?

    對於HTML,伺服器處理起來很簡單,靜態的資源,你客戶端請求我就直接給你,不用做任何複雜操作,但是在生成動態內容和資料持久化(把資料儲存下來)上有問題,比如你在頁面上選了個商品,想直接檢視商品詳情,如果是靜態的你需要用另一個URL去檢視商品詳情,伺服器不能動態根據你的操作動態給你反饋,這個是動態的問題,那還有你精心編輯好的微博傳送到後臺,後臺也沒法給你存下來(因為後臺沒有處理程式,都是靜態的HTML),這個是持久化的問題,Servlet和JSPs就是幹動態和持久化的,他們擴充套件了伺服器的功能,為動態資料更新和資料持久化提供了支援。

5.通過Servlet和JSP實現的第一個Web應用

     接下來是重頭戲,我會用MyEclipse和Tomcat構建我們第一個Demo。因為Servlet是服務端技術,我們需要Web容器來支援Servlet執行,這裡我們用Apache Tomcat充當Web容器。Tomcat很容易裝,這部分工作留給你自己。

在MyEclipse 中點選File->New->Web Project  輸入“MyFirstServlet”建立新的Web應用程式,如下圖


建立好之後點選工程,右鍵New Servlet,如下圖所示:


       現在我們在doGet()方法內新增一些動態資料程式碼,我們第一個Servlet就像下面這樣:

package com.jige.first;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
		description = "My First Servlet", 
		urlPatterns = { "/FirstServlet" , "/FirstServlet.do"},
		initParams = {
			@WebInitParam (name="id",value="1"),
			@WebInitParam(name="name",value="Jack")
		}
)
public class FirstServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	public static final String HTML_START="<html><body>";
	public static final String HTML_END="</body></html>";
	
	public FirstServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); 
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		Date date = new Date();
		out.println(HTML_START + "<h2>Hi There!</h2><br/><h3>Date="+date +"</h3>"+HTML_END);
	}

	public void init() throws ServletException {
		// Put your code here
	}

}
這裡要說的一點是在Servlet 3之前,我們需要在應用部署描述(web.xml)檔案中提供Servlet宣告和對映,但是Servlet 3使用java annotations告訴Servlet Container(Apache)這是一個Servlet,既簡單又容易維護。

我們點右鍵,執行  Run As->MyEclipse Server,在瀏覽器輸入地址http://localhost:8080/MyFirstServlet/FirstServlet,效果如下:


你可以重新整理網頁,資料是動態變化的。

因此Servlet這裡就是用來生成HTML,並返回給response物件,容器將response返回給客戶端。通過Servlet建立動態網頁很簡單,但是也很容易出錯,遇到大資料量更是如此(你想啊,你用Java寫html,估計沒幾個人會這麼做吧!),因此就有了JSP,JSP語法結構上和HTML類似,只是添加了我們需要的動態內容。

JSP很容易看懂,長得像HTML嘛。那下面我們通過JSP實現剛才的效果:

<%@page import="java.util.Date" %>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>hello</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
    <h2>Hi There!</h2> <br>
    <h3>Date=<%= new Date() %>
  </body>
</html>
實現後效果一樣。後面我會更詳細的介紹Servlet和JSP,現在我們先還是把Java Web基礎知識看完。

6.Web容器

Tomcat是個Web容器,它處理來自客戶端的請求。具體流程是這樣的,當請求過來的時候,如果這個請求是請求servlet的,web容器會建立二個物件HTTPServletRequest and HTTPServletResponse,然後,根據請求的URL找到對應的Servlet,為這個請求建立一個執行緒,然後呼叫Servlet的service()方法,在service()方法基礎上呼叫doGet()和doPost()方法,Servlet doGet()和doPost()生成動態網頁然後將它傳遞給response。一旦servlet執行緒完成,容器將response發給客戶端。 Web容器幾個核心功能:       1.通訊支援  - 容器提供了Web伺服器和Servlet/JSP之間最簡單的溝通方式,因為容器的存在,我們不需要自己寫一個程式去監聽伺服器埠(就像上面說的HTTP:80),也不需要自己解析來自客戶端HTTP請求,生成發給客戶端的HTTP應答內容,這些工作容器都給做好了,我們只需要關係核心業務邏輯的實現;       2.生命週期和資源管理 - 容器來負責管理Servlet的生命週期。容器建立執行緒,將Servlet載入到記憶體,呼叫Servlet的方法,銷燬它們,不需要程式開發者自己維護Servlet的生命週期。容器還提供了像JNDI來實現資源池的管理。       3.多執行緒的支援 - 容器為每一個到Servlet的請求建立一個執行緒,當處理完請求後結束執行緒。容器不會為每一個請求建立一個Servlet,因此Servlet是共用的,在Servlet中應當注意共享資源的同步問題,以及資源的死鎖,這個後面會講到。       4.JSP的支援  - JSP不像一般的Java 類一樣,容器會將每一個JSP編譯成Servlet,然後容器會像管理其他Servlet一樣管理JSP編譯成的Servlet。       5.其他任務  - 容器還提供了資源池管理、記憶體優化、垃圾回收、安全配置、多個應用支援、熱部署和幕後的任務等等。

 7.Web應用目錄結構

      Java Web應用可以被打包成Web Archive(WAR),它有一個定義好的結構。你可以把上面寫的應用程式匯出成War包,然後解壓檢查目錄。目錄結構如下:

8.釋出描述Web.xml

        web.xml檔案是Web容器的部署描述,同時包含了servlets的對映(在3.0之前),歡迎首頁,安全配置,session timeout配置等等,這些我會在系列教程的後面講到。 嗯嗯嗯,最後的話,機哥留個QQ:493967121  歡迎Java Web開發工程師互相學習交流。