JSP簡明教程:令人興奮的指令碼編程

來源:互聯網
上載者:User
js|編程|指令碼|教程 如果你是直接使用Java servlets,那你將不得不在Java類中處理HTTP輸入和HTML輸出,你需要豐富的Java編程經驗來構建複雜的應用程式。JSP的加入,使你可以把HTML的表達邏輯從植入servlets中的複雜的商務邏輯區分開來。這意味著可以由有經驗的指令碼編寫者來編寫表達層代碼,而進階的Java開發人員能夠集中精力去解決servlets和bean中更為複雜的問題。



  不管你有沒有Java編程知識,都能夠使用JSP。JSP包含了一些伺服器端的標籤,使得不用寫一行Java代碼就能顯示動態資料。你可以直接存取bean來完成操作,然後使用JSP標籤把結果顯示為動態內容。你還可以用servlets產生bean,servlets 操作的運算結果存於其中,然後再使用JSP標籤顯示結果,同樣不需要在JSP頁中寫Java代碼。



  有三種方式可以用來在你的網頁中加入Java代碼:



  1、使用declarations(聲明),可以定義全域變數或是在頁內任何地方都可以訪問的Java方法。聲明被包含在標記<%!...%>中。



  2、使用scriptlets(指令碼片斷),你能書寫頁內處理所需的任何邏輯,它們包含在<%...%>標記內。



  3、Expressions(運算式),包含於<%=...%>中。它提供一種簡單的方法來顯示Java運算式的結果。被附加上的運算式將被計算並在頁面上顯示出來,就好像你已經在代碼中明確寫出了運算結果的數值一樣。



  在你自己編寫的代碼中,可以使用一些隱含變數(implicit variables)――JSP提供的預定義的Java對象。另外,通過使用JSP的指令(directives), 還可以包含非Java代碼模組,比如來自其他檔案的HTML文本。



  下面我們來仔細看一看這些指令碼元素,在編寫你自己的JSP指令碼時將會經常用到它們。



Directives(指令)

  JSP定義了三個頁內指令用於設定JSP參數或擴充代碼。它們是 page,include和taglib,必須寫在JSP頁的第一行。文法如下:



  <%@ directive attribute="value" ... %>



  page指令允許你為網頁設定一些基本參數,包括設定所用指令碼語言的參數(預設為Java)、你的指令碼片斷中引入的Java類、設定輸出緩衝區等等。完整的page指令參數表見《JSP Specification Version 1.0》(《JSP規範1.0》)的2.8.1章。



  使用include指令,可以包含其他檔案的內容,比如存於單獨檔案中的HTML前序和頁尾。



  taglib指令用於擴充標準的JSP標籤集,這超出了本文的討論範圍。然而,瞭解JSP定義了一種擴充其標籤集的方法還是很有好處的,當你是一個軟體商,想擴充JSP的原始功能而又不想破壞其相容性時,這一點尤為重要。



Declarations(聲明)

  使用declarations,你可以在JSP頁中定義方法或變數,它們可被同一頁中的其他代碼訪問。在大多數情況下,你可能會在自己的bean中定義方法。然而,有時候在網頁內定義方法可能更方便一些,尤其是當代碼只用於單一頁面時。不論定義方法還是變數,聲明都包含在<%! %>標記內。



  注意,聲明並不在JSP頁內產生任何輸出。它們僅僅用於定義,而不產生輸出結果。要產生輸出結果,你應該用JSP運算式或指令碼片斷。



Expressions(運算式)

  Expressions是一種非常簡單的JSP標籤,它用來把在<%= %>中定義的JSP運算式的值轉換成字串並將這個值以動態文本的形式送出。Expression的確是一條產生文本的捷徑,有了它,你不必在每次要顯示一段動態文本的時候都去調用print()方法。典型的應用就是,你可以用expressions顯示簡單的變數值或bean中的方法的傳回值。



  例如,下面的代碼將會產生getName()方法的傳回值:



  <H2>Welcome, <%= mybean.getName() %></H2>



  事實上,在產生動態輸出之前,JSP必須把方法的傳回值轉變為Java中的String對象。JSP規範中詳細描述了在JSP運算式中,什麼樣的Java類型和Java類會被轉變成字串。



Scriptlets(指令碼片斷)

  到現在為止你已經學會了使用指令來引入任何Java類或Java包,你能定義頁面級的方法或變數並在頁中使用它們,你還可以使用提供普通web處理功能的隱含變數。還能在JSP頁內做些什麼就取決於你了,因為你可以在scriptlets(指令碼片斷)裡編寫任何你想要的Java代碼,如下所示:



  <% ...code... %>



  通過在page指令中使用IMPORT參數,你可以從指令碼片斷內調用所有Java API。因為你寫的所有JSP代碼實際上都被編譯構成Java servlet,它本身就是一個Java類,所以你所用的語言本身就是Java,而不是任何一種修改或整理過的版本。這就像在SSJS中你可以編寫任何代碼一樣。而與SSJS不同,在JSP中你有權使用整套豐富的Java API,因此幾乎沒有任何局限性。



Implicit Variables(隱含變數)

  前面提到過,JSP定義了一些隱含變數(即Java 對象)供你在運算式和指令碼片斷中使用。《JSP Specification Version 1.0》的表2-2列出了JSP1.0中可用的隱含變數。這裡列出一些常用的對象:



  out對象,類型為javax.servlet.jsp.JspWriter,提供對方法(例如print()方法)的訪問,用來在指令碼片斷內產生輸出結果。



  request對象直接與Java中的javax.servlet.http.HttpServletRequest類對應,具有該類的對象的一切屬性和方法。舉個例子,要擷取一個從HTML表單或URL查詢字串傳入的值,可以調用request.getParameter()方法,根據名字擷取參量。



   response對象與Java中的javax.servlet.http.HttpServletResponse類對應,提供對你的網頁產生的HTML響應的參數的訪問權。因此,要在JSP頁返回的HTML響應前序中加入一個值,你就可以調用the response.setHeader() 方法來實現。



另一個簡單的例子

  在下面的例子中,我們來看一看一個表單和它的JSP表單控制代碼之間的互動過程。使用前面討論過的指令碼元素,我實現了一個簡單的web網站回饋表單(見圖2)和一個JSP表單控制代碼用來驗證輸入,然後有條件地地產生基於回饋的輸出。



  圖2.一個web網站回饋表單





  圖中按鈕:submit query--提交;reset――重填



  表單控制代碼將會檢驗名稱和意見欄以確定它們已被填寫,如果其中任何一個或兩個是空白的,表單控制代碼會產生一條錯誤資訊;否則它將繼續查看使用者意見是否與預先設定的字串匹配。如果匹配,它就輸出一條專門的資訊;否則輸出“thank you”。



  例2



  <HTML>



  <HEAD>



  <META NAME="GENERATOR" Content="NetObjects ScriptBuilder 2.01">



  <TITLE>Feedback Results</TITLE>



  </HEAD>



  <%!



  // 姓名和意見欄不可為空白



  // 檢查它們的值並返回結果



  boolean validateInput(String name, String comment) {



   boolean result = true;



   // 如果姓名或意見未填寫,返回 false 以表明輸入無效



   if (name.length() == 0)



     result = false;



   if (comment.length() == 0)



     result = false;



   return result;



  } // 結束輸入驗證validateInput







  // 根據表單上的意見欄輸出結果



  String getStringCheese (String comment) {



   String cheese = "I like cheese.";



   String result;



   if (comment.compareTo(cheese) == 0)



    result = "We like cheese too!";



   else



    result = "We hope someday you'll learn to like cheese.";



   return result;



  } //結束 getStringCheese



  %>



  <BODY BGCOLOR="#F0F0E0">



  <%



   // 擷取通過表單提交的資料



   String name = request.getParameter("name");



   String age = request.getParameter("age");



   String comment = request.getParameter("comment");



   boolean isValid;



   isValid = validateInput(name, comment);



   // 根據使用者是否未填寫姓名或意見欄決定輸出內容



   if (isValid) {



  %>



  <H2>Thank you for your feedback!</H2>



  <H3>



  <%



    //輸出意見欄的查詢結果



    out.println(getStringCheese(comment));



   } // 結束 if 程式段



  else {



    out.println("You didn't give us your name or a comment.");



  %>



  </H3>



  Please <a href="feedback_form.html">try again</a>



  <%



   } //結束 else 程式段



  %>



  </BODY>



  </HTML>



  這個例子假定使用者輸入的意見是“I like cheese."(我喜歡乳酪)在代碼中可以看到,這一響應是為填寫這條意見的使用者定製的。表單控制代碼將會返回如圖3所示的頁面:



  圖3.表單控制代碼輸出





  圖中文字:謝謝你的反饋!我們也喜歡乳酪。



  這個例子非常簡單易懂。即便你只是一個JavaScript程式員,你也應該可以理解它。我還要指出這個例子中體現的在JSP規範中並不很明顯的一些特性。首先,請注意我在聲明部分(<%'...%>中的部分)定義了一些方法,與在Java類中定義方法一模一樣。這是因為JSP引擎把這些方法轉變為底層的Java servlets,在瀏覽器向網頁發出請求時由伺服器來執行它們。因此,任何變數和方法的定義都必須遵守標準的Java文法。



  還應注意到,在我的指令碼片斷的代碼中,我把一個if...else語句分開了,它跨越了兩個不同的指令碼片斷段。這完全是合法的!不僅合法,而且把指令碼片斷代碼和靜態HTML交叉起來是有條件產生HTML的好辦法,就像我在本例中所做到的一樣。



  最後,你可以看到我通過調用request.getParameter()方法取得表單元素的值並把它賦給一個臨時變數。這是處理從表單或查詢字串輸入的值的標準方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.