JavaWeb_day07_JSP

本文爲博主辛苦總結,但願本身之後返回來看的時候理解更深入,也但願能夠起到幫助初學者的做用.

轉載請註明 出自 : luogg的博客園 謝謝配合!

day07 JSP

全稱 :Java Server Pages ,jsp實際就是一個servlet
jsp運行機制: 用戶訪問jsp頁面,服務器將其轉換成servlet,也就是java文件,而後編譯成class文件,最後運行,最後響應給用戶。html

工程jsp中不少波浪線報錯,是由於找不到jar包。java

jsp也是一個servlet

public final class HelloJSP_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent {web

在G:\eclipse項目.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\employeePro\org\apache\jsp 中找到當前項目的jsp文件,能夠看到jsp被編譯成了java和class文件,修改jsp,運行,能夠看到被編譯以後的java文件已修改。在_jspService方法下修改了。apache

咱們去tomcat的lib目錄找到org.apache.jasper.runtime.HttpJspBase,而後對其反編譯,public abstract class HttpJspBase extends HttpServlet implements HttpJspPage { 發現jsp繼承的HttpJspBase也繼承了HttpServlet,說明jsp也繼承了HttpServlet。windows

JSP設置編碼格式

右鍵文件->properties->other utf-8
設置jsp默認編碼:windows->preference->搜索jsp->jsp file->encoding修改utf-8
通常不直接複製文件,會亂碼,ctrl+A,複製所有代碼而後粘貼到同類名的文件中tomcat

JSP腳本元素

<% 普通java代碼,局部變量,放在了jspService方法中 %>服務器

<%! 全局變量,放在_jsp_Service方法外邊%> 非靜態,只是定義在類中的全局變量,在jsp聲明中不可使用javaService方法中的9個隱式對象.session

<%= 表達式,輸出時候使用%> 好比 : <tr><td><%=rs.getInt(1) %></td><td><%=rs.getString(3) %></td></tr>app

JSP註釋

1.HTML註釋 註釋在翻譯的java文件也存在,在頁面也存在
2.Java註釋,在翻譯成的java文件中也存在,在頁面不存在.框架

<%  
    1.//    
    2./* */    
    3./** **/    
%>

3.JSP註釋:<%-- --%>只存在於jsp頁面

JSP指令

語法 : <%@ 指令元素 屬性名=屬性值 %>
 若是一個指令有多個屬性,這多個屬性能夠寫在一個指令中,中間用空格隔開。即上面兩條指令等價表示以下

JSP共有3個指令:

1.page指令: page指令用於定義JSP頁面的各類屬性,import屬性能夠出現屢次,其餘屬性只能出現一次,重點:session,import,contentType,pageEncoding,isELIgnonred

  • session屬性爲true時,翻譯後的servlet中會自動建立session對象,false則不建立。
  • errorPage屬性:指定錯誤頁面
  • isErrorPage屬性 :爲true時,表示該頁面是處理錯誤頁面,JSP引擎在翻譯成servlet時,會定義一個exception對象,從而就能夠用exception隱式對象得到出錯信息。
  • import屬性:引入java中的jar包(使用屢次)
  • language屬性:JSP文件容許嵌入的語言,只支持一種JAVA語言.
  • extends:JSP翻譯成Servlet文件時servlet繼承的類.(不須要改變)
  • buffer屬性:設置緩衝區大小
  • aotoFlush:設置默認刷新緩衝區(不須要修改)
  • contentType屬性:服務器端輸出全部內容採用的編碼
  • pageEncoding屬性:JSP翻譯成Servlet文件時採用的編碼
  • isElIgnored屬性:是否忽略EL表達式(false不忽略)

2.include指令,靜態引入其餘JSP頁面,

  • 語法:<%@ include file="要包含文件的地址(靜態包含)" %>
    <%@ include file="/include/head.jsp" %>

3.taglib指令:引入標籤庫文件語法:<%taglib %>

屬性:

  • uri :引入標籤庫文件的名稱
  • prefix:標籤庫的前綴名

JSP9大隱式對象(直接使用)

  • request://就是Servlet裏的HttpServletRequest , 方法setAttribute() getAttribute()
  • response: //就是Servlet裏的HttpServletResponse,方法:addCookie() , getWriter()
  • session: //就是Servlet裏的HttpSession,方法setAttribute() ,getAttribute()
  • application: //就是servlet裏的 servletContext,方法setAttribute() , getAttribute()
  • config: //就是Servlet裏的servletConfig,方法getInitParameter(), getInitParameterNames()
  • page: //就是Servlet本身,Object
  • exception: //異常,只有errorPage纔有,而且isErrorPage=true時纔可使用
  • out://JSP頁面輸出,JspWriter,方法 write() , print()
  • pageContext://pageContext方法setAttribute(), getAttribute(), 域對象,本身存取值 , 向其餘的域存取值。能夠獲取其餘8個對象。編寫框架或者通用性較高代碼。
    • pageContext對象是JSP技術中最重要的一個對象,它表明JSP頁面的運行環境,這個對象不只封裝了對其它8大隱式對象的引用,它自身仍是一個域對象,能夠用來保存數據。而且,這個對象還封裝了web開發中常常涉及到的一些經常使用操做,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。
    • setAttribute(String name, Object value, int scope)

    • getAttribute(String name, int scope)
    • findAttribute(String name)
      • 返回page隱式對象
      • getRequest() //方法返回request隱式對象
      • getResponse() //方法返回response隱式對象
      • getgetServletContext() //方法返回 application隱式對象
      • getServletConfig() //方法返回config隱式對象
      • getSession() //方法返回session隱式對象
      • getOut() //方法返回out隱式對象

      • 另外還有個findAttribute方法(*重要,查找各個域中的屬性,EL表達式就依賴於這個方法),能夠直接調用pageContext.findAttribute(String name),首先會從pageContext裏找該屬性,若是沒有,會依次按照下面順序在相應的域中查找:request, session, servletContext,若是沒找着,返回null,不然返回屬性值。
      •  pageContext類中定義了一個forward方法和兩個include方法分別簡化和替代RequestDispatcher.forward方法和include方法,方法接收的資源若是以"/"開頭,"/"表明當前web應用。不過這裏的include是動態包含,不建議使用include。

JSP4個域對象

ServletContext  application域,整個web應用,servletContext中存的數據在整個應用程序範圍內均可以取出
session         session域,一次會話,/session中存的數據在會話範圍內均可以取出
request         request域,一次請求,request中存的數據在請求範圍內均可以取出
pageContext     page域,當前頁面,pageContext中存的數據在頁面範圍均可以取出

JSP3大標籤(動做)

它用於在JSP頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼形成JSP頁面難以維護。

1. 標籤 : 頁面的包含(動態包含)

  • 屬性:page 要包含的頁面
  • 語法:

<jsp:include page="index.html"></jsp:include>
  至關於調用pageContext.include("relativeURL")

2. 標籤 : 轉發

  • 屬性:page 要轉發的頁面
  • 語法: <jsp:forward page=""></jsp:forward>

3. 標籤 : 當使用 標籤引入或將請求轉發給其它資源時,可使用 標籤向這個資源傳遞參數。

  • 屬性 : name:參數名稱 value:參數值
  • 語法 :
    <jsp:include page="index.jsp"> <jsp:param value="" name=""/> </jsp:include>
    至關於index?name=...&value=....

或者
<jsp:forward page="index.jsp"> <jsp:param value="" name=""/> </jsp:forward>

JSP映射

JSP也能夠像Servlet那樣映射,由於JSP原本就是Servlet。

<servlet>
    <servlet-name>SimpleJspServlet</servlet-name>
    <jsp-file>/jsp/simple.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>SimpleJspServlet</servlet-name>
    <url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>

/jsp/simple.jsp表示在webRoot/jsp目錄下的simple.jsp文件

include指令與include動做區別

include指令:<%@include file="top.jsp" %>
include標準動做:<jsp:include page="top.jsp"></jsp:include>

include指令:是在編譯以前就把包含文件的代碼合併在了一塊兒,共同生成一個.java文件,因此在編譯的時候會出現重複定義了本地變量的狀況。而include動做先將主頁面獨立生成一個.class文件,運行時候和包含的文件合併在一塊兒,因此不會出現重複定義變量的錯誤信息。

設置404 500錯誤提示頁面

在xml中加入:

<error-page>
    <error-code>404</error-code>
    <location>/error404.jsp</location>
  </error-page>

而後在錯誤指定的頁面page指令中輸入isErrorPage="true"

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息