javaweb:JSP快速入門
使用jsp的原因:
Servlet的缺點:
Servlet技術:
• 缺點:不適合設定html響應體,需要大量的response.getWriter().print("<html>")
• 優點:動態資源,可以程式設計。l html技術:
• 缺點:html是靜態頁面,不能包含動態資訊
• 優點:不用為輸出html標籤而發愁
jsp(java server pages):
優點:在原有html的基礎上新增java指令碼,構成jsp頁面。
JSP簡介:
JSP(Java Server Pages)與Java Servlet一樣,是在伺服器端執行的
•不同的是先由伺服器編譯部署成Servlet執行
JSP的組成
•jsp = html + java指令碼 + jsp標籤(指令)
•jsp中無需建立即可使用的物件一共有9個,被稱之為9大內建物件。例如:request物件、out物件
JSP的指令碼元素
•<%...%>:java程式碼片段(常用)
•<%=...%>:java表示式,用於輸出(常用)
•<%!...%>:宣告,用來建立類的成員變數和成員方法(基本不用,但容易被考到)
JSP 指令碼元素:
<%! %>:這裡面的程式碼相當於java中的全域性變數或方法宣告和賦值
<% %>:在裡面的程式碼相當於java中的println輸出內容
<% %>:在裡面的程式碼相當於java的區域性變數和java程式程式碼。
Declaration(宣告):
l宣告的格式: <%! 宣告1;[宣告2];……%>
l宣告的作用範圍是整個JSP頁面,同時它只在一個JSP頁面有效
l宣告的型別包括:變數,方法,類
Jsp的註釋:
存在下面的兩種註釋方法:
JSP註釋:<%-- … --%>
JAVA註釋://、/**/、/***/,編譯階段消失
HTML註釋:<!-- … -->, 不會消失,在頁面中也能看到
注意:在Jsp中的註釋我們推薦使用Jsp的註釋方法,因為很多情況下,如果我們的Jsp程式碼中含有Jsp的標籤,那麼使用html註釋該標籤將會不起作用。
Expression(表示式):
l語法格式
•<%= 變數或表示式 %>
l表示式的計算結果轉換成字串
•使用隱含物件out進行輸出
l範例
•<%=“abc” %> 等價於 out.print(“abc”);
lJSP指令碼表示式中的變數或表示式後面不能有分號(;)
Scriptlets(程式碼塊):
l語法格式
•<% java code %>
l在“<%”和”%>”之間插入java程式片,一個JSP頁面可以有許多程式片,這些程式碼塊將被JSP伺服器按照順序執行
在一個程式碼塊中宣告的變數是JSP頁面的區域性變數,只在當前頁面有效
JSP的執行原理:
ljsp其實是一種特殊的Servlet
l > 當jsp頁面第一次被訪問時,伺服器會把jsp編譯成java檔案(這個java其實是一個servlet類)
l > 然後再把java編譯成.class
l > 然後建立該類物件
l > 最後呼叫它的service()方法
l > 第二次請求同一jsp時,直接呼叫service()方法。
JSP程式的翻譯過程:
JSP與Servlet的分工:
一個例子
jiaServlet.java:
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 處理求和的操作
* @author Administrator
*
*/
public class JiaServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.獲取請求引數
* 2.求和
* 3.使用轉發或者重定向到成功頁面
*/
// 獲取請求引數
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
int num11 = Integer.parseInt(num1);
int num22 = Integer.parseInt(num2);
int result = num11 + num22;
// 找到成功的頁面
// 使用重定向或者轉發
request.setAttribute("result", result);
// 只能使用轉發了(/jsp/he.jsp)
request.getRequestDispatcher("/jsp/he.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
he.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Integer result = (Integer)request.getAttribute("result");
%>
<h3>顯示成功的結果:<%= result %> </h3>
</body>
</html>
jia.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day11/jia" method="post">
整數1:<input type="text" name="num1" /><br/>
整數2:<input type="text" name="num2" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
JSP
•作為請求發起頁面,例如顯示錶單、超連結。
•作為請求結束頁面,例如顯示資料。
lServlet
•作為請求中處理資料的環節。
jsp三大指令:
page
page指令標記:
page屬性包含在“<%@ page ”和“%>”之間。
<%@page language=”java” info=”xxx”…%>**
這些屬性可以單獨使用,也可以幾個或多個同時使用
page指令用來定義JSP檔案的全域性屬性
在JSP頁面中,只有import可以出現多次,其它屬性都只能出現一次
page指令標記:
pageEncoding和contentType:
pageEncoding:它指定當前jsp頁面的編碼,只要不說謊,就不會有亂碼!在伺服器要把jsp編譯成.java時需要使用pageEncoding!
contentType:它表示新增一個響應頭:Content-Type!等同與response.setContentType(“text/html;charset=utf-8”);
如果兩個屬性只提供一個,那麼另一個的預設值為設定那一個。
如果兩個屬性都沒有設定,那麼預設為iso
import:導包!可以出現多次
errorPage和isErrorPage
errorPage:當前頁面如果丟擲異常,那麼要轉發到哪一個頁面,由errorPage來指定
isErrorPage:它指定當前頁面是否為處理錯誤的頁面!當該屬性為true時,這個頁面會設定狀態碼為500!而且這個頁面可以使用9大內建物件中的exception!
<error-page>有兩種使用方式:
<error-code>和<location>子元素;
<exception-type>和<location>子元素;
其中<error-code>是指定響應碼;<location>指定轉發的頁面;<exception-type>是指定丟擲的異常型別。
在web.xml中配置
<error-page>
<error-code>404</error-code>
<location>/error/errorPage.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/index.jsp</location>
</error-page>
autoFlush和buffer
autoFlush:指定jsp的輸出流緩衝區滿時,是否自動重新整理!預設為true,如果為false,那麼在緩衝區滿時丟擲異常!
buffer:指定緩衝區大小,預設為8kb,通常不需要修改!
isELIgnored:是否忽略el表示式,預設值為false,不忽略,即支援!
(以下了解即可):
language:指定當前jsp編譯後的語言型別,預設值為java。
info:資訊!
isThreadSafe:當前的jsp是否支援併發訪問!
session:當前頁面是否支援session,如果為false,那麼當前頁面就沒有session這個內建物件!
extends:讓jsp生成的servlet去繼承該屬性指定的類!
include –> 靜態包含:
與RequestDispatcher的include()方法的功能相似!他們共同生成一個java(就是一個servlet)檔案,然後再生成一個class!
RequestDispatcher的include()是一個方法,包含和被包含的是兩個servlet,即兩個.class!他們只是把響應的內容在執行時合併了!
linclude指令的語法格式如下
•<%@ include file=“filename” %>
linclude指令的作用是在JSP頁面中靜態包含一個檔案,同時由JSP解析包含的檔案內容
作用:把頁面分解了,使用包含的方式組合在一起,這樣一個頁面中不變的部分,就是一個獨立jsp,而我們只需要處理變化的頁面。
l靜態包含的含義
•file不能為一變數
•<% String url="index.html" ; %>
•<%@ include file = "<%= url %>" %>
•不可以在file 所指定的檔案後接任何引數
•<%@ include file = "jw.jsp?nm=browser" %>
靜態包含舉例:
l包含的是目標檔案的原始碼;包含過來,一起翻譯
lmain.jsp
<%
String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp
<%=s %> 沒有定義變數s
儘管part.jsp本身會有錯誤
但是執行main.jsp就可以正確引入part.jsp
taglib –> 匯入標籤庫:
兩個屬性:
prefix:指定標籤庫在本頁面中的字首!由我們自己來起名稱!
uri: 指定標籤庫的位置!
<%@taglib prefix=”s” uri=”/struts-tags”%> 字首的用法<s:text>
九大內建物件:
在jsp中無需宣告即可直接使用的9個物件
out(JspWriter):等同與response.getWriter(),用來向客戶端傳送文字資料;
config(ServletConfig):對應“真身”中的ServletConfig;
page(當前JSP的真身型別):當前JSP頁面的“this”,即當前物件,引用為Object型別;
pageContext(PageContext):頁面上下文物件,它是最後一個沒講的域物件;
exception(Throwable):只有在錯誤頁面中可以使用這個物件;
request(HttpServletRequest):即HttpServletRequest類的物件;
response(HttpServletResponse):即HttpServletResponse類的物件;
application(ServletContext):即ServletContext類的物件;
session(HttpSession):即HttpSession類的物件,不是每個JSP頁面中都可以使用,如果在某個JSP頁面中設定<%@page session=”false”%>,說明這個頁面不能使用session。
pageContext(一個頂9個!)
Servlet中有三大域,而JSP中有四大域!
ServletContext:整個應用程式
session:整個會話(一個會話中只有一個使用者)
request:一個請求鏈!
pageContext:一個jsp頁面!這個域是在當前jsp頁面和當前jsp頁面中使用的標籤之間共享資料!
域物件
代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
全域查詢:pageContext.findAttribute(“xxx”);從小到大,依賴查詢!
獲取其他8個內建物件:
內建物件的型別:
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
page this (HttpServlet)
pageContext PageContext
exception Throwable (所有異常父類)
out JspWriter
exception物件:
exception物件是java.lang.Trowable類的例項
(使用前 isErrorPage=“true”)
exception物件用來處理JSP檔案在執行時所有發生的錯誤和異常
exception物件可以和page指令一起使用,通過指定某一個頁面為錯誤處理頁面,對錯誤進行處理
•<%@ page isErrorPage=”true “%>的頁面內使用
page物件 ---- Servlet物件:
“page” 物件代表了正在執行的由JSP檔案產生的類物件 【一般不建議使用】
page物件是指向當前JSP程式本身的物件this
page物件其實是java.lang.Object類的例項物件
out物件:
向客戶端輸出資料
管理伺服器輸出緩衝區
內部使用PrintWriter物件來輸出文字級資料
通過page指令的buffer屬性來調整緩衝區的大小,預設的緩衝區是8kb
out隱式物件的工作原理圖 :
pageContext物件:
pageContext也是域物件,代表當前的頁面範圍,在當前的頁面範圍內獲取資料。
向JSP的四個作用域範圍內存資料。
•Servlet中有三個域,而JSP有四個域。
•JSP中多了pageContext的域範圍,代表當前頁面範圍。
獲取其他8個內建物件。
•編寫框架、通用性較高的程式碼。
pageContext物件可以直譯為“頁面上下文”物件,代表的是當前頁面執行的一些屬性
它是javax.servlet.jsp.PageContext類的例項物件,可以使用PageContext類的方法。pageContext物件提供了對JSP頁面所有的物件及名稱空間的訪問
提供了page範圍的存取方法
•Object getAttribute(String name)
•void removeAttribute(String name)
•void setAttribute(String name, Object value)
findAttribute方法 (*重點,查詢各個域中的屬性)
通過pageContext獲得其他物件 :
getException方法返回exception隱式物件
getPage方法返回page隱式物件
getRequest方法返回request隱式物件
getResponse方法返回response隱式物件
getServletConfig方法返回config隱式物件
getServletContext方法返回application隱式物件
getSession方法返回session隱式物件
getOut方法返回out隱式物件
JSP的四種資料範圍:
物件 scope
pageContext page範圍
request 請求範圍
session 會話範圍
application 應用範圍
JSP動作標籤:
JSP標籤也稱之為Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java程式碼,造成jsp頁面難以維護。
這些JSP的動作標籤,與HTML的標籤有本質上的區別,動作標籤是由Tomcat(伺服器)來解釋執行的,都是在伺服器端執行的。HTML標籤是由瀏覽器執行的。
JSP常用標籤:
<jsp:useBean>
•使用一個ID和一個給定作用範圍和同一ID的JavaBean相關聯
<jsp:setProperty>
•設定JavaBean的屬性值
<jsp:getProperty>
•取得JavaBean的屬性值
<jsp:include>
•檔案包含(伺服器端路徑,沒有專案名稱)
動態包含原理:
<jsp:forward>
•在JSP的頁面中完成轉發(伺服器端路徑,沒有專案名稱)
<jsp:param>
•需要寫在<jsp:forward>的中間
<jsp:include>
例如:<jsp:include page="xxx"/>,用來包含指定的頁面。假如有兩個jsp. 分別為a.jsp和b.jsp,他們分別編碼成Servlet,然後在執行Servlet時才會執行包含過程。這也是include指令與include標籤的區別。
注意:<jsp:include page="<%=myfile%>">,這是可以的!因為include指令是在執行時才完成的包含,在執行時已經可以確定myfile這個變數的值。
該標籤內部使用的是RequestDispatcher#include()方法完成的包含
<jsp:forward>
例如:<jsp:forward page="xxx"/>,用來轉發到指定頁面
例如在a.jsp中存在如下內容:<jsp:fowrad page="b.jsp"/>
a.jsp中的內容不會顯示在瀏覽器上,而只是顯示b.jsp的內容。而且在<jsp:forwad>標籤下面的內容不會被執行。
<jsp:param>
該標籤是和的子標籤,用來向其他頁面傳遞引數。
<jsp:include>與include指令的比較 :
<jsp:include>標籤是動態引入, <jsp:include>標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合併。
而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在原始檔級別進行合併。
不管是<jsp:include>標籤,還是include指令,它們都會把兩個JSP頁面內容合併輸出,所以這兩個頁面不要出現重複的HTML全域性架構標籤,否則輸出給客戶端的內容將會是一個格式混亂的HTML文件。
兩種include用法的區別: