我們在瀏覽網頁的時候,經常需要向服務器提交信息,并讓后臺程序處理。瀏覽器中使用 GET 和 POST 方法向服務器提交數據。
GET 方法
GET方法將請求的編碼信息添加在網址后面,網址與編碼信息通過"?"號分隔。如下所示:
http://www.runoob.com/hello?key1=value1&key2=value2
GET方法是瀏覽器默認傳遞參數的方法,一些敏感信息,如密碼等建議不使用GET方法。
用get時,傳輸數據的大小有限制 (注意不是參數的個數有限制),最大為1024字節。
POST 方法
一些敏感信息,如密碼等我們可以通過POST方法傳遞,POST提交數據是隱式的。
POST提交數據是不可見的,GET是通過在url里面傳遞的(可以看一下你瀏覽器的地址欄)。
JSP使用getParameter()來獲得傳遞的參數,getInputStream()方法用來處理客戶端的二進制數據流的請求。
JSP 讀取表單數據
getParameter(): 使用 request.getParameter() 方法來獲取表單參數的值。
getParameterValues(): 獲得如checkbox類(名字相同,但值有多個)的數據。 接收數組變量 ,如checkbox類型
getParameterNames():該方法可以取得所有變量的名稱,該方法返回一個Emumeration。
getInputStream():調用此方法來讀取來自客戶端的二進制數據流。
使用URL的 GET 方法實例
以下是一個簡單的URL,并使用GET方法來傳遞URL中的參數:
http://localhost:8080/testjsp/main.jsp?name=菜鳥教程&url=http://ww.runoob.com
testjsp 為項目地址。
以下是 main.jsp 文件的JSP程序用于處理客戶端提交的表單數據,我們使用getParameter()方法來獲取提交的數據:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<h1>使用 GET 方法讀取數據</h1>
<ul>
<li><p><b>站點名:</b>
<%= request.getParameter("name")%>
</p></li>
<li><p><b>網址:</b>
<%= request.getParameter("url")%>
</p></li>
</ul>
</body>
</html>
接下來我們通過瀏覽器訪問 http://localhost:8080/testjsp/main.jsp?name=菜鳥教程&url=http://ww.runoob.com 輸出結果如下所示:
使用表單的 GET 方法實例
以下是一個簡單的 HTML 表單,該表單通過GET方法將客戶端數據提交 到 main.jsp 文件中:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<form action="main.jsp" method="GET">
站點名: <input type="text" name="name">
<br />
網址: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
將以上HTML代碼保存到test.htm文件中。 將該文件放置于當前jsp項目的 WebContent 目錄下(與 main.jsp 同一個目錄)。
通過訪問 http://localhost:8080/testjsp/test.html 提交表單數據到 main.jsp 文件,演示 Gif 圖如下所示:
在 "站點名" 與 "網址" 兩個表單中填入信息,并點擊 "提交" 按鈕,它將輸出結果。
使用表單的 POST 方法實例
接下來讓我們使用POST方法來傳遞表單數據,修改main.jsp與Hello.htm文件代碼,如下所示:
main.jsp文件代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<h1>使用 POST 方法讀取數據</h1>
<ul>
<li><p><b>站點名:</b>
<%
// 解決中文亂碼的問題
String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8");
%>
<%=name%>
</p></li>
<li><p><b>網址:</b>
<%= request.getParameter("url")%>
</p></li>
</ul>
</body>
</html>
代碼中我們使用 new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8")來轉換編碼,防止中文亂碼的發生。
以下是test.htm修改后的代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<form action="main.jsp" method="POST">
站點名: <input type="text" name="name">
<br />
網址: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
通過訪問 http://localhost:8080/testjsp/test.html 提交表單數據到 main.jsp 文件,演示 Gif 圖如下所示:
傳遞 Checkbox 數據到JSP程序
復選框 checkbox 可以傳遞一個甚至多個數據。
以下是一個簡單的HTML代碼,并將代碼保存在test.htm文件中:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<form action="main.jsp" method="POST" target="_blank">
<input type="checkbox" name="google" checked="checked" /> Google
<input type="checkbox" name="runoob" /> 菜鳥教程
<input type="checkbox" name="taobao" checked="checked" />
淘寶
<input type="submit" value="選擇網站" />
</form>
</body>
</html>
以上代碼在瀏覽器訪問如下所示:
以下為main.jsp文件代碼,用于處理復選框數據:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<h1>從復選框中讀取數據</h1>
<ul>
<li><p><b>Google 是否選中:</b>
<%= request.getParameter("google")%>
</p></li>
<li><p><b>菜鳥教程是否選中:</b>
<%= request.getParameter("runoob")%>
</p></li>
<li><p><b>淘寶是否選中:</b>
<%= request.getParameter("taobao")%>
</p></li>
</ul>
</body>
</html>
通過訪問 http://localhost:8080/testjsp/test.html 提交表單數據到 main.jsp 文件,演示 Gif 圖如下所示:
讀取所有表單參數
以下我們將使用 HttpServletRequest 的 getParameterNames() 來讀取所有表單參數,該方法可以取得所有變量的名稱,該方法返回一個枚舉。
一旦我們有了一個 Enumeration(枚舉),我們就可以調用 hasMoreElements() 方法來確定是否還有元素,以及使用nextElement()方法來獲得每個參數的名稱。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<h1>讀取所有表單參數</h1>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>參數名</th><th>參數值</th>
</tr>
<%
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getParameter(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</body>
</html>
以下是test.htm文件的內容:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<form action="main.jsp" method="POST" target="_blank">
<input type="checkbox" name="google" checked="checked" /> Google
<input type="checkbox" name="runoob" /> 菜鳥教程
<input type="checkbox" name="taobao" checked="checked" />
淘寶
<input type="submit" value="選擇網站" />
</form>
</body>
</html>
現在我們通過瀏覽器訪問 test.htm 文件提交數據,輸出結果如下:
通過訪問 http://localhost:8080/testjsp/test.html 提交表單數據到 main.jsp 文件,演示 Gif 圖如下所示:
你可以嘗試使用以上的JSP代碼讀取其它對象,如文本框,單選按鈕或下拉框等等其他形式的數據。
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
自定義標簽是用戶定義的JSP語言元素。當JSP頁面包含一個自定義標簽時將被轉化為servlet,標簽轉化為對被 稱為tag handler的對象的操作,即當servlet執行時Web container調用那些操作。
JSP標簽擴展可以讓你創建新的標簽并且可以直接插入到一個JSP頁面。 JSP 2.0規范中引入Simple Tag Handlers來編寫這些自定義標記。
你可以繼承SimpleTagSupport類并重寫的doTag()方法來開發一個最簡單的自定義標簽。
創建"Hello"標簽
接下來,我們想創建一個自定義標簽叫作<ex:Hello>,標簽格式為:
<ex:Hello />
要創建自定義的JSP標簽,你首先必須創建處理標簽的Java類。所以,讓我們創建一個HelloTag類,如下所示:
package com.runoob;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}
以下代碼重寫了doTag()方法,方法中使用了getJspContext()方法來獲取當前的JspContext對象,并將"Hello Custom Tag!"傳遞給JspWriter對象。
編譯以上類,并將其復制到環境變量CLASSPATH目錄中。最后創建如下標簽庫:<Tomcat安裝目錄>webapps\ROOT\WEB-INF\custom.tld。
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.runoob.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
接下來,我們就可以在JSP文件中使用Hello標簽:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
以上程序輸出結果為:
Hello Custom Tag!
訪問標簽體
你可以像標準標簽庫一樣在標簽中包含消息內容。如我們要在我們自定義的Hello中包含內容,格式如下:
<ex:Hello>
This is message body
</ex:Hello>
我們可以修改標簽處理類文件,代碼如下:
package com.runoob;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException
{
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
接下來我們需要修改TLD文件,如下所示:
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.runoob.HelloTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
現在我們可以在JSP使用修改后的標簽,如下所示:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello>
This is message body
</ex:Hello>
</body>
</html>
以上程序輸出結果如下所示:
This is message body
自定義標簽屬性
你可以在自定義標準中設置各種屬性,要接收屬性,值自定義標簽類必須實現setter方法, JavaBean 中的setter方法如下所示:
package com.runoob;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String msg) {
this.message = msg;
}
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException
{
if (message != null) {
/* 從屬性中使用消息 */
JspWriter out = getJspContext().getOut();
out.println( message );
}
else {
/* 從內容體中使用消息 */
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
屬性的名稱是"message",所以setter方法是的setMessage()。現在讓我們在TLD文件中使用的<attribute>元素添加此屬性:
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.runoob.HelloTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
現在我們就可以在JSP文件中使用message屬性了,如下所示:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello message="This is custom tag" />
</body>
</html>
以上實例數據輸出結果為:
This is custom tag
你還可以包含以下屬性:
屬性 | 描述 |
---|---|
name | 定義屬性的名稱。每個標簽的是屬性名稱必須是唯一的。 |
required | 指定屬性是否是必須的或者可選的,如果設置為false為可選。 |
rtexprvalue | 聲明在運行表達式時,標簽屬性是否有效。 |
type | 定義該屬性的Java類類型 。默認指定為 String |
description | 描述信息 |
fragment | 如果聲明了該屬性,屬性值將被視為一個 JspFragment。 |
以下是指定相關的屬性實例:
.....
<attribute>
<name>attribute_name</name>
<required>false</required>
<type>java.util.Date</type>
<fragment>false</fragment>
</attribute>
.....
如果你使用了兩個屬性,修改TLD文件,如下所示:
.....
<attribute>
<name>attribute_name1</name>
<required>false</required>
<type>java.util.Boolean</type>
<fragment>false</fragment>
</attribute>
<attribute>
<name>attribute_name2</name>
<required>true</required>
<type>java.util.Date</type>
</attribute>
.....
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
言:在CGI(通用網關接口)編程風行的日子,人們紛紛尋思簡化并讓其更加靈活的新方法和新技術,包括PHP、JSP、ASP。1997年SUN公司推出了servlet,1999年初,SUN公司推出了JSP,實際上在servlet基礎上修改而成。JSP即Java服務器頁面(Java Server Page),將HTML和JAVA代碼使用某種方式結合起來,完成前后端的有效交互。本文通過JSP歷史回顧和應用總結來審視過去和開拓未來。
其實,從現在看來JSP依然極具魅力,據了解很多JSP老項目還在維護。下面使用STS作為IDE構建一個實例項目,先體驗其效果。
如下圖,使用new dynamic web project創建項目:
進入preferences修改JSP文件的編碼:
新增一個JSP文件到WebContent目錄,如下
然后檢查并修改編碼,應該都是UTF-8,如下圖:
如果不是,就修改。
選中項目名稱,點郵件菜單的Run as ...-->Run on server
之后出現如下界面:
若沒有現存的tomcat server,就自己加一個。點Finish。然后自動調用chrome,界面如下:
自動調用瀏覽器設置的地方是windows-->Web browser菜單:
(1)顯示ip地址:getRemoteAddr
(2)變量聲明<%! %>
(3)表達式<%=%>
語法 | 描述 |
<%-- 注釋 --%> | JSP注釋,注釋內容不會被發送至瀏覽器甚至不會被編譯 |
<!-- 注釋 --> | HTML注釋,通過瀏覽器查看網頁源代碼時可以看見注釋內容 |
<\% | 代表靜態 <%常量 |
%\> | 代表靜態 %> 常量 |
\' | 在屬性中使用的單引號 |
\" | 在屬性中使用的雙引號 |
指令 | 描述 |
<%@ page ... %> | 定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入標簽庫的定義,可以是自定義標簽 |
屬性 | 描述 |
buffer | 指定out對象使用緩沖區的大小 |
autoFlush | 控制out對象的 緩存區 |
contentType | 指定當前JSP頁面的MIME類型和字符編碼 |
errorPage | 指定當JSP頁面發生異常時需要轉向的錯誤處理頁面 |
isErrorPage | 指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面 |
extends | 指定servlet從哪一個類繼承 |
import | 導入要使用的Java類 |
info | 定義JSP頁面的描述信息 |
isThreadSafe | 指定對JSP頁面的訪問是否為線程安全 |
language | 定義JSP頁面所用的腳本語言,默認是Java |
session | 指定JSP頁面是否使用session |
isELIgnored | 指定是否執行EL表達式 |
isScriptingEnabled | 確定腳本元素能否被使用 |
行為標簽語法:<jsp:行為名稱 attribute="value" />
語法 | 描述 |
jsp:include | 用于在當前頁面中包含靜態或動態資源 |
jsp:useBean | 尋找和初始化一個JavaBean組件 |
jsp:setProperty | 設置 JavaBean組件的值 |
jsp:getProperty | 將 JavaBean組件的值插入到 output中 |
jsp:forward | 從一個JSP文件向另一個文件傳遞一個包含用戶請求的request對象 |
jsp:plugin | 用于在生成的HTML頁面中包含Applet和JavaBean對象 |
jsp:element | 動態創建一個XML元素 |
jsp:attribute | 定義動態創建的XML元素的屬性 |
jsp:body | 定義動態創建的XML元素的主體 |
jsp:text | 用于封裝模板數據 |
使用bean是最好用的行為標簽,例如,我們創建一個java類:
然后,在JSP中使用useBea/setProperty/getProperty三個行為標簽:
測試:
對象 | 描述 |
request | HttpServletRequest類的實例 |
response | HttpServletResponse類的實例 |
out | PrintWriter類的實例,用于把結果輸出至網頁上 |
session | HttpSession類的實例 |
application | ServletContext類的實例,與應用上下文有關 |
config | ServletConfig類的實例 |
pageContext | PageContext類的實例,提供對JSP頁面所有對象以及命名空間的訪問 |
page | 類似于Java類中的this關鍵字 |
Exception | Exception類的對象,代表發生錯誤的JSP頁面中對應的異常對象 |
判斷語句包括兩種:if else和switch case
示例如下:
循環語句包括兩種:for和while
示例如下:
類別 | 操作符 | 結合性 |
后綴 | () [] . (點運算符) | 左到右 |
一元 | ++ - - ! ~ | 右到左 |
可乘性 | * / % | 左到右 |
可加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
關系 | > >= < <= | 左到右 |
相等/不等 | == != | 左到右 |
位與 | & | 左到右 |
位異或 | ^ | 左到右 |
位或 | | | 左到右 |
邏輯與 | && | 左到右 |
邏輯或 | || | 左到右 |
條件判斷 | ?: | 右到左 |
賦值 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗號 | , | 左到右 |
布爾值(boolean):true 和 false;
整型(int):與 Java 中的一樣;
浮點型(float):與 Java 中的一樣;
字符串(string):以單引號或雙引號開始和結束;
Null:null。
以下提供一個例子來說明:
(1)創建FormProcess.jsp文件:
其中提供了兩個input輸入框。
(2)再創建FormProcessMain.jsp文件,如下:
其中使用request對象的getParameter方法來獲取Get參數。
JSP過濾器實際上和Servlet過濾器一樣。
以下通過示例來說明:
(1)在web.xml中增加一個過濾器:
(2)然后創建過濾器處理類com.hunting.LogFilter,如下:
(1)核心標簽:
標簽 | 描述 |
<c:out> | 用于在JSP中顯示數據,就像<%= ... > |
<c:set> | 用于保存數據 |
<c:remove> | 用于刪除數據 |
<c:catch> | 用來處理產生錯誤的異常狀況,并且將錯誤信息儲存起來 |
<c:if> | 與我們在一般程序中用的if一樣 |
<c:choose> | 本身只當做<c:when>和<c:otherwise>的父標簽 |
<c:when> | <c:choose>的子標簽,用來判斷條件是否成立 |
<c:otherwise> | <c:choose>的子標簽,接在<c:when>標簽后,當<c:when>標簽判斷為false時被執行 |
<c:import> | 檢索一個絕對或相對 URL,然后將其內容暴露給頁面 |
<c:forEach> | 基礎迭代標簽,接受多種集合類型 |
<c:forTokens> | 根據指定的分隔符來分隔內容并迭代輸出 |
<c:param> | 用來給包含或重定向的頁面傳遞參數 |
<c:redirect> | 重定向至一個新的URL. |
<c:url> | 使用可選的查詢參數來創造一個URL |
(2)格式化標簽:
標簽 | 描述 |
<fmt:formatNumber> | 使用指定的格式或精度格式化數字 |
<fmt:parseNumber> | 解析一個代表著數字,貨幣或百分比的字符串 |
<fmt:formatDate> | 使用指定的風格或模式格式化日期和時間 |
<fmt:parseDate> | 解析一個代表著日期或時間的字符串 |
<fmt:bundle> | 綁定資源 |
<fmt:setLocale> | 指定地區 |
<fmt:setBundle> | 綁定資源 |
<fmt:timeZone> | 指定時區 |
<fmt:setTimeZone> | 指定時區 |
<fmt:message> | 顯示資源配置文件信息 |
<fmt:requestEncoding> | 設置request的字符編碼 |
(3)SQL標簽:
標簽 | 描述 |
<sql:setDataSource> | 指定數據源 |
<sql:query> | 運行SQL查詢語句 |
<sql:update> | 運行SQL更新語句 |
<sql:param> | 將SQL語句中的參數設為指定值 |
<sql:dateParam> | 將SQL語句中的日期參數設為指定的java.util.Date 對象值 |
<sql:transaction> | 在共享數據庫連接中提供嵌套的數據庫行為元素,將所有語句以一個事務的形式來運行 |
(4)XML標簽:
標簽 | 描述 |
<x:out> | 與<%= ... >,類似,不過只用于XPath表達式 |
<x:parse> | 解析 XML 數據 |
<x:set> | 設置XPath表達式 |
<x:if> | 判斷XPath表達式,若為真,則執行本體中的內容,否則跳過本體 |
<x:forEach> | 迭代XML文檔中的節點 |
<x:choose> | <x:when>和<x:otherwise>的父標簽 |
<x:when> | <x:choose>的子標簽,用來進行條件判斷 |
<x:otherwise> | <x:choose>的子標簽,當<x:when>判斷為false時被執行 |
<x:transform> | 將XSL轉換應用在XML文檔中 |
<x:param> | 與<x:transform>共同使用,用于設置XSL樣式表 |
下面從前后端分離角度展現JSP的產生和發展脈絡。
1957年美國國防部(DoD)組建了高級研究計劃局(ARPA)。1961年7月,MIT工程師Leonard Kleinrock發表Information Flow in Large Communication Nets論文。1962年8月, MIT工程師J.C.R. Licklider和W. Clark發表On-Line Man Computer Communication論文。1967 2月,在ARPA IPTO PI會議上,Larry Roberts組織了有關ARPANET設計方案的討論。互聯網雛形ARPANET由此產生。
互聯網最初的目的是訪問和復制文件從一臺計算機到另一臺遠程計算機,兩臺計算機之間有網絡,但速度慢,而且經常專用于大學或者研究機構是昂貴的,不支持大規模用戶。1970年,ARPANET主機開始使用網絡控制協議(NCP),這就是后來的傳輸控制協議(TCP)的雛形。
人們基于TCP/IP構建了更快的網絡,其中應用層文件傳輸協議(FTP)規范提供了交換這些文件的標準方法。1973年,文件傳輸協議(FTP)推出,用于在異構系統之間交換文件。FTP傳輸的文件并不能有效查看,因此發明了超文本標記語言(HTML),使我們能夠在互聯網上看到文檔。
1989年蒂姆伯納斯-李寫了一份關于建立一個通過網絡傳輸超文本系統的報告,其中創建了單行 HTTP 協議,這個協議在1991年被命名為HTTP/0.9,萬維網由此產生,1996年超文本傳送協議HTTP 1.0發布。
盡管FTP可以傳輸HTML文件,但是并沒有提供有效小文件傳輸機制和無狀態管理能力,超文本傳輸協議(HTTP)才被發明出來專門用于傳輸HTML文檔,HTTP是一種無連接/無狀態協議,這使得許多短連接更加有效,而且可以不使用密碼就可以獲取HTML文檔,這讓萬維網真正到來,真正體現了互聯網的快捷、免費思維。
上面提到了TCP/IP,HTTP,FTP都是通信管道,后來大家把注意力轉向內容。我們感興趣的文件隨著IT技術的發展而快速爆發,例如數據庫快速發展導致各種應用系統快速發展。同時,數據的更新頻度更加快速,這種即時信息推動了互聯網流量快速增長。通過基于HTTP的HTML,最終用戶可以瀏覽位于遠程服務器上的文件。
當時,遠程服務器屬于局域網,局域網連接到互聯網需要專用設備,可惜的是這種專用設備并不好用(直到后來路由器和交換機被思科發明出來),因此通用網關接口(CGI)規范被制定出來,它允許Web服務器超越文件服務器并從內部數據庫中獲取數據,并動態更改HTML。
最初,CGI是在1993年由美國國家超級電腦應用中心(NCSA)為NCSA HTTPd Web服務器開發的,當年NCSA內部有一份簡單的CGI規范說明,后來在1997年Ken Coar領導的團隊制定了CGI1.1規范,并提交RFC。CGI規范是Web應用程序開發中的一個重大突破,確保了相同的CGI程序在不同的Web服務器上工作。
CGI成為傳遞動態內容的最常用手段。只是互聯網發展太快了,CGI的性能無法跟上,每個對CGI腳本的請求都會產生一個單獨的進程。這種設計讓CGI在高峰負載時也消耗大量資源。解決方案非常多,功能性和可伸縮性成為關鍵。
許多CGI替代者都采用服務器端編程技術來實現業務邏輯,包括ASP、ColdFusion、PHP和Perl等等,其中至今仍然在大量使用的是PHP ,PHP 繼承自一個老的工程,名叫 PHP/FI,PHP/FI 在 1995 年由 Rasmus Lerdorf 創建,最初只是一套簡單的 Perl 腳本,用來跟蹤訪問他主頁的人。然后,即使是PHP,最終由于可移植性和面向對象的編程設計,Java超越了PHP和其他CGI平臺。
Java自1991年誕生以來已經走過了很長的一段路,當時Sun公司推出了“綠色計劃”,試圖集成數字消費設備,如電視機、CD播放機和計算機。OAK(名字來自高斯林窗外的一棵橡樹!)誕生了,但直到出現HotJava和小程序,才開始活躍起來。1995年,Sun發布了開源Java,向微軟發起了挑戰,反響巨大。這促使Java深入到服務器端開發領域。
Sun在Java中加入了Internet功能,并在1997年6月發布了servlet接口。servlet以CGI替代為目標。與CGI為每個請求啟動一個進程不同,servlet使用更細粒度的線程在單個進程中運行。servlet采用了更有效的體系架構,能夠應對互聯網上的復雜情況。Java servlet為開發Java Web組件提供了基礎。servlet優點是每個額外的并發請求帶來的額外開銷非常小。
servlet技術需要真正的Java編程技能才能有效應用,外觀和良好體驗為web應用帶來了巨大方便,但是圖像支持還不是那么良好。于是Sun公司在1998年發布了JavaServer Pages (JSP),這來自于微軟ASP的啟發,也有些人說是復制的,它使得編寫動態HTML頁面變得容易。
使用JSP的使用非常簡單,有些工具(例如Dreamweaver)能讓非程序員來構建WWW網站前端頁面,當然要servlet帶動后端服務器代碼(例如javabean)才能完成完整的WWW網站構建工作,這樣構建的WWW網站具有模塊化、可維護、可伸縮和可移植優點,從而完成簡單網站到復雜Web應用程序的轉變,從而實現前后端分離。
JSP官方版本1.0和1.1都出現在1999年,都很受歡迎,版本1.2出現于2001年,是目前最流行的實現。
JSP終究還是含有Java代碼,前后端沒有徹底分離,因此人們在2009年發明了node-js,這讓前端開發人員崛起,他們單純使用HTML+CSS+JavaScript前端語言就能完成前端頁面的開發,而不需要使用含有各種后端交互印記的標簽。
于是,基于node-js的React、Angela、VUE框架成為潮流。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。