jsp 筆記

jsp概述

  • jsp全稱是 Java Server Page,它和servlet技術一樣,都是SUN公司定義的一種用于開發動態web資源的技術。jsp實際上就是servlet
  • jsp = html+java
  • jsp 主要用于顯示數據

jsp 的原理

翻譯-> 編譯 -> 執行
demo.jsp 翻譯成 _demo_jsp.java
_demo_jsp.java 編譯 _demo_jsp.class

jsp作用

  • Servlet:控制器。重點編寫java代碼邏輯(獲取表單數據,處理業務邏輯,分發轉向)。
  • jsp: 代碼顯示模板,重點在于顯示數據

jsp的基本語法

jsp模板元素

  • jsp 頁面中的HTML內容稱之為jsp模板元素。
  • jsp 模板元素定義了網頁的骨架,即定義了頁面的結構和外觀。

jsp腳本

1,jsp 腳本片段

語法
<%
    //多行java代碼
%>
<% 
    out.write("hello"); 
    out.write("142");
%>
注意
  • jsp 腳本片段只能初心java代碼,不能出現其他模板元素,jsp引進在翻譯jsp頁面中,會將jsp腳步片段中的jva代碼原封不動的放倒servlet中的_jspService方法中
  • jsp 腳本片段的java代碼必須嚴格遵循java語法 每行語句結束要有(;).
  • 多個腳本之間的變量可以相互訪問

2 jsp表達式

jsp用于將程序的數據輸出到客戶端

語法
<%=變量表達式%>
<%=2+8 %>
注意
jsp表達式中的變量和表達式后面**不能有(;)**

3,定義全局成員和靜態塊

語法
<%!  %>
<%!
    int i=0;
%>
<%
    int j=0;
%>
<%
    out.write(" i= "+(i++)+"   j= "+(j++));
%>
注意
i 是全局變量每次都會加1
j 每次請求都會初始化

jsp 注釋

  • jsp注釋<%-- 被注釋的內容 --%> 特點:安全,省流量
  • 網頁注釋: 特點:不安全,費流量
  • 在查看源碼時網頁注釋會顯示出來 jsp注釋不會顯示

jsp 三個指令

jsp指令是為jsp引擎二設計的,他們并不直接產生任何輸出,而只是告訴瀏覽器如何處理jsp頁面的其余部分。在jsp2.0規范中定義了三個指令

  • page 指令
  • include指令
  • taglib 指令
語法
<%@ 指令 屬性名1=“值1” 屬性名2=“值2”  屬性名3=“值3”>
或者
<%@ 指令 屬性名1=“值1”%>
<%@ 指令 屬性名2=“值2”%>
<%@ 指令 屬性名3=“值3”%>

<%@ page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

1,page

作用
用于定義jsp頁面的各種屬性,page指令最好是放在整個jsp頁面的起始位置。
屬性
  • 屬性含義
屬性 定義
language="java" 指定JSPContainer用什么語言來編譯,目前只支持Java語言。默認為JAVA
extends=”className” 定義此JSP網頁產生的Servlet是繼承哪個
import=”importList” 定義此JSP網頁要使用哪些Java API
session = "true false" 決定此頁面是否使用session對象,默認為ture
buffer=”none size in kb” 決定輸出流(Input stream)是否又緩沖區。默認為8kb
isThreadSafe=”true false” 是否支持線程。默認為true
errorPage=”url” 如果此頁發生異常,網頁會重新指向一個url
isErrorPage=”true false” 表示此頁面是否為錯誤處理頁面。默認為false
contentType=”text/html;charset=gb2312” 表示MIME類型和JSP的編碼方式
pageEncoding=”ISO-8859-1” 編碼方式
isELLgnored=”true false” 表示是否在此JSP頁面中EL表達式。true則忽略,反之false則支持。默認為false
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"  errorPage="error.jsp" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    int i= 10/0;
%>
</body>
</html>

error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>錯誤頁面</title>
</head>
<body>
errorMesg:
<% out.write(exception.getMessage());%>

</body>
</html>

web.xml配置error 頁面
 <error-page>
  <error-code>500</error-code>
  <location>/error.jsp</location>
</error-page>

2,include

  • 靜態包含:把其他資源包含到當前頁面
    <% include file="/header.jsp"%>
    <% include file="/footer.jsp"%>

  • 動態包含
    <jsp:include page="/foorer"></jsp:include>

  • 兩者的區別:翻譯的時間段不同

    • 靜態在翻譯時就把兩個文件合并
    • 動態不會合并文件,當代碼執行到include時,才包含另外一個文件內容
    • 能用靜態就不用動態

header.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
我是是頭部

index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/header.jsp" %>
我是內容
<%@ include file="/footer.jsp" %>

footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
我是底部

</body>
</html>

3,taglib

  • 作用:在jsp頁面中導入jstl標簽庫。替換jsp中的java代碼片段
  • <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

jsp 六個動作

  • 1,<jsp:include > 動態包含
  • 2,<jsp:forward> 請求轉發
  • 3,<jsp:param> 設置請求參數
  • 4,<jsp:useBean> 創建一個對象
  • 5,<jsp:setProperty> 給指定的對象屬性賦值
  • 6,<jsp:getProperty> 取出指定對象的屬性值
<jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean>
     <jsp:setProperty property="name" name="stu1" value="jerry"/>
     <jsp:getProperty property="name" name="stu1"/>
     
 <!-- http://localhost:8080/test.jsp?name=123 -->
 <jsp:forward page="/7.jsp">
    <jsp:param value="123" name="name"/>
    <jsp:param value="333" name="pwd"/>
 </jsp:forward>`

jsp 9個內置對象

  • 指在jsp的<%= %> 和<% %> 中可以直接使用的對象
對象名 類型 說明
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession 由session="true" 開關
application javax.servlet.ServeletContext
exception java.lang.Throwable 由 isErrorPage="false"開關
out javax.servlet.jsp.JspWriter 字符串輸出流,相當于PrintWriter對象
page java.lang.Object 當前對象this 當前servlet實例
pageContext javax.servlet.jsp.PageContext
config javax.servlet.ServletConfig

pageContext

1, 本身也是一個域對象,他可以操作其他三個域對象(request session application)的數據
  • void setAttribute(String name,Object o);
  • Object getAttribute(String name);
  • void removeAttribute(String name);
  • 操作其它域對象的方法
  • void setAttribute(String name,Object o,int Scope);
  • Object getAttribute(String name,int Scope);
  • void removeAttribute(String name,int Scope);
  • scpoe的值:
  • PageContext.PAGE_SCOPE
  • PageContext.REQUEST_SCOPE
  • PageContext.SESSION_SCOPE
  • PageContext.APPLICATION_SCOPE
  • findAttribute(String name);自動從page request session application一次查找,找到了就取值,介乎查找

####### 例
pageContext.setAttribute("test", "page",PageContext.PAGE_SCOPE);
request.setAttribute("test", "request");
session.setAttribute("test","session");
application.setAttribute("test", "application");

2,它可以創建其他的8個隱士對象
<%
    pageContext.getSession();
    pageContext.getRequest()
    pageContext.getOut()
    //...
%>
3,提供了簡易方法
  • pageContext.forward("2.jsp");
  • pageContext.include("2.jsp");

四大域對象,開發中使用場景

  • PageContext:pageContext 數據存放在當前頁面有效。開發時使用較小
  • ServletRequest: request 數據存放在一次請求(轉發)內有效,使用非常多。
  • HttpSession: session 存放的數據在一次會話中有效,使用比較多。
  • ServletContext: application 存放的數據在整個應用范圍內都有效。因為范圍太大,盡量少用

EL的具體功能

  • 獲取數據
  • 運算
  • 隱式對象:11個

獲取數據

EL表達式只能獲取存在4個作用域的數據
${u} 原理:pageContext.findAttribute("u");
url>name=lihao 
${param.name}
獲取對于 null這樣的數據,在頁面中表現為空字符串
點(.) 運算符相當于調用了getter方法,點后面跟的是屬性名
<% 
    Book book = new Book("1", "android 開發大全", 29, "王子陽");
    request.setAttribute("book",book);
%>

${book.name }
[]運算符:點能做的,它也能做;他不能做的,點不一定能做
${book.name } === ${book['name'] } === ${book["name"] }

運算

empty
    判斷null,空字符串和沒有元素的集合(即使集合對象本身不為null)都返回true
    <%
        String str = null;
        pageContext.setAttribute("str", str);
        
        String str1= "";
        pageContext.setAttribute("str1",str1);
        
        String str2="abc";
        pageContext.setAttribute("str2",str2);
        
        List<String> list1 = new ArrayList<String>();
        pageContext.setAttribute("list1", list1);
        
        List<String> list2 = new ArrayList<String>();
        list2.add("aa");
        pageContext.setAttribute("list2",list2);

    %>
    ${ empty str } -----true <br/>
    ${ empty str1 } -----true <br/>
    ${ empty str2 } -----false <br/>
    ${ empty list1 } -----true <br/>
    ${ empty list2 } -----false <br/>
    ${ empty str ? "str為空":"有值" }

    賦值 ${test = index+4 }
    取值 ${test}

隱式對象

EL 隱式對象引用名稱 類型 jsp內置對象名稱 說明
pageContext javax.servlet.jsp.PageCOntext pageContent 一樣的
pageSope java.util.Map<String,Object> 沒有對應的 pageContext返回中存放的數據,頁面范圍
requestScope java.util.Map<String,Object> 沒有對應的 請求范圍數據
sessionScope java.util.Map<String,Object> 沒有對應的 會話范圍數據
applicationScope java.util.Map<String,Object> 沒有對應的 應用范圍數據
param java.util.Map<String,Object> 沒有對應的 一個請求參數
paramValues java.util.Map<String,Object> 沒有對應的 重名請求參數
header java.util.Map<String,Object> 沒有對應的 一個請求消息頭
initParam java.util.Map<String,Object> 沒有對應的 web.xml中全局參數
cookie java.util.Map<String,Object> 沒有對應的 key:cookie對象的name值

jstl

  • jstl 是什么
  • jstl 解決什么問題
  • jstl 如何使用

jstl 是什么

jstl(JSP Standard Tag Library,JSP標準**標簽庫**)是一個不斷完善的開放源代碼的jsp標簽庫,是由apache的jakarta小組來維護的。

jstl 解決什么問題

處理jsp 頁面的邏輯處理。比如判斷,循環等。

jstl 如何使用

在jsp頁面添加taglib指令才能使用jstl標簽
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="core"%>
使用  jstl標簽  
語法 <prefix:命令 test=""></prefix:命令>
<core:if test="${num>3}"></core:if>

常用標簽
通用標簽 set out remove
設置變量:<core:set var="num" value="${10+5 }" scope="page"></core:set>
輸出數據:<core:out value="${num }"></core:out>
移除變量:<core:remove var="num"/><br/>
移除后輸出設置默認值: <core:out value="${num }" default="默認值"></core:out>
條件標簽 if choose(switch)
<%
    pageContext.setAttribute("num", 5);
    pageContext.setAttribute("index", 5);
%>
  • if
    <core:if test="${num>3}"> ${num} </core:if>
  • choose
<core:choose>
    <core:when test="${num==1 }">
    num = 1
</core:when>
    <core:when test="${num==2 }">
    num=2
</core:when>
    <core:when test="${num==3 }">
    num=3
</core:when>
    <core:when test="${num==5 }">
    num =5
</core:when>
    <core:otherwise>
    默認值
</core:otherwise>
</core:choose>
迭代器 foreach
  • 普通循環

    • var 聲明變量

    • begin 初始化

    • end 結束條件

    • step 步長
      <core:forEach var="i" begin="1" end="10" step="2">
      ${i }

      </core:forEach>

  • 循環數據

    • items 獲取到集合
    • varStatus 元素的信息
    • var 單個數據
例1
<%
    List<String> list = new ArrayList<String>();
    list.add("aaa");
    list.add("bbb");
    list.add("cccc");
    pageContext.setAttribute("list", list);

    Map<String, String> map = new HashMap<String, String>();
    map.put("a", "A");
    map.put("b", "B");
    map.put("c", "C");
    map.put("d", "D");
    map.put("e", "E");
    pageContext.setAttribute("map", map);
%>
<core:forEach items="${list }" var="l">
    ${l }
</core:forEach>
例2
<table border="1px">
    <tr>
        <th>key</th>
        <th>內容</th>
        <th>索引</th>
        <th>計數</th>
        <th>是否第一個</th>
        <th>是否最后一個</th>
    </tr>
<core:forEach items="${map }" var="m" varStatus="vs">

    <tr>
        <td>${m['key'] }</td>
        <td>${m['value'] }</td>
        <td>${vs.index }</td>
        <td>${vs.count }</td>
        <td>${vs.first }</td>
        <td>${vs.last }</td>
    </tr>
</core:forEach>

</table>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • JSP 基本結構JSP 頁面組成:模板文本(HTML,XML,純文本),JSP 元素;JSP 元素:腳本元素,指令...
    jslancer閱讀 877評論 0 11
  • 一、JSP基礎 1.1什么是JSP JSP(Java ServerPage)是Java服務器端動態頁面技術。是su...
    晨星資源閱讀 1,175評論 0 6
  • title: JSP筆記date: 2017-02-24 21:51:49tags: JSP JSP&Servle...
    fanyank閱讀 473評論 0 1
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 1.學習內容 JSP技術入門和常用指令 JSP的內置對象&標簽介紹 EL表達式&EL的內置對象 2.JSP技術入門...
    WendyVIV閱讀 2,172評論 1 18