java--jsp(Java Server Page)_1
JSP技術簡介
JSP是Java Server Page的縮寫,它是Servlet的擴充套件,它的作用是簡化網站的建立和維護。
JSP是HTML程式碼與Java程式碼的混合體。
JSP檔案通常以JSP或JSPX的副檔名。
JSP擁有自己的語法。
JSP形式上像HTML,但本質上是Servlet。
JSP的出現,使得將Web開發中的HTML與業務邏輯程式碼有效分離成為可能。通常JSP只負責生成動態的HTML文件,而業務邏輯由其他Java元件如JavaBean來實現。JSP可以通過Scriptlet來訪問這些元件。
< % %>
ContentType與pageEncoding的區別:
pageEncoding是jsp檔案本身的編碼 ,把jsp檔案編譯成java的時候給編譯器用的 。
contentType的charset是指伺服器傳送給客戶端時的內容編碼 ,是瀏覽器解析網頁的時候用的
如果兩個任意設定了其中一個,另一個即會與此保持一致。但,contentType除可以設定charset外,還可以設定MIME型別,如text/html
Tomcat首次訪問JSP的過程:
當瀏覽器(客戶端)首次請求時,如果沒有此jsp對應的servlet的class檔案,tomcat會把jsp檔案翻譯成servlet原始檔.java,再編譯成servlet的.class檔案,把.class 檔案傳送給瀏覽器,讓瀏覽器解析.class檔案。如果有,就呼叫。
容器按照以下順序處理JSP請求
1、查詢與JSP檔案對應的Servlet,如果已經存在,就呼叫它的服務方法。
2、如果與JSP對應的Servlet不存在,就解析檔案系統中的JSP檔案,將它翻譯成Servlet原始檔,接著把Servlet原始檔編譯成Servlet類,然後再去初始化並執行Servle。
下是經過翻譯的JSP檔案,可見在它的服務方法中存在以下對像
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
JSP語法:
SP指令 < %@ 指令名 屬性=“值”%>
JSP宣告 成員變數,或是成員方法。<%! …. %>
Java程式片段 不論有多少這樣的程式碼塊,都將包含_jspSerivice方法中。<% … %>
Java表示式 快速輸出資訊. _jspSerivice。<%= …%>
JSP隱含對像 pageContext.request,response,session,confing,application
JSP指令-page:
語法:<%@ 指令名 屬性=“值”%>
Page指令-用於指定所使用的語言,及匯入的包。
屬性說明:
language – 示例:language=“java”
import -如: (注意多個引用之間使用逗號分開。)
<%@ page import=“java.util.,java.sql.”%> contentType – 指定響應結果的MIME型別。預設為text/html;charset=ISO-8859-1
session = true | false –指定jsp頁面是否使用session.
errorPage = url – 指定當發生異常時轉發到哪一個頁面。
isErrorPage = true|false, - 表示此頁是處理異常的頁面。
pageEncoding – 設定頁面的編碼方式,此編碼方式,會自動應用到contentType中的charset上,如果沒有設定content-Type的話。顯示時以content-Type為準。建議這兩個值應該設定一個或至少應該一致。建議設定content-Type
buffer = none | 8kb | sizeb – 設定頁面緩衝區大小。-建議不要修改此值。
JSP指令-taglib—標籤庫:
taglib指令,用於在頁面上宣告要使用的自定義標籤。
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
uri – 指定自定義的標籤的引用URI。
Prefix-指定使用時的字首。
如:
此內容將在講自定義標籤時具體講。
JSTL :java Standard Tag Lib
URL – 統一資源定位符
URI – 統一資源識別符號.—XML namespace=“http://hncu.cn”
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*,java.awt.*" errorPage="jsps/error.jsp" pageEncoding="UTF-8"%>
<!-- jsp中的導報:1.import 2.","+包 -->
<!-- isErrorPage="true":錯誤頁面 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP技術演示</title>
</head>
<body>
<h2>這是主頁</h2>
cForEach:<c:forEach begin="0" end="10">
這裡相當於for迴圈...<br/>
</c:forEach>
<%
for(int i=3;i<10;i++){ //注意JSP表示式不能用;號結束
%>
<%=i %><br/>
<%
}
%>
<%//JSP的Java程式片段和JSP表示式:
//可以宣告多個Java片段,它們都位於_jspService方法中。
int a=100;
out.println(a+"<br/>");//JspWriter
//jsp八個隱藏物件--用PageContext()可以獲取
Button b=new Button("測試導報");//在page指令中import屬性新增,java.awt.*
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=sdf.format(d);
out.println(time+"<br/>");
//JSP中的區域性變數---在底層函式 _jspService()內都有效
String str="湖南城院";
//錯--底層函式_jspService()內不可巢狀函式
//void hello(){
//}
//pageContext.setAttribute("name", "page1111");
//request.setAttribute("name", "req22222");
//session.setAttribute("name", "session33333");
application.setAttribute("name", "app44444");
%>
<%!//JSP宣告
//宣告函式或者變數,JSP中的成員變數或方法----在index_jsp.java中和 _jspService()並列的方法
//語法:
int t=1;
String hello(){
return "hello";
}
//可以宣告靜態變數,也可以宣告靜態方法。可以多個JSP宣告的程式碼塊。
%>
<%out.println("out.println_str:"+str+"<br/>");//在底層函式 _jspService()內訪問它的的區域性變數
out.println("out.println_hello():"+hello()+"<br/>");//在底層函式 _jspService()內訪問它的的成員變數
//依次從pageContext開始request,session,application,從小到大尋找一個name屬性的值
String name=(String)pageContext.findAttribute("name");
out.println("out.println_name:"+name+"--pageContext.,request,session,application中之一的name屬性值<br/>");
String name2=(String)pageContext.findAttribute("name2");
out.println("out.println_name2:"+name2+"<br/>");//null
%>
$_name:${name}--pageContext.,request,session,application中之一的name屬性值<br/><!-- el表示式 -->
$_name2:${name2}若4個容器中都不存在該屬性,什麼也不輸出(不會輸出null)<br/><!-- 若4個容器中都不存在該屬性,什麼也不輸出(不會輸出null) -->
<!-- 快速輸出, 小細節: %=兩者緊挨著,結尾處不要新增";"號 -->
<%="快速輸出str:"+str+"<br/>" %>
<%="快速輸出hello():"+hello()+"<br/>" %>
<%="快速輸出name:"+name+"<br/>" %>
<%="快速輸出name2:"+name2+"<br/>" %><!-- 輸出null -->
<% //exception.getStackTrace();//必須在page指令中新增屬性isErrorPage="true"
//使用exception,必須在Page指令中新增屬性:isErrorPage="true"
%>
<%
//以下用於測試erroPage屬性
//int i = 100/0;
%>
</body>
</html>
<%@ page session="false" language="java" import="java.util.*,java.awt.*" isErrorPage="true" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>錯誤...</title>
</head>
<body>
<h1>這是錯誤頁面</h1>
<%
out.println(exception);
//session.getAttribute("aa");
%>
</body>
</html>