Java匹馬行天下之JavaWeb核心技術——JSP

泰斗賢若如發表於2019-05-30

JSP動態網頁技術

一、JavaWeb簡介

一、什麼是JavaWeb?

  •  JavaWeb是用Java技術來解決相關web網際網路領域的技術總稱。
  •  需要在特定的web伺服器上執行,分為web伺服器和web客戶端兩部分
  •  跨平臺,能夠在多個平臺下部署和執行

二、靜態網頁和動態網頁

  • 靜態網頁:網頁中的內容是固定的,不會更新。
  • 所用技術為html、css;
  • 動態網頁:網頁中的內容通過程式動態顯示的,自動更新。
  • 所用技術為html、css、資料庫、至少一門高階語言(Java、C#,PHP),JavaScript,XML等,主流的動態網頁尾本技術(jsp/Asp.net/php)

三、Tomcat伺服器目錄介紹

 

 

WEB-INF是Java的Web應用的安全目錄。所謂安全就是客戶端無法訪問,只有服務端可以訪問的目錄。

web.xml檔案是專案的部署檔案

classes資料夾,用於放置*.class檔案

lib資料夾,用於存放需要的jar包

如圖:

 

 

四、修改Tomcat伺服器預設埠

在Tomcat的安裝目錄下,找到conf-->server.xml檔案

 

 

找到Connector標籤

 

 

修改port屬性的值即可,埠修改完成後要記得儲存,並且重啟Tomcat伺服器。

 

 

二、JSP基礎學習

一、JSP簡介

JSP全名為Java Server Pages,其根本是一個簡化的Servlet設計,他實現了再Java當中使用HTML標籤。JSP是一種動態網頁技術標準也是JavaEE的標準。JSP與Servlet一樣,是在伺服器端執行的。

 

JSP實際上就是Servlet。JSP這門技術的最大的特點在於:寫jsp就像在寫html,但它相比html而言,html只能為使用者提供靜態資料,而Jsp技術允許在頁面中巢狀java程式碼,為使用者提供動態資料。

二、JSP的作用

  • Servlet:伺服器端的小應用程式。適合編寫Java邏輯程式碼,如果編寫網頁內容------->費時費力,太苦

缺點:不適合設定HTML響應體,需要大量的

response.getWriter().print("<html>");

優點:動態資源,可以程式設計。

  • HTML:靜態內容

缺點:HTML是靜態頁面,不能包含動態資訊;

優點:不用為輸出html標籤而發愁。

  • jspjava server pages):適合編寫輸出動態內容,但不適合編寫Java邏輯

優點:在原有HTML的基礎上新增java指令碼,構成jsp頁面。

 

三、JSP和Servlet的分工

  • JSP

作為請求發起頁面,例如顯示錶單、超連結。

作為請求結束頁面,例如顯示資料。

  • Servlet

作為請求中處理資料的環節

 

四、JSP的組成

 

 

jsp=html+java指令碼+jsp標籤(指令)

jsp中無需建立即可使用的物件一共有9個,稱為九大內建物件。

3種java指令碼:

  • <%……%> java程式碼片段(常用),用於定義0-N條java語句,方法內寫什麼就可以在這裡寫什麼,不能宣告方法和類;
  • <%=……%> java表示式,用於輸出(常用),用於輸出一條表示式(或變數)的結束,print()括號中引數可以放什麼,這裡就能放什麼;
  • <%!……%> 宣告,用來建立類的成員變數和成員方法(基本不用),class A{ } 類體中可以放什麼,這裡就可以放什麼。

五、JSP的執行流程及原理

 

 

 

jsp其實是一種特殊的Servlet

  • 當jsp頁面第一次被訪問時,伺服器會把jsp編譯成java檔案(這個java其實是一個Servlet類);
  • 然後再把java編譯成.class;
  • 然後建立該類物件;
  • 最後呼叫它的service()方法;
  • 第二次請求同一jsp時,直接呼叫service()方法。
  • 在Tomcat的work目錄下可以找到jsp對應的.java原始碼。

 

1、IE瀏覽器在訪問JSP頁面時,Web伺服器是如何呼叫並執行一個jsp頁面的?(Servlet)

  •   第一次:轉譯(翻譯) --> 編譯 --> 執行
  •   第二次:執行

2、Web伺服器在執行jsp頁面時,是如何把Jsp頁面中的html排版標籤傳送到客戶端的?

  •   out.print("<......>"); 或者 out.write("<......>");

3、Jsp頁面中的java程式碼伺服器是如何執行的?

  •   伺服器 --> .java檔案 --> .class檔案 --> 結果out回客戶端

4、Web伺服器在呼叫jsp時,會給jsp提供一些什麼java物件(內建物件)?

  •   HttpSession、ServletConfig、ServletContent、request、response、out等等。

 

六、JSP的基本語法

  •   Servlet:控制器。重點編寫java程式碼邏輯。(獲取表單資料、處理業務邏輯、分發轉向)
  •   JSP:程式碼顯示模板。重點在於顯示資料。(為什麼顯示資料不直接用.html檔案呢?因為.jsp檔案中可以插入java程式碼顯示回顯訊息,簡言之,jsp功能更強大)

 1、JSP的模版元素:簡言之就是網頁的靜態內容

    例如:html標籤和普通文字。

 2、JSP的指令碼     

  • <%……%> java程式碼片段(常用),用於定義0-N條java語句,方法內寫什麼就可以在這裡寫什麼,不能宣告方法和類;
  • <%=……%> java表示式,用於輸出(常用),用於輸出一條表示式(或變數)的結束,print()括號中引數可以放什麼,這裡就能放什麼;

        <%= 2 + 3 %> 等價於out.print(2 + 3);

  • <%!……%> 宣告,用來建立類的成員變數和成員方法(基本不用),class A{ } 類體中可以放什麼,這裡就可以放什麼。

 

 

    3、註釋

    JSP註釋:<%-- 被註釋的內容 --%> 特點:安全,省流量

    網頁註釋:<!-- 網頁註釋 -->     特點:不安全,費流量

 

七、JSP的三個指令

 JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其餘部分

 在JSP 2.0規範中共定義了三個指令: 

  •   page指令(頁面級別)
  •   include指令(匯入其它頁面的資訊)
  •   taglib指令(標籤指令)

例如:

 

 1page

    作用:page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面。

        為了保持程式的可讀性和遵循良好的程式設計習慣,page指令最好是放在整個JSP頁面的起始位置。 

    屬性

 

  •      importjava程式碼中的import是一樣的。

        <%@ page import="java.util.Date, java.util.List" %>

        或者:

        <%@ page import="java.util.Date" %>

        <%@ page import="java.util.List" %>

        JSP會自動匯入(預設匯入)以下的包:

          import java.lang.*;

          import javax.servlet.*;

          import javax.servlet.http.*;

          import javax.servlet.jsp.*;

  •      session: 表示是否會自動建立session物件。其預設值是true
  •       buffer: JSP中有javax.servlet.jsp.JspWriter輸出字元流。設定輸出資料的快取大小,預設大小是8kb。建議最好不要改大小。
  •      errorPage: 如果頁面中有錯誤,則跳轉到指定的資源。(即不讓頁面彈出404/500等錯誤)

        errorPage="/uri" 

        如果寫"/"則代表當前應用的目錄下,絕對路徑。

        如果不寫"/"則代表相對路徑。

  •      isErrorPage: 表示是否建立throwable物件。其預設值是false。作用:輸出頁面錯誤資訊:by zero
  •      contextType: contentType="text/html; charset=UTF-8" 告訴瀏覽器使用什麼編碼來解析文字。等同於 response.setContextType("text/html; charset=utf-8"); 
  •      pageEncoding: 告訴JSP引擎(伺服器)要轉譯(翻譯)的檔案使用的編碼。

        例如:<%@ page  pageEncoding="gbk" %>

  •      isELIgnored: 是否支援EL表示式。 預設是false,表示支援EL表示式。

        例如:${1+1}  等價於out.print(1+1);

   

   

2include

      include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。

  •         靜態包含:把其它資源包含到當前頁面中。

          <%@ include file="/include/header.jsp" %>

  •         動態包含:

          <jsp:include page="/include/header.jsp"></jsp:include>

        兩者的區別:轉譯(翻譯)的時間段不同

  •           前者:在翻譯時就把兩個檔案合併
  •           後者:不會合並檔案,當程式碼執行到include時,才包含另一個檔案的內容。

        使用原則:能用靜的就不用動的。原因之一是:可以省略一些程式碼的書寫。

   3taglib

JSP API允許使用者自定義標籤,一個自定義標籤庫就是自定義標籤的集合。

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

Taglib指令的語法:

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

  

uri屬性確定標籤庫的位置,prefix屬性指定標籤庫的字首。

等價的XML語法:

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

  

      作用:在JSP頁面中匯入JSTL標籤庫。替換jsp中的java程式碼片段。

        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    prefix:字首(相當於重新給uri起個名字)

 

       示例:

    

           <%   

          if (5 > 3) { 

          out.print(5); 

          } 

        %> 

        <%-- 上下二種方式是等價的 --%>

        <c:if test="${5>3}"> 

          aaa 

        </c:if>

      下面的這種方式很好用!後面慢慢體會。

   

 

八、JSP的動作

使用標籤的形式來表示一段java程式碼。

 

JSP行為標籤使用XML語法結構來控制servlet引擎。它能夠動態插入一個檔案,重用JavaBean元件,引導使用者去另一個頁面,為Java外掛產生相關的HTML等等。

行為標籤只有一種語法格式,它嚴格遵守XML標準:

<jsp:action_name attribute="value" />

  

行為標籤基本上是一些預先就定義好的函式,下表羅列出了一些可用的JSP行為標籤:

 

九、JSP的九個內建物件

指在JSP的<%=%> 和<% %>中可以直接使用的物件,伺服器給我們建立好的物件,直接拿過來用就行了。

      例如:

     

          <%=request.getParameter("name") %>

      <%

         Student stu = new Student();

         stu.setName("tom");

         out.print(stu.getName());

         // request.getRequestDispatcher("/7.jsp").forward(request, response);

       %>

  

 

 

 

十、JSP客戶端請求

HttpServletRequest類

request物件是javax.servlet.http.HttpServletRequest類的例項。每當客戶端請求一個頁面時,JSP引擎就會產生一個新的物件來代表這個請求。

request物件提供了一系列方法來獲取HTTP資訊頭,包括表單資料,cookies,HTTP方法等等。

接下來將會介紹一些在JSP程式設計中常用的獲取HTTP資訊頭的方法。詳細內容請見下表:

 

 

 

HTTP資訊頭示例

在這個例子中,我們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP資訊頭。這個方法以列舉的形式返回當前HTTP請求的頭資訊。

獲取Enumeration物件後,用標準的方式來遍歷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>
<h2>HTTP 頭部請求例項</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
   Enumeration headerNames = request.getHeaderNames();
   while(headerNames.hasMoreElements()) {
      String paramName = (String)headerNames.nextElement();
      out.print("<tr><td>" + paramName + "</td>\n");
      String paramValue = request.getHeader(paramName);
      out.println("<td> " + paramValue + "</td></tr>\n");
   }
%>
</table>
</body>
</html>

  

十一、JSP伺服器響應

HttpServletResponse類

response 物件是 javax.servlet.http.HttpServletResponse 類的一個例項。就像伺服器會建立request物件一樣,它也會建立一個客戶端響應。

response物件定義了處理建立HTTP資訊頭的介面。通過使用這個物件,開發者們可以新增新的cookie或時間戳,還有HTTP狀態碼等等。

下表列出了用來設定HTTP響應頭的方法,這些方法由HttpServletResponse 類提供:

 

HTTP響應頭程式示例

接下來的例子使用setIntHeader()方法和setRefreshHeader()方法來模擬一個數字時鐘:

<%@ 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>
<h2>自動重新整理例項</h2>
<%
   // 設定每隔5秒自動重新整理
   response.setIntHeader("Refresh", 5);
   // 獲取當前時間
   Calendar calendar = new GregorianCalendar();
   String am_pm;
   int hour = calendar.get(Calendar.HOUR);
   int minute = calendar.get(Calendar.MINUTE);
   int second = calendar.get(Calendar.SECOND);
   if(calendar.get(Calendar.AM_PM) == 0)
      am_pm = "AM";
   else
      am_pm = "PM";
   String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
   out.println("當前時間: " + CT + "\n");
%>
</body>
</html>

  

 

 

此篇是我在學習過程中參考菜鳥教程以及筆記和別人部落格(黑澤君)完成

Java匹馬行天下依舊在更新中,歡迎大家關注,感覺可以的可以點選一下推薦,若如有誤,感謝指正,謝謝!

相關文章