1. 程式人生 > >javaweb:JSP快速入門

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程式的翻譯過程:

JSPServlet的分工:

一個例子

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和一個給定作用範圍和同一IDJavaBean相關聯

<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>標籤涉及到的2JSP頁面會被翻譯成2servlet,這2servlet的內容在執行時進行合併。

include指令是靜態引入,涉及到的2JSP頁面會被翻譯成一個servlet,其內容是在原始檔級別進行合併。

不管是<jsp:include>標籤,還是include指令,它們都會把兩個JSP頁面內容合併輸出,所以這兩個頁面不要出現重複的HTML全域性架構標籤,否則輸出給客戶端的內容將會是一個格式混亂的HTML文件。

兩種include用法的區別: