Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产成人综合日韩精品无,视频区图片区,草草影院地址ccyycom浮力影院37

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaWeb實現文件上傳與下載

          . 增強HttpServletResponse對象

          1. 實現一個增強的HttpServletResponse類,需要繼承javax.servlet.http.HttpServletRequestWrapper類,通過重寫自己需要增強的方法來實現(這種模式就叫做裝飾者模式),使用該增強類在加上過濾器就可以實現無編碼轉換處理代碼。

          public class MyRequest extends HttpServletRequestWrapper{
          	private HttpServletRequest req;
          	public MyRequest(HttpServletRequest request) {
          		super(request);
          		req=request;
          	}
          	@Override
          	public String getParameter(String name) {
          		//解決編碼問題,無論是post還是get請求,都不需要在業務代碼中對編碼再處理
          		String method=req.getMethod();
          		if("get".equalsIgnoreCase(method)){
          			try {
          				String str=req.getParameter(name);
          				byte[] b=str.getBytes("iso8859-1");
          				String newStr=new String(b, "utf-8");
          				return newStr;
          			} catch (UnsupportedEncodingException e) {
          				// TODO Auto-generated catch block
          				e.printStackTrace();
          			}
          		}else if("post".equalsIgnoreCase(method)){
          			try {
          				req.setCharacterEncoding("utf-8");
          			} catch (UnsupportedEncodingException e) {
          				// TODO Auto-generated catch block
          				e.printStackTrace();
          			}
          		}
          		//絕對不能刪除此行代碼,因為此行代碼返回的就是編碼之后的數據
          		return super.getParameter(name);
          	}
          }
          

          在過濾器中應用

          public class FilterTest4 implements Filter {
          	@Override
          	public void init(FilterConfig filterConfig) throws ServletException {}
          	@Override
          	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          			throws IOException, ServletException {
          		//生成增強的HttpServletRequest對象
          		HttpServletRequest req=(HttpServletRequest) request;
          		MyRequest myReq=new MyRequest(req);
          		//將增強的HttpServletRequest對象傳入過濾器執行鏈中,在后面傳入的request對象都會是增強的HttpServletRequest對象
          		chain.doFilter(myReq, response);
          		
          	}
          	@Override
          	public void destroy() {}
          }
          

          2. 文件上傳原理過程

          1. JavaWeb中實現文件上傳:

          • 客戶端:HTML頁面需要一個<form>表單,且必須設置表單的enctype屬性值為"multipart/form-data",以及method屬性值為"post"(因為get方式不支持大量數據提交);表單里有一個<input type="file" name="">的標簽,且name屬性值必須指定。
          <html>
           <head>
           <title>My JSP 'upload.jsp' starting page</title>
          	<meta http-equiv="pragma" content="no-cache">
          	<meta http-equiv="cache-control" content="no-cache">
          	<meta http-equiv="expires" content="0"> 
          	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          	<meta http-equiv="description" content="This is my page">
           </head>
           
           <body>
           <form action="" method="post" enctype="multipart/form-data">
           <input type="text" name="name">
           	請選擇文件:<input type="file" name="upload">
           	<input type="submit" value="上傳">
           </form>
           </body>
          </html>
          
          • 服務端:主要進行IO讀寫操作。必須導入commons-fileupload和commons-io兩個jar包,可以通過請求request對象的getInputStream獲得一個流來讀取請求中的文件數據,但是如果客戶端上傳多個文件時,就會很麻煩,所以提供了commons-fileupload和commons-io兩個jar包來更方便的實現文件上傳。
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.OutputStream;
          import java.util.List;
          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import org.apache.commons.fileupload.FileItem;
          import org.apache.commons.fileupload.FileUploadException;
          import org.apache.commons.fileupload.disk.DiskFileItemFactory;
          import org.apache.commons.fileupload.servlet.ServletFileUpload;
          public class UploadServlet extends HttpServlet{
          	@Override
          	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          		/**
          		 * 1. 創建磁盤文件項工廠類 DiskFileItemFactory
          		 * 2. 創建核心解析Request類 ServletFileUpload
          		 * 3. 開始解析Request對象中的數據,并返回一個List集合
          		 * 4. List中包含表單中提交的內容
          		 * 5. 遍歷集合,獲取內容
          		 */
          		DiskFileItemFactory fac=new DiskFileItemFactory();
          		
          		ServletFileUpload upload=new ServletFileUpload(fac);
          		upload.setHeaderEncoding("utf-8");//防止中文的文件名亂碼
          		try {
          			List<FileItem> fileItems = upload.parseRequest(req);
          			for(FileItem item:fileItems){
          				//有可能是普通文本項,比如<input type="text">標簽提交上來的字符串
          				//也有可能是<input type="submit" value="上傳">上傳的文件
          				//文件項與普通項有不同的API來處理
          				//首先判斷是普通文本項還是文件項,
          				if(item.isFormField()){
          					//true表示普通文本項
          					//獲取文本項的name屬性值
          					String name=item.getFieldName();
          					//獲取對應的文本
          					String value=item.getString("utf-8");//防止中文亂碼
          					System.out.println(name+":"+value);
          				}else{
          					//false表示文件項
          					//先獲取文件名稱
          					String name=item.getName();
          					//獲取文件項的輸入流
          					InputStream in=item.getInputStream();
          					//獲取服務器端文件存儲的目標磁盤路徑
          					String path=getServletContext().getRealPath("/upload");
          					System.out.println(path);
          					//獲取輸出流,輸出到本地文件中
          					OutputStream out=new FileOutputStream(path+"/"+name);
          					//寫入數據
          					int len=0;
          					byte[] b=new byte[1024];
          					while((len=in.read(b))!=-1){
          						out.write(b,0,len);
          					}
          					in.close();
          					out.close();
          					
          				}
          			}
          		} catch (FileUploadException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		}
          	}
          }
          

          注意:在文件上傳時,會將form表單的屬性enctype屬性值為"multipart/form-data",當提交到服務端后,無法使用 req.getParameter(name) 方法來獲取到內容,只有通過上面的方法來獲取文本項。

          2. 文件上傳相關核心類:

          • DiskFileItemFactory:相關API如下
          • public DiskFileItemFactory():無參構造器
          • public DiskFileItemFactory(int sizeThreshold, File repository):構造器,sizeThreshold設置緩沖區大小,默認10240 byte;repository表示如果過緩沖區空間小于上傳文件空間,那么會生成臨時文件,repository就是指定該臨時文件的保存路徑,如果過未上傳完成就中斷,繼續上傳時就可以通過這個臨時文件來繼續上傳。
          • public void setSizeThreshold(int sizeThreshold):設置緩沖區大小
          • public void setRepository(File repository):指定該臨時文件的保存路徑
          //改進上面的文件上傳代碼,添加一個臨時文件
          public class UploadServlet extends HttpServlet{
          	@Override
          	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          		DiskFileItemFactory fac=new DiskFileItemFactory();
          		fac.setSizeThreshold(1024*1024);//設置緩沖區為1mb
          		//設置臨時文件的本地磁盤存儲路徑
          		File repository=new File(getServletContext().getRealPath("/temp"));
          		fac.setRepository(repository);
          		ServletFileUpload upload=new ServletFileUpload(fac);
          		upload.setHeaderEncoding("utf-8");//防止中文的文件名亂碼
          		try {
          			List<FileItem> fileItems = upload.parseRequest(req);
          			for(FileItem item:fileItems){
          				if(item.isFormField()){
          					String name=item.getFieldName();
          					String value=item.getString();
          					String value=item.getString("utf-8");//防止中文亂碼
          					System.out.println(name+":"+value);
          				}else{
          					String name=item.getName();
          					InputStream in=item.getInputStream();
          					String path=getServletContext().getRealPath("/upload");
          					System.out.println(path);
          					OutputStream out=new FileOutputStream(path+"/"+name);
          					int len=0;
          					byte[] b=new byte[1024];
          					while((len=in.read(b))!=-1){
          						out.write(b,0,len);
          					}
          					in.close();
          					out.close();
          					
          				}
          			}
          		} catch (FileUploadException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		}
          	}
          }
          
          • ServletFileUpload:相關API如下
          • public static final boolean isMultipartContent( HttpServletRequest request) :判斷表單提交上來的數據內容是否是multipart類型的數據,即 form表單的 enctype="multipart/form-data",是則返回true,否則返回false
          • public List /* FileItem */ parseRequest(HttpServletRequest request):解析request對象,返回一個泛型為FileItem 的List集合
          • public void setFileSizeMax(long fileSizeMax):設置單個文件的空間大小的最大值
          • public void setSizeMax(long sizeMax):設置所有文件空間大小之和的最大值
          • public void setHeaderEncoding(String encoding):解決上傳文件名的亂碼問題
          • public void setProgressListener(ProgressListener pListener):上傳時的進度條。
          • FileItem:封裝表單中提交的數據
          • boolean isFormField():判斷當前FileItem對象是表單中提交的文本數據項,還是文件數據項
          • String getFieldName():獲取文本項類型FileItem對象的name屬性值,即相當于表單中的 <input type="text" name="name">
          • String getString( String encoding ):獲取文本項類型FileItem對象的value值,可以指定編碼格式,也可以省略encoding不寫
          • String getName():應用于文件項類型的FileItem對象,用于獲取文件的名稱,包括后綴名
          • InputStream getInputStream():獲取輸入流
          • void delete():刪除臨時緩存文件(在輸入以及輸出流關閉后執行)

          3. 實現多文件上傳(需要js技術):主要是更改jsp頁面,通過js代碼來添加多個文件進行上傳,服務器代碼無需更改

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
          <%
          String path = request.getContextPath();
          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
          %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
           <head>
           <base href="<%=basePath%>">
           <title>My JSP 'upload.jsp' starting page</title>
          	<meta http-equiv="pragma" content="no-cache">
          	<meta http-equiv="cache-control" content="no-cache">
          	<meta http-equiv="expires" content="0"> 
          	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          	<meta http-equiv="description" content="This is my page">
           </head>
           
           <body>
           <script type="text/javascript">
           	function run(){
           		var div=document.getElementById("divId");
           		 div.innerHTML+=
           		 "<div><input type='file' name='upload'><input type='button' value='刪除' onclick='del(this)'></div>"
           	}
           	function del(presentNode){
           		var div=document.getElementById("divId");
           		div.removeChild(presentNode.parentNode);
           	}
           </script>
           <div>
           	多文件上傳<br/>
           <form action="/Servlet/upload" method="post" enctype="multipart/form-data">
           	<input type="button" value="添加" onclick="run()"><br/>
           	<div id="divId">
           	
           	</div>
           	
           	<input type="submit" value="上傳">
           </form>
           </div>
           </body>
          </html>
          

          4. 關于文件上傳的一些問題:

          • 文件重名可能會產生覆蓋效果,可以在處理文件名時生成一個唯一的文件名
          • 如果所有的文件都儲存在一個文件夾中,會導致文件夾下文件過多,可以一個用戶一個文件夾,或者利用算法目錄分離等方法。

          3. 文件下載

          1. 傳統文件下載方式有超鏈接下載或者后臺程序下載兩種方式。通過超鏈接下載時,如果瀏覽器可以解析,那么就會直接打開,如果不能解析,就會彈出下載框;而后臺程序下載就必須通過兩個響應頭和一個文件的輸入流。

          2. 后臺程序下載:

          • 兩個響應頭:
          • Content-Type:其值有比如 text/html;charset=utf-8
          • Content-Disposition:其值為 attachment;filename=文件名 以附件形式打開
          • 流:需要獲取文件的輸入流,然后通過response對象的輸出流輸出到客戶端。

          JSP指令用來設置整個JSP頁面相關的屬性,如網頁的編碼方式和腳本語言。

          語法格式如下:

          <%@ directive attribute="value" %>

          指令可以有很多個屬性,它們以鍵值對的形式存在,并用逗號隔開。

          JSP中的三種指令標簽:

          指令描述
          <%@ page ... %>定義網頁依賴屬性,比如腳本語言、error頁面、緩存需求等等
          <%@ include ... %>包含其他文件
          <%@ taglib ... %>引入標簽庫的定義

          Page指令

          Page指令為容器提供當前頁面的使用說明。一個JSP頁面可以包含多個page指令。

          Page指令的語法格式:

          <%@ page attribute="value" %>

          等價的XML格式:

          <jsp:directive.page attribute="value" />

          屬性

          下表列出與Page指令相關的屬性:

          屬性描述
          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確定腳本元素能否被使用

          Include指令

          JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。

          Include指令的語法格式如下:

          <%@ include file="文件相對 url 地址" %>

          include 指令中的文件名實際上是一個相對的 URL 地址。

          如果您沒有給文件關聯一個路徑,JSP編譯器默認在當前路徑下尋找。

          等價的XML語法:

          <jsp:directive.include file="文件相對 url 地址" />

          Taglib指令

          JSP API允許用戶自定義標簽,一個自定義標簽庫就是自定義標簽的集合。

          Taglib指令引入一個自定義標簽集合的定義,包括庫路徑、自定義標簽。

          Taglib指令的語法:

          <%@ taglib uri="uri" prefix="prefixOfTag" %>

          uri屬性確定標簽庫的位置,prefix屬性指定標簽庫的前綴。

          等價的XML語法:

          <jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          言:在CGI(通用網關接口)編程風行的日子,人們紛紛尋思簡化并讓其更加靈活的新方法和新技術,包括PHP、JSP、ASP。1997年SUN公司推出了servlet,1999年初,SUN公司推出了JSP,實際上在servlet基礎上修改而成。JSP即Java服務器頁面(Java Server Page),將HTML和JAVA代碼使用某種方式結合起來,完成前后端的有效交互。本文通過JSP歷史回顧和應用總結來審視過去和開拓未來。

          1.從實例項目入手

          其實,從現在看來JSP依然極具魅力,據了解很多JSP老項目還在維護。下面使用STS作為IDE構建一個實例項目,先體驗其效果。

          1.1 動態web項目模板

          如下圖,使用new dynamic web project創建項目:

          1.2修改文件編碼

          進入preferences修改JSP文件的編碼:

          1.3 編寫簡單的JSP文件

          新增一個JSP文件到WebContent目錄,如下

          然后檢查并修改編碼,應該都是UTF-8,如下圖:

          如果不是,就修改。

          1.4運行和測試

          選中項目名稱,點郵件菜單的Run as ...-->Run on server

          之后出現如下界面:

          若沒有現存的tomcat server,就自己加一個。點Finish。然后自動調用chrome,界面如下:

          自動調用瀏覽器設置的地方是windows-->Web browser菜單:

          1.5增加功能:顯示IP地址

          (1)顯示ip地址:getRemoteAddr

          (2)變量聲明<%! %>

          (3)表達式<%=%>

          2.JSP語言介紹

          2.1語法

          語法

          描述

          <%-- 注釋 --%>

          JSP注釋,注釋內容不會被發送至瀏覽器甚至不會被編譯

          <!-- 注釋 -->

          HTML注釋,通過瀏覽器查看網頁源代碼時可以看見注釋內容

          <\%

          代表靜態 <%常量

          %\>

          代表靜態 %> 常量

          \'

          在屬性中使用的單引號

          \"

          在屬性中使用的雙引號

          2.2指令

          指令

          描述

          <%@ page ... %>

          定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等等

          <%@ include ... %>

          包含其他文件

          <%@ taglib ... %>

          引入標簽庫的定義,可以是自定義標簽

          2.3Page指令屬性

          屬性

          描述

          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

          確定腳本元素能否被使用

          2.4行為標簽

          行為標簽語法:<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三個行為標簽:

          測試:

          2.5隱含對象(默認創建的對象)

          對象

          描述

          request

          HttpServletRequest類的實例

          response

          HttpServletResponse類的實例

          out

          PrintWriter類的實例,用于把結果輸出至網頁上

          session

          HttpSession類的實例

          application

          ServletContext類的實例,與應用上下文有關

          config

          ServletConfig類的實例

          pageContext

          PageContext類的實例,提供對JSP頁面所有對象以及命名空間的訪問

          page

          類似于Java類中的this關鍵字

          Exception

          Exception類的對象,代表發生錯誤的JSP頁面中對應的異常對象

          2.6判斷語句

          判斷語句包括兩種:if else和switch case

          示例如下:

          2.7循環語句

          循環語句包括兩種:for和while

          示例如下:

          2.8運算符

          類別

          操作符

          結合性

          后綴

          () [] . (點運算符)

          左到右

          一元

          ++ - - ! ~

          右到左

          可乘性

          * / %

          左到右

          可加性

          + -

          左到右

          移位

          >> >>> <<

          左到右

          關系

          > >= < <=

          左到右

          相等/不等

          == !=

          左到右

          位與

          &

          左到右

          位異或

          ^

          左到右

          位或

          |

          左到右

          邏輯與

          &&

          左到右

          邏輯或

          ||

          左到右

          條件判斷

          ?:

          右到左

          賦值

          = += -= *= /= %= >>= <<= &= ^= |=

          右到左

          逗號

          ,

          左到右

          2.9變量類型

          布爾值(boolean):true 和 false;

          整型(int):與 Java 中的一樣;

          浮點型(float):與 Java 中的一樣;

          字符串(string):以單引號或雙引號開始和結束;

          Null:null。

          2.10表單處理

          以下提供一個例子來說明:

          (1)創建FormProcess.jsp文件:

          其中提供了兩個input輸入框。

          (2)再創建FormProcessMain.jsp文件,如下:

          其中使用request對象的getParameter方法來獲取Get參數。

          2.11過濾器

          JSP過濾器實際上和Servlet過濾器一樣。

          以下通過示例來說明:

          (1)在web.xml中增加一個過濾器:

          (2)然后創建過濾器處理類com.hunting.LogFilter,如下:

          2.12JSTL(JSP標準標簽庫)

          (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樣式表

          3.JSP歷史

          下面從前后端分離角度展現JSP的產生和發展脈絡。

          3.1互聯網的產生

          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),使我們能夠在互聯網上看到文檔。

          3.2萬維網的產生

          1989年蒂姆伯納斯-李寫了一份關于建立一個通過網絡傳輸超文本系統的報告,其中創建了單行 HTTP 協議,這個協議在1991年被命名為HTTP/0.9,萬維網由此產生,1996年超文本傳送協議HTTP 1.0發布。

          盡管FTP可以傳輸HTML文件,但是并沒有提供有效小文件傳輸機制和無狀態管理能力,超文本傳輸協議(HTTP)才被發明出來專門用于傳輸HTML文檔,HTTP是一種無連接/無狀態協議,這使得許多短連接更加有效,而且可以不使用密碼就可以獲取HTML文檔,這讓萬維網真正到來,真正體現了互聯網的快捷、免費思維。

          3.3通用網關接口的產生

          上面提到了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平臺。

          3.4 JSP的產生

          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年,是目前最流行的實現。

          3.5 Node的產生

          JSP終究還是含有Java代碼,前后端沒有徹底分離,因此人們在2009年發明了node-js,這讓前端開發人員崛起,他們單純使用HTML+CSS+JavaScript前端語言就能完成前端頁面的開發,而不需要使用含有各種后端交互印記的標簽。

          于是,基于node-js的React、Angela、VUE框架成為潮流。


          主站蜘蛛池模板: 国产一区二区在线看| 亚洲国产精品一区二区九九| 立川理惠在线播放一区| 无码人妻精一区二区三区| 亚洲一区二区三区丝袜| 精品国产一区二区二三区在线观看| 国产裸体舞一区二区三区| 视频一区视频二区制服丝袜| 精品人妻一区二区三区毛片 | 国产视频一区在线播放| 一区二区三区福利视频| 无码精品视频一区二区三区 | 丰满人妻一区二区三区视频| 亚洲色精品aⅴ一区区三区| 人妻无码一区二区不卡无码av| 国产精品99精品一区二区三区 | 亚洲电影唐人社一区二区| 国产一区二区三区乱码在线观看| 人成精品视频三区二区一区| 91亚洲一区二区在线观看不卡| 视频一区视频二区日韩专区| 少妇无码一区二区二三区| 八戒久久精品一区二区三区| 国产激情视频一区二区三区| 国产精品亚洲一区二区无码| 亚洲国产一区国产亚洲| 日韩一区二区在线观看| 99精品国产一区二区三区不卡| 国产SUV精品一区二区88L| av无码免费一区二区三区| 亚洲第一区精品日韩在线播放| 欧美亚洲精品一区二区| 国产在线精品一区二区三区直播 | 3d动漫精品啪啪一区二区中文| 日韩国产一区二区| 亚洲Av永久无码精品一区二区| 国产精品一区二区三区99| 精品国产高清自在线一区二区三区 | 精品一区二区三区3d动漫| 精品国产福利在线观看一区| 国产午夜精品片一区二区三区|