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>