JSP

經常使用配置項解析

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
  • <% String path = request.getContextPath();%>jsp裏面用到意思是:css

    • 1.request.getContextPath() 得到當前的項目根目錄路徑;html

    • 2.聲明一個字符串變量path;java

    • 3.將當前項目的根目錄複製給變量path。web

  • String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";面試

    • 得到應用的根url,好比說你的應用的根路徑是 http://localhost:8080,那麼你列出的代碼就是爲basePath賦值爲 http://localhost:8080瀏覽器

    • 具體點:緩存

      • 一、request.getScheme() 返回協議的名稱 http,和後面的"://" 拼起來就成了 http://tomcat

      • 二、request.getServerName() 這是獲取你的服務器的名稱,若是你的應用部署在本機那麼其就返回localhost或者127.0.0.1 ,這2個是等價的服務器

      • 三、request.getServerPort() 是你應用使用的端口,好比8080或者80session


只用在修改類和配置文件時才須要從新部署

JSP原理

因爲原理上是Servlet, 因此JSP/Servlet在一塊兒。

HTML、Servlet和JSP

  • 一、HTML:靜態頁面,不能包含java代碼,只能有HTML有關的標記

  • 二、Servlet:寫java代碼,作頁面的輸出,不是很方便(開發效率很低)

  • 三、JSP:HTML+java


學習JSP技巧

一、JSP就是Servlet,學習好JSP的關鍵(語法),時刻想到他對應的Servlet。
圖片描述

二、時常翻閱JSP對應的Servlet源碼(到tomcat下查看jsp相對應的*.java文件)

JSP的語法

模板元素

  • 指JSP中的那些HTML。開發時先編寫模板元素,由於他們決定頁面的外觀。

Java程序片斷

  • 語法:<%java程序%>

  • 出如今JSP對應Servlet的service方法中。

  • <%聲明的變量:局部%>

Java表達式

  • 語法:<%=表達式%>

示例

<!-- 以表格的形式打印出來 -->
       <table border = "1" width = "438">
               <tr>
                   <th>姓名</th>
                   <th>性別</th>
                   <th>年齡</th>
               </tr>
               <% 
                   for(student s : stu){
               %>
               <tr>
                   <td><%=s.getName()%></td>
                   <td><%=s.getGender()%></td>
                   <td><%=s.getAge()%></td>
               </tr>
               <%
               }
                %>

JSP聲明

語法:<%!

%>
做用:定義JSP對應Serlvet的成員(變量和方法、靜態方法)全局變量

注意:開發中不多用。面試和考試常常考。

JSP註釋

語法:<%--這是註釋--%>

做用:註釋掉的代碼,JSP引擎不會翻譯到Servlet源碼中。要注意和HTML註釋的區別。

JSP指令:

  • 指令是爲JSP引擎設計的。而只是告訴引擎如何處理JSP頁面中的其他部分(非指令部分);
    基本語法格式:<%@指令 屬性1=」值1」 ....%>.

  • 通常把指令放在JSP頁面的頂部(不是必須的)

  • 指令的屬性能夠寫在一個指令的中,也能夠分開寫:好比:
    <%@指令 屬性1=」值1」 屬性2=」值2」%>.

  • 等價於:
    <%@指令 屬性1=」值1」 %>.

  • <%@指令 屬性2=」值2」%>.

page:
  • 屬性:

  • language:告知引擎,腳本用的是java。默認java,支持java。不寫也行。

  • extends:告知引擎,JSP對應的Servlet的父類是哪一個。不須要寫,也不要改。

  • *import:告知引擎,導入哪些包。

  • 注意:引擎自動導入: java.lang.;javax.servlet.;javax.servlet.http.;javax.servlet.jsp.;

導入的形式:
  • <%@page import=」java.util.Date,java.util.UUID」%>或者: <%@page
    import=」java.util.Date」%> <%@page import=」java.util.UUID」%>

  • 用Eclipse:Alt+/ 自動導入

  • *session:告知引擎是否產生HttpSession對象,便是否在代碼中調用request.getSession()。默認值true。 buffer:JspWriter用於輸出JSP的內容到頁面上。告知引擎,設定他的緩存大小。默認8Kb。

  • *errorPage:告知引擎,當前頁面出現了異常,應該轉發到哪一個頁面上(路徑寫法:/表明着當前應用,相對路徑)

  • 配置全局錯誤頁面:web.xml
    圖片描述

  • isErrorPage:告知引擎,是否抓住異常。若是該屬性爲true,頁面中就可使用exception隱含對象,打印異常的詳細信息。

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>
    
    
    <body>
        <%=exception.getMessage() %>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
        <h1>服務器出錯了</h1>
      </body>
  • contentType:告知引擎,響應正文的MIME類型。
    contentType=」text/html;charset=UTF-8」 至關於response.setContentType(「<%=exception.getMessage() %>」);

  • pageEncoding:告知引擎,翻譯JSP時(要從磁盤上讀JSP文件)所用的碼錶。要和存的時候編碼一致
    圖片描述

  • pageEncoding=」UTF-8」:至關於,告知了引擎用UTF-8讀jsp,還response.setContentType(「text/html;charset=UTF-8」);

  • isELIgnored:告知引擎,是否忽略EL表達式。默認值是false,不忽略。


include:

  • 包含屬性:file,以」/」開頭,就表明着當前應用。

taglib:

  • 引入外部的標籤。實現視圖代碼重用,不多量的代碼就能實現很複雜的效果

  • 要使用標籤功能必須先聲明標籤庫以及標籤前綴
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

  • uri:外部的標籤的uri地址,比如名稱空間

  • prefix:前綴。

JSP中的轉發和包含

  • 一、轉發:<jsp:forward page="/10forward.jsp"></jsp:forward>

<jsp:forward page="/10forward.jsp">
        <jsp:params value="124" name="username"
    </jsp:forward>
  • forward不只能夠跳轉到本應用的另外一個servlet jsp頁面,也能夠跳轉到另一個文件,甚至WEB-INF文件夾下的文件

  • 當使用forward進行跳轉時, 地址欄會顯示跳轉前的訪問地址,跳轉是在服務器端實現的

  • 重定向是利用服務器返回的狀態碼來實現的。客戶端瀏覽器請求服務器的時候,服務器會返回一個狀態碼

  • 進行重定向時,跳轉是在客戶端實現的。也就是客戶端實際上請求了服務器兩次。第一次得到重定向狀態碼和重定向的網址,第二次訪問真實網址,

  • JSP的內置標籤。

  • 二、參數:不能單獨使用
    向目標傳遞請求參數

  • 三、包含:(面試題)

    • 靜態包含:<%@include %> 在編譯的時候,將源碼加了進去

    • 動態包含:其他的

    • <jsp:include page=」」/>

  • 總結:用標籤能夠少些java腳本。


JSP九個隱含對象

圖片描述

PageContext抽象類(很重要)每一個頁面都有本身惟一的pageContext對象

  • 一、自己是一個域(範圍)對象,還能操做其餘3個域對象中的屬性

    • 頁面範圍:

    void setAttribute(String name,Object value);
    void removeAttribute(String name);
    Object getAttribute(String name);

    • 操做其餘域對象中的屬性:

    void setAttribute(String name,Object value,int scope);
    void removeAttribute(String name,int scope);
    Object getAttribute(String name,int scope);

    • int scope:常量,PageContext PAGE_SCOPE(頁面) REQUEST_SCOPE(請求)SESSION_SCOPE(會話)APPLICATION_SCOPE(應用)

  • 在四個範圍中依次查找指定名稱對象的方法:
    PAGE(頁面) REQUEST(請求)SESSION(會話)APPLICATION(應用)

  • 超出頁面範圍結果爲null,若是是同一個對象,那麼就會輸出value值。

    • Object findAttribute(String name); 從四個對象中依次查找

  • 二、獲取其餘八個JSP隱含對象(自定義標籤時用)

    PageContext.getRequest();
    getServletContext();
    getServletConfig();
    getException();
    get...

  • 三、提供轉發和包含的簡易方法

    pageContext.include(String url);

    • 參數必須以「/」開始,「/」表示本web應用程序的根目錄(WebRoot)

  • pageContext demo

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>pageContext demo</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
 <body>
    <% pageContext.setAttribute("p", "pp"); %>
    <% pageContext.setAttribute("p", "pp", pageContext.PAGE_SCOPE); %>
    
    <% request.setAttribute("p", "rp"); %>
    <% pageContext.setAttribute("p", "rp", pageContext.REQUEST_SCOPE); %>
    
    <% session.setAttribute("p", "sp"); %>
    <% pageContext.setAttribute("p", "sp", pageContext.SESSION_SCOPE); %>
    
    <% application.setAttribute("p", "ap"); %>
    <% pageContext.setAttribute("p", "ap", pageContext.APPLICATION_SCOPE); %>
     <%--
    <jsp:forward page = "2.jsp"></jsp:forward>
    --%>
    <%--
        response.sendRedirect("2.jsp");
        --%>
    <%
    
        pageContext.forward("/test/2.jsp");
     %>
    
     <%--
    <%=pageContext.getAttribute("p")%>
    <%=request.getAttribute("p")%>
    <%=session.getAttribute("p")%> --%>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>2</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    page:<%=pageContext.getAttribute("p")%></br>
    request:<%=request.getAttribute("p")%></br>
    session:<%=session.getAttribute("p")%></br>
    application:<%=application.getAttribute("p")%></br>
  </body>
</html>

四大域對象

  • 實際開發中:存放數據的。

  • PageContext:頁面範圍。最小。開發中不多用。演示代碼。

  • ServletRequest:請求範圍。不一樣的資源,只有用轉發。

  • HttpSession:會話範圍。屢次請求共享數據,但不一樣的客戶端不能共享。

  • ServletContext:應用範圍。最大。儘可能少用。用時要作同步處理。

JSP開發的最佳實踐

  • Servlet:擅長寫Java代碼邏輯,不擅長輸出html的內容。

  • 開發中做爲:控制器。

  • JSP:不擅長寫Java代碼邏輯,擅長顯示結果。

  • 開發中做爲:視圖(顯示結果)
    圖片描述

JavaBean的概念

  • 一、JavaBean又稱之爲POJO(Plain Old Java Object)、VO(Value Object)、DO(Data Object)

  • 二、JavaBean的書寫規範

    • a、必須是public的

    • b、提供默認的構造方法

    • c、字段都是私有的: private String username;

    • d、提供公有的getter或setter方法:屬性。

    • getUsername():讀屬性,屬性名:username.

    • setUsername(String username):寫屬性,屬性名:username。

    • 注意:private boolean married; getMarried()===isMarried()

    • e、通常須要實現java.io.Serializable接口。

  • 結論:JavaBean在JavaEE開發中,主要擔當封裝數據用的。

相關文章
相關標籤/搜索