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


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匹馬行天下依舊在更新中,歡迎大家關注,感覺可以的可以點擊一下推薦,若如有誤,感謝指正,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM