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標簽而發愁。
- jsp(java 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指令(標簽指令)
例如:
1、page
作用:page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什么地方,它作用的都是整個JSP頁面。
為了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。
屬性:
- import和java代碼中的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);
2、include
include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那么JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。
- 靜態包含:把其它資源包含到當前頁面中。
<%@ include file="/include/header.jsp" %>
- 動態包含:
<jsp:include page="/include/header.jsp"></jsp:include>
兩者的區別:轉譯(翻譯)的時間段不同
- 前者:在翻譯時就把兩個文件合並
- 后者:不會合並文件,當代碼執行到include時,才包含另一個文件的內容。
使用原則:能用靜的就不用動的。原因之一是:可以省略一些代碼的書寫。
3、taglib
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匹馬行天下依舊在更新中,歡迎大家關注,感覺可以的可以點擊一下推薦,若如有誤,感謝指正,謝謝!