【Java Web初級系列教程】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.jsphttp:// - 這部分是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基礎知識看完。